⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286844 in webkit


Ignore:
Timestamp:
Dec 10, 2021, 4:23:49 AM (5 years ago)
Author:
Razvan Caliman
Message:

Web Inspector: Extract a specialized CSSNameCompletions from CSSCompletions
https://bugs.webkit.org/show_bug.cgi?id=233369
<rdar://83206520>

Reviewed by Devin Rousso.

WI.CSSPropertyNameCompletions is a long-lived object that holds the list of all CSS properties
supported by the target. It is instantiated only once on Web Inspector startup.

By contrast, WI.CSSCompletions is an object instantiated as often as needed with
lists of property values, CSS function values, etc. It holds the generic logic for
matching values against a given query.

The specialized logic for CSS property names was mixed-in with the generic logic in WI.CSSCompletions.
The main difference is in the format of the payload provided:

  • an array of objects with key/value pairs for WI.CSSPropertyNameCompletions.
  • an array of strings for general purpose WI.CSSCompletions.

This patch reduces the complexity in WI.Completions:

  • moves the one-time initialization method to WI.cssManager.initializeCSSCompletions.
  • simplifies WI.Completions constructor to expect just an array of strings.
  • introduces WI.CSSPropertyNameCompletions as a sub-class of WI.CSSCompletions where its constructor is specialized to handle the payload received from the backend.
  • moves the WI.CSSPropertyNameCompletions instance to WI.cssManager.cssPropertyNameCompletions.
  • removes unused accessors for navigating the list of matched completions.
  • UserInterface/Base/Main.js:

(WI.performOneTimeFrontendInitializationsUsingTarget):

  • UserInterface/Controllers/CSSManager.js:

(WI.CSSManager):
(WI.CSSManager.prototype.initializeCSSPropertyNameCompletions.):
(WI.CSSManager.prototype.initializeCSSPropertyNameCompletions):
Moved the initializiation method for objects used to get CSS completions
from WI.CSSCompletions with data from the backed to a more appropriate place.

(WI.CSSManager.prototype.get propertyNameCompletions):

  • UserInterface/Controllers/CodeMirrorCompletionController.js:

(WI.CodeMirrorCompletionController.prototype._generateCSSCompletions):

  • UserInterface/Main.html:
  • UserInterface/Models/CSSCompletions.js:

(WI.CSSCompletions.prototype._firstIndexOfPrefix):
(WI.CSSCompletions):
(WI.CSSCompletions.initializeCSSCompletions.): Deleted.
(WI.CSSCompletions.initializeCSSCompletions.collectPropertyNameForCodeMirror): Deleted.
(WI.CSSCompletions.initializeCSSCompletions.propertiesCallback): Deleted.
(WI.CSSCompletions.initializeCSSCompletions.fontFamilyNamesCallback): Deleted.
(WI.CSSCompletions.initializeCSSCompletions): Deleted.
Moved to WI.CSSManager.

(WI.CSSCompletions.prototype.next): Deleted.
(WI.CSSCompletions.prototype.previous): Deleted.
(WI.CSSCompletions.prototype._closest): Deleted.
Removed unused methods for navigating the completions list.
This behavior is encapsulated in WI.CompletionSuggestionsView.

(WI.CSSCompletions.prototype.isValidPropertyName): Deleted.
Moved to WI.CSSPropertyNameCompletions.

  • UserInterface/Models/CSSKeywordCompletions.js:

(WI.CSSKeywordCompletions.forPartialPropertyName):

  • UserInterface/Models/CSSPropertyNameCompletions.js: Added.

(WI.CSSPropertyNameCompletions.prototype.isValidPropertyName):
(WI.CSSPropertyNameCompletions):

  • UserInterface/Test.html:
  • UserInterface/Test/Test.js:

(WI.performOneTimeFrontendInitializationsUsingTarget):

  • UserInterface/Views/SpreadsheetStyleProperty.js:

(WI.SpreadsheetStyleProperty.prototype.updateStatus):
(WI.SpreadsheetStyleProperty.prototype._addCSSDocumentationButton):

