diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebInspectorUI/UserInterface/Views/ComputedStyleDetailsPanel.js | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Views/ComputedStyleDetailsPanel.js')
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Views/ComputedStyleDetailsPanel.js | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Views/ComputedStyleDetailsPanel.js b/Source/WebInspectorUI/UserInterface/Views/ComputedStyleDetailsPanel.js new file mode 100644 index 000000000..0e7a238c0 --- /dev/null +++ b/Source/WebInspectorUI/UserInterface/Views/ComputedStyleDetailsPanel.js @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2013, 2015 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +WebInspector.ComputedStyleDetailsPanel = class ComputedStyleDetailsPanel extends WebInspector.StyleDetailsPanel +{ + constructor(delegate) + { + super(delegate, WebInspector.ComputedStyleDetailsPanel.StyleClassName, "computed", WebInspector.UIString("Styles \u2014 Computed")); + + this._computedStyleShowAllSetting = new WebInspector.Setting("computed-style-show-all", false); + + this.cssStyleDeclarationTextEditorShouldAddPropertyGoToArrows = true; + } + + // Public + + get regionFlow() { return this._regionFlow; } + set regionFlow(regionFlow) + { + this._regionFlow = regionFlow; + this._regionFlowNameLabelValue.textContent = regionFlow ? regionFlow.name : ""; + this._regionFlowNameRow.value = regionFlow ? this._regionFlowFragment : null; + this._updateFlowNamesSectionVisibility(); + } + + get contentFlow() { return this._contentFlow; } + set contentFlow(contentFlow) + { + this._contentFlow = contentFlow; + this._contentFlowNameLabelValue.textContent = contentFlow ? contentFlow.name : ""; + this._contentFlowNameRow.value = contentFlow ? this._contentFlowFragment : null; + this._updateFlowNamesSectionVisibility(); + } + + get containerRegions() { return this._containerRegions; } + set containerRegions(regions) + { + this._containerRegions = regions; + + if (!regions || !regions.length) { + this._containerRegionsFlowSection.element.classList.add("hidden"); + return; + } + + this._containerRegionsDataGrid.removeChildren(); + for (var regionNode of regions) + this._containerRegionsDataGrid.appendChild(new WebInspector.DOMTreeDataGridNode(regionNode)); + + this._containerRegionsFlowSection.element.classList.remove("hidden"); + + this._containerRegionsDataGrid.updateLayoutIfNeeded(); + } + + cssStyleDeclarationTextEditorShowProperty(property, showSource) + { + function delegateShowProperty() { + if (typeof this._delegate.computedStyleDetailsPanelShowProperty === "function") + this._delegate.computedStyleDetailsPanelShowProperty(property); + } + + if (!showSource) { + delegateShowProperty.call(this); + return; + } + + let effectiveProperty = this._nodeStyles.effectivePropertyForName(property.name); + if (!effectiveProperty || !effectiveProperty.styleSheetTextRange) { + if (!effectiveProperty.relatedShorthandProperty) { + delegateShowProperty.call(this); + return; + } + effectiveProperty = effectiveProperty.relatedShorthandProperty; + } + + let ownerRule = effectiveProperty.ownerStyle.ownerRule; + if (!ownerRule) { + delegateShowProperty.call(this); + return; + } + + let sourceCode = ownerRule.sourceCodeLocation.sourceCode; + let {startLine, startColumn} = effectiveProperty.styleSheetTextRange; + let sourceCodeLocation = sourceCode.createSourceCodeLocation(startLine, startColumn); + WebInspector.showSourceCodeLocation(sourceCodeLocation); + } + + refresh(significantChange) + { + // We only need to do a rebuild on significant changes. Other changes are handled + // by the sections and text editors themselves. + if (!significantChange) { + super.refresh(); + return; + } + + this._propertiesTextEditor.style = this.nodeStyles.computedStyle; + this._variablesTextEditor.style = this.nodeStyles.computedStyle; + this._refreshFlowDetails(this.nodeStyles.node); + this._boxModelDiagramRow.nodeStyles = this.nodeStyles; + + super.refresh(); + + this._variablesSection.element.classList.toggle("hidden", !this._variablesTextEditor.shownProperties.length); + } + + filterDidChange(filterBar) + { + let filterText = filterBar.filters.text; + this._propertiesTextEditor.removeNonMatchingProperties(filterText); + this._variablesTextEditor.removeNonMatchingProperties(filterText); + } + + // Protected + + initialLayout() + { + let computedStyleShowAllLabel = document.createElement("label"); + computedStyleShowAllLabel.textContent = WebInspector.UIString("Show All"); + + this._computedStyleShowAllCheckbox = document.createElement("input"); + this._computedStyleShowAllCheckbox.type = "checkbox"; + this._computedStyleShowAllCheckbox.checked = this._computedStyleShowAllSetting.value; + this._computedStyleShowAllCheckbox.addEventListener("change", this._computedStyleShowAllCheckboxValueChanged.bind(this)); + computedStyleShowAllLabel.appendChild(this._computedStyleShowAllCheckbox); + + this._propertiesTextEditor = new WebInspector.CSSStyleDeclarationTextEditor(this); + this._propertiesTextEditor.propertyVisibilityMode = WebInspector.CSSStyleDeclarationTextEditor.PropertyVisibilityMode.HideVariables; + this._propertiesTextEditor.showsImplicitProperties = this._computedStyleShowAllSetting.value; + this._propertiesTextEditor.alwaysShowPropertyNames = ["display", "width", "height"]; + this._propertiesTextEditor.sortProperties = true; + + let propertiesRow = new WebInspector.DetailsSectionRow; + let propertiesGroup = new WebInspector.DetailsSectionGroup([propertiesRow]); + let propertiesSection = new WebInspector.DetailsSection("computed-style-properties", WebInspector.UIString("Properties"), [propertiesGroup], computedStyleShowAllLabel); + propertiesSection.addEventListener(WebInspector.DetailsSection.Event.CollapsedStateChanged, this._handlePropertiesSectionCollapsedStateChanged, this); + + this.addSubview(this._propertiesTextEditor); + + propertiesRow.element.appendChild(this._propertiesTextEditor.element); + + this._variablesTextEditor = new WebInspector.CSSStyleDeclarationTextEditor(this); + this._variablesTextEditor.propertyVisibilityMode = WebInspector.CSSStyleDeclarationTextEditor.PropertyVisibilityMode.HideNonVariables; + this._variablesTextEditor.sortProperties = true; + + let variablesRow = new WebInspector.DetailsSectionRow; + let variablesGroup = new WebInspector.DetailsSectionGroup([variablesRow]); + this._variablesSection = new WebInspector.DetailsSection("computed-style-properties", WebInspector.UIString("Variables"), [variablesGroup]); + this._variablesSection.addEventListener(WebInspector.DetailsSection.Event.CollapsedStateChanged, this._handleVariablesSectionCollapsedStateChanged, this); + + this.addSubview(this._variablesTextEditor); + + variablesRow.element.appendChild(this._variablesTextEditor.element); + + // Region flow name is used to display the "flow-from" property of the Region Containers. + this._regionFlowFragment = document.createElement("span"); + this._regionFlowFragment.appendChild(document.createElement("img")).className = "icon"; + this._regionFlowNameLabelValue = this._regionFlowFragment.appendChild(document.createElement("span")); + + let goToRegionFlowButton = this._regionFlowFragment.appendChild(WebInspector.createGoToArrowButton()); + goToRegionFlowButton.addEventListener("click", this._goToRegionFlowArrowWasClicked.bind(this)); + + this._regionFlowNameRow = new WebInspector.DetailsSectionSimpleRow(WebInspector.UIString("Region Flow")); + this._regionFlowNameRow.element.classList.add("content-flow-link"); + + // Content flow name is used to display the "flow-into" property of the Content nodes. + this._contentFlowFragment = document.createElement("span"); + this._contentFlowFragment.appendChild(document.createElement("img")).className = "icon"; + this._contentFlowNameLabelValue = this._contentFlowFragment.appendChild(document.createElement("span")); + + let goToContentFlowButton = this._contentFlowFragment.appendChild(WebInspector.createGoToArrowButton()); + goToContentFlowButton.addEventListener("click", this._goToContentFlowArrowWasClicked.bind(this)); + + this._contentFlowNameRow = new WebInspector.DetailsSectionSimpleRow(WebInspector.UIString("Content Flow")); + this._contentFlowNameRow.element.classList.add("content-flow-link"); + + let flowNamesGroup = new WebInspector.DetailsSectionGroup([this._regionFlowNameRow, this._contentFlowNameRow]); + this._flowNamesSection = new WebInspector.DetailsSection("content-flow", WebInspector.UIString("Flows"), [flowNamesGroup]); + + this._containerRegionsDataGrid = new WebInspector.DOMTreeDataGrid; + this._containerRegionsDataGrid.headerVisible = false; + + let containerRegionsRow = new WebInspector.DetailsSectionDataGridRow(this._containerRegionsDataGrid); + let containerRegionsGroup = new WebInspector.DetailsSectionGroup([containerRegionsRow]); + this._containerRegionsFlowSection = new WebInspector.DetailsSection("container-regions", WebInspector.UIString("Container Regions"), [containerRegionsGroup]); + + this.element.appendChild(propertiesSection.element); + this.element.appendChild(this._variablesSection.element); + this.element.appendChild(this._flowNamesSection.element); + this.element.appendChild(this._containerRegionsFlowSection.element); + + this._resetFlowDetails(); + + this._boxModelDiagramRow = new WebInspector.BoxModelDetailsSectionRow; + + let boxModelGroup = new WebInspector.DetailsSectionGroup([this._boxModelDiagramRow]); + let boxModelSection = new WebInspector.DetailsSection("style-box-model", WebInspector.UIString("Box Model"), [boxModelGroup]); + + this.element.appendChild(boxModelSection.element); + } + + // Private + + _computedStyleShowAllCheckboxValueChanged(event) + { + let checked = this._computedStyleShowAllCheckbox.checked; + this._computedStyleShowAllSetting.value = checked; + this._propertiesTextEditor.showsImplicitProperties = checked; + this._propertiesTextEditor.updateLayout(); + } + + _handlePropertiesSectionCollapsedStateChanged(event) + { + if (event && event.data && !event.data.collapsed) + this._propertiesTextEditor.refresh(); + } + + _handleVariablesSectionCollapsedStateChanged(event) + { + if (event && event.data && !event.data.collapsed) + this._variablesTextEditor.refresh(); + } + + _updateFlowNamesSectionVisibility() + { + this._flowNamesSection.element.classList.toggle("hidden", !this._contentFlow && !this._regionFlow); + } + + _resetFlowDetails () + { + this.regionFlow = null; + this.contentFlow = null; + this.containerRegions = null; + } + + _refreshFlowDetails(domNode) + { + this._resetFlowDetails(); + if (!domNode) + return; + + function contentFlowInfoReady(error, flowData) + { + // Element is not part of any flow. + if (error || !flowData) { + this._resetFlowDetails(); + return; + } + + this.regionFlow = flowData.regionFlow; + this.contentFlow = flowData.contentFlow; + this.containerRegions = flowData.regions; + } + + WebInspector.domTreeManager.getNodeContentFlowInfo(domNode, contentFlowInfoReady.bind(this)); + } + + _goToRegionFlowArrowWasClicked() + { + WebInspector.showRepresentedObject(this._regionFlow); + } + + _goToContentFlowArrowWasClicked() + { + WebInspector.showRepresentedObject(this._contentFlow, {nodeToSelect: this.nodeStyles.node}); + } +}; + +WebInspector.ComputedStyleDetailsPanel.StyleClassName = "computed"; |