/* * Copyright (C) 2013 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.CSSStyleDeclarationSection = function(style) { WebInspector.Object.call(this); console.assert(style); this._style = style || null; this._element = document.createElement("div"); this._element.className = WebInspector.CSSStyleDeclarationSection.StyleClassName; this._headerElement = document.createElement("div"); this._headerElement.className = WebInspector.CSSStyleDeclarationSection.HeaderElementStyleClassName; this._iconElement = document.createElement("img"); this._iconElement.className = WebInspector.CSSStyleDeclarationSection.IconElementStyleClassName; this._headerElement.appendChild(this._iconElement); this._selectorElement = document.createElement("span"); this._selectorElement.className = WebInspector.CSSStyleDeclarationSection.SelectorElementStyleClassName; this._selectorElement.setAttribute("spellcheck", "false"); this._headerElement.appendChild(this._selectorElement); this._originElement = document.createElement("span"); this._originElement.className = WebInspector.CSSStyleDeclarationSection.OriginElementStyleClassName; this._headerElement.appendChild(this._originElement); this._propertiesElement = document.createElement("div"); this._propertiesElement.className = WebInspector.CSSStyleDeclarationSection.PropertiesElementStyleClassName; this._propertiesTextEditor = new WebInspector.CSSStyleDeclarationTextEditor(this, style); this._propertiesElement.appendChild(this._propertiesTextEditor.element); this._element.appendChild(this._headerElement); this._element.appendChild(this._propertiesElement); var iconClassName; switch (style.type) { case WebInspector.CSSStyleDeclaration.Type.Rule: console.assert(style.ownerRule); if (style.inherited) iconClassName = WebInspector.CSSStyleDeclarationSection.InheritedStyleRuleIconStyleClassName; else if (style.ownerRule.type === WebInspector.CSSRule.Type.Author) iconClassName = WebInspector.CSSStyleDeclarationSection.AuthorStyleRuleIconStyleClassName; else if (style.ownerRule.type === WebInspector.CSSRule.Type.User) iconClassName = WebInspector.CSSStyleDeclarationSection.UserStyleRuleIconStyleClassName; else if (style.ownerRule.type === WebInspector.CSSRule.Type.UserAgent) iconClassName = WebInspector.CSSStyleDeclarationSection.UserAgentStyleRuleIconStyleClassName; else if (style.ownerRule.type === WebInspector.CSSRule.Type.Inspector) iconClassName = WebInspector.CSSStyleDeclarationSection.InspectorStyleRuleIconStyleClassName; break; case WebInspector.CSSStyleDeclaration.Type.Inline: case WebInspector.CSSStyleDeclaration.Type.Attribute: if (style.inherited) iconClassName = WebInspector.CSSStyleDeclarationSection.InheritedElementStyleRuleIconStyleClassName; else iconClassName = WebInspector.DOMTreeElementPathComponent.DOMElementIconStyleClassName; break; } console.assert(iconClassName); this._element.classList.add(iconClassName); if (!style.editable) this._element.classList.add(WebInspector.CSSStyleDeclarationSection.LockedStyleClassName); else if (style.ownerRule) { this._commitSelectorKeyboardShortcut = new WebInspector.KeyboardShortcut(null, WebInspector.KeyboardShortcut.Key.Enter, this._commitSelector.bind(this), this._selectorElement); this._selectorElement.addEventListener("blur", this._commitSelector.bind(this)); } else this._element.classList.add(WebInspector.CSSStyleDeclarationSection.SelectorLockedStyleClassName); if (!WebInspector.CSSStyleDeclarationSection._generatedLockImages) { WebInspector.CSSStyleDeclarationSection._generatedLockImages = true; var specifications = {"style-lock-normal": {fillColor: [0, 0, 0, 0.5]}}; generateColoredImagesForCSS("Images/Locked.svg", specifications, 8, 10); } this.refresh(); }; WebInspector.CSSStyleDeclarationSection.StyleClassName = "style-declaration-section"; WebInspector.CSSStyleDeclarationSection.LockedStyleClassName = "locked"; WebInspector.CSSStyleDeclarationSection.SelectorLockedStyleClassName = "selector-locked"; WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName = "last-in-group"; WebInspector.CSSStyleDeclarationSection.HeaderElementStyleClassName = "header"; WebInspector.CSSStyleDeclarationSection.IconElementStyleClassName = "icon"; WebInspector.CSSStyleDeclarationSection.SelectorElementStyleClassName = "selector"; WebInspector.CSSStyleDeclarationSection.OriginElementStyleClassName = "origin"; WebInspector.CSSStyleDeclarationSection.PropertiesElementStyleClassName = "properties"; WebInspector.CSSStyleDeclarationSection.MatchedSelectorElementStyleClassName = "matched"; WebInspector.CSSStyleDeclarationSection.AuthorStyleRuleIconStyleClassName = "author-style-rule-icon"; WebInspector.CSSStyleDeclarationSection.UserStyleRuleIconStyleClassName = "user-style-rule-icon"; WebInspector.CSSStyleDeclarationSection.UserAgentStyleRuleIconStyleClassName = "user-agent-style-rule-icon"; WebInspector.CSSStyleDeclarationSection.InspectorStyleRuleIconStyleClassName = "inspector-style-rule-icon"; WebInspector.CSSStyleDeclarationSection.InheritedStyleRuleIconStyleClassName = "inherited-style-rule-icon"; WebInspector.CSSStyleDeclarationSection.InheritedElementStyleRuleIconStyleClassName = "inherited-element-style-rule-icon"; WebInspector.CSSStyleDeclarationSection.prototype = { constructor: WebInspector.CSSStyleDeclarationSection, // Public get element() { return this._element; }, get style() { return this._style; }, get lastInGroup() { return this._element.classList.contains(WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName); }, set lastInGroup(last) { if (last) this._element.classList.add(WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName); else this._element.classList.remove(WebInspector.CSSStyleDeclarationSection.LastInGroupStyleClassName); }, get focused() { return this._propertiesTextEditor.focused; }, focus: function() { this._propertiesTextEditor.focus(); }, refresh: function() { this._selectorElement.removeChildren(); this._originElement.removeChildren(); this._originElement.appendChild(document.createTextNode(" \u2014 ")); function appendSelector(selectorText, matched) { var selectorElement = document.createElement("span"); if (matched) selectorElement.className = WebInspector.CSSStyleDeclarationSection.MatchedSelectorElementStyleClassName; selectorElement.textContent = selectorText; this._selectorElement.appendChild(selectorElement); } switch (this._style.type) { case WebInspector.CSSStyleDeclaration.Type.Rule: console.assert(this._style.ownerRule); var selectors = this._style.ownerRule.selectors; var matchedSelectorIndices = this._style.ownerRule.matchedSelectorIndices; if (selectors.length && matchedSelectorIndices.length) { for (var i = 0; i < selectors.length; ++i) { appendSelector.call(this, selectors[i], matchedSelectorIndices.contains(i)); if (i < selectors.length - 1) this._selectorElement.appendChild(document.createTextNode(", ")); } } else appendSelector.call(this, this._style.ownerRule.selectorText, true); if (this._style.ownerRule.sourceCodeLocation) { var sourceCodeLink = WebInspector.createSourceCodeLocationLink(this._style.ownerRule.sourceCodeLocation, true); this._originElement.appendChild(sourceCodeLink); } else { var originString; switch (this._style.ownerRule.type) { case WebInspector.CSSRule.Type.Author: originString = WebInspector.UIString("Author Stylesheet"); break; case WebInspector.CSSRule.Type.User: originString = WebInspector.UIString("User Stylesheet"); break; case WebInspector.CSSRule.Type.UserAgent: originString = WebInspector.UIString("User Agent Stylesheet"); break; case WebInspector.CSSRule.Type.Inspector: originString = WebInspector.UIString("Web Inspector"); break; } console.assert(originString); if (originString) this._originElement.appendChild(document.createTextNode(originString)); } break; case WebInspector.CSSStyleDeclaration.Type.Inline: appendSelector.call(this, WebInspector.displayNameForNode(this._style.node), true); this._originElement.appendChild(document.createTextNode(WebInspector.UIString("Style Attribute"))); break; case WebInspector.CSSStyleDeclaration.Type.Attribute: appendSelector.call(this, WebInspector.displayNameForNode(this._style.node), true); this._originElement.appendChild(document.createTextNode(WebInspector.UIString("HTML Attributes"))); break; } }, updateLayout: function() { this._propertiesTextEditor.updateLayout(); }, // Private _commitSelector: function(mutations) { console.assert(this._style.ownerRule); if (!this._style.ownerRule) return; var newSelectorText = this._selectorElement.textContent.trim(); if (!newSelectorText) { // Revert to the current selector (by doing a refresh) since the new selector is empty. this.refresh(); return; } this._style.ownerRule.selectorText = newSelectorText; } }; WebInspector.CSSStyleDeclarationSection.prototype.__proto__ = WebInspector.StyleDetailsPanel.prototype;