<?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>61268</bug_id>
          
          <creation_ts>2011-05-23 02:51:21 -0700</creation_ts>
          <short_desc>REGRESSION (r45620): Node list caches never deleted</short_desc>
          <delta_ts>2011-05-24 07:48:53 -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="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>407845</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-05-23 02:51:21 -0700</bug_when>
    <thetext>We have

struct NodeListsNodeData {
...
    RefPtr&lt;DynamicNodeList::Caches&gt; m_childNodeListCaches;
...

and

bool NodeListsNodeData::isEmpty() const
{
...
    if (m_childNodeListCaches-&gt;refCount())
        return false;
...

The condition is always true and as a result node list caches are never empty and so never destroyed. This is bad for DOM modification performance as maintaing the caches is costly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408166</commentid>
    <comment_count>1</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-05-23 12:45:12 -0700</bug_when>
    <thetext>&lt;rdar://problem/9467379&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408188</commentid>
    <comment_count>2</comment_count>
      <attachid>94468</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-05-23 13:03:24 -0700</bug_when>
    <thetext>Created attachment 94468
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408192</commentid>
    <comment_count>3</comment_count>
      <attachid>94468</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2011-05-23 13:09:52 -0700</bug_when>
    <thetext>Comment on attachment 94468
patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408201</commentid>
    <comment_count>4</comment_count>
      <attachid>94468</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-05-23 13:16:38 -0700</bug_when>
    <thetext>Comment on attachment 94468
patch

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

How did you test? A while ago Ojan(?) added a harness that could be used for performance tests to prove operations didn’t have an O(n^2) component or something along those lines. Did you check into adding a test using that machinery? I’d like to see at least a manual test.

&gt; Source/WebCore/dom/Node.cpp:1041
&gt; +void Node::clearNodeListsIfPossible()

I think this name is confusing. While the function is called “clear node lists”, it does’t actually clear any node lists. In fact it only does work at all when there are no node lists!

&gt; Source/WebCore/dom/Node.cpp:1047
&gt; +    NodeRareData* data = rareData();
&gt; +    if (!data-&gt;nodeLists()-&gt;isEmpty())
&gt; +        return;

Might be nice to inline this part of the function so the common case doesn’t require another level of function call overhead. But maybe not.

&gt; Source/WebCore/dom/Node.cpp:2540
&gt; +            m_childNodeListCaches.clear();

Can this cause another kind of churn as the caches object is deleted and recreated?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408218</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-05-23 13:37:24 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 94468 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=94468&amp;action=review
&gt; 
&gt; How did you test? A while ago Ojan(?) added a harness that could be used for performance tests to prove operations didn’t have an O(n^2) component or something along those lines. Did you check into adding a test using that machinery? I’d like to see at least a manual test.

I checked it fixed the problem in gdb and with a manual performance test case (attached). This is not really O(n^2), more like 2x, but I&apos;ll check the harness.

&gt; &gt; Source/WebCore/dom/Node.cpp:1041
&gt; &gt; +void Node::clearNodeListsIfPossible()
&gt; 
&gt; I think this name is confusing. While the function is called “clear node lists”, it does’t actually clear any node lists. In fact it only does work at all when there are no node lists!

This is somewhat consistent with the existing naming (calls RareData::clearNodeLists()). The could certainly use wider renaming.

(It could also use a lot more optimization. The whole thing is pretty primitive.)

&gt; &gt; Source/WebCore/dom/Node.cpp:1047
&gt; &gt; +    NodeRareData* data = rareData();
&gt; &gt; +    if (!data-&gt;nodeLists()-&gt;isEmpty())
&gt; &gt; +        return;
&gt; 
&gt; Might be nice to inline this part of the function so the common case doesn’t require another level of function call overhead. But maybe not.

True. I&apos;ll do that.
 
&gt; &gt; Source/WebCore/dom/Node.cpp:2540
&gt; &gt; +            m_childNodeListCaches.clear();
&gt; 
&gt; Can this cause another kind of churn as the caches object is deleted and recreated?

I don&apos;t think so. Only thing that is actually cached is the last index and the corresponding node. Reconstructing the cache vs. starting with invalidated cache should have little actual cost difference.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408239</commentid>
    <comment_count>6</comment_count>
      <attachid>94480</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-05-23 13:46:32 -0700</bug_when>
    <thetext>Created attachment 94480
perf test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>408841</commentid>
    <comment_count>7</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2011-05-24 07:48:53 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/87147</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>94468</attachid>
            <date>2011-05-23 13:03:24 -0700</date>
            <delta_ts>2011-05-23 13:16:38 -0700</delta_ts>
            <desc>patch</desc>
            <filename>nodelist-invalidate-4.patch</filename>
            <type>text/plain</type>
            <size>6824</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg3MDg5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzcgQEAKKzIwMTEtMDUtMjMgIEFudHRpIEtv
aXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorICAgIAorICAgICAgICBSRUdSRVNTSU9OIChyNDU2MjApOiBOb2RlIGxpc3QgY2Fj
aGVzIG5ldmVyIGRlbGV0ZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTYxMjY4CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS85NDY3Mzc5PgorICAgICAg
ICAKKyAgICAgICAgTm9kZUxpc3RzTm9kZURhdGE6OmlzRW1wdHkoKSB0ZXN0cyBpZiBSZWZDb3Vu
dGVkIG9iamVjdHMgaGF2ZSByZWZjb3VudCBvZiB6ZXJvIHdoaWNoIGlzIGltcG9zc2libGUuCisg
ICAgICAgIEFzIGEgcmVzdWx0cyBOb2RlTGlzdCBjYWNoZXMgYXJlIG5ldmVyIGRlbGV0ZWQsIGNh
dXNpbmcgYmFkIHBlcmZvcm1hbmNlIGluIERPTSBtdXRhdGluZyBvcGVyYXRpb25zIGFzCisgICAg
ICAgIHRoZXkgcmVwZWF0ZWRseSBpbnZhbGlkYXRlIGNhY2hlcy4KKworICAgICAgICAqIGRvbS9O
b2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OmNoaWxkTm9kZXMpOgorICAgICAgICAg
ICAgQ29uc3RydWN0IG1fY2hpbGROb2RlTGlzdENhY2hlcyBsYXppbHkuCisKKyAgICAgICAgKFdl
YkNvcmU6Ok5vZGU6OnVucmVnaXN0ZXJEeW5hbWljTm9kZUxpc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6Tm9kZTo6bm90aWZ5TG9jYWxOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKToKKyAgICAgICAg
KFdlYkNvcmU6Ok5vZGU6Om5vdGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok5vZGU6OmNsZWFyTm9kZUxpc3RzSWZQb3NzaWJsZSk6IAorICAgICAg
ICAgICAgQWRkIGEgaGVscGVyLgorCisgICAgICAgIChXZWJDb3JlOjpOb2RlTGlzdHNOb2RlRGF0
YTo6aW52YWxpZGF0ZUNhY2hlcyk6CisgICAgICAgICAgICBJbnZhbGlkYXRlIG1fY2hpbGROb2Rl
TGlzdENhY2hlcyBieSBjbGVhcmluZyBpdCBpZiB0aGVyZSBhcmUgbm8gYWRkaXRpb25hbCBjbGll
bnRzCisKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGVMaXN0c05vZGVEYXRhOjppc0VtcHR5KToKKyAg
ICAgICAgICAgIFRlc3QgZW1wdGluZXNzIG9mIHZhcmlvdXMgTm9kZUxpc3RDYWNoZXMgc2ltcGx5
IGJ5IHRlc3RpbmcgaGFzaCBlbXB0aW5lc3MgaW5zdGVhZCBvZiB0ZXN0aW5nIGZvciBub24temVy
byByZWYgY291bnQgb2YgaXRlbXMuCisgICAgICAgICAgICBtX2NoaWxkTm9kZUxpc3RDYWNoZXMg
aXMgZW1wdHkgaWYgaXQgaXMgbnVsbC4KKworICAgICAgICAqIGRvbS9Ob2RlLmg6IAorICAgICAg
ICAqIGRvbS9Ob2RlUmFyZURhdGEuaDoKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGVMaXN0c05vZGVE
YXRhOjpOb2RlTGlzdHNOb2RlRGF0YSk6CisgICAgICAgICAgICBDb25zdHJ1Y3QgbV9jaGlsZE5v
ZGVMaXN0Q2FjaGVzIGxhemlseS4KKwogMjAxMS0wNS0yMyAgUnViZW4gIDxjaHJvbWl1bUBoeWJy
aWRzb3VyY2Uub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvbnkgQ2hhbmcuCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
ZG9tL05vZGUuY3BwCShyZXZpc2lvbiA4NjU3NCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2Rl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjA4LDYgKzYwOCw4IEBAIFBhc3NSZWZQdHI8Tm9kZUxp
c3Q+IE5vZGU6OmNoaWxkTm9kZXMoKQogICAgICAgICAgICAgZG9jdW1lbnQoKS0+YWRkTm9kZUxp
c3RDYWNoZSgpOwogICAgIH0KIAorICAgIGlmICghZGF0YS0+bm9kZUxpc3RzKCktPm1fY2hpbGRO
b2RlTGlzdENhY2hlcykKKyAgICAgICAgZGF0YS0+bm9kZUxpc3RzKCktPm1fY2hpbGROb2RlTGlz
dENhY2hlcyA9IER5bmFtaWNOb2RlTGlzdDo6Q2FjaGVzOjpjcmVhdGUoKTsKICAgICByZXR1cm4g
Q2hpbGROb2RlTGlzdDo6Y3JlYXRlKHRoaXMsIGRhdGEtPm5vZGVMaXN0cygpLT5tX2NoaWxkTm9k
ZUxpc3RDYWNoZXMuZ2V0KCkpOwogfQogCkBAIC05OTMsMTEgKzk5NSw3IEBAIHZvaWQgTm9kZTo6
dW5yZWdpc3RlckR5bmFtaWNOb2RlTGlzdChEeW4KICAgICBpZiAobGlzdC0+aGFzT3duQ2FjaGVz
KCkpIHsKICAgICAgICAgTm9kZVJhcmVEYXRhKiBkYXRhID0gcmFyZURhdGEoKTsKICAgICAgICAg
ZGF0YS0+bm9kZUxpc3RzKCktPm1fbGlzdHNXaXRoQ2FjaGVzLnJlbW92ZShsaXN0KTsKLSAgICAg
ICAgaWYgKGRhdGEtPm5vZGVMaXN0cygpLT5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGRhdGEt
PmNsZWFyTm9kZUxpc3RzKCk7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnQoKSkKLSAgICAgICAg
ICAgICAgICBkb2N1bWVudCgpLT5yZW1vdmVOb2RlTGlzdENhY2hlKCk7Ci0gICAgICAgIH0KKyAg
ICAgICAgY2xlYXJOb2RlTGlzdHNJZlBvc3NpYmxlKCk7CiAgICAgfQogfQogCkBAIC0xMDE0LDEw
ICsxMDEyLDcgQEAgdm9pZCBOb2RlOjpub3RpZnlMb2NhbE5vZGVMaXN0c0F0dHJpYnV0ZQogICAg
IGVsc2UKICAgICAgICAgZGF0YS0+bm9kZUxpc3RzKCktPmludmFsaWRhdGVDYWNoZXMoKTsKIAot
ICAgIGlmIChkYXRhLT5ub2RlTGlzdHMoKS0+aXNFbXB0eSgpKSB7Ci0gICAgICAgIGRhdGEtPmNs
ZWFyTm9kZUxpc3RzKCk7Ci0gICAgICAgIGRvY3VtZW50KCktPnJlbW92ZU5vZGVMaXN0Q2FjaGUo
KTsKLSAgICB9CisgICAgY2xlYXJOb2RlTGlzdHNJZlBvc3NpYmxlKCk7CiB9CiAKIHZvaWQgTm9k
ZTo6bm90aWZ5Tm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpCkBAIC0xMDQwLDEwICsxMDM1LDE4
IEBAIHZvaWQgTm9kZTo6bm90aWZ5TG9jYWxOb2RlTGlzdHNDaGlsZHJlbkMKICAgICBmb3IgKE5v
ZGVMaXN0c05vZGVEYXRhOjpOb2RlTGlzdFNldDo6aXRlcmF0b3IgaSA9IGRhdGEtPm5vZGVMaXN0
cygpLT5tX2xpc3RzV2l0aENhY2hlcy5iZWdpbigpOyBpICE9IGVuZDsgKytpKQogICAgICAgICAo
KmkpLT5pbnZhbGlkYXRlQ2FjaGUoKTsKIAotICAgIGlmIChkYXRhLT5ub2RlTGlzdHMoKS0+aXNF
bXB0eSgpKSB7Ci0gICAgICAgIGRhdGEtPmNsZWFyTm9kZUxpc3RzKCk7Ci0gICAgICAgIGRvY3Vt
ZW50KCktPnJlbW92ZU5vZGVMaXN0Q2FjaGUoKTsKLSAgICB9CisgICAgY2xlYXJOb2RlTGlzdHNJ
ZlBvc3NpYmxlKCk7Cit9CisgICAgCit2b2lkIE5vZGU6OmNsZWFyTm9kZUxpc3RzSWZQb3NzaWJs
ZSgpCit7CisgICAgQVNTRVJUKHJhcmVEYXRhKCktPm5vZGVMaXN0cygpKTsKKworICAgIE5vZGVS
YXJlRGF0YSogZGF0YSA9IHJhcmVEYXRhKCk7CisgICAgaWYgKCFkYXRhLT5ub2RlTGlzdHMoKS0+
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgZGF0YS0+Y2xlYXJOb2RlTGlzdHMoKTsK
KyAgICBkb2N1bWVudCgpLT5yZW1vdmVOb2RlTGlzdENhY2hlKCk7CiB9CiAKIHZvaWQgTm9kZTo6
bm90aWZ5Tm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKCkKQEAgLTI1MzIsNyArMjUzNSwxMiBAQCB2
b2lkIE5vZGU6OmZvcm1hdEZvckRlYnVnZ2VyKGNoYXIqIGJ1ZmZlCiAKIHZvaWQgTm9kZUxpc3Rz
Tm9kZURhdGE6OmludmFsaWRhdGVDYWNoZXMoKQogewotICAgIG1fY2hpbGROb2RlTGlzdENhY2hl
cy0+cmVzZXQoKTsKKyAgICBpZiAobV9jaGlsZE5vZGVMaXN0Q2FjaGVzKSB7CisgICAgICAgIGlm
IChtX2NoaWxkTm9kZUxpc3RDYWNoZXMtPmhhc09uZVJlZigpKQorICAgICAgICAgICAgbV9jaGls
ZE5vZGVMaXN0Q2FjaGVzLmNsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fY2hp
bGROb2RlTGlzdENhY2hlcy0+cmVzZXQoKTsKKyAgICB9CiAKICAgICBpZiAobV9sYWJlbHNOb2Rl
TGlzdENhY2hlKQogICAgICAgICBtX2xhYmVsc05vZGVMaXN0Q2FjaGUtPmludmFsaWRhdGVDYWNo
ZSgpOwpAQCAtMjU2MywzMiArMjU3MSwxNyBAQCBib29sIE5vZGVMaXN0c05vZGVEYXRhOjppc0Vt
cHR5KCkgY29uc3QKICAgICBpZiAoIW1fbGlzdHNXaXRoQ2FjaGVzLmlzRW1wdHkoKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKG1fY2hpbGROb2RlTGlzdENhY2hlcy0+cmVmQ291
bnQoKSkKKyAgICBpZiAobV9jaGlsZE5vZGVMaXN0Q2FjaGVzKQogICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgCi0gICAgVGFnTm9kZUxpc3RDYWNoZTo6Y29uc3RfaXRlcmF0b3IgdGFnQ2FjaGVF
bmQgPSBtX3RhZ05vZGVMaXN0Q2FjaGUuZW5kKCk7Ci0gICAgZm9yIChUYWdOb2RlTGlzdENhY2hl
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fdGFnTm9kZUxpc3RDYWNoZS5iZWdpbigpOyBpdCAhPSB0
YWdDYWNoZUVuZDsgKytpdCkgewotICAgICAgICBpZiAoaXQtPnNlY29uZC0+cmVmQ291bnQoKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBUYWdOb2RlTGlzdENhY2hl
TlM6OmNvbnN0X2l0ZXJhdG9yIHRhZ0NhY2hlTlNFbmQgPSBtX3RhZ05vZGVMaXN0Q2FjaGVOUy5l
bmQoKTsKLSAgICBmb3IgKFRhZ05vZGVMaXN0Q2FjaGVOUzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X3RhZ05vZGVMaXN0Q2FjaGVOUy5iZWdpbigpOyBpdCAhPSB0YWdDYWNoZU5TRW5kOyArK2l0KSB7
Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kLT5yZWZDb3VudCgpKQotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLQotICAgIENsYXNzTm9kZUxpc3RDYWNoZTo6Y29uc3RfaXRlcmF0b3Ig
Y2xhc3NDYWNoZUVuZCA9IG1fY2xhc3NOb2RlTGlzdENhY2hlLmVuZCgpOwotICAgIGZvciAoQ2xh
c3NOb2RlTGlzdENhY2hlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fY2xhc3NOb2RlTGlzdENhY2hl
LmJlZ2luKCk7IGl0ICE9IGNsYXNzQ2FjaGVFbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5z
ZWNvbmQtPnJlZkNvdW50KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCi0g
ICAgTmFtZU5vZGVMaXN0Q2FjaGU6OmNvbnN0X2l0ZXJhdG9yIG5hbWVDYWNoZUVuZCA9IG1fbmFt
ZU5vZGVMaXN0Q2FjaGUuZW5kKCk7Ci0gICAgZm9yIChOYW1lTm9kZUxpc3RDYWNoZTo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX25hbWVOb2RlTGlzdENhY2hlLmJlZ2luKCk7IGl0ICE9IG5hbWVDYWNo
ZUVuZDsgKytpdCkgewotICAgICAgICBpZiAoaXQtPnNlY29uZC0+cmVmQ291bnQoKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgaWYgKCFtX3RhZ05vZGVMaXN0Q2FjaGUu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtX3RhZ05vZGVMaXN0
Q2FjaGVOUy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1fY2xh
c3NOb2RlTGlzdENhY2hlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
ICghbV9uYW1lTm9kZUxpc3RDYWNoZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
IAogICAgIGlmIChtX2xhYmVsc05vZGVMaXN0Q2FjaGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvZG9tL05vZGUuaAkocmV2aXNpb24gODY1NzQpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20v
Tm9kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00OTcsNiArNDk3LDcgQEAgcHVibGljOgogICAgIHZv
aWQgc2hvd1RyZWVBbmRNYXJrKGNvbnN0IE5vZGUqIG1hcmtlZE5vZGUxLCBjb25zdCBjaGFyKiBt
YXJrZWRMYWJlbDEsIGNvbnN0IE5vZGUqIG1hcmtlZE5vZGUyID0gMCwgY29uc3QgY2hhciogbWFy
a2VkTGFiZWwyID0gMCkgY29uc3Q7CiAjZW5kaWYKIAorICAgIHZvaWQgY2xlYXJOb2RlTGlzdHNJ
ZlBvc3NpYmxlKCk7CiAgICAgdm9pZCByZWdpc3RlckR5bmFtaWNOb2RlTGlzdChEeW5hbWljTm9k
ZUxpc3QqKTsKICAgICB2b2lkIHVucmVnaXN0ZXJEeW5hbWljTm9kZUxpc3QoRHluYW1pY05vZGVM
aXN0Kik7CiAgICAgdm9pZCBub3RpZnlOb2RlTGlzdHNDaGlsZHJlbkNoYW5nZWQoKTsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlUmFyZURhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9kb20vTm9kZVJhcmVEYXRhLmgJKHJldmlzaW9uIDg2NTc0KQorKysgU291cmNlL1dl
YkNvcmUvZG9tL05vZGVSYXJlRGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC02OSwxMCArNjksNyBA
QCBwdWJsaWM6CiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgTm9k
ZUxpc3RzTm9kZURhdGEoKQotICAgICAgICA6IG1fY2hpbGROb2RlTGlzdENhY2hlcyhEeW5hbWlj
Tm9kZUxpc3Q6OkNhY2hlczo6Y3JlYXRlKCkpLCBtX2xhYmVsc05vZGVMaXN0Q2FjaGUoMCkKLSAg
ICB7Ci0gICAgfQorICAgIE5vZGVMaXN0c05vZGVEYXRhKCkgOiBtX2xhYmVsc05vZGVMaXN0Q2Fj
aGUoMCkge30KIH07CiAgICAgCiBjbGFzcyBOb2RlUmFyZURhdGEgewo=
</data>
<flag name="review"
          id="87776"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>94480</attachid>
            <date>2011-05-23 13:46:32 -0700</date>
            <delta_ts>2011-05-23 13:46:32 -0700</delta_ts>
            <desc>perf test</desc>
            <filename>textContent.html</filename>
            <type>text/html</type>
            <size>1611</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPkR5bmFtaWMgVGV4dCBN
ZWFzdXJlbWVudDwvdGl0bGU+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3Jl
ZW4iPgoKICAgICAgZGl2IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVm
dDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgZm9udDogMjJweCBIZWx2ZXRpY2E7CiAgICAg
IH0KCiAgICA8L3N0eWxlPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFy
c2V0PSJ1dGYtOCI+CiAgICAgICAgZnVuY3Rpb24gZ2MoKSB7CiAgICAgICAgICAgIGlmICh0eXBl
b2YgR0NDb250cm9sbGVyICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgR0NDb250cm9sbGVy
LmNvbGxlY3QoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBn
Y1JlYyhuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG4gPCAxKQogICAgICAgICAgICAgICAg
ICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IHtpOiAiYWIiICsg
aSArIChpIC8gMTAwMDAwKX07CiAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiZm9vIjsKICAg
ICAgICAgICAgICAgICAgICBnY1JlYyhuLTEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwOyBpKyspCiAgICAgICAgICAgICAgICBnY1Jl
YygxMCkKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRz
QnlUYWdOYW1lKCJzdHlsZSIpOwogICAgICBnYygpOwogICAgICAKICAgICAgd2luZG93LmFkZEV2
ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8g
cnVuIHRlc3QgaW4gYSB0aW1lb3V0IHRvIG1ha2Ugc3VyZSB3ZWIgcGFnZSBsb2FkaW5nIGhhcyBu
byBpbXBhY3QKICAgICAgICAvLyB3aXRoIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50CiAgICAgICAg
d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGNvdW50ID0gMTAw
MDA7CiAgICAgICAgICB2YXIgdGV4dCA9ICdUaGlzIGlzIGEgdGl0bGUnOwogICAgICAgICAgLy8g
cmVjb3JkIHN0YXJ0IHRpbWUgZm9yIGxhdGVyIGNvbXBhcmlzb24KICAgICAgICAgIHZhciBzdGFy
dCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAvLyBjcmVhdGUgdGhlIDxkaXY+IHdlJ2xsIGJlIGFw
cGVuZGluZyB0bwogICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgICAgICAgLy8gdXBkYXRlIHRoZSA8
ZGl2PgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAg
ICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zb2xl
LmxvZygnVGltZSA9ICcgKyAobmV3IERhdGUoKSAtIHN0YXJ0KSk7CiAgICAgICAgfSwgMTAwMCk7
CiAgICAgIH0sIGZhbHNlKTsKCiAgICA8L3NjcmlwdD4KICA8L2hlYWQ+CgogIDxib2R5PgogIDwv
Ym9keT4KCjwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>