<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>137189</bug_id>
          
          <creation_ts>2014-09-27 23:57:05 -0700</creation_ts>
          <short_desc>Try to detect no-op innerHTML mutations and avoid repainting.</short_desc>
          <delta_ts>2022-08-12 22:07:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>LATER</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar, Performance</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andreas Kling">kling</reporter>
          <assigned_to name="Andreas Kling">kling</assigned_to>
          <cc>ahmad.saleem792</cc>
    
    <cc>ap</cc>
    
    <cc>barraclough</cc>
    
    <cc>bfulgham</cc>
    
    <cc>darin</cc>
    
    <cc>ggaren</cc>
    
    <cc>kling</cc>
    
    <cc>koivisto</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1037752</commentid>
    <comment_count>0</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2014-09-27 23:57:05 -0700</bug_when>
    <thetext>We should try to avoid repainting when setting an element&apos;s innerHTML a HTML string that&apos;s equivalent to the existing DOM subtree.

&lt;rdar://problem/18241048&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1037753</commentid>
    <comment_count>1</comment_count>
      <attachid>238805</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2014-09-28 00:11:12 -0700</bug_when>
    <thetext>Created attachment 238805
Patch

Let&apos;s see what EWS thinks of this..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1037763</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2014-09-28 00:39:00 -0700</bug_when>
    <thetext>A node that does not have a JS wrapper could still be accessible from JS, e.g. if it&apos;s part of editing undo stack, XPath node set, and there are more cases like that. So there are many ways in which this change is observable,  

I think that something very similar has been tried before, but I do not know how to find when. Perhaps it was part of Acid3 performance work? Darin may remember better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1037779</commentid>
    <comment_count>3</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2014-09-28 09:46:03 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; A node that does not have a JS wrapper could still be accessible from JS, e.g. if it&apos;s part of editing undo stack, XPath node set, and there are more cases like that. So there are many ways in which this change is observable,  

Perhaps we could use something like hasOneRef()?

&gt; 
&gt; I think that something very similar has been tried before, but I do not know how to find when. Perhaps it was part of Acid3 performance work? Darin may remember better.

This was attempted before, for all tag names, but broke plugin loading IIRC. My approach is to have a small whitelist of simple tags.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1037845</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-09-28 18:16:35 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; A node that does not have a JS wrapper could still be accessible from JS, e.g. if it&apos;s part of editing undo stack, XPath node set, and there are more cases like that. So there are many ways in which this change is observable.

I’d like to understand this better. I agree that a node can be accessible from JavaScript even if it doesn’t have a wrapper. But how would the lack of change in the identity of a node be observable if the node has no properties and does not appear as a property of any JavaScript object (including a collection)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1037890</commentid>
    <comment_count>5</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2014-09-29 00:41:05 -0700</bug_when>
    <thetext>I think that the difference is observable in a scenario like:

- we have a node accessible from JavaScript;
- JS code performs an assignment to innerHTML that we optimize away;
- then JS code accesses the node, and finds one that is in document tree, instead of one outside the tree.

In the case of XPath, document mutation should invalidate result sets, but as we don&apos;t do the mutation, the sets remain intact.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1038708</commentid>
    <comment_count>6</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2014-10-01 16:25:09 -0700</bug_when>
    <thetext>It&apos;s worth noting that we already short-circuit innerHTML mutations if they are found to only affect the content of a single text node:

    if (hasOneTextChild(&amp;containerNode.get()) &amp;&amp; hasOneTextChild(fragment.get())) {
        downcast&lt;Text&gt;(*containerNode-&gt;firstChild()).setData(downcast&lt;Text&gt;(*fragment-&gt;firstChild()).data(), ec); 
        return;
    }

I wonder if there&apos;s really any harm in keeping the old DOM subtree alive, even if it&apos;s observable from JS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1890939</commentid>
    <comment_count>7</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2022-08-12 10:57:34 -0700</bug_when>
    <thetext>Patch does not have any test case but I can see this has not landed in Webkit Github and the source does not contain code from the patch:

https://github.com/WebKit/WebKit/blob/0eaa48964a00d47f5b1dd9d5fd8b589d5ac74b13/Source/WebCore/editing/markup.cpp

