<?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>100873</bug_id>
          
          <creation_ts>2012-10-31 11:41:02 -0700</creation_ts>
          <short_desc>REGRESSION (r132941): attribute modification 10% performance regression</short_desc>
          <delta_ts>2012-11-01 18:12:01 -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>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ojan Vafai">ojan</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>allan.jensen</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>dglazkov</cc>
    
    <cc>kling</cc>
    
    <cc>koivisto</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>755499</commentid>
    <comment_count>0</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-10-31 11:41:02 -0700</bug_when>
    <thetext>Regression range: http://trac.webkit.org/log/?verbose=on&amp;rev=132949&amp;stop_rev=132924

http://trac.webkit.org/changeset/132941/ seems like the most likely culprit to me.

Most clear graph. Click on the part in the graph where the performance drops then click on the webkit link on the right to see the webkit blamelist:
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrjquery/report.html?rev=165231&amp;graph=jslib_attr_jquery_jQuery___removeClass&amp;trace=score&amp;history=150

Some less clear graphs that point at the same webkit blamelist:
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrprototype/report.html?rev=165213&amp;graph=jslib_attr_prototype_Prototype___removeClassName&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrprototype/report.html?rev=165213&amp;graph=jslib_attr_prototype_Prototype___writeAttribute&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrjquery/report.html?rev=165213&amp;graph=jslib_attr_jquery_jQuery___attr_class_test_&amp;trace=score&amp;history=150</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755506</commentid>
    <comment_count>1</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-10-31 11:48:45 -0700</bug_when>
    <thetext>Smaller regression range from the Chromium linux bot: http://trac.webkit.org/log/?verbose=on&amp;rev=132944&amp;stop_rev=132938

http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/dromaeo_jslibattrjquery/report.html?rev=165139&amp;graph=jslib_attr_jquery_jQuery___attr_class_test_&amp;trace=score&amp;history=150
http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/dromaeo_jslibattrprototype/report.html?rev=165139&amp;graph=jslib_attr_prototype_Prototype___removeClassName&amp;trace=score&amp;history=150</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755524</commentid>
    <comment_count>2</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2012-10-31 12:04:06 -0700</bug_when>
    <thetext>If it was http://trac.webkit.org/changeset/132941, I think http://trac.webkit.org/changeset/133021 should fix it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755561</commentid>
    <comment_count>3</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-10-31 12:48:18 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; If it was http://trac.webkit.org/changeset/132941, I think http://trac.webkit.org/changeset/133021 should fix it.

133021 did not fix it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755562</commentid>
    <comment_count>4</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-10-31 12:51:39 -0700</bug_when>
    <thetext>Not sure it will. We&apos;ll see. I think a sufficiently artificial test case might see a regression from that change. There are ways to improve if needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>755575</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-10-31 13:10:35 -0700</bug_when>
    <thetext>Turns out the difference finding algorithm using SpaceSplitString mutation is too slow:

Running Time	Self		Symbol Name
1714.0ms    5.6%	302,0	 	 WebCore::Element::classAttributeChanged(WTF::AtomicString const&amp;)
532.0ms    1.7%	174,0	 	  WebCore::SpaceSplitString::remove(WTF::AtomicString const&amp;)
277.0ms    0.9%	66,0	 	   WebCore::SpaceSplitString::ensureUnique()
136.0ms    0.4%	136,0	 	    WTF::fastMalloc(unsigned long)
75.0ms    0.2%	75,0	 	    WTF::Vector&lt;WTF::AtomicString, 4ul&gt;::Vector(WTF::Vector&lt;WTF::AtomicString, 4ul&gt; const&amp;)

Should be easy to optimize this away.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756447</commentid>
    <comment_count>6</comment_count>
      <attachid>171893</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-01 10:50:51 -0700</bug_when>
    <thetext>Created attachment 171893
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756481</commentid>
    <comment_count>7</comment_count>
      <attachid>171893</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-01 11:31:40 -0700</bug_when>
    <thetext>Comment on attachment 171893
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=171893&amp;action=review

