Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 0d990da3c01519907affff83cfdee71283f2ef4f
      
https://github.com/WebKit/WebKit/commit/0d990da3c01519907affff83cfdee71283f2ef4f
  Author: Patrick Angle <[email protected]>
  Date:   2022-11-07 (Mon, 07 Nov 2022)

  Changed paths:
    M LayoutTests/inspector/css/add-css-property-expected.txt
    M LayoutTests/inspector/css/add-css-property.html
    M Source/WebInspectorUI/UserInterface/Models/CSSStyleDeclaration.js
    M Source/WebInspectorUI/UserInterface/Models/DOMNodeStyles.js

  Log Message:
  -----------
  Web Inspector: Adding a new style property to a rule after a commented out 
property results in incorrect style text/bad frontend state
https://bugs.webkit.org/show_bug.cgi?id=247139
rdar://88824802

Reviewed by Devin Rousso.

Two problems existed that together caused us to incorrectly associate incoming 
edits to properties following a
commented-out property with that commented out property, or to create a new 
WI.CSSProperty instead of using the existing
one that is being edited, resulting in various garbage text being written to 
the style sheet.

The first issue is in how we handle `pendingProperties` in 
WI.CSSStyleDeclaration. We currently consider a pending
property to be one that is not enabled (e.g. commented out), which does not 
match the intent of the comments in the
code and nor does it match its usage. The intended use for `pendingProperties` 
is to house properties that are no
longer part of the CSSStyleDeclaration after an update, presumedly to allow us 
to reuse `WI.CSSProperty`s during
undo/redo operations. It is also imaginable that this is where properties being 
edited should briefly exist if after
their creation, we receive an update from the backend before we have received 
the update that commits the property under
edit.

The misclassification of what belongs in `pendingProperties` is was not enough 
by itself to cause the issue however. The
issues arose when DOMNodeStyles._parseStylePropertyPayload attempted to 
associate incoming property payloads with existing
WI.CSSProperty objects. For pending properties, we only have the property name 
as a point of verification, which is ripe
for collision when looking at the array of "Pending Properties" that includes 
commented-out properties.

In addition to properly classifying a "pending" property we need to consider 
all existing properties for an earlier
comparison between payload properties and WI.CSSProperty objects in 
WI.DOMNodeStyles.prototype._parseStylePropertyPayload.
We currently are only considering enabled properties for direct matches, even 
though a commented-out property could
still be a direct match by name and index to an existing property. Failing to 
make this association results in us
unnecessarily creating a new WI.CSSProperty for the commented out rule, which 
is turn grows the number of "Pending
Properties" as we toss objects out of the main set of properties for a 
CSSStyleDeclaration and into the "Pending
Properties", where they then can end up colliding by name inside 
WI.DOMNodeStyles.prototype._parseStylePropertyPayload.

We instead need to use all of the existing properties to check for a direct 
name+index match to catch all possible
properties for reuse.

It seems likely that this regressed sometime during the bringup of the 
Spreadsheet* editor.
https://commits.webkit.org/208214@main, while likely not the cause, renamed the 
trinity of property arrays as follows:
`properties` -> `enabledProperties`
`allProperties` -> `properties`
`allVisibleProperties` -> `visibleProperties`

It seems ripe for misunderstanding that previously we had both an 
`allProperties` and a `properties` and I suspect that
the root misunderstanding of this issue stems from that. A quick audit of other 
uses of `enabledProperties` in our
current code shows generally reasonable usage as far as I can tell.

* LayoutTests/inspector/css/add-css-property-expected.txt:
* LayoutTests/inspector/css/add-css-property.html:

* Source/WebInspectorUI/UserInterface/Models/CSSStyleDeclaration.js:
* Source/WebInspectorUI/UserInterface/Models/DOMNodeStyles.js:
(WI.DOMNodeStyles.prototype._parseStylePropertyPayload):

Canonical link: https://commits.webkit.org/256410@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to