rniwa@webkit.org - Is it something needed now or this can be marked as &quot;RESOLVED LATER&quot;? Would appreciate your input?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1891089</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2022-08-12 22:07:22 -0700</bug_when>
    <thetext>Yeah, -&gt; Later.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>238805</attachid>
            <date>2014-09-28 00:11:12 -0700</date>
            <delta_ts>2014-09-28 00:11:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-137189.diff</filename>
            <type>text/plain</type>
            <size>5287</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBhMzQ4MWMwLi44MjFhOTk4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjgg
QEAKKzIwMTQtMDktMjggIEFuZHJlYXMgS2xpbmcgIDxha2xpbmdAYXBwbGUuY29tPgorCisgICAg
ICAgIFRyeSB0byBkZXRlY3Qgbm8tb3AgaW5uZXJIVE1MIG11dGF0aW9ucyBhbmQgYXZvaWQgcmVw
YWludGluZy4KKyAgICAgICAgPGh0dHBzOi8vd2Via2l0Lm9yZy9iLzEzNzE4OT4KKyAgICAgICAg
PHJkYXI6Ly9wcm9ibGVtLzE4MjQxMDQ4PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFRyeSB0byBpZ25vcmUgaW5uZXJIVE1MIG11dGF0aW9ucyB3aGVy
ZSB0aGUgRE9NIHRyZWUgd291bGQgYmUgaWRlbnRpY2FsCisgICAgICAgIGFmdGVyIHRoZSBtdXRh
dGlvbi4gV2UgYWxzbyByZXF1aXJlIHRoYXQgdGhlcmUgYXJlIG5vIEpTIHdyYXBwZXJzLCBvcgor
ICAgICAgICBldmVudCBoYW5kbGVycyByZWdpc3RlcmVkLiBBbmQgd2Ugb25seSBkbyB0aGlzIGZv
ciB0ZXh0IG5vZGVzIGFuZCBhIHNtYWxsCisgICAgICAgIHN1YnNldCBvZiBIVE1MIHRhZ3MuCisK
KyAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjaGFuZ2UgaXMgdG8gYXZvaWQgcmVwZWF0ZWQs
IGlkZW50aWNhbCByZXBhaW50cyBvbgorICAgICAgICBzaXRlcyB3aXRoIHJlbGF0aXZlIHRpbWVz
dGFtcHMsIHN1Y2ggYXMgdGhlICI4aCBsZWZ0IiBzdGFtcHMgb24gZUJheS4KKyAgICAgICAgV2l0
aCB0aGlzIGNoYW5nZSwgd2Ugb25seSByZXBhaW50IHdoZW4gdGhlIHRleHQgYWN0dWFsbHkgY2hh
bmdlcywgaW5zdGVhZAorICAgICAgICBvZiBvbmNlIGV2ZXJ5IHNlY29uZC4KKworICAgICAgICAq
IGVkaXRpbmcvbWFya3VwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmF0dHJpYnV0ZXNBcmVFcXVh
bEZvclJlcGxhY2VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OmlzU2FmZWx5UmVwbGFjZWFibGVU
YWcpOgorICAgICAgICAoV2ViQ29yZTo6bm9kZXNBcmVFcXVhbEZvclJlcGxhY2VtZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OmNoaWxkcmVuQXJlRXF1YWxGb3JSZXBsYWNlbWVudCk6CisgICAgICAg
IChXZWJDb3JlOjpyZXBsYWNlQ2hpbGRyZW5XaXRoRnJhZ21lbnQpOgorCiAyMDE0LTA5LTI2ICBD
aHJpc3RvcGhlIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAogICAgICAgICBTdG9wIHVzaW5n
IGxlZ2FjeSBOT0RFX1RZUEVfQ0FTVFMoKSBtYWNybyBmb3IgSFRNTCBFbGVtZW50cwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwIGIvU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9tYXJrdXAuY3BwCmluZGV4IDA5N2UzMmIuLmQwZDNmYWYgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL21hcmt1cC5jcHAKQEAgLTk5MCw2ICs5OTAsMTExIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBo
YXNPbmVUZXh0Q2hpbGQoQ29udGFpbmVyTm9kZSogbm9kZSkKICAgICByZXR1cm4gaGFzT25lQ2hp
bGQobm9kZSkgJiYgbm9kZS0+Zmlyc3RDaGlsZCgpLT5pc1RleHROb2RlKCk7CiB9CiAKK3N0YXRp
YyBib29sIGF0dHJpYnV0ZXNBcmVFcXVhbEZvclJlcGxhY2VtZW50KEVsZW1lbnQmIGUxLCBFbGVt
ZW50JiBlMikKK3sKKyAgICBpZiAoIWUxLmVsZW1lbnREYXRhKCkpCisgICAgICAgIHJldHVybiAh
ZTIuZWxlbWVudERhdGEoKSB8fCAhZTIuZWxlbWVudERhdGEoKS0+bGVuZ3RoKCk7CisKKyAgICBp
ZiAoIWUyLmVsZW1lbnREYXRhKCkpCisgICAgICAgIHJldHVybiAhZTEuZWxlbWVudERhdGEoKS0+
bGVuZ3RoKCk7CisKKyAgICBhdXRvJiBkYXRhMSA9ICplMS5lbGVtZW50RGF0YSgpOworICAgIGF1
dG8mIGRhdGEyID0gKmUyLmVsZW1lbnREYXRhKCk7CisKKyAgICBpZiAoZGF0YTEubGVuZ3RoKCkg
IT0gZGF0YTIubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAodW5z
aWduZWQgaSA9IDAsIGxlbmd0aCA9IGRhdGExLmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyArK2kpIHsK
KyAgICAgICAgY29uc3QgQXR0cmlidXRlJiBhdHRyaWJ1dGUxID0gZGF0YTEuYXR0cmlidXRlQXQo
aSk7CisgICAgICAgIGNvbnN0IEF0dHJpYnV0ZSYgYXR0cmlidXRlMiA9IGRhdGEyLmF0dHJpYnV0
ZUF0KGkpOworICAgICAgICBpZiAoYXR0cmlidXRlMS5uYW1lKCkgIT0gYXR0cmlidXRlMi5uYW1l
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChhdHRyaWJ1dGUxLnZh
bHVlKCkgIT0gYXR0cmlidXRlMi52YWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpc1NhZmVseVJlcGxh
Y2VhYmxlVGFnKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpCit7CisgICAgcmV0dXJuIG5hbWUg
PT0gSFRNTE5hbWVzOjpzcGFuVGFnCisgICAgICAgIHx8IG5hbWUgPT0gSFRNTE5hbWVzOjpkaXZU
YWcKKyAgICAgICAgfHwgbmFtZSA9PSBIVE1MTmFtZXM6OmJUYWcKKyAgICAgICAgfHwgbmFtZSA9
PSBIVE1MTmFtZXM6OmlUYWcKKyAgICAgICAgfHwgbmFtZSA9PSBIVE1MTmFtZXM6OnVUYWcKKyAg
ICAgICAgfHwgbmFtZSA9PSBIVE1MTmFtZXM6OnN0cm9uZ1RhZworICAgICAgICB8fCBuYW1lID09
IEhUTUxOYW1lczo6ZW1UYWcKKyAgICAgICAgfHwgbmFtZSA9PSBIVE1MTmFtZXM6OnN0cmlrZVRh
ZworICAgICAgICB8fCBuYW1lID09IEhUTUxOYW1lczo6YVRhZworICAgICAgICB8fCBuYW1lID09
IEhUTUxOYW1lczo6cHJlVGFnCisgICAgICAgIHx8IG5hbWUgPT0gSFRNTE5hbWVzOjpjb2RlVGFn
CisgICAgICAgIHx8IG5hbWUgPT0gSFRNTE5hbWVzOjpibG9ja3F1b3RlVGFnCisgICAgICAgIHx8
IG5hbWUgPT0gSFRNTE5hbWVzOjpwVGFnCisgICAgICAgIHx8IG5hbWUgPT0gSFRNTE5hbWVzOjpi
clRhZzsKK30KKworc3RhdGljIGJvb2wgY2hpbGRyZW5BcmVFcXVhbEZvclJlcGxhY2VtZW50KGNv
bnN0IENvbnRhaW5lck5vZGUmLCBjb25zdCBDb250YWluZXJOb2RlJiwgdW5zaWduZWQmIHZpc2l0
ZWROb2RlQ291bnQpOworCitzdGF0aWMgYm9vbCBub2Rlc0FyZUVxdWFsRm9yUmVwbGFjZW1lbnQo
Tm9kZSYgbjEsIE5vZGUmIG4yLCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkKK3sKKyAgICAv
LyBCYWlsIG91dCBpZiB0aGUgcmVwbGFjZW1lbnQgc3VidHJlZSBpcyB0b28gaHVnZS4KKyAgICBp
ZiAodmlzaXRlZE5vZGVDb3VudCsrID4gNjQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGF1dG8gbm9kZVR5cGUgPSBuMS5ub2RlVHlwZSgpOworICAgIGlmIChub2RlVHlwZSAhPSBuMi5u
b2RlVHlwZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobjEud3JhcHBlcigp
IHx8IG4yLndyYXBwZXIoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG4xLmhh
c0V2ZW50TGlzdGVuZXJzKCkgfHwgbjIuaGFzRXZlbnRMaXN0ZW5lcnMoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKG5vZGVUeXBlID09IE5vZGU6OlRFWFRfTk9ERSkKKyAgICAg
ICAgcmV0dXJuIHRvVGV4dChuMSkuZGF0YSgpID09IHRvVGV4dChuMikuZGF0YSgpOworCisgICAg
aWYgKG5vZGVUeXBlICE9IE5vZGU6OkVMRU1FTlRfTk9ERSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgYXV0byYgZTEgPSB0b0VsZW1lbnQobjEpOworICAgIGF1dG8mIGUyID0gdG9FbGVt
ZW50KG4yKTsKKworICAgIGlmIChlMS50YWdRTmFtZSgpICE9IGUyLnRhZ1FOYW1lKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXNTYWZlbHlSZXBsYWNlYWJsZVRhZyhlMS50
YWdRTmFtZSgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFhdHRyaWJ1dGVz
QXJlRXF1YWxGb3JSZXBsYWNlbWVudChlMSwgZTIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICByZXR1cm4gY2hpbGRyZW5BcmVFcXVhbEZvclJlcGxhY2VtZW50KGUxLCBlMiwgdmlzaXRl
ZE5vZGVDb3VudCk7Cit9CisKK3N0YXRpYyBib29sIGNoaWxkcmVuQXJlRXF1YWxGb3JSZXBsYWNl
bWVudChjb25zdCBDb250YWluZXJOb2RlJiBuMSwgY29uc3QgQ29udGFpbmVyTm9kZSYgbjIsIHVu
c2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KQoreworICAgIE5vZGUqIGNoaWxkID0gbjEuZmlyc3RD
aGlsZCgpOworICAgIE5vZGUqIG90aGVyQ2hpbGQgPSBuMi5maXJzdENoaWxkKCk7CisKKyAgICB3
aGlsZSAoY2hpbGQpIHsKKyAgICAgICAgaWYgKCFvdGhlckNoaWxkKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIGlmICghbm9kZXNBcmVFcXVhbEZvclJlcGxhY2VtZW50KCpj
aGlsZCwgKm90aGVyQ2hpbGQsIHZpc2l0ZWROb2RlQ291bnQpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CisgICAgICAg
IG90aGVyQ2hpbGQgPSBvdGhlckNoaWxkLT5uZXh0U2libGluZygpOworICAgIH0KKworICAgIGlm
IChvdGhlckNoaWxkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwogdm9pZCByZXBsYWNlQ2hpbGRyZW5XaXRoRnJhZ21lbnQoQ29udGFpbmVyTm9kZSYgY29u
dGFpbmVyLCBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50LCBFeGNlcHRpb25D
b2RlJiBlYykKIHsKICAgICBSZWY8Q29udGFpbmVyTm9kZT4gY29udGFpbmVyTm9kZShjb250YWlu
ZXIpOwpAQCAtMTAxMCw2ICsxMTE1LDEwIEBAIHZvaWQgcmVwbGFjZUNoaWxkcmVuV2l0aEZyYWdt
ZW50KENvbnRhaW5lck5vZGUmIGNvbnRhaW5lciwgUGFzc1JlZlB0cjxEb2N1bWVudEZyCiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKKyAgICB1bnNpZ25lZCB2aXNpdGVkTm9kZUNvdW50ID0gMDsK
KyAgICBpZiAoY29udGFpbmVyLmZpcnN0Q2hpbGQoKSAmJiBjaGlsZHJlbkFyZUVxdWFsRm9yUmVw
bGFjZW1lbnQoY29udGFpbmVyLCAqZnJhZ21lbnQsIHZpc2l0ZWROb2RlQ291bnQpKQorICAgICAg
ICByZXR1cm47CisKICAgICBjb250YWluZXJOb2RlLT5yZW1vdmVDaGlsZHJlbigpOwogICAgIGNv
bnRhaW5lck5vZGUtPmFwcGVuZENoaWxkKGZyYWdtZW50LCBlYyk7CiB9Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>