&gt; Source/WebCore/dom/Element.cpp:723
&gt; +    StyleResolver* styleResolver = document()-&gt;styleResolverIfExists();
&gt; +    bool testShouldInvalidateStyle = attached() &amp;&amp; styleResolver &amp;&amp; styleChangeType() &lt; FullStyleChange;

I almost wonder if it&apos;s worth adding a static helper function here since this code is duplicated with Element::classAttributeChanged.

static StyleResolver* styleResolverForTestingStyleInvalidation(Document* document, Element* element)
{
    if (!element-&gt;attached() || element-&gt;needsStyleRecalc() || styleTypeChange &gt;= FullStyleChange)
        return 0;
    return document()-&gt;styleResolverIfExists();
}

Then you wouldn&apos;t need the testShouldInvalidateStyle at all and could just null check the returned style resolver.

It&apos;s not clearly better to me, but it does avoid some duplication. Up to you.

&gt; Source/WebCore/dom/Element.cpp:733
&gt; +            if (shouldInvalidateStyle)
&gt; +                testShouldInvalidateStyle = false;

I think you could avoid needing to do this if you put the check below into an else clause. That&apos;d simplify the logic some I think.

} else {
    if (name == HTMLNames::nameAttr)
        setHasName(!newValue.isNull());
    shouldInvalidateStyle = ...;
}

&gt; Source/WebCore/dom/Element.cpp:738
&gt; +    shouldInvalidateStyle = testShouldInvalidateStyle &amp;&amp; styleResolver-&gt;hasSelectorForAttribute(name.localName());

Not sure it matters, but we currently only do this if (!needsStyleRecalc()). Maybe testShouldInvalidateStyle should also &amp;&amp; !needsStyleRecalc()? Obviously the same would apply in Element::classAttributeChanged. Saves a hashtable lookup. Not sure it matters in practice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756501</commentid>
    <comment_count>8</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-01 11:45:05 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Not sure it matters, but we currently only do this if (!needsStyleRecalc()). Maybe testShouldInvalidateStyle should also &amp;&amp; !needsStyleRecalc()? Obviously the same would apply in Element::classAttributeChanged. Saves a hashtable lookup. Not sure it matters in practice.

styleChangeType() &lt; FullStyleChange is the equivalent test (more correct in fact).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756511</commentid>
    <comment_count>9</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-01 11:54:38 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; styleChangeType() &lt; FullStyleChange is the equivalent test (more correct in fact).

Ah. Got it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756527</commentid>
    <comment_count>10</comment_count>
      <attachid>171893</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-01 12:07:39 -0700</bug_when>
    <thetext>Comment on attachment 171893
patch

Attachment 171893 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/14686598

New failing tests:
css3/viewport-percentage-lengths/css3-viewport-percentage-lengths-getStyle.html
fast/dynamic/004.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756541</commentid>
    <comment_count>11</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-01 12:41:53 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/133214 (with the test breaking bug fixed)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756543</commentid>
    <comment_count>12</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-01 12:42:13 -0700</bug_when>
    <thetext>Lets see what the bots say.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756719</commentid>
    <comment_count>13</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-01 16:31:21 -0700</bug_when>
    <thetext>Looks like it fixed it.

http://build.chromium.org/f/chromium/perf/chromium-rel-win7-webkit/dromaeo_jslibattrjquery/report.html?graph=jslib_attr_jquery_jQuery___removeClass&amp;trace=score&amp;history=100&amp;rev=165526</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>756778</commentid>
    <comment_count>14</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-01 18:12:01 -0700</bug_when>
    <thetext>Yup. Looks great!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>171893</attachid>
            <date>2012-11-01 10:50:51 -0700</date>
            <delta_ts>2012-11-01 12:07:39 -0700</delta_ts>
            <desc>patch</desc>
            <filename>classAttributeChanged-performance.patch</filename>
            <type>text/plain</type>
            <size>10754</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMzE5MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM4IEBACisyMDEyLTExLTAxICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBSRUdSRVNTSU9OIChyMTMyOTQx