Location:
trunk/Source/WebInspectorUI
Files:
1 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebInspectorUI/ChangeLog

    r286803 r286844  
     12021-12-10  Razvan Caliman  <rcaliman@apple.com>
     2
     3        Web Inspector: Extract a specialized CSSNameCompletions from CSSCompletions
     4        https://bugs.webkit.org/show_bug.cgi?id=233369
     5        <rdar://83206520>
     6
     7        Reviewed by Devin Rousso.
     8
     9        `WI.CSSPropertyNameCompletions` is a long-lived object that holds the list of all CSS properties
     10        supported by the target. It is instantiated only once on Web Inspector startup.
     11
     12        By contrast, `WI.CSSCompletions` is an object instantiated as often as needed with
     13        lists of property values, CSS function values, etc. It holds the generic logic for
     14        matching values against a given query.
     15
     16        The specialized logic for CSS property names was mixed-in with the generic logic in `WI.CSSCompletions`.
     17        The main difference is in the format of the payload provided:
     18        - an array of objects with key/value pairs for `WI.CSSPropertyNameCompletions`.
     19        - an array of strings for general purpose `WI.CSSCompletions`.
     20
     21        This patch reduces the complexity in `WI.Completions`:
     22        - moves the one-time initialization method to `WI.cssManager.initializeCSSCompletions`.
     23        - simplifies `WI.Completions` constructor to expect just an array of strings.
     24        - introduces `WI.CSSPropertyNameCompletions` as a sub-class of `WI.CSSCompletions` where its constructor
     25          is specialized to handle the payload received from the backend.
     26        - moves the `WI.CSSPropertyNameCompletions` instance to `WI.cssManager.cssPropertyNameCompletions`.
     27        - removes unused accessors for navigating the list of matched completions.
     28
     29        * UserInterface/Base/Main.js:
     30        (WI.performOneTimeFrontendInitializationsUsingTarget):
     31        * UserInterface/Controllers/CSSManager.js:
     32        (WI.CSSManager):
     33        (WI.CSSManager.prototype.initializeCSSPropertyNameCompletions.):
     34        (WI.CSSManager.prototype.initializeCSSPropertyNameCompletions):
     35        Moved the initializiation method for objects used to get CSS completions
     36        from `WI.CSSCompletions` with data from the backed to a more appropriate place.
     37
     38        (WI.CSSManager.prototype.get propertyNameCompletions):
     39        * UserInterface/Controllers/CodeMirrorCompletionController.js:
     40        (WI.CodeMirrorCompletionController.prototype._generateCSSCompletions):
     41        * UserInterface/Main.html:
     42        * UserInterface/Models/CSSCompletions.js:
     43        (WI.CSSCompletions.prototype._firstIndexOfPrefix):
     44        (WI.CSSCompletions):
     45        (WI.CSSCompletions.initializeCSSCompletions.): Deleted.
     46        (WI.CSSCompletions.initializeCSSCompletions.collectPropertyNameForCodeMirror): Deleted.
     47        (WI.CSSCompletions.initializeCSSCompletions.propertiesCallback): Deleted.
     48        (WI.CSSCompletions.initializeCSSCompletions.fontFamilyNamesCallback): Deleted.
     49        (WI.CSSCompletions.initializeCSSCompletions): Deleted.
     50        Moved to `WI.CSSManager`.
     51
     52        (WI.CSSCompletions.prototype.next): Deleted.
     53        (WI.CSSCompletions.prototype.previous): Deleted.
     54        (WI.CSSCompletions.prototype._closest): Deleted.
     55        Removed unused methods for navigating the completions list.
     56        This behavior is encapsulated in `WI.CompletionSuggestionsView`.
     57
     58        (WI.CSSCompletions.prototype.isValidPropertyName): Deleted.
     59        Moved to `WI.CSSPropertyNameCompletions`.
     60
     61        * UserInterface/Models/CSSKeywordCompletions.js:
     62        (WI.CSSKeywordCompletions.forPartialPropertyName):
     63        * UserInterface/Models/CSSPropertyNameCompletions.js: Added.
     64        (WI.CSSPropertyNameCompletions.prototype.isValidPropertyName):
     65        (WI.CSSPropertyNameCompletions):
     66        * UserInterface/Test.html:
     67        * UserInterface/Test/Test.js:
     68        (WI.performOneTimeFrontendInitializationsUsingTarget):
     69        * UserInterface/Views/SpreadsheetStyleProperty.js:
     70        (WI.SpreadsheetStyleProperty.prototype.updateStatus):
     71        (WI.SpreadsheetStyleProperty.prototype._addCSSDocumentationButton):
     72
    1732021-12-09  Brent Fulgham  <bfulgham@apple.com>
    274
  • trunk/Source/WebInspectorUI/UserInterface/Base/Main.js

    r286329 r286844  
    624624    if (!WI.__didPerformCSSInitialization && target.hasDomain("CSS")) {
    625625        WI.__didPerformCSSInitialization = true;
    626         WI.CSSCompletions.initializeCSSCompletions(target);
     626        WI.cssManager.initializeCSSPropertyNameCompletions(target);
    627627    }
    628628};
     
    811811
    812812        if (WI.mainTarget.hasDomain("CSS"))
    813             WI.CSSCompletions.initializeCSSCompletions(WI.assumingMainTarget());
     813            WI.cssManager.initializeCSSPropertyNameCompletions(WI.assumingMainTarget());
    814814
    815815        if (WI.mainTarget.hasDomain("DOM"))
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/CSSManager.js

    r285502 r286844  
    4949        this._defaultAppearance = null;
    5050        this._forcedAppearance = null;
     51
     52        this._propertyNameCompletions = null;
    5153    }
    5254
     
    5759        if (target.hasDomain("CSS"))
    5860            target.CSSAgent.enable();
     61    }
     62
     63    initializeCSSPropertyNameCompletions(target)
     64    {
     65        console.assert(target.hasDomain("CSS"));
     66
     67        if (this._propertyNameCompletions)
     68            return;
     69
     70        target.CSSAgent.getSupportedCSSProperties((error, cssProperties) => {
     71            if (error)
     72                return;
     73
     74            this._propertyNameCompletions = new WI.CSSPropertyNameCompletions(cssProperties);
     75
     76            WI.CSSKeywordCompletions.addCustomCompletions(cssProperties);
     77
     78            // CodeMirror is not included by tests so we shouldn't assume it always exists.
     79            // If it isn't available we skip MIME type associations.
     80            if (!window.CodeMirror)
     81                return;
     82
     83            let propertyNamesForCodeMirror = {};
     84            let valueKeywordsForCodeMirror = {"inherit": true, "initial": true, "unset": true, "revert": true, "var": true, "env": true};
     85            let colorKeywordsForCodeMirror = {};
     86
     87            function nameForCodeMirror(name) {
     88                // CodeMirror parses the vendor prefix separate from the property or keyword name,
     89                // so we need to strip vendor prefixes from our names. Also strip function parenthesis.
     90                return name.replace(/^-[^-]+-/, "").replace(/\(\)$/, "").toLowerCase();
     91            }
     92
     93            for (let property of cssProperties) {
     94                // Properties can also be value keywords, like when used in a transition.
     95                // So we add them to both lists.
     96                let codeMirrorPropertyName = nameForCodeMirror(property.name);
     97                propertyNamesForCodeMirror[codeMirrorPropertyName] = true;
     98                valueKeywordsForCodeMirror[codeMirrorPropertyName] = true;
     99            }
     100
     101            for (let propertyName in WI.CSSKeywordCompletions._propertyKeywordMap) {
     102                let keywords = WI.CSSKeywordCompletions._propertyKeywordMap[propertyName];
     103                for (let keyword of keywords) {
     104                    // Skip numbers, like the ones defined for font-weight.
     105                    if (keyword === WI.CSSKeywordCompletions.AllPropertyNamesPlaceholder || !isNaN(Number(keyword)))
     106                        continue;
     107                    valueKeywordsForCodeMirror[nameForCodeMirror(keyword)] = true;
     108                }
     109            }
     110
     111            for (let color of WI.CSSKeywordCompletions._colors)
     112                colorKeywordsForCodeMirror[nameForCodeMirror(color)] = true;
     113
     114            function updateCodeMirrorCSSMode(mimeType) {
     115                let modeSpec = CodeMirror.resolveMode(mimeType);
     116
     117                console.assert(modeSpec.propertyKeywords);
     118                console.assert(modeSpec.valueKeywords);
     119                console.assert(modeSpec.colorKeywords);
     120
     121                modeSpec.propertyKeywords = propertyNamesForCodeMirror;
     122                modeSpec.valueKeywords = valueKeywordsForCodeMirror;
     123                modeSpec.colorKeywords = colorKeywordsForCodeMirror;
     124
     125                CodeMirror.defineMIME(mimeType, modeSpec);
     126            }
     127
     128            updateCodeMirrorCSSMode("text/css");
     129            updateCodeMirrorCSSMode("text/x-scss");
     130        });
     131
     132        if (target.hasCommand("CSS.getSupportedSystemFontFamilyNames")) {
     133            target.CSSAgent.getSupportedSystemFontFamilyNames((error, fontFamilyNames) =>{
     134                if (error)
     135                    return;
     136
     137                WI.CSSKeywordCompletions.addPropertyCompletionValues("font-family", fontFamilyNames);
     138                WI.CSSKeywordCompletions.addPropertyCompletionValues("font", fontFamilyNames);
     139            });
     140        }
    59141    }
    60142
     
    181263    // Public
    182264
     265    get propertyNameCompletions() { return this._propertyNameCompletions; }
     266
    183267    get preferredColorFormat()
    184268    {
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorCompletionController.js

    r269023 r286844  
    628628
    629629        // Complete property names.
    630         return WI.CSSCompletions.cssNameCompletions.startsWith(this._prefix);
     630        return WI.cssManager.propertyNameCompletions.startsWith(this._prefix);
    631631    }
    632632
  • trunk/Source/WebInspectorUI/UserInterface/Main.html

    r286611 r286844  
    397397    <script src="Models/CSSKeywordCompletions.js"></script>
    398398    <script src="Models/CSSProperty.js"></script>
     399    <script src="Models/CSSPropertyNameCompletions.js"></script>
    399400    <script src="Models/CSSRule.js"></script>
    400401    <script src="Models/CSSSelector.js"></script>
  • trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js

    r286611 r286844  
    3434WI.CSSCompletions = class CSSCompletions
    3535{
    36     constructor(properties, acceptEmptyPrefix)
    37     {
    38         this._values = [];
    39 
    40         // The `properties` parameter can be either a list of objects with 'name' / 'longhand'
    41         // properties when initialized from the protocol for CSSCompletions.cssNameCompletions.
    42         // Or it may just a list of strings when quickly initialized for other completion purposes.
    43         if (properties.length && typeof properties[0] === "string")
    44             this._values.pushAll(properties);
    45         else {
    46             for (var property of properties) {
    47                 var propertyName = property.name;
    48                 console.assert(propertyName);
    49 
    50                 this._values.push(propertyName);
    51 
    52                 let aliases = property.aliases;
    53                 if (aliases)
    54                     this._values.pushAll(aliases);
    55             }
    56         }
    57 
     36    constructor(values, {acceptEmptyPrefix} = {})
     37    {
     38        console.assert(Array.isArray(values), values);
     39        console.assert(typeof values[0] === "string", "Expect an array of string values", values);
     40
     41        this._values = values.slice();
    5842        this._values.sort();
    59 
    60         this._acceptEmptyPrefix = acceptEmptyPrefix;
     43        this._acceptEmptyPrefix = !!acceptEmptyPrefix;
    6144        this._queryController = null;
    6245    }
    6346
    6447    // Static
    65 
    66     static initializeCSSCompletions(target)
    67     {
    68         console.assert(target.hasDomain("CSS"));
    69 
    70         if (WI.CSSCompletions.cssNameCompletions)
    71             return;
    72 
    73         function propertiesCallback(error, cssProperties)
    74         {
    75             if (error)
    76                 return;
    77 
    78             WI.CSSCompletions.cssNameCompletions = new WI.CSSCompletions(cssProperties, false);
    79 
    80             WI.CSSKeywordCompletions.addCustomCompletions(cssProperties);
    81 
    82             // CodeMirror is not included by tests so we shouldn't assume it always exists.
    83             // If it isn't available we skip MIME type associations.
    84             if (!window.CodeMirror)
    85                 return;
    86 
    87             var propertyNamesForCodeMirror = {};
    88             var valueKeywordsForCodeMirror = {"inherit": true, "initial": true, "unset": true, "revert": true, "var": true, "env": true};
    89             var colorKeywordsForCodeMirror = {};
    90 
    91             function nameForCodeMirror(name)
    92             {
    93                 // CodeMirror parses the vendor prefix separate from the property or keyword name,
    94                 // so we need to strip vendor prefixes from our names. Also strip function parenthesis.
    95                 return name.replace(/^-[^-]+-/, "").replace(/\(\)$/, "").toLowerCase();
    96             }
    97 
    98             function collectPropertyNameForCodeMirror(propertyName)
    99             {
    100                 // Properties can also be value keywords, like when used in a transition.
    101                 // So we add them to both lists.
    102                 var codeMirrorPropertyName = nameForCodeMirror(propertyName);
    103                 propertyNamesForCodeMirror[codeMirrorPropertyName] = true;
    104                 valueKeywordsForCodeMirror[codeMirrorPropertyName] = true;
    105             }
    106 
    107             for (var property of cssProperties)
    108                 collectPropertyNameForCodeMirror(property.name);
    109 
    110             for (var propertyName in WI.CSSKeywordCompletions._propertyKeywordMap) {
    111                 var keywords = WI.CSSKeywordCompletions._propertyKeywordMap[propertyName];
    112                 for (var i = 0; i < keywords.length; ++i) {
    113                     // Skip numbers, like the ones defined for font-weight.
    114                     if (keywords[i] === WI.CSSKeywordCompletions.AllPropertyNamesPlaceholder || !isNaN(Number(keywords[i])))
    115                         continue;
    116                     valueKeywordsForCodeMirror[nameForCodeMirror(keywords[i])] = true;
    117                 }
    118             }
    119 
    120             WI.CSSKeywordCompletions._colors.forEach(function(colorName) {
    121                 colorKeywordsForCodeMirror[nameForCodeMirror(colorName)] = true;
    122             });
    123 
    124             function updateCodeMirrorCSSMode(mimeType)
    125             {
    126                 var modeSpec = CodeMirror.resolveMode(mimeType);
    127 
    128                 console.assert(modeSpec.propertyKeywords);
    129                 console.assert(modeSpec.valueKeywords);
    130                 console.assert(modeSpec.colorKeywords);
    131 
    132                 modeSpec.propertyKeywords = propertyNamesForCodeMirror;
    133                 modeSpec.valueKeywords = valueKeywordsForCodeMirror;
    134                 modeSpec.colorKeywords = colorKeywordsForCodeMirror;
    135 
    136                 CodeMirror.defineMIME(mimeType, modeSpec);
    137             }
    138 
    139             updateCodeMirrorCSSMode("text/css");
    140             updateCodeMirrorCSSMode("text/x-scss");
    141         }
    142 
    143         function fontFamilyNamesCallback(error, fontFamilyNames)
    144         {
    145             if (error)
    146                 return;
    147 
    148             WI.CSSKeywordCompletions.addPropertyCompletionValues("font-family", fontFamilyNames);
    149             WI.CSSKeywordCompletions.addPropertyCompletionValues("font", fontFamilyNames);
    150         }
    151 
    152         target.CSSAgent.getSupportedCSSProperties(propertiesCallback);
    153         if (target.hasCommand("CSS.getSupportedSystemFontFamilyNames"))
    154             target.CSSAgent.getSupportedSystemFontFamilyNames(fontFamilyNamesCallback);
    155     }
    15648
    15749    static completeUnbalancedValue(value)
     
    312204        return foundIndex;
    313205    }
    314 
    315     next(str, prefix)
    316     {
    317         return this._closest(str, prefix, 1);
    318     }
    319 
    320     previous(str, prefix)
    321     {
    322         return this._closest(str, prefix, -1);
    323     }
    324 
    325     _closest(str, prefix, shift)
    326     {
    327         if (!str)
    328             return "";
    329 
    330         var index = this._values.indexOf(str);
    331         if (index === -1)
    332             return "";
    333 
    334         if (!prefix) {
    335             index = (index + this._values.length + shift) % this._values.length;
    336             return this._values[index];
    337         }
    338 
    339         var propertiesWithPrefix = this.startsWith(prefix);
    340         var j = propertiesWithPrefix.indexOf(str);
    341         j = (j + propertiesWithPrefix.length + shift) % propertiesWithPrefix.length;
    342         return propertiesWithPrefix[j];
    343     }
    344 
    345     isValidPropertyName(name)
    346     {
    347         return this._values.includes(name);
    348     }
    349206};
    350 
    351 WI.CSSCompletions.cssNameCompletions = null;
    352207
    353208WI.CSSCompletions.lengthUnits = new Set([
  • trunk/Source/WebInspectorUI/UserInterface/Models/CSSKeywordCompletions.js

    r286803 r286844  
    4242
    4343    if (!text.length && allowEmptyPrefix)
    44         return {prefix: text, completions: WI.CSSCompletions.cssNameCompletions.values};
     44        return {prefix: text, completions: WI.cssManager.propertyNameCompletions.values};
    4545
    4646    let completions;
    4747    if (useFuzzyMatching)
    48         completions = WI.CSSCompletions.cssNameCompletions.executeQuery(text);
     48        completions = WI.cssManager.propertyNameCompletions.executeQuery(text);
    4949    else
    50         completions = WI.CSSCompletions.cssNameCompletions.startsWith(text);
     50        completions = WI.cssManager.propertyNameCompletions.startsWith(text);
    5151
    5252    return {prefix: text, completions};
     
    171171    }
    172172
    173     if (acceptedKeywords.includes(WI.CSSKeywordCompletions.AllPropertyNamesPlaceholder) && WI.CSSCompletions.cssNameCompletions) {
     173    if (acceptedKeywords.includes(WI.CSSKeywordCompletions.AllPropertyNamesPlaceholder) && WI.cssManager.propertyNameCompletions) {
    174174        acceptedKeywords.remove(WI.CSSKeywordCompletions.AllPropertyNamesPlaceholder);
    175         acceptedKeywords.pushAll(WI.CSSCompletions.cssNameCompletions.values);
     175        acceptedKeywords.pushAll(WI.cssManager.propertyNameCompletions.values);
    176176    }
    177177
    178     return new WI.CSSCompletions(Array.from(new Set(acceptedKeywords)), true);
     178    return new WI.CSSCompletions(Array.from(new Set(acceptedKeywords)), {acceptEmptyPrefix: true});
    179179};
    180180
     
    227227    }
    228228
    229     return new WI.CSSCompletions(suggestions, true);
     229    return new WI.CSSCompletions(suggestions, {acceptEmptyPrefix: true});
    230230};
    231231
  • trunk/Source/WebInspectorUI/UserInterface/Test.html

    r286611 r286844  
    133133    <script src="Models/CSSKeywordCompletions.js"></script>
    134134    <script src="Models/CSSProperty.js"></script>
     135    <script src="Models/CSSPropertyNameCompletions.js"></script>
    135136    <script src="Models/CSSRule.js"></script>
    136137    <script src="Models/CSSSelector.js"></script>
  • trunk/Source/WebInspectorUI/UserInterface/Test/Test.js

    r260847 r286844  
    126126    if (!WI.__didPerformCSSInitialization && target.hasDomain("CSS")) {
    127127        WI.__didPerformCSSInitialization = true;
    128         WI.CSSCompletions.initializeCSSCompletions(target);
     128        WI.cssManager.initializeCSSPropertyNameCompletions(target);
    129129    }
    130130};
  • trunk/Source/WebInspectorUI/UserInterface/Views/SpreadsheetStyleProperty.js

    r286611 r286844  
    301301            classNames.push("other-vendor");
    302302        else if (this._hasInvalidVariableValue || (!this._property.valid && this._property.value !== "")) {
    303             let propertyNameIsValid = false;
    304             if (WI.CSSCompletions.cssNameCompletions)
    305                 propertyNameIsValid = WI.CSSCompletions.cssNameCompletions.isValidPropertyName(this._property.name);
    306 
    307303            classNames.push("has-warning");
    308304
    309             if (!propertyNameIsValid) {
     305            if (!WI.cssManager.propertyNameCompletions?.isValidPropertyName(this._property.name)) {
    310306                classNames.push("invalid-name");
    311307                elementTitle = WI.UIString("Unsupported property name");
     
    540536            return;
    541537
    542         if (!WI.CSSCompletions.cssNameCompletions.isValidPropertyName(this._property.name))
     538        if (!WI.cssManager.propertyNameCompletions?.isValidPropertyName(this._property.name))
    543539            return;
    544540
Note: See TracChangeset for help on using the changeset viewer.