Changeset 286558 in webkit
- Timestamp:
- Dec 6, 2021 11:45:45 AM (8 months ago)
- Location:
- trunk
- Files:
-
- 3 added
- 17 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/inspector/css/getMatchedStylesForNode-expected.txt (modified) (5 diffs)
-
LayoutTests/inspector/css/getMatchedStylesForNodeLayerGrouping-expected.txt (added)
-
LayoutTests/inspector/css/getMatchedStylesForNodeLayerGrouping.html (added)
-
LayoutTests/inspector/css/resources/external-layers.css (added)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/inspector/protocol/CSS.json (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Headers.cmake (modified) (3 diffs)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (2 diffs)
-
Source/WebCore/css/CSSImportRule.cpp (modified) (1 diff)
-
Source/WebCore/css/CSSImportRule.h (modified) (2 diffs)
-
Source/WebCore/css/CSSLayerRule.cpp (modified) (3 diffs)
-
Source/WebCore/css/CSSLayerRule.h (modified) (2 diffs)
-
Source/WebCore/inspector/InspectorStyleSheet.cpp (modified) (7 diffs)
-
Source/WebCore/style/InspectorCSSOMWrappers.cpp (modified) (2 diffs)
-
Source/WebInspectorUI/ChangeLog (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Models/CSSGrouping.js (modified) (4 diffs)
-
Source/WebInspectorUI/UserInterface/Models/CSSStyleDeclaration.js (modified) (2 diffs)
-
Source/WebInspectorUI/UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r286555 r286558 1 2021-12-06 Patrick Angle <pangle@apple.com> 2 3 Web Inspector: Support Cascade Layers in the Styles sidebar 4 https://bugs.webkit.org/show_bug.cgi?id=233208 5 6 Reviewed by Devin Rousso. 7 8 Add new test cases for `CSS.getMatchesStyleForNode` to make sure that layer groupings are correctly determined, 9 and that rules nested in `@layer` rules and `@import layer()`s are correctly represented and sorted by the order 10 they are applied to an element. 11 12 * inspector/css/getMatchedStylesForNode-expected.txt: 13 - Re-baseline to account for change in order of CSSGrouping properties in the protocol due to `text` now being 14 optional. 15 * inspector/css/getMatchedStylesForNodeLayerGrouping-expected.txt: Added. 16 * inspector/css/getMatchedStylesForNodeLayerGrouping.html: Added. 17 * inspector/css/resources/external-layers.css: Added. 18 1 19 2021-12-06 Antoine Quint <graouts@webkit.org> 2 20 -
trunk/LayoutTests/inspector/css/getMatchedStylesForNode-expected.txt
r273821 r286558 905 905 "groupings": [ 906 906 { 907 "type": "media-import-rule", 907 908 "text": "(min-width: 0px)", 908 "type": "media-import-rule",909 909 "sourceURL": "<filtered>" 910 910 } … … 998 998 "groupings": [ 999 999 { 1000 "type": "media-rule", 1000 1001 "text": "(min-width: 1px)", 1001 "type": "media-rule",1002 1002 "sourceURL": "<filtered>" 1003 1003 } … … 1048 1048 "groupings": [ 1049 1049 { 1050 "type": "supports-rule", 1050 1051 "text": "(display: block)", 1051 "type": "supports-rule",1052 1052 "sourceURL": "<filtered>" 1053 1053 }, 1054 1054 { 1055 "type": "media-rule", 1055 1056 "text": "(min-width: 2px)", 1056 "type": "media-rule",1057 1057 "sourceURL": "<filtered>" 1058 1058 } … … 1103 1103 "groupings": [ 1104 1104 { 1105 "type": "media-style-node", 1105 1106 "text": "(min-width: 3px)", 1106 "type": "media-style-node",1107 1107 "sourceURL": "<filtered>" 1108 1108 } … … 1153 1153 "groupings": [ 1154 1154 { 1155 "type": "media-link-node", 1155 1156 "text": "(min-width: 4px)", 1156 "type": "media-link-node",1157 1157 "sourceURL": "<filtered>" 1158 1158 } -
trunk/Source/JavaScriptCore/ChangeLog
r286502 r286558 1 2021-12-06 Patrick Angle <pangle@apple.com> 2 3 Web Inspector: Support Cascade Layers in the Styles sidebar 4 https://bugs.webkit.org/show_bug.cgi?id=233208 5 6 Reviewed by Devin Rousso. 7 8 Add new values to `CSS.Grouping`'s `type` enum for cascade layers and make the `text` optional since an 9 anonymous layer will not have a name or other text. 10 11 * inspector/protocol/CSS.json: 12 1 13 2021-12-03 Keith Miller <keith_miller@apple.com> 2 14 -
trunk/Source/JavaScriptCore/inspector/protocol/CSS.json
r281229 r286558 227 227 "id": "Grouping", 228 228 "type": "object", 229 "description": "CSS @media (as well as other users of media queries, like @import, <style>, <link>, etc.) and @supportsdescriptor.",230 "properties": [ 231 { "name": "t ext", "type": "string", "description": "Media query text." },232 { "name": "t ype", "type": "string", "enum": ["media-rule", "media-import-rule", "media-link-node", "media-style-node", "supports-rule"], "description": "Source of the media query: \"media-rule\" if specified by a @media rule, \"media-import-rule\" if specified by an @import rule, \"media-link-node\" if specified by a \"media\" attribute in a linked style sheet's LINK tag, \"media-style-node\" if specified by a \"media\" attribute in an inline style sheet's STYLE tag, \"supports-rule\" if specified by an @supports rule,." },229 "description": "CSS @media (as well as other users of media queries, like @import, <style>, <link>, etc.), @supports, and @layer descriptor.", 230 "properties": [ 231 { "name": "type", "type": "string", "enum": ["media-rule", "media-import-rule", "media-link-node", "media-style-node", "supports-rule", "layer-rule", "layer-import-rule"], "description": "Source of the media query: \"media-rule\" if specified by a @media rule, \"media-import-rule\" if specified by an @import rule, \"media-link-node\" if specified by a \"media\" attribute in a linked style sheet's LINK tag, \"media-style-node\" if specified by a \"media\" attribute in an inline style sheet's STYLE tag, \"supports-rule\" if specified by an @supports rule, \"layer-rule\" if specified by an @layer rule." }, 232 { "name": "text", "type": "string", "optional": true, "description": "Query text if specified by a @media or @supports rule. Layer name (or not present for anonymous layers) for @layer rules." }, 233 233 { "name": "sourceURL", "type": "string", "optional": true, "description": "URL of the document containing the CSS grouping." } 234 234 ] -
trunk/Source/WebCore/ChangeLog
r286556 r286558 1 2021-12-06 Patrick Angle <pangle@apple.com> 2 3 Web Inspector: Support Cascade Layers in the Styles sidebar 4 https://bugs.webkit.org/show_bug.cgi?id=233208 5 6 Reviewed by Devin Rousso. 7 8 Test: inspector/css/getMatchedStylesForNodeLayerGrouping.html 9 10 Add support for parsing and grouping CSS `@layer` rules in `InspectorStyleSheet` to the existing paths for 11 handling other groupings so that the frontend is made aware of rules wrapped inside a layer or multiple layers. 12 13 * Headers.cmake: 14 * WebCore.xcodeproj/project.pbxproj: 15 - CompiledSelector.h needs to be exported as a private header to include in WebKitLegacy's build, since it is 16 imported by StyleRule.h, which is now imported by CSSImportRule.h, which is imported in WebKitLegacy. 17 18 * css/CSSImportRule.cpp: 19 (WebCore::CSSImportRule::cascadeLayerName const): 20 * css/CSSImportRule.h: 21 * css/CSSLayerRule.cpp: 22 (WebCore::CSSLayerRule::cssText const): 23 (WebCore::CSSLayerRule::layerName const): 24 (WebCore::CSSLayerRule::stringFromCascadeLayerName): 25 * css/CSSLayerRule.h: 26 * inspector/InspectorStyleSheet.cpp: 27 (flattenSourceData): 28 (WebCore::asCSSRuleList): 29 (WebCore::buildArrayForGroupings): 30 * style/InspectorCSSOMWrappers.cpp: 31 (WebCore::Style::InspectorCSSOMWrappers::collect): 32 1 33 2021-12-06 Wenson Hsieh <wenson_hsieh@apple.com> 2 34 -
trunk/Source/WebCore/Headers.cmake
r286555 r286558 526 526 css/CSSRule.h 527 527 css/CSSRuleList.h 528 css/CSSSelector.h 529 css/CSSSelectorList.h 528 530 css/CSSStyleDeclaration.h 529 531 css/CSSStyleRule.h … … 552 554 css/StyleColor.h 553 555 css/StyleProperties.h 556 css/StyleRule.h 554 557 css/StyleRuleType.h 555 558 css/StyleSheet.h … … 564 567 css/parser/CSSParserToken.h 565 568 css/parser/CSSParserTokenRange.h 569 570 cssjit/CompiledSelector.h 566 571 567 572 display/DisplayTree.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r286555 r286558 893 893 2E0888D51148848A00AF4265 /* JSDOMFormData.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E0888D31148848A00AF4265 /* JSDOMFormData.h */; }; 894 894 2E2D99CE10E2BBDA00496337 /* JSBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E2D99CC10E2BBDA00496337 /* JSBlob.h */; settings = {ATTRIBUTES = (Private, ); }; }; 895 2E301BE82745947200C0564F /* CompiledSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = E4451077202C7E0100657D33 /* CompiledSelector.h */; settings = {ATTRIBUTES = (Private, ); }; }; 895 896 2E37DFDB12DBAFB800A6B233 /* DOMURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E37DFD812DBAFB800A6B233 /* DOMURL.h */; }; 896 897 2E37E00612DBC5A400A6B233 /* JSDOMURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E37E00412DBC5A400A6B233 /* JSDOMURL.h */; }; … … 33528 33529 0F60F32B1DFBB10700416D6C /* CommonVM.h in Headers */, 33529 33530 7C93F34A1AA6BA5E00A98BAB /* CompiledContentExtension.h in Headers */, 33531 2E301BE82745947200C0564F /* CompiledSelector.h in Headers */, 33530 33532 C2F4E78C1E45C3EF006D7105 /* ComplexTextController.h in Headers */, 33531 33533 E4BA50901BCFBD9500E34EF7 /* ComposedTreeAncestorIterator.h in Headers */, -
trunk/Source/WebCore/css/CSSImportRule.cpp
r277967 r286558 57 57 } 58 58 59 const std::optional<CascadeLayerName>& CSSImportRule::cascadeLayerName() const 60 { 61 return m_importRule.get().cascadeLayerName(); 62 } 63 59 64 String CSSImportRule::cssText() const 60 65 { -
trunk/Source/WebCore/css/CSSImportRule.h
r204717 r286558 23 23 24 24 #include "CSSRule.h" 25 #include "StyleRule.h" 25 26 26 27 namespace WebCore { … … 38 39 WEBCORE_EXPORT MediaList& media() const; 39 40 WEBCORE_EXPORT CSSStyleSheet* styleSheet() const; 41 WEBCORE_EXPORT const std::optional<CascadeLayerName>& cascadeLayerName() const; 40 42 41 43 private: -
trunk/Source/WebCore/css/CSSLayerRule.cpp
r283170 r286558 53 53 StringBuilder result; 54 54 55 auto appendLayerName = [&](auto& name) {56 for (auto& segment : name) {57 result.append(segment);58 if (&segment != &name.last())59 result.append('.');60 }61 };62 63 55 if (layer.isStatement()) { 64 56 result.append("@layer "); 65 57 for (auto& name : layer.nameList()) { 66 appendLayerName(name);58 result.append(stringFromCascadeLayerName(name)); 67 59 if (&name != &layer.nameList().last()) 68 60 result.append(", "); … … 73 65 74 66 result.append("@layer "); 75 if (!layer.name().isEmpty()) { 76 appendLayerName(layer.name()); 77 result.append(' '); 78 } 67 if (auto name = layerName()) 68 result.append(*name, " "); 79 69 result.append("{\n"); 80 70 appendCSSTextForItems(result); … … 83 73 } 84 74 75 std::optional<String> CSSLayerRule::layerName() const 76 { 77 auto& layer = downcast<StyleRuleLayer>(groupRule()); 78 79 if (!layer.isStatement() && !layer.name().isEmpty()) 80 return stringFromCascadeLayerName(layer.name()); 81 82 return std::nullopt; 83 } 84 85 String CSSLayerRule::stringFromCascadeLayerName(const CascadeLayerName& name) 86 { 87 StringBuilder result; 88 for (auto& segment : name) { 89 result.append(segment); 90 if (&segment != &name.last()) 91 result.append('.'); 92 } 93 return result.toString(); 94 } 95 85 96 } // namespace WebCore 86 97 -
trunk/Source/WebCore/css/CSSLayerRule.h
r283170 r286558 31 31 32 32 #include "CSSGroupingRule.h" 33 #include "StyleRule.h" 33 34 34 35 namespace WebCore { … … 41 42 42 43 String cssText() const final; 44 std::optional<String> layerName() const; 45 46 static String stringFromCascadeLayerName(const CascadeLayerName&); 43 47 44 48 private: -
trunk/Source/WebCore/inspector/InspectorStyleSheet.cpp
r283851 r286558 1 1 /* 2 2 * Copyright (C) 2010, Google Inc. All rights reserved. 3 * Copyright (C) 2021, Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 28 29 #include "CSSImportRule.h" 29 30 #include "CSSKeyframesRule.h" 31 #include "CSSLayerRule.h" 30 32 #include "CSSMediaRule.h" 31 33 #include "CSSParser.h" … … 106 108 if (data->type == WebCore::StyleRuleType::Style) 107 109 target.append(data.copyRef()); 108 else if (data->type == WebCore::StyleRuleType::Media) 109 flattenSourceData(data->childRules, target); 110 else if (data->type == WebCore::StyleRuleType::Supports) 110 else if (data->type == WebCore::StyleRuleType::Media || data->type == WebCore::StyleRuleType::Supports || data->type == WebCore::StyleRuleType::Layer) 111 111 flattenSourceData(data->childRules, target); 112 112 } … … 427 427 return &downcast<CSSSupportsRule>(*rule).cssRules(); 428 428 429 if (is<CSSLayerRule>(*rule)) 430 return &downcast<CSSLayerRule>(*rule).cssRules(); 431 429 432 return nullptr; 430 433 } … … 436 439 auto* parentRule = &rule; 437 440 while (parentRule) { 438 RefPtr<Protocol::CSS::Grouping> ruleGroupingPayload;441 Vector<Ref<Protocol::CSS::Grouping>> ruleGroupingPayloads; 439 442 440 443 if (is<CSSMediaRule>(parentRule)) { 441 444 auto* media = downcast<CSSMediaRule>(parentRule)->media(); 442 445 if (media && media->length() && media->mediaText() != "all") { 443 ruleGroupingPayload = Protocol::CSS::Grouping::create() 444 .setText(media->mediaText()) 446 auto mediaRulePayload = Protocol::CSS::Grouping::create() 445 447 .setType(Protocol::CSS::Grouping::Type::MediaRule) 446 448 .release(); 449 mediaRulePayload->setText(media->mediaText()); 450 ruleGroupingPayloads.append(WTFMove(mediaRulePayload)); 447 451 } 448 452 } else if (is<CSSImportRule>(parentRule)) { 453 if (auto& layerName = downcast<CSSImportRule>(parentRule)->cascadeLayerName()) { 454 auto layerRulePayload = Protocol::CSS::Grouping::create() 455 .setType(Protocol::CSS::Grouping::Type::LayerImportRule) 456 .release(); 457 layerRulePayload->setText(CSSLayerRule::stringFromCascadeLayerName(*layerName)); 458 ruleGroupingPayloads.append(WTFMove(layerRulePayload)); 459 } 460 449 461 auto& media = downcast<CSSImportRule>(parentRule)->media(); 450 462 if (media.length() && media.mediaText() != "all") { 451 ruleGroupingPayload = Protocol::CSS::Grouping::create() 452 .setText(media.mediaText()) 463 auto mediaRulePayload = Protocol::CSS::Grouping::create() 453 464 .setType(Protocol::CSS::Grouping::Type::MediaImportRule) 454 465 .release(); 466 mediaRulePayload->setText(media.mediaText()); 467 ruleGroupingPayloads.append(WTFMove(mediaRulePayload)); 455 468 } 456 469 } else if (is<CSSSupportsRule>(parentRule)) { 457 ruleGroupingPayload = Protocol::CSS::Grouping::create() 458 .setText(downcast<CSSSupportsRule>(parentRule)->conditionText()) 470 auto supportsRulePayload = Protocol::CSS::Grouping::create() 459 471 .setType(Protocol::CSS::Grouping::Type::SupportsRule) 460 472 .release(); 473 supportsRulePayload->setText(downcast<CSSSupportsRule>(parentRule)->conditionText()); 474 ruleGroupingPayloads.append(WTFMove(supportsRulePayload)); 475 } else if (is<CSSLayerRule>(parentRule)) { 476 auto layerRulePayload = Protocol::CSS::Grouping::create() 477 .setType(Protocol::CSS::Grouping::Type::LayerRule) 478 .release(); 479 if (auto layerName = downcast<CSSLayerRule>(parentRule)->layerName()) 480 layerRulePayload->setText(*layerName); 481 ruleGroupingPayloads.append(WTFMove(layerRulePayload)); 461 482 } 462 483 463 if (ruleGroupingPayload) {484 for (auto&& ruleGroupingPayload : WTFMove(ruleGroupingPayloads)) { 464 485 if (auto* parentStyleSheet = parentRule->parentStyleSheet()) { 465 486 String sourceURL = parentStyleSheet->contents().baseURL().string(); … … 472 493 } 473 494 474 groupingsPayload->addItem( ruleGroupingPayload.releaseNonNull());495 groupingsPayload->addItem(WTFMove(ruleGroupingPayload)); 475 496 } 476 497 … … 485 506 if (media && media->length() && media->mediaText() != "all") { 486 507 auto sheetGroupingPayload = Protocol::CSS::Grouping::create() 487 .setText(media->mediaText())488 508 .setType(is<HTMLStyleElement>(styleSheet->ownerNode()) ? Protocol::CSS::Grouping::Type::MediaStyleNode: Protocol::CSS::Grouping::Type::MediaLinkNode) 489 509 .release(); 510 sheetGroupingPayload->setText(media->mediaText()); 490 511 491 512 String sourceURL; -
trunk/Source/WebCore/style/InspectorCSSOMWrappers.cpp
r284176 r286558 31 31 32 32 #include "CSSImportRule.h" 33 #include "CSSLayerRule.h" 33 34 #include "CSSMediaRule.h" 34 35 #include "CSSRule.h" … … 61 62 case CSSRule::IMPORT_RULE: 62 63 collect(downcast<CSSImportRule>(*cssRule).styleSheet()); 64 break; 65 case CSSRule::LAYER_RULE: 66 collect(downcast<CSSLayerRule>(cssRule)); 63 67 break; 64 68 case CSSRule::MEDIA_RULE: -
trunk/Source/WebInspectorUI/ChangeLog
r286458 r286558 1 2021-12-06 Patrick Angle <pangle@apple.com> 2 3 Web Inspector: Support Cascade Layers in the Styles sidebar 4 https://bugs.webkit.org/show_bug.cgi?id=233208 5 6 Reviewed by Devin Rousso. 7 8 * UserInterface/Models/CSSGrouping.js: 9 (WI.CSSGrouping): 10 (WI.CSSGrouping.prototype.get isLayer): 11 (WI.CSSGrouping.prototype.get prefix): 12 - Update `CSSGrouping` to support `@layer` rules, and make `text` optional for a grouping, since anonymous layers 13 will not have a name. 14 15 * UserInterface/Models/CSSStyleDeclaration.js: 16 (WI.CSSStyleDeclaration.prototype.generateFormattedText): 17 - Ensure that spacing remains correct and "null" isn't shown for groupings without text. 18 19 * UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js: 20 (WI.SpreadsheetCSSStyleDeclarationSection.prototype.initialLayout): 21 - When merging layer groups, ensure that a "." is used as a separator, and that each group has a name (to 22 prevent having a hanging period or the "null" text appearing). 23 1 24 2021-12-02 Devin Rousso <drousso@apple.com> 2 25 -
trunk/Source/WebInspectorUI/UserInterface/Models/CSSGrouping.js
r248602 r286558 1 1 /* 2 * Copyright (C) 2019 Apple Inc. All rights reserved.2 * Copyright (C) 2019, 2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 { 30 30 console.assert(Object.values(CSSGrouping.Type).includes(type)); 31 console.assert( typeof text === "string" && text.length);31 console.assert(!text || (typeof text === "string" && text.length)); 32 32 console.assert(!sourceCodeLocation || sourceCodeLocation instanceof WI.SourceCodeLocation); 33 33 34 34 this._type = type; 35 this._text = text ;35 this._text = text || null; 36 36 this._sourceCodeLocation = sourceCodeLocation || null; 37 37 } … … 56 56 } 57 57 58 get isLayer() 59 { 60 return this._type === WI.CSSGrouping.Type.LayerRule 61 || this._type === WI.CSSGrouping.Type.LayerImportRule; 62 } 63 58 64 get prefix() 59 65 { 60 66 if (this.isSupports) 61 67 return "@supports"; 68 69 if (this.isLayer) 70 return "@layer"; 62 71 63 72 console.assert(this.isMedia); … … 72 81 MediaStyleNode: "media-style-node", 73 82 SupportsRule: "supports-rule", 83 LayerRule: "layer-rule", 84 LayerImportRule: "layer-import-rule", 74 85 }; -
trunk/Source/WebInspectorUI/UserInterface/Models/CSSStyleDeclaration.js
r285896 r286558 471 471 let indentString = WI.indentString(); 472 472 let styleText = ""; 473 let groupings = this.groupings.filter((grouping) => grouping.text !== "all");473 let groupings = this.groupings.filter((grouping) => !grouping.isMedia || grouping.text !== "all"); 474 474 let groupingsCount = groupings.length; 475 475 … … 479 479 styleText += indentString.repeat(groupingsCount - i - 1); 480 480 481 styleText += groupings[i].prefix + " " + groupings[i].text + " {"; 481 styleText += groupings[i].prefix; 482 if (groupings[i].text) 483 styleText += " " + groupings[i].text; 484 styleText += " {"; 482 485 483 486 if (options.multiline) -
trunk/Source/WebInspectorUI/UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js
r283723 r286558 103 103 this._element.classList.add("has-icon", iconClassName); 104 104 105 let groupings = this._style.groupings.filter((grouping) => grouping.text !== "all");105 let groupings = this._style.groupings.filter((grouping) => !grouping.isMedia || grouping.text !== "all").reverse(); 106 106 if (groupings.length) { 107 107 let groupingsElement = this.element.appendChild(document.createElement("div")); … … 109 109 110 110 let currentGroupingType = null; 111 let currentGroupingHadText = false; 111 112 let groupingTypeElement = null; 112 113 this._groupingElements = groupings.map((grouping) => { 113 if (grouping.type !== currentGroupingType ) {114 if (grouping.type !== currentGroupingType || !grouping.text || !currentGroupingHadText) { 114 115 groupingTypeElement = groupingsElement.appendChild(document.createElement("div")); 115 116 groupingTypeElement.classList.add("grouping"); … … 117 118 currentGroupingType = grouping.type; 118 119 } else 119 groupingTypeElement.append(", "); 120 120 groupingTypeElement.append(grouping.isLayer && grouping.text ? "." : ", "); 121 122 currentGroupingHadText = !!grouping.text; 121 123 let span = groupingTypeElement.appendChild(document.createElement("span")); 122 span.textContent = grouping.text ;124 span.textContent = grouping.text ?? ""; 123 125 return span; 124 126 });
Note: See TracChangeset
for help on using the changeset viewer.