Changeset 99849 in webkit


Ignore:
Timestamp:
Nov 10, 2011 6:56:28 AM (12 years ago)
Author:
apavlov@chromium.org
Message:

Web Inspector: Show media queries associated with specific CSS rules
https://bugs.webkit.org/show_bug.cgi?id=65626

Reviewed by Pavel Feldman.

Source/WebCore:

Test: inspector/styles/media-queries.html

  • css/CSSGrammar.y:
  • css/CSSParser.cpp:

(WebCore::CSSParser::updateLastMediaLine):

  • css/CSSParser.h:
  • css/MediaList.cpp:

(WebCore::MediaList::MediaList):

  • css/MediaList.h:

(WebCore::MediaList::lastLine):
(WebCore::MediaList::setLastLine):

  • inspector/Inspector.json:
  • inspector/InspectorCSSAgent.cpp:

(WebCore::InspectorCSSAgent::bindStyleSheet):
(WebCore::InspectorCSSAgent::viaInspectorStyleSheet):

  • inspector/InspectorDOMAgent.cpp:

(WebCore::InspectorDOMAgent::documentURLString):

  • inspector/InspectorDOMAgent.h:
  • inspector/InspectorStyleSheet.cpp:

(WebCore::buildMediaObject):
(WebCore::fillMediaListChain):
(WebCore::InspectorStyleSheet::buildObjectForRule):

  • inspector/front-end/CSSStyleModel.js:

(WebInspector.CSSRule):
(WebInspector.CSSMedia):
(WebInspector.CSSMedia.parsePayload):
(WebInspector.CSSMedia.parseMediaArrayPayload):

  • inspector/front-end/ResourceUtils.js:

(WebInspector.linkifyResourceAsNode):

  • inspector/front-end/StylesSidebarPane.js:

(WebInspector.StylesSidebarPane.prototype._rebuildUpdate):
(WebInspector.StylesSidebarPane.prototype._rebuildStyleRules):
(WebInspector.StylePropertiesSection.prototype._handleEmptySpaceDoubleClick):
(WebInspector.StylePropertiesSection.prototype.editingSelectorCommitted.successCallback):
(WebInspector.StylePropertiesSection.prototype.editingSelectorCommitted):

  • inspector/front-end/elementsPanel.css:

(.styles-section .header .title .media, .styles-section .header .title .media .subtitle):
(.styles-section .header .subtitle):

LayoutTests:

  • inspector/styles/media-queries-expected.txt: Added.
  • inspector/styles/media-queries.html: Added.
  • inspector/styles/resources/media-queries-1.css: Added.