KTogYXR0cmlidXRlIG1vZGlmaWNhdGlvbiAxMCUgcGVyZm9ybWFuY2UgcmVncmVzc2lvbgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAwODczCisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRG9uJ3QgZG8gdGhl
IGNsYXNzIGNoYW5nZSBmaW5kaW5nIGJ5IG11dGF0aW5nIFNwYWNlU3BsaXRTdHJpbmcuIEl0IGlz
IHNsb3cuIEluc3RlYWQgdXNlIGEgYml0IHZlY3RvcgorICAgICAgICB0byBtYXJrIHRoZSB1bmNo
YW5nZWQgY2xhc3NlcworCisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKToKKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JG
b3JDbGFzcyk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZv
cklkKToKKyAgICAgICAgCisgICAgICAgICAgICBJbmxpbmVkIHRoZXNlIGFuZCBtb3ZlZCB2YWx1
ZSB2YWxpZGl0eSB0ZXN0aW5nIHRvIGNsaWVudHMuCisKKyAgICAgICAgKiBkb20vRWxlbWVudC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpjaGVja05lZWRzU3R5bGVJbnZhbGlkYXRpb25Gb3JJZENo
YW5nZSk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OmF0
dHJpYnV0ZUNoYW5nZWQpOgorICAgIAorICAgICAgICAgICAgQ2xlYW4gdXAgaWQgdGVzdGluZyB0
b28uCisKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrTmVlZHNTdHlsZUludmFsaWRhdGlvbkZvckNs
YXNzQ2hhbmdlKToKKyAgICAgICAgCisgICAgICAgICAgICBVc2UgYml0IHZlY3RvciBmb3IgbWFy
a2luZyBzZWVuIHZhbHVlcy4gQXZvaWRzIGFsbG9jYXRpb25zIGFuZCByZWZmaW5nLgorCisgICAg
ICAgIChXZWJDb3JlOjpFbGVtZW50OjpjbGFzc0F0dHJpYnV0ZUNoYW5nZWQpOgorICAgICAgICAK
KyAgICAgICAgICAgIERvbid0IHRlc3QgaWYgc3R5bGUgaXMgYWxyZWFkeSBpbnZhbGlkLgorCiAy
MDEyLTExLTAxICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFdlYiBJbnNwZWN0b3I6IFVwZGF0ZSBDb2RlTWlycm9yIHRvIHYzCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCShyZXZpc2lvbiAxMzI5NDEpCisrKyBTb3VyY2UvV2Vi
Q29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyNDksMjUgKzQy
NDksNiBAQCBDb2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWCiAgICAgfQog
fQogCi1ib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0
b21pY1N0cmluZyAmYXR0cm5hbWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZmVhdHVyZXMuYXR0
cnNJblJ1bGVzLmNvbnRhaW5zKGF0dHJuYW1lLmltcGwoKSk7Ci19Ci0KLWJvb2wgU3R5bGVSZXNv
bHZlcjo6aGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmIGNsYXNzVmFsdWUp
IGNvbnN0Ci17Ci0gICAgaWYgKGNsYXNzVmFsdWUuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgcmV0dXJuIG1fZmVhdHVyZXMuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xh
c3NWYWx1ZS5pbXBsKCkpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9y
SWQoY29uc3QgQXRvbWljU3RyaW5nJiBpZFZhbHVlKSBjb25zdAotewotICAgIGlmIChpZFZhbHVl
LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBtX2ZlYXR1cmVz
Lmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwotfQotCiB2b2lkIFN0eWxlUmVz
b2x2ZXI6OmFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1
ZXJ5RXhwKiBleHByLCBib29sIHJlc3VsdCkKIHsKICAgICBtX3ZpZXdwb3J0RGVwZW5kZW50TWVk
aWFRdWVyeVJlc3VsdHMuYXBwZW5kKGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5UmVzdWx0KCpleHBy
LCByZXN1bHQpKSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgJKHJldmlzaW9u
IDEzMjk0MSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTUxOCw2ICs1MTgsMjQgQEAgcHJpdmF0ZToKICAgICBmcmllbmQgYm9vbCBvcGVy
YXRvciE9KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsKIH07CiAKK2lu
bGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0
b21pY1N0cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWF0dHJpYnV0
ZU5hbWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9mZWF0dXJlcy5hdHRyc0luUnVsZXMuY29u
dGFpbnMoYXR0cmlidXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29s
dmVyOjpoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYgY2xhc3NWYWx1ZSkg
Y29uc3QKK3sKKyAgICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4g
bV9mZWF0dXJlcy5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFzc1ZhbHVlLmltcGwoKSk7Cit9
CisKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRv
bWljU3RyaW5nJiBpZFZhbHVlKSBjb25zdAoreworICAgIEFTU0VSVCghaWRWYWx1ZS5pc0VtcHR5
KCkpOworICAgIHJldHVybiBtX2ZlYXR1cmVzLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5p
bXBsKCkpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBTdHlsZVJl
c29sdmVyX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzMzAyMSkKKysr
IFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzcsNiAr
NzcsNyBAQAogI2luY2x1ZGUgIlhNTE5TTmFtZXMuaCIKICNpbmNsdWRlICJYTUxOYW1lcy5oIgog
I2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSA8d3RmL0JpdFZlY3Rvci5oPgogI2lu
Y2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogI2lmIEVOQUJMRShTVkcpCkBAIC03MDIsMzIg
KzcwMyw0NSBAQCBzdGF0aWMgaW5saW5lIEF0b21pY1N0cmluZyBtYWtlSWRGb3JTdHlsCiAgICAg
cmV0dXJuIHZhbHVlOwogfQogCitzdGF0aWMgYm9vbCBjaGVja05lZWRzU3R5bGVJbnZhbGlkYXRp
b25Gb3JJZENoYW5nZShjb25zdCBBdG9taWNTdHJpbmcmIG9sZElkLCBjb25zdCBBdG9taWNTdHJp
bmcmIG5ld0lkLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQoreworICAgIEFTU0VSVChu
ZXdJZCAhPSBvbGRJZCk7CisgICAgaWYgKCFvbGRJZC5pc0VtcHR5KCkgJiYgc3R5bGVSZXNvbHZl
ci0+aGFzU2VsZWN0b3JGb3JJZChvbGRJZCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlm
ICghbmV3SWQuaXNFbXB0eSgpICYmIHN0eWxlUmVzb2x2ZXItPmhhc1NlbGVjdG9yRm9ySWQobmV3
SWQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQg
RWxlbWVudDo6YXR0cmlidXRlQ2hhbmdlZChjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25z
dCBBdG9taWNTdHJpbmcmIG5ld1ZhbHVlKQogewogICAgIHBhcnNlQXR0cmlidXRlKEF0dHJpYnV0
ZShuYW1lLCBuZXdWYWx1ZSkpOwogCiAgICAgZG9jdW1lbnQoKS0+aW5jRE9NVHJlZVZlcnNpb24o
KTsKIAorICAgIFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIgPSBkb2N1bWVudCgpLT5zdHls
ZVJlc29sdmVySWZFeGlzdHMoKTsKKyAgICBib29sIHRlc3RTaG91bGRJbnZhbGlkYXRlU3R5bGUg
PSBhdHRhY2hlZCgpICYmIHN0eWxlUmVzb2x2ZXIgJiYgc3R5bGVDaGFuZ2VUeXBlKCkgPCBGdWxs
U3R5bGVDaGFuZ2U7CisgICAgYm9vbCBzaG91bGRJbnZhbGlkYXRlU3R5bGUgPSBmYWxzZTsKKwog
ICAgIGlmIChpc0lkQXR0cmlidXRlTmFtZShuYW1lKSkgewogICAgICAgICBBdG9taWNTdHJpbmcg
b2xkSWQgPSBhdHRyaWJ1dGVEYXRhKCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCk7CiAgICAgICAg
IEF0b21pY1N0cmluZyBuZXdJZCA9IG1ha2VJZEZvclN0eWxlUmVzb2x1dGlvbihuZXdWYWx1ZSwg
ZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpOwogICAgICAgICBpZiAobmV3SWQgIT0gb2xkSWQp
IHsKICAgICAgICAgICAgIGF0dHJpYnV0ZURhdGEoKS0+c2V0SWRGb3JTdHlsZVJlc29sdXRpb24o
bmV3SWQpOwotICAgICAgICAgICAgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlciA9IGRvY3Vt
ZW50KCktPnN0eWxlUmVzb2x2ZXJJZkV4aXN0cygpOwotICAgICAgICAgICAgaWYgKGF0dGFjaGVk
KCkgJiYgKCFzdHlsZVJlc29sdmVyIHx8IChzdHlsZVJlc29sdmVyLT5oYXNTZWxlY3RvckZvcklk
KG5ld0lkKSB8fCBzdHlsZVJlc29sdmVyLT5oYXNTZWxlY3RvckZvcklkKG9sZElkKSkpKQotICAg
ICAgICAgICAgICAgIHNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIHNob3VsZElu
dmFsaWRhdGVTdHlsZSA9IHRlc3RTaG91bGRJbnZhbGlkYXRlU3R5bGUgJiYgY2hlY2tOZWVkc1N0
eWxlSW52YWxpZGF0aW9uRm9ySWRDaGFuZ2Uob2xkSWQsIG5ld0lkLCBzdHlsZVJlc29sdmVyKTsK
KyAgICAgICAgICAgIGlmIChzaG91bGRJbnZhbGlkYXRlU3R5bGUpCisgICAgICAgICAgICAgICAg
dGVzdFNob3VsZEludmFsaWRhdGVTdHlsZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNl
IGlmIChuYW1lID09IEhUTUxOYW1lczo6bmFtZUF0dHIpCiAgICAgICAgIHNldEhhc05hbWUoIW5l
d1ZhbHVlLmlzTnVsbCgpKTsKIAotICAgIGlmICghbmVlZHNTdHlsZVJlY2FsYygpICYmIGRvY3Vt
ZW50KCktPmF0dGFjaGVkKCkpIHsKLSAgICAgICAgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZl
ciA9IGRvY3VtZW50KCktPnN0eWxlUmVzb2x2ZXJJZkV4aXN0cygpOwotICAgICAgICBpZiAoIXN0
eWxlUmVzb2x2ZXIgfHwgc3R5bGVSZXNvbHZlci0+aGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUobmFt
ZS5sb2NhbE5hbWUoKSkpCi0gICAgICAgICAgICBzZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAg
fQorICAgIHNob3VsZEludmFsaWRhdGVTdHlsZSA9IHRlc3RTaG91bGRJbnZhbGlkYXRlU3R5bGUg
JiYgc3R5bGVSZXNvbHZlci0+aGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUobmFtZS5sb2NhbE5hbWUo
KSk7CiAKICAgICBpbnZhbGlkYXRlTm9kZUxpc3RDYWNoZXNJbkFuY2VzdG9ycygmbmFtZSwgdGhp
cyk7CiAKKyAgICBpZiAoc2hvdWxkSW52YWxpZGF0ZVN0eWxlKQorICAgICAgICBzZXROZWVkc1N0
eWxlUmVjYWxjKCk7CisKICAgICBpZiAoQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJs
ZWQoKSkKICAgICAgICAgZG9jdW1lbnQoKS0+YXhPYmplY3RDYWNoZSgpLT5oYW5kbGVBdHRyaWJ1
dGVDaGFuZ2VkKG5hbWUsIHRoaXMpOwogfQpAQCAtNzY1LDQ5ICs3NzksNzIgQEAgc3RhdGljIGlu
bGluZSBib29sIGNsYXNzU3RyaW5nSGFzQ2xhc3NOYQogICAgIHJldHVybiBjbGFzc1N0cmluZ0hh
c0NsYXNzTmFtZShuZXdDbGFzc1N0cmluZy5jaGFyYWN0ZXJzMTYoKSwgbGVuZ3RoKTsKIH0KIAot
c3RhdGljIHZvaWQgY29sbGVjdEFkZGVkQW5kUmVtb3ZlZENsYXNzZXMoVmVjdG9yPEF0b21pY1N0
cmluZywgND4mIGFkZGVkQW5kUmVtb3ZlZENsYXNzZXMsIFNwYWNlU3BsaXRTdHJpbmcmIG9sZENs
YXNzZXMsIGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIG5ld0NsYXNzZXMpCitzdGF0aWMgYm9vbCBj
aGVja05lZWRzU3R5bGVJbnZhbGlkYXRpb25Gb3JDbGFzc0NoYW5nZShjb25zdCBTcGFjZVNwbGl0
U3RyaW5nJiBjaGFuZ2VkQ2xhc3NlcywgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlcikKK3sK
KyAgICB1bnNpZ25lZCBjaGFuZ2VkU2l6ZSA9IGNoYW5nZWRDbGFzc2VzLnNpemUoKTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2hhbmdlZFNpemU7ICsraSkgeworICAgICAgICBpZiAo
c3R5bGVSZXNvbHZlci0+aGFzU2VsZWN0b3JGb3JDbGFzcyhjaGFuZ2VkQ2xhc3Nlc1tpXSkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitz
dGF0aWMgYm9vbCBjaGVja05lZWRzU3R5bGVJbnZhbGlkYXRpb25Gb3JDbGFzc0NoYW5nZShjb25z
dCBTcGFjZVNwbGl0U3RyaW5nJiBvbGRDbGFzc2VzLCBjb25zdCBTcGFjZVNwbGl0U3RyaW5nJiBu
ZXdDbGFzc2VzLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQogewotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBuZXdDbGFzc2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChv
bGRDbGFzc2VzLnJlbW92ZShuZXdDbGFzc2VzW2ldKSkKKyAgICB1bnNpZ25lZCBvbGRTaXplID0g
b2xkQ2xhc3Nlcy5zaXplKCk7CisgICAgaWYgKCFvbGRTaXplKQorICAgICAgICByZXR1cm4gY2hl
Y2tOZWVkc1N0eWxlSW52YWxpZGF0aW9uRm9yQ2xhc3NDaGFuZ2UobmV3Q2xhc3Nlcywgc3R5bGVS
ZXNvbHZlcik7CisgICAgQml0VmVjdG9yIHJlbWFpbmluZ0NsYXNzQml0czsKKyAgICByZW1haW5p
bmdDbGFzc0JpdHMuZW5zdXJlU2l6ZShvbGRDbGFzc2VzLnNpemUoKSk7CisgICAgLy8gQ2xhc3Mg
dmVjdG9ycyB0ZW5kIHRvIGJlIHZlcnkgc2hvcnQuIFRoaXMgaXMgZmFzdGVyIHRoYW4gdXNpbmcg
YSBoYXNoIHRhYmxlLgorICAgIHVuc2lnbmVkIG5ld1NpemUgPSBuZXdDbGFzc2VzLnNpemUoKTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICAgIGZv
ciAodW5zaWduZWQgaiA9IDA7IGogPCBvbGRTaXplOyArK2opIHsKKyAgICAgICAgICAgIGlmIChu
ZXdDbGFzc2VzW2ldID09IG9sZENsYXNzZXNbal0pIHsKKyAgICAgICAgICAgICAgICByZW1haW5p
bmdDbGFzc0JpdHMucXVpY2tTZXQoaik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlUmVzb2x2ZXItPmhhc1NlbGVj
dG9yRm9yQ2xhc3MobmV3Q2xhc3Nlc1tpXSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9sZFNpemU7ICsraSkgeworICAgICAg
ICAvLyBJZiB0aGUgYml0IGlzIG5vdCBzZXQgdGhlIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGhh
cyBiZWVuIHJlbW92ZWQuCisgICAgICAgIGlmIChyZW1haW5pbmdDbGFzc0JpdHMucXVpY2tHZXQo
aSkpCiAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYWRkZWRBbmRSZW1vdmVkQ2xhc3Nl
cy5hcHBlbmQobmV3Q2xhc3Nlc1tpXSk7CisgICAgICAgIGlmIChzdHlsZVJlc29sdmVyLT5oYXNT
ZWxlY3RvckZvckNsYXNzKG9sZENsYXNzZXNbaV0pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CiAgICAgfQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvbGRDbGFzc2VzLnNpemUoKTsg
KytpKQotICAgICAgICBhZGRlZEFuZFJlbW92ZWRDbGFzc2VzLmFwcGVuZChvbGRDbGFzc2VzW2ld
KTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRWxlbWVudDo6Y2xhc3NBdHRyaWJ1dGVD
aGFuZ2VkKGNvbnN0IEF0b21pY1N0cmluZyYgbmV3Q2xhc3NTdHJpbmcpCiB7Ci0gICAgYm9vbCBz
aG91bGRJbnZhbGlkYXRlU3R5bGUgPSBhdHRhY2hlZCgpICYmIGRvY3VtZW50KCktPnN0eWxlUmVz
b2x2ZXJJZkV4aXN0cygpOwotICAgIFZlY3RvcjxBdG9taWNTdHJpbmcsIDQ+IGFkZGVkQW5kUmVt
b3ZlZENsYXNzZXM7CisgICAgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlciA9IGRvY3VtZW50
KCktPnN0eWxlUmVzb2x2ZXJJZkV4aXN0cygpOworICAgIGJvb2wgdGVzdFNob3VsZEludmFsaWRh
dGVTdHlsZSA9IGF0dGFjaGVkKCkgJiYgc3R5bGVSZXNvbHZlciAmJiBzdHlsZUNoYW5nZVR5cGUo
KSA8IEZ1bGxTdHlsZUNoYW5nZTsKKyAgICBib29sIHNob3VsZEludmFsaWRhdGVTdHlsZSA9IGZh
bHNlOwogCiAgICAgaWYgKGNsYXNzU3RyaW5nSGFzQ2xhc3NOYW1lKG5ld0NsYXNzU3RyaW5nKSkg
ewogICAgICAgICBjb25zdCBFbGVtZW50QXR0cmlidXRlRGF0YSogYXR0cmlidXRlRGF0YSA9IGVu
c3VyZUF0dHJpYnV0ZURhdGEoKTsKICAgICAgICAgY29uc3QgYm9vbCBzaG91bGRGb2xkQ2FzZSA9
IGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpOwotICAgICAgICBTcGFjZVNwbGl0U3RyaW5nIG9s
ZENsYXNzZXMgPSBhdHRyaWJ1dGVEYXRhLT5jbGFzc05hbWVzKCk7CisgICAgICAgIGNvbnN0IFNw
YWNlU3BsaXRTdHJpbmcgb2xkQ2xhc3NlcyA9IGF0dHJpYnV0ZURhdGEtPmNsYXNzTmFtZXMoKTsK
KwogICAgICAgICBhdHRyaWJ1dGVEYXRhLT5zZXRDbGFzcyhuZXdDbGFzc1N0cmluZywgc2hvdWxk
Rm9sZENhc2UpOwotICAgICAgICBpZiAoc2hvdWxkSW52YWxpZGF0ZVN0eWxlKQotICAgICAgICAg
ICAgY29sbGVjdEFkZGVkQW5kUmVtb3ZlZENsYXNzZXMoYWRkZWRBbmRSZW1vdmVkQ2xhc3Nlcywg
b2xkQ2xhc3NlcywgYXR0cmlidXRlRGF0YS0+Y2xhc3NOYW1lcygpKTsKKworICAgICAgICBjb25z
dCBTcGFjZVNwbGl0U3RyaW5nJiBuZXdDbGFzc2VzID0gYXR0cmlidXRlRGF0YS0+Y2xhc3NOYW1l
cygpOworICAgICAgICBzaG91bGRJbnZhbGlkYXRlU3R5bGUgPSB0ZXN0U2hvdWxkSW52YWxpZGF0
ZVN0eWxlICYmIGNoZWNrTmVlZHNTdHlsZUludmFsaWRhdGlvbkZvckNsYXNzQ2hhbmdlKG9sZENs
YXNzZXMsIG5ld0NsYXNzZXMsIHN0eWxlUmVzb2x2ZXIpOwogICAgIH0gZWxzZSBpZiAoY29uc3Qg
RWxlbWVudEF0dHJpYnV0ZURhdGEqIGF0dHJpYnV0ZURhdGEgPSB0aGlzLT5hdHRyaWJ1dGVEYXRh
KCkpIHsKLSAgICAgICAgaWYgKHNob3VsZEludmFsaWRhdGVTdHlsZSkgewotICAgICAgICAgICAg
Y29uc3QgU3BhY2VTcGxpdFN0cmluZyYgb2xkQ2xhc3NlcyA9IGF0dHJpYnV0ZURhdGEtPmNsYXNz
TmFtZXMoKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvbGRDbGFzc2Vz
LnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIGFkZGVkQW5kUmVtb3ZlZENsYXNzZXMuYXBw
ZW5kKG9sZENsYXNzZXNbaV0pOwotICAgICAgICB9CisgICAgICAgIGNvbnN0IFNwYWNlU3BsaXRT
dHJpbmcmIG9sZENsYXNzZXMgPSBhdHRyaWJ1dGVEYXRhLT5jbGFzc05hbWVzKCk7CisgICAgICAg
IHNob3VsZEludmFsaWRhdGVTdHlsZSA9IHRlc3RTaG91bGRJbnZhbGlkYXRlU3R5bGUgJiYgY2hl
Y2tOZWVkc1N0eWxlSW52YWxpZGF0aW9uRm9yQ2xhc3NDaGFuZ2Uob2xkQ2xhc3Nlcywgc3R5bGVS
ZXNvbHZlcik7CisKICAgICAgICAgYXR0cmlidXRlRGF0YS0+Y2xlYXJDbGFzcygpOwogICAgIH0K
IAogICAgIGlmIChET01Ub2tlbkxpc3QqIGNsYXNzTGlzdCA9IG9wdGlvbmFsQ2xhc3NMaXN0KCkp
CiAgICAgICAgIHN0YXRpY19jYXN0PENsYXNzTGlzdCo+KGNsYXNzTGlzdCktPnJlc2V0KG5ld0Ns
YXNzU3RyaW5nKTsKIAotICAgIGlmICghc2hvdWxkSW52YWxpZGF0ZVN0eWxlKQotICAgICAgICBy
ZXR1cm47Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFkZGVkQW5kUmVtb3ZlZENsYXNz
ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnN0eWxlUmVzb2x2ZXJJ
ZkV4aXN0cygpLT5oYXNTZWxlY3RvckZvckNsYXNzKGFkZGVkQW5kUmVtb3ZlZENsYXNzZXNbaV0p
KSB7Ci0gICAgICAgICAgICBzZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKHNob3VsZEludmFsaWRhdGVTdHlsZSkKKyAg
ICAgICAgc2V0TmVlZHNTdHlsZVJlY2FsYygpOwogfQogCiAvLyBSZXR1cm5zIHRydWUgaXMgdGhl
IGdpdmVuIGF0dHJpYnV0ZSBpcyBhbiBldmVudCBoYW5kbGVyLgo=
</data>
<flag name="review"
          id="185989"
          type_id="1"
          status="+"
          setter="ojan"
    />
    <flag name="commit-queue"
          id="186014"
          type_id="3"
          status="-"
          setter="webkit.review.bot"
    />
          </attachment>
      

    </bug>

</bugzilla>