(body):
(#main):

  • inspector/styles/resources/media-queries.css: Added.

(#main):

  • inspector/styles/styles-iframe-expected.txt:
  • inspector/styles/styles-source-lines-expected.txt:
Location:
trunk
Files:
4 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r99841 r99849  
     12011-11-10  Alexander Pavlov  <apavlov@chromium.org>
     2
     3        Web Inspector: Show media queries associated with specific CSS rules
     4        https://bugs.webkit.org/show_bug.cgi?id=65626
     5
     6        Reviewed by Pavel Feldman.
     7
     8        * inspector/styles/media-queries-expected.txt: Added.
     9        * inspector/styles/media-queries.html: Added.
     10        * inspector/styles/resources/media-queries-1.css: Added.
     11        (body):
     12        (#main):
     13        * inspector/styles/resources/media-queries.css: Added.
     14        (#main):
     15        * inspector/styles/styles-iframe-expected.txt:
     16        * inspector/styles/styles-source-lines-expected.txt:
     17
    1182011-11-10  Csaba Osztrogonác  <ossy@webkit.org>
    219
  • trunk/LayoutTests/inspector/styles/styles-iframe-expected.txt

    r99713 r99849  
    99======== Matched CSS Rules ========
    1010[expanded]
     11media="screen" (styles-iframe.html)
    1112#main  { (styles-iframe.html:5)
    1213background: blue;
     
    2324======== Matched CSS Rules ========
    2425[expanded]
     26media="screen" (styles-iframe-data.html)
    2527body  { (styles-iframe-data.html:4)
    2628background: green;
  • trunk/LayoutTests/inspector/styles/styles-source-lines-expected.txt

    r99713 r99849  
    66======== Matched CSS Rules ========
    77[expanded]
     8media="screen" (styles-source-lines.html)
    89#main, .at_line_50  { (styles-source-lines.html:50)
    910border: 1px solid
     
    1112
    1213[expanded]
     14media="screen" (styles-source-lines.html)
    1315#main, .at_line_43  { (styles-source-lines.html:43)
    1416font-size: 10px;
    1517
    1618[expanded]
     19media="screen" (styles-source-lines.html)
    1720#main, .at_line_29  { (styles-source-lines.html:29)
    1821font-family: /*  Comment in
     
    2023
    2124[expanded]
     25media="screen" (styles-source-lines.html)
    2226#main, .at_line_15::before  { (styles-source-lines.html:15)
    2327color: red;
  • trunk/Source/WebCore/ChangeLog

    r99848 r99849  
     12011-11-10  Alexander Pavlov  <apavlov@chromium.org>
     2
     3        Web Inspector: Show media queries associated with specific CSS rules
     4        https://bugs.webkit.org/show_bug.cgi?id=65626
     5
     6        Reviewed by Pavel Feldman.
     7
     8        Test: inspector/styles/media-queries.html
     9
     10        * css/CSSGrammar.y:
     11        * css/CSSParser.cpp:
     12        (WebCore::CSSParser::updateLastMediaLine):
     13        * css/CSSParser.h:
     14        * css/MediaList.cpp:
     15        (WebCore::MediaList::MediaList):
     16        * css/MediaList.h:
     17        (WebCore::MediaList::lastLine):
     18        (WebCore::MediaList::setLastLine):
     19        * inspector/Inspector.json:
     20        * inspector/InspectorCSSAgent.cpp:
     21        (WebCore::InspectorCSSAgent::bindStyleSheet):
     22        (WebCore::InspectorCSSAgent::viaInspectorStyleSheet):
     23        * inspector/InspectorDOMAgent.cpp:
     24        (WebCore::InspectorDOMAgent::documentURLString):
     25        * inspector/InspectorDOMAgent.h:
     26        * inspector/InspectorStyleSheet.cpp:
     27        (WebCore::buildMediaObject):
     28        (WebCore::fillMediaListChain):
     29        (WebCore::InspectorStyleSheet::buildObjectForRule):
     30        * inspector/front-end/CSSStyleModel.js:
     31        (WebInspector.CSSRule):
     32        (WebInspector.CSSMedia):
     33        (WebInspector.CSSMedia.parsePayload):
     34        (WebInspector.CSSMedia.parseMediaArrayPayload):
     35        * inspector/front-end/ResourceUtils.js:
     36        (WebInspector.linkifyResourceAsNode):
     37        * inspector/front-end/StylesSidebarPane.js:
     38        (WebInspector.StylesSidebarPane.prototype._rebuildUpdate):
     39        (WebInspector.StylesSidebarPane.prototype._rebuildStyleRules):
     40        (WebInspector.StylePropertiesSection.prototype._handleEmptySpaceDoubleClick):
     41        (WebInspector.StylePropertiesSection.prototype.editingSelectorCommitted.successCallback):
     42        (WebInspector.StylePropertiesSection.prototype.editingSelectorCommitted):
     43        * inspector/front-end/elementsPanel.css:
     44        (.styles-section .header .title .media, .styles-section .header .title .media .subtitle):
     45        (.styles-section .header .subtitle):
     46
    1472011-11-10  Alexander Pavlov  <apavlov@chromium.org>
    248
  • trunk/Source/WebCore/css/CSSGrammar.y

    r99595 r99849  
    576576        $$ = p->createMediaList();
    577577        $$->appendMediaQuery(p->sinkFloatingMediaQuery($1));
     578        p->updateLastMediaLine($$);
    578579    }
    579580    | media_list ',' maybe_space media_query {
    580581        $$ = $1;
     582        CSSParser* p = static_cast<CSSParser*>(parser);
    581583        if ($$)
    582             $$->appendMediaQuery(static_cast<CSSParser*>(parser)->sinkFloatingMediaQuery($4));
     584            $$->appendMediaQuery(p->sinkFloatingMediaQuery($4));
     585        p->updateLastMediaLine($$);
    583586    }
    584587    | media_list error {
  • trunk/Source/WebCore/css/CSSParser.cpp

    r99695 r99849  
    76967696}
    76977697
     7698void CSSParser::updateLastMediaLine(MediaList* media)
     7699{
     7700    media->setLastLine(m_lineNumber);
     7701}
     7702
    76987703void CSSParser::markSelectorListStart()
    76997704{
  • trunk/Source/WebCore/css/CSSParser.h

    r99695 r99849  
    261261
    262262    void updateLastSelectorLineAndPosition();
     263    void updateLastMediaLine(MediaList*);
    263264
    264265    void clearProperties();
  • trunk/Source/WebCore/css/MediaList.cpp

    r97854 r99849  
    6161    : m_fallback(fallbackToDescriptor)
    6262    , m_parentStyleSheet(parentStyleSheet)
     63    , m_lastLine(0)
    6364{
    6465}
     
    6768    : m_fallback(fallbackToDescriptor)
    6869    , m_parentStyleSheet(parentStyleSheet)
     70    , m_lastLine(0)
    6971{
    7072    ExceptionCode ec = 0;
     
    8587    : m_fallback(false)
    8688    , m_parentStyleSheet(parentRule->parentStyleSheet())
     89    , m_lastLine(0)
    8790{
    8891    ExceptionCode ec = 0;
  • trunk/Source/WebCore/css/MediaList.h

    r99184 r99849  
    8686    }
    8787
     88    int lastLine() const { return m_lastLine; }
     89    void setLastLine(int lastLine) { m_lastLine = lastLine; }
     90
    8891private:
    8992    MediaList(CSSStyleSheet* parentSheet, bool fallbackToDescription);
     
    97100    CSSStyleSheet* m_parentStyleSheet;
    98101    Vector<MediaQuery*> m_queries;
     102    int m_lastLine;
    99103};
    100104
  • trunk/Source/WebCore/inspector/Inspector.json

    r98456 r99849  
    14391439                    { "name": "origin", "type": "string", "enum": ["user", "user-agent", "inspector", ""], "description": "The parent stylesheet type: \"user\" for user stylesheets, \"user-agent\" for user-agent stylesheets, \"inspector\" for stylesheets created by the inspector (i.e. those holding new rules created with <code>addRule()</code>), \"\" for regular stylesheets."},
    14401440                    { "name": "style", "$ref": "CSSStyle", "description": "Associated style declaration." },
    1441                     { "name": "selectorRange", "$ref": "SourceRange", "optional": true, "description": "The rule selector range in the underlying resource (if available)." }
     1441                    { "name": "selectorRange", "$ref": "SourceRange", "optional": true, "description": "The rule selector range in the underlying resource (if available)." },
     1442                    { "name": "media", "type": "array", "items": { "$ref": "CSSMedia" }, "optional": true, "description": "Media list array (for rules involving media queries). The array enumerates media queries starting with the innermost one, going outwards." }
    14421443                ],
    14431444                "description": "CSS rule representation."
     
    14881489                ],
    14891490                "description": "CSS style effective visual dimensions and source offsets."
     1491            },
     1492            {
     1493                "id": "CSSMedia",
     1494                "type": "object",
     1495                "properties": [
     1496                    { "name": "text", "type": "string", "description": "Media query text." },
     1497                    { "name": "source", "type": "string", "enum": ["mediaRule", "importRule", "stylesheet"], "optional": true, "description": "Source of the media query: \"mediaRule\" if specified by a @media rule, \"importRule\" if specified by an @import rule, \"stylesheet\" (implied if absent) if specified by a \"media\" attribute in a stylesheet's LINK or STYLE tag." },
     1498                    { "name": "sourceURL", "type": "string", "optional": true, "description": "URL of the document containing the media query description." },
     1499                    { "name": "sourceLine", "type": "string", "optional": true, "description": "Line in the document containing the media query (not defined for the \"stylesheet\" source)." }
     1500                ],
     1501                "description": "CSS media query descriptor."
    14901502            }
    14911503        ],
  • trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp

    r99595 r99849  
    499499        String id = String::number(m_lastStyleSheetId++);
    500500        Document* document = styleSheet->findDocument();
    501         inspectorStyleSheet = InspectorStyleSheet::create(id, styleSheet, detectOrigin(styleSheet, document), m_domAgent->documentURLString(document));
     501        inspectorStyleSheet = InspectorStyleSheet::create(id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::documentURLString(document));
    502502        m_idToInspectorStyleSheet.set(id, inspectorStyleSheet);
    503503        m_cssStyleSheetToInspectorStyleSheet.set(styleSheet, inspectorStyleSheet);
     
    540540    CSSStyleSheet* cssStyleSheet = static_cast<CSSStyleSheet*>(styleSheet);
    541541    String id = String::number(m_lastStyleSheetId++);
    542     inspectorStyleSheet = InspectorStyleSheet::create(id, cssStyleSheet, "inspector", m_domAgent->documentURLString(document));
     542    inspectorStyleSheet = InspectorStyleSheet::create(id, cssStyleSheet, "inspector", InspectorDOMAgent::documentURLString(document));
    543543    m_idToInspectorStyleSheet.set(id, inspectorStyleSheet);
    544544    m_cssStyleSheetToInspectorStyleSheet.set(cssStyleSheet, inspectorStyleSheet);
  • trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp

    r99683 r99849  
    12111211}
    12121212
    1213 String InspectorDOMAgent::documentURLString(Document* document) const
     1213// static
     1214String InspectorDOMAgent::documentURLString(Document* document)
    12141215{
    12151216    if (!document || document->url().isNull())
  • trunk/Source/WebCore/inspector/InspectorDOMAgent.h

    r96106 r99849  
    162162    void setDOMListener(DOMListener*);
    163163
    164     String documentURLString(Document*) const;
     164    static String documentURLString(Document*);
    165165
    166166    PassRefPtr<InspectorObject> resolveNode(Node*, const String& objectGroup);
  • trunk/Source/WebCore/inspector/InspectorStyleSheet.cpp

    r99595 r99849  
    103103namespace WebCore {
    104104
     105enum MediaListSource {
     106    MediaListSourceLinkedSheet,
     107    MediaListSourceInlineSheet,
     108    MediaListSourceMediaRule,
     109    MediaListSourceImportRule
     110};
     111
    105112static PassRefPtr<InspectorObject> buildSourceRangeObject(const SourceRange& range)
    106113{
     
    111118}
    112119
     120static PassRefPtr<InspectorObject> buildMediaObject(const MediaList* media, MediaListSource mediaListSource, const String& sourceURL)
     121{
     122    RefPtr<InspectorObject> mediaObject = InspectorObject::create();
     123    switch (mediaListSource) {
     124    case MediaListSourceMediaRule:
     125        mediaObject->setString("source", "mediaRule");
     126        break;
     127    case MediaListSourceImportRule:
     128        mediaObject->setString("source", "importRule");
     129        break;
     130    case MediaListSourceLinkedSheet:
     131        mediaObject->setString("source", "linkedSheet");
     132        break;
     133    case MediaListSourceInlineSheet:
     134        mediaObject->setString("source", "inlineSheet");
     135        break;
     136    }
     137    if (!sourceURL.isEmpty()) {
     138        mediaObject->setString("sourceURL", sourceURL);
     139        mediaObject->setNumber("sourceLine", media->lastLine());
     140    }
     141    mediaObject->setString("text", media->mediaText());
     142    return mediaObject.release();
     143}
     144
    113145static PassRefPtr<CSSRuleList> asCSSRuleList(CSSStyleSheet* styleSheet)
    114146{
     
    131163
    132164    return 0;
     165}
     166
     167static void fillMediaListChain(CSSRule* rule, InspectorArray* mediaArray)
     168{
     169    MediaList* mediaList;
     170    CSSRule* parentRule = rule;
     171    String sourceURL;
     172    while (parentRule) {
     173        CSSStyleSheet* parentStyleSheet = 0;
     174        bool isMediaRule = true;
     175        if (parentRule->isMediaRule()) {
     176            CSSMediaRule* mediaRule = static_cast<CSSMediaRule*>(parentRule);
     177            mediaList = mediaRule->media();
     178            parentStyleSheet = mediaRule->parentStyleSheet();
     179        } else if (parentRule->isImportRule()) {
     180            CSSImportRule* importRule = static_cast<CSSImportRule*>(parentRule);
     181            mediaList = importRule->media();
     182            parentStyleSheet = importRule->parentStyleSheet();
     183            isMediaRule = false;
     184        } else
     185            mediaList = 0;
     186
     187        if (parentStyleSheet) {
     188            sourceURL = parentStyleSheet->finalURL();
     189            if (sourceURL.isEmpty())
     190                sourceURL = InspectorDOMAgent::documentURLString(parentStyleSheet->findDocument());
     191        } else
     192            sourceURL = "";
     193
     194        if (mediaList && mediaList->length())
     195            mediaArray->pushObject(buildMediaObject(mediaList, isMediaRule ? MediaListSourceMediaRule : MediaListSourceImportRule, sourceURL));
     196
     197        if (parentRule->parentRule())
     198            parentRule = parentRule->parentRule();
     199        else {
     200            CSSStyleSheet* styleSheet = parentRule->parentStyleSheet();
     201            while (styleSheet) {
     202                mediaList = styleSheet->media();
     203                if (mediaList && mediaList->length()) {
     204                    Document* doc = styleSheet->findDocument();
     205                    if (doc)
     206                        sourceURL = doc->url();
     207                    else if (!styleSheet->finalURL().isEmpty())
     208                        sourceURL = styleSheet->finalURL();
     209                    else
     210                        sourceURL = "";
     211                    mediaArray->pushObject(buildMediaObject(mediaList, styleSheet->ownerNode() ? MediaListSourceLinkedSheet : MediaListSourceInlineSheet, sourceURL));
     212                }
     213                parentRule = styleSheet->parentRule();
     214                if (parentRule)
     215                    break;
     216                styleSheet = styleSheet->parentStyleSheet();
     217            }
     218        }
     219    }
    133220}
    134221
     
    717804    }
    718805
     806    RefPtr<InspectorArray> mediaArray = InspectorArray::create();
     807
     808    fillMediaListChain(rule, mediaArray.get());
     809    if (mediaArray->length())
     810        result->setArray("media", mediaArray.release());
     811
    719812    return result.release();
    720813}
  • trunk/Source/WebCore/inspector/front-end/CSSStyleModel.js

    r97606 r99849  
    491491    this.style.parentRule = this;
    492492    this.selectorRange = payload.selectorRange;
     493    if (payload.media)
     494        this.media = WebInspector.CSSMedia.parseMediaArrayPayload(payload.media);
    493495}
    494496
     
    652654        CSSAgent.toggleProperty(this.ownerStyle.id, this.index, disabled, callback.bind(this));
    653655    }
     656}
     657
     658/**
     659 * @constructor
     660 * @param {*} payload
     661 */
     662WebInspector.CSSMedia = function(payload)
     663{
     664    this.text = payload.text;
     665    this.source = payload.source;
     666    this.sourceURL = payload.sourceURL || "";
     667    this.sourceLine = typeof payload.sourceLine === "undefined" || this.source === "linkedSheet" ? -1 : payload.sourceLine;
     668}
     669
     670WebInspector.CSSMedia.Source = {
     671    LINKED_SHEET: "linkedSheet",
     672    INLINE_SHEET: "inlineSheet",
     673    MEDIA_RULE: "mediaRule",
     674    IMPORT_RULE: "importRule"
     675};
     676
     677WebInspector.CSSMedia.parsePayload = function(payload)
     678{
     679    return new WebInspector.CSSMedia(payload);
     680}
     681
     682WebInspector.CSSMedia.parseMediaArrayPayload = function(payload)
     683{
     684    var result = [];
     685    for (var i = 0; i < payload.length; ++i)
     686        result.push(WebInspector.CSSMedia.parsePayload(payload[i]));
     687    return result;
    654688}
    655689
  • trunk/Source/WebCore/inspector/front-end/ResourceUtils.js

    r98840 r99849  
    216216    var anchor = WebInspector.linkifyURLAsNode(url, linkText, classes, false, tooltipText);
    217217    anchor.setAttribute("preferred_panel", "resources");
    218     anchor.setAttribute("line_number", lineNumber);
     218    if (typeof lineNumber !== "undefined")
     219        anchor.setAttribute("line_number", lineNumber);
    219220    return anchor;
    220221}
  • trunk/Source/WebCore/inspector/front-end/StylesSidebarPane.js

    r99713 r99849  
    340340            for (var j = pseudoElementCSSRules.rules.length - 1; j >= 0; --j) {
    341341                var rule = pseudoElementCSSRules.rules[j];
    342                 styleRules.push({ style: rule.style, selectorText: rule.selectorText, sourceURL: rule.sourceURL, rule: rule, editable: !!(rule.style && rule.style.id) });
     342                styleRules.push({ style: rule.style, selectorText: rule.selectorText, media: rule.media, sourceURL: rule.sourceURL, rule: rule, editable: !!(rule.style && rule.style.id) });
    343343            }
    344344            usedProperties = {};
     
    412412                addStyleAttributes();
    413413            }
    414             styleRules.push({ style: rule.style, selectorText: rule.selectorText, sourceURL: rule.sourceURL, rule: rule, editable: !!(rule.style && rule.style.id) });
     414            styleRules.push({ style: rule.style, selectorText: rule.selectorText, media: rule.media, sourceURL: rule.sourceURL, rule: rule, editable: !!(rule.style && rule.style.id) });
    415415        }
    416416
     
    454454                    separatorInserted = true;
    455455                }
    456                 styleRules.push({ style: rule.style, selectorText: rule.selectorText, sourceURL: rule.sourceURL, rule: rule, isInherited: true, editable: !!(rule.style && rule.style.id) });
     456                styleRules.push({ style: rule.style, selectorText: rule.selectorText, media: rule.media, sourceURL: rule.sourceURL, rule: rule, isInherited: true, editable: !!(rule.style && rule.style.id) });
    457457            }
    458458            parentNode = parentNode.parentNode;
     
    838838    this.element.className = "styles-section monospace" + (isFirstSection ? " first-styles-section" : "");
    839839
     840    if (styleRule.media) {
     841        for (var i = styleRule.media.length - 1; i >= 0; --i) {
     842            var media = styleRule.media[i];
     843            var mediaDataElement = this.titleElement.createChild("div", "media");
     844            var mediaText;
     845            switch (media.source) {
     846            case WebInspector.CSSMedia.Source.LINKED_SHEET:
     847            case WebInspector.CSSMedia.Source.INLINE_SHEET:
     848                mediaText = "media=\"" + media.text + "\"";
     849                break;
     850            case WebInspector.CSSMedia.Source.MEDIA_RULE:
     851                mediaText = "@media " + media.text;
     852                break;
     853            case WebInspector.CSSMedia.Source.IMPORT_RULE:
     854                mediaText = "@import " + media.text;
     855                break;
     856            }
     857
     858            var mediaTextElement = mediaDataElement.createChild("span");
     859            mediaTextElement.textContent = mediaText;
     860            mediaTextElement.title = media.text;
     861
     862            if (media.sourceURL) {
     863                var refElement = mediaDataElement.createChild("div", "subtitle");
     864                var anchor = WebInspector.linkifyResourceAsNode(media.sourceURL, media.sourceLine < 0 ? undefined : media.sourceLine, "subtitle");
     865                anchor.style.float = "right";
     866                refElement.appendChild(anchor);
     867            }
     868        }
     869    }
     870
    840871    var selectorContainer = document.createElement("div");
    841872    this._selectorElement = document.createElement("span");
     
    11231154    _handleEmptySpaceDoubleClick: function(event)
    11241155    {
    1125         if (event.target.hasStyleClass("header") || this.element.hasStyleClass("read-only")) {
     1156        if (event.target.hasStyleClass("header") || this.element.hasStyleClass("read-only") || event.target.enclosingNodeOrSelfWithClass("media")) {
    11261157            event.stopPropagation();
    11271158            return;
     
    12111242
    12121243            this.rule = newRule;
    1213             this.styleRule = { section: this, style: newRule.style, selectorText: newRule.selectorText, sourceURL: newRule.sourceURL, rule: newRule };
     1244            this.styleRule = { section: this, style: newRule.style, selectorText: newRule.selectorText, media: newRule.media, sourceURL: newRule.sourceURL, rule: newRule };
    12141245
    12151246            var oldIdentifier = this.identifier;
  • trunk/Source/WebCore/inspector/front-end/elementsPanel.css

    r98348 r99849  
    277277}
    278278
     279.styles-section .header .title .media, .styles-section .header .title .media .subtitle {
     280    color: rgb(128, 128, 128);
     281    overflow: hidden;
     282}
     283
    279284.styles-section .header .subtitle {
    280285    color: rgb(85, 85, 85);
     
    284289    text-overflow: ellipsis;
    285290    overflow: hidden;
     291    white-space: nowrap;
    286292}
    287293
Note: See TracChangeset for help on using the changeset viewer.