<?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>103911</bug_id>
          
          <creation_ts>2012-12-03 11:32:23 -0800</creation_ts>
          <short_desc>Web Inspector: more robust treeoutline.findTreeElement</short_desc>
          <delta_ts>2012-12-05 10:33:13 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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>0</everconfirmed>
          <reporter name="johnjbarton">johnjbarton</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>vsevik</cc>
    
    <cc>web-inspector-bugs</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>781705</commentid>
    <comment_count>0</comment_count>
    <who name="johnjbarton">johnjbarton</who>
    <bug_when>2012-12-03 11:32:23 -0800</bug_when>
    <thetext>The current implementation of findTreeElement() calls itself recursively. If the tree data is correct, the algorithm (evidently) terminates. If the tree data is incorrect, the algorithm goes in to a loop.  

I hit this when debugging, the result is 100% CPU and sometimes no slow-script dialog and sometimes memory increases without bound. With the current behavior I am unable to determine what input data is incorrect since I cannot get control or output from the CPU bound process. 

I believe the current algorithm fails when given incorrect data because of the isAncestor search:
    for (var i = 0; i &lt; this.children.length; ++i) {
        item = this.children[i];
        if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {
            found = true;
            break;
        }
    }
When we call findTreeElement() recursively we are expecting an immediate child -- represented by the first conditional expression -- to match. After all we are walking down the ancestor chain from a known treeElement so one step should not require the isAncestor() path. 

However, if the match we need is not the first child, we check isAncestor() anyway (needlessly in the correct-data case). If we have bad data, then this first child could incorrectly report true for isAncestor(). Then the rest of the code in findTreeElement will cause us to recurse again. This should never happen with correct data. 

Obviously the errant data need not be in the first child, just any child before the true child.

Note that the current code has this comment immediately before the recursive call:
  // FIXME: we could do something faster than findTreeElement since we will know the next
  // ancestor exists in the tree
A more robust implementation would fix this ;-).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>781719</commentid>
    <comment_count>1</comment_count>
      <attachid>177296</attachid>
    <who name="johnjbarton">johnjbarton</who>
    <bug_when>2012-12-03 11:43:38 -0800</bug_when>
    <thetext>Created attachment 177296
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>781740</commentid>
    <comment_count>2</comment_count>
      <attachid>177296</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2012-12-03 12:01:52 -0800</bug_when>
    <thetext>Comment on attachment 177296
Patch

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

&gt; Source/WebCore/inspector/front-end/treeoutline.js:279
&gt; +        function oneLevel() {

{ should go on the next line

I also don&apos;t think this is right: imagine you get here due to isAncestor(item.representedObject, representedObject) returning true above. And there are no tree elements created for the path from root to given representedObject yet. You get into recursive findTreeElement for the parent object as the next step, but oneLevel (isAncestor substitude) returns false and you never call onpopulate on the parent.

&gt; Source/WebCore/inspector/front-end/treeoutline.js:282
&gt; +        function noAncestors() {

ditto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>781774</commentid>
    <comment_count>3</comment_count>
    <who name="johnjbarton">johnjbarton</who>
    <bug_when>2012-12-03 12:37:17 -0800</bug_when>
    <thetext>(In reply to comment #2)

&gt; I also don&apos;t think this is right: imagine you get here due to isAncestor(item.representedObject, representedObject) returning true above. And there are no tree elements created for the path from root to given representedObject yet. You get into recursive findTreeElement for the parent object as the next step, but oneLevel (isAncestor substitude) returns false and you never call onpopulate on the parent.

When we reach the first recursive findTreeElement call:

  childTreeElement = childTreeElement.treeOutline.findTreeElement(ancestors[i], oneLevel, noAncestors);
  
we have i = 0. So the first call to findTreeElement() will use ancestors[0]. This value will be the representedObject for the &apos;found&apos; childTreeElement, which is one of this.children[]. 

I was assuming that this.children[] are all in the cache, so the findTreeElement() will return the childTreeElement and we will call onpopulate() on it to begin the process of building the children-tree. 

Is this assumption incorrect? (all the tests pass FWIW).

If my assumption is incorrect, then we need to prepend this.representedObject to the ancestors list.

If my assumption is correct, then I will add comments to the code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>783069</commentid>
    <comment_count>4</comment_count>
      <attachid>177595</attachid>
    <who name="johnjbarton">johnjbarton</who>
    <bug_when>2012-12-04 16:08:41 -0800</bug_when>
    <thetext>Created attachment 177595
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>783265</commentid>
    <comment_count>5</comment_count>
      <attachid>177595</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-12-04 19:29:33 -0800</bug_when>
    <thetext>Comment on attachment 177595
Patch

Attachment 177595 did not pass win-ews (win):
Output: http://queues.webkit.org/results/15147284</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>783809</commentid>
    <comment_count>6</comment_count>
    <who name="johnjbarton">johnjbarton</who>
    <bug_when>2012-12-05 09:07:43 -0800</bug_when>
    <thetext>This patch is only JavaScript. As far as I can tell the win EWS never ran tests, it just failed in some way. Any hints?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>783856</commentid>
    <comment_count>7</comment_count>
      <attachid>177595</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-12-05 09:46:51 -0800</bug_when>
    <thetext>Comment on attachment 177595
Patch

Clearing flags on attachment: 177595

Committed r136706: &lt;http://trac.webkit.org/changeset/136706&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>783857</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-12-05 09:46:55 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>783883</commentid>
    <comment_count>9</comment_count>
    <who name="johnjbarton">johnjbarton</who>
    <bug_when>2012-12-05 10:33:13 -0800</bug_when>
    <thetext>In my original report I cited a 100% CPU problem tracked down to the code patched here. I claimed that incorrect remote data could cause the algorithm to recurse. 

With the patched WebInspector I attempted to reproduce the remote data problem. However I think my understanding of the issue was not quite correct.

Here are some outputs from the command line when we are in the patched code just after calling treeElement.onpopulate():

representedObject._nodeName
&quot;BODY&quot;
treeElement.representedObject._nodeName
&quot;HTML&quot;
treeElement.children.map(function(c){return c.representedObject._nodeName;});
[&quot;HEAD&quot;, &quot;BODY&quot;, &quot;HTML&quot;]

So for an HTML tag, the representation has three children: HEAD, BODY, and -- surprise to me -- HTML. Evidently the closing tag is represented as child treeElement:

treeElement.representedObject === treeElement.children[2].representedObject
true

Thus the DOMNode data is a tree, but the treeoutline never is.

Suppose we have 
&lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;div&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;
and suppose we have the body treeElement built but not the div. In the old algorithm we visit children of HTML, and we should find BODY because isAncestor(BODY, DIV) should be true. But any failure that might cause this test to fail will result in infinite recursion because the last child will always be true, eg isAncestor(HTML, DIV).

This does not explain how the test can fail but it does explain why my testing to verify that the treeoutline is itself a tree fails.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>177296</attachid>
            <date>2012-12-03 11:43:38 -0800</date>
            <delta_ts>2012-12-04 16:08:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-103911-20121203114105.patch</filename>
            <type>text/plain</type>
            <size>4786</size>
            <attacher name="johnjbarton">johnjbarton</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM2NDE5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTJjYjA2MzliZGY0ODQ5
MTRhMDQ5YTNjM2JhNmFhMWNjMjViOWEwNS4uODQ2MWEwZTFmMjhjY2VlNGFmODNhOTlkYTJhNDdi
ZTc1NTIwYmZjYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI2IEBACisyMDEyLTEyLTAzICBKb2hu
IEouIEJhcnRvbiAgPGpvaG5qYmFydG9uQGNocm9taXVtLm9yZz4KKworICAgICAgICBXZWIgSW5z
cGVjdG9yOiBtb3JlIHJvYnVzdCB0cmVlb3V0bGluZS5maW5kVHJlZUVsZW1lbnQKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwMzkxMQorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdoZW4gY2FsbGluZyBmaW5k
VHJlZUVsZW1lbnQoKSBmcm9tIGZpbmRUcmVlRWxlbWVudCgpLCBwYXNzIGZ1bmN0aW9ucworICAg
ICAgICBmb3IgaXNBbmNlc3RvcigpIGFuZCBnZXRQYXJlbnQoKSB0aGF0IHRyZWF0IHRoZWlyIGFy
Z3VtZW50IGFzIGFuCisgICAgICAgIG9ycGhhbi4gVGhhdCB3YXkgcmVjdXJzaXZlIGZpbmRUcmVl
RWxlbWVudCgpIG9ubHkgbG9va3MgYW1vbmcgdGhlCisgICAgICAgIGNoaWxkcmVuIG9mIHRoZSBj
dXJyZW50IHRyZWVFbGVtZW50IGZvciB0aGUgY2hpbGQgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAg
cmVwcmVzZW50ZWRPYmplY3QuIAorCisgICAgICAgIEFsc28gc29sdmVzIGEgRklYTUU7IHByb2Jh
Ymx5IG1hcmdpbmFsbHkgZmFzdGVyIChubyB1bm5lY2Vzc2FyeSAKKyAgICAgICAgaXNBbmNlc3Rv
cigpIGNhbGxzKS4gCisKKyAgICAgICAgTm8gbmV3IHRlc3RzOiBhbGdvcml0aG0gdHdlZWsuCisK
KyAgICAgICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL3RyZWVvdXRsaW5lLmpzOgorICAgICAgICAo
Lik6CisgICAgICAgICgubm9BbmNlc3RvcnMpOgorICAgICAgICAoVHJlZU91dGxpbmUucHJvdG90
eXBlLmZpbmRUcmVlRWxlbWVudCk6CisKIDIwMTItMTItMDMgIEFuZHJleSBBZGFpa2luICA8YWFu
ZHJleUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogW0NhbnZhc10gc2hv
dyByZXBsYXkgc2NyZWVuc2hvdCBvZiB0aGUgbGFzdCBjYWxsJ3MgY2FudmFzCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL3RyZWVvdXRsaW5lLmpzIGIvU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC90cmVlb3V0bGluZS5qcwppbmRleCA5YzUy
ZDVjODBjMDI5OTMzNTgzMjkwZmJmNzJlYzgyZTM1YTJhMjFkLi4zNDkwMGUwMWMxZTY5NzIyNzZk
ZjRkYzNjNTIwMzJlNTg1N2JmNDQ5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL3RyZWVvdXRsaW5lLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvdHJlZW91dGxpbmUuanMKQEAgLTI0NSwxMyArMjQ1LDE1IEBAIFRyZWVPdXRs
aW5lLnByb3RvdHlwZS5maW5kVHJlZUVsZW1lbnQgPSBmdW5jdGlvbihyZXByZXNlbnRlZE9iamVj
dCwgaXNBbmNlc3RvciwKICAgICBpZiAoY2FjaGVkRWxlbWVudCkKICAgICAgICAgcmV0dXJuIGNh
Y2hlZEVsZW1lbnQ7CiAKLSAgICAvLyBUaGUgcmVwcmVzZW50ZWRPYmplY3QgaXNuJ3Qga25vd24s
IHNvIHdlIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHRyZWUgYW5kIHdvcmsgZG93biB0byBmaW5k
IHRoZSBmaXJzdAotICAgIC8vIHRyZWUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgcmVwcmVzZW50
ZWRPYmplY3Qgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMuCi0gICAgdmFyIGl0ZW07CisgICAgLy8g
VGhlIHJlcHJlc2VudGVkT2JqZWN0IGlzbid0IGtub3duLCBzbyB3ZSBsb29rIHRocm91Z2ggb3Vy
IGNoaWxkIHRyZWUgZWxlbWVudHMgdG8gZmluZCB0aGUgZmlyc3QKKyAgICAvLyB0cmVlIGVsZW1l
bnQgdGhhdCByZXByZXNlbnRzIHJlcHJlc2VudGVkT2JqZWN0IG9yIHJlcHJlc2VudHMgb25lIG9m
IGl0cyBhbmNlc3RvcnMuCisgICAgdmFyIGNoaWxkVHJlZUVsZW1lbnQ7CisgICAgdmFyIGNoaWxk
T2JqZWN0OwogICAgIHZhciBmb3VuZCA9IGZhbHNlOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
dGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICBpdGVtID0gdGhpcy5jaGlsZHJl
bltpXTsKLSAgICAgICAgaWYgKGl0ZW0ucmVwcmVzZW50ZWRPYmplY3QgPT09IHJlcHJlc2VudGVk
T2JqZWN0IHx8IGlzQW5jZXN0b3IoaXRlbS5yZXByZXNlbnRlZE9iamVjdCwgcmVwcmVzZW50ZWRP
YmplY3QpKSB7CisgICAgICAgIGNoaWxkVHJlZUVsZW1lbnQgPSB0aGlzLmNoaWxkcmVuW2ldOwor
ICAgICAgICBjaGlsZE9iamVjdCA9IGNoaWxkVHJlZUVsZW1lbnQucmVwcmVzZW50ZWRPYmplY3Q7
CisgICAgICAgIGlmIChjaGlsZE9iamVjdCA9PT0gcmVwcmVzZW50ZWRPYmplY3QgfHwgaXNBbmNl
c3RvcihjaGlsZE9iamVjdCwgcmVwcmVzZW50ZWRPYmplY3QpKSB7CiAgICAgICAgICAgICBmb3Vu
ZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjYwLDI4ICsyNjIs
MzIgQEAgVHJlZU91dGxpbmUucHJvdG90eXBlLmZpbmRUcmVlRWxlbWVudCA9IGZ1bmN0aW9uKHJl
cHJlc2VudGVkT2JqZWN0LCBpc0FuY2VzdG9yLAogICAgIGlmICghZm91bmQpCiAgICAgICAgIHJl
dHVybiBudWxsOwogCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBpdGVtIHRoYXQgd2UgZm91bmQgaXMg
Y29ubmVjdGVkIHRvIHRoZSByb290IG9mIHRoZSB0cmVlLgotICAgIC8vIEJ1aWxkIHVwIGEgbGlz
dCBvZiByZXByZXNlbnRlZE9iamVjdCdzIGFuY2VzdG9ycyB0aGF0IGFyZW4ndCBhbHJlYWR5IGlu
IG91ciB0cmVlLgorICAgIC8vIFdhbGsgdGhlIHBhcmVudCBwb2ludGVycyBmcm9tIHRoZSByZXBy
ZXNlbnRlZE9iamVjdCB0byB0aGUgZm91bmQgdHJlZS1lbGVtZW50J3MgCisgICAgLy8gcmVwcmVz
ZW50ZWRPYmplY3QgdG8gYnVpbGQgYSBsaXN0IG9mIGludGVydmVuaW5nIGFuY2VzdG9yIG9iamVj
dHMuCiAgICAgdmFyIGFuY2VzdG9ycyA9IFtdOwotICAgIHZhciBjdXJyZW50T2JqZWN0ID0gcmVw
cmVzZW50ZWRPYmplY3Q7CisgICAgdmFyIGN1cnJlbnRPYmplY3QgPSBnZXRQYXJlbnQocmVwcmVz
ZW50ZWRPYmplY3QpOwogICAgIHdoaWxlIChjdXJyZW50T2JqZWN0KSB7CiAgICAgICAgIGFuY2Vz
dG9ycy51bnNoaWZ0KGN1cnJlbnRPYmplY3QpOwotICAgICAgICBpZiAoY3VycmVudE9iamVjdCA9
PT0gaXRlbS5yZXByZXNlbnRlZE9iamVjdCkKKyAgICAgICAgaWYgKGN1cnJlbnRPYmplY3QgPT09
IGNoaWxkVHJlZUVsZW1lbnQucmVwcmVzZW50ZWRPYmplY3QpCiAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgY3VycmVudE9iamVjdCA9IGdldFBhcmVudChjdXJyZW50T2JqZWN0KTsKICAgICB9
CiAKLSAgICAvLyBGb3IgZWFjaCBvZiB0aG9zZSBhbmNlc3RvcnMgd2UgcG9wdWxhdGUgdGhlbSB0
byBmaWxsIGluIHRoZSB0cmVlLgorICAgIC8vIFBvcHVsYXRlIGVhY2ggYW5jZXN0b3IncyBjaGls
ZHJlbiB0byBmaWxsIGluIHRoZSB0cmVlLgorICAgIGNoaWxkVHJlZUVsZW1lbnQgPSB0aGlzOwog
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAg
IC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjYWxsIGZpbmRUcmVlRWxlbWVudCB3aXRoIHRoZSBzYW1l
IHJlcHJlc2VudGVkT2JqZWN0Ci0gICAgICAgIC8vIGFnYWluLCB0byBwcmV2ZW50IGluZmluaXRl
IHJlY3Vyc2lvbi4KLSAgICAgICAgaWYgKGFuY2VzdG9yc1tpXSA9PT0gcmVwcmVzZW50ZWRPYmpl
Y3QpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgLy8gRklYTUU6IHdlIGNvdWxkIGRv
IHNvbWV0aGluZyBmYXN0ZXIgdGhhbiBmaW5kVHJlZUVsZW1lbnQgc2luY2Ugd2Ugd2lsbCBrbm93
IHRoZSBuZXh0Ci0gICAgICAgIC8vIGFuY2VzdG9yIGV4aXN0cyBpbiB0aGUgdHJlZS4KLSAgICAg
ICAgaXRlbSA9IHRoaXMuZmluZFRyZWVFbGVtZW50KGFuY2VzdG9yc1tpXSwgaXNBbmNlc3Rvciwg
Z2V0UGFyZW50KTsKLSAgICAgICAgaWYgKGl0ZW0pCi0gICAgICAgICAgICBpdGVtLm9ucG9wdWxh
dGUoKTsKKyAgICAgICAgZnVuY3Rpb24gb25lTGV2ZWwoKSB7CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZnVuY3Rpb24gbm9BbmNlc3RvcnMoKSB7CisgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWxsIGZpbmRUcmVl
RWxlbWVudCwgYnV0IHdpdGhvdXQgYW55IGFuY2VzdG9yIGFuYWx5c2lzIHRvIGF2b2lkIHJlY3Vy
c2lvbi4KKyAgICAgICAgY2hpbGRUcmVlRWxlbWVudCA9IGNoaWxkVHJlZUVsZW1lbnQudHJlZU91
dGxpbmUuZmluZFRyZWVFbGVtZW50KGFuY2VzdG9yc1tpXSwgb25lTGV2ZWwsIG5vQW5jZXN0b3Jz
KTsKKyAgICAgICAgaWYgKGNoaWxkVHJlZUVsZW1lbnQpCisgICAgICAgICAgICBjaGlsZFRyZWVF
bGVtZW50Lm9ucG9wdWxhdGUoKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIGJyZWFrOyAv
LyBpbmNvbnNpc3RlbnQgZGF0YSwgcG9zc2liaWx5IHRlbXBvcmFyaWx5LiAKICAgICB9CiAKICAg
ICByZXR1cm4gdGhpcy5nZXRDYWNoZWRUcmVlRWxlbWVudChyZXByZXNlbnRlZE9iamVjdCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>177595</attachid>
            <date>2012-12-04 16:08:41 -0800</date>
            <delta_ts>2012-12-05 09:46:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-103911-20121204160606.patch</filename>
            <type>text/plain</type>
            <size>4017</size>
            <attacher name="johnjbarton">johnjbarton</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM2NDE5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTJjYjA2MzliZGY0ODQ5
MTRhMDQ5YTNjM2JhNmFhMWNjMjViOWEwNS4uY2E0MTc2MTg0MzczNGJiNzNhYjBmYjFkYzlmY2Q0
ZWE3YjE1YWJkMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIyIEBACisyMDEyLTEyLTA0ICBKb2hu
IEouIEJhcnRvbiAgPGpvaG5qYmFydG9uQGNocm9taXVtLm9yZz4KKworICAgICAgICBXZWIgSW5z
cGVjdG9yOiBtb3JlIHJvYnVzdCB0cmVlb3V0bGluZS5maW5kVHJlZUVsZW1lbnQKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwMzkxMQorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vbi1yZWN1cnNpdmUgYWxn
b3JpdGhtIHRvIHBvcHVsYXRlIHRoZSB0cmVlb3V0bGluZSBnaXZlbiBhbiBET01Ob2RlCisgICAg
ICAgIGFzIHJlcHJlc2VudGVkT2JqZWN0LiBXYWxrIHVwIHRoZSBwYXJlbnRzIGZyb20gdGhlIGRl
c2lyZWQgb2JqZWN0CisgICAgICAgIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgaXMgY3VycmVudGx5
IHJlcHJlc2VudGVkIGluIHRoZSB0cmVlb3V0bGluZSAKKyAgICAgICAgY2FjaGUuIFRoZW4gd2Fs
ayBkb3duLCBwdXR0aW5nIGNoaWxkcmVuIGluIHRoZSBjYWNoZSB1bnRpbCB3ZSBnZXQgCisgICAg
ICAgIHRvIHRoZSBkZXNpcmVkIG9iamVjdCBhZ2Fpbi4gCisgICAgICAgIFdpdGggUGF2ZWwgRmVs
ZGVtYW4gPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBObyBuZXcgdGVzdHMsIHJl
ZmFjdG9yaW5nLCBubyBuZXcgZnVuY3Rpb24KKworICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVu
ZC90cmVlb3V0bGluZS5qczoKKyAgICAgICAgKFRyZWVPdXRsaW5lLnByb3RvdHlwZS5maW5kVHJl
ZUVsZW1lbnQpOgorCiAyMDEyLTEyLTAzICBBbmRyZXkgQWRhaWtpbiAgPGFhbmRyZXlAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IFtDYW52YXNdIHNob3cgcmVwbGF5IHNj
cmVlbnNob3Qgb2YgdGhlIGxhc3QgY2FsbCdzIGNhbnZhcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC90cmVlb3V0bGluZS5qcyBiL1NvdXJjZS9XZWJDb3Jl
L2luc3BlY3Rvci9mcm9udC1lbmQvdHJlZW91dGxpbmUuanMKaW5kZXggOWM1MmQ1YzgwYzAyOTkz
MzU4MzI5MGZiZjcyZWM4MmUzNWEyYTIxZC4uMTBkN2YzMzA5ZDg2NGMwMjZlNzg3N2U3NzY3MTcx
M2MwYjQ0YzFkNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVu
ZC90cmVlb3V0bGluZS5qcworKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5k
L3RyZWVvdXRsaW5lLmpzCkBAIC0yNDUsNDMgKzI0NSwyMiBAQCBUcmVlT3V0bGluZS5wcm90b3R5
cGUuZmluZFRyZWVFbGVtZW50ID0gZnVuY3Rpb24ocmVwcmVzZW50ZWRPYmplY3QsIGlzQW5jZXN0
b3IsCiAgICAgaWYgKGNhY2hlZEVsZW1lbnQpCiAgICAgICAgIHJldHVybiBjYWNoZWRFbGVtZW50
OwogCi0gICAgLy8gVGhlIHJlcHJlc2VudGVkT2JqZWN0IGlzbid0IGtub3duLCBzbyB3ZSBzdGFy
dCBhdCB0aGUgdG9wIG9mIHRoZSB0cmVlIGFuZCB3b3JrIGRvd24gdG8gZmluZCB0aGUgZmlyc3QK
LSAgICAvLyB0cmVlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHJlcHJlc2VudGVkT2JqZWN0IG9y
IG9uZSBvZiBpdHMgYW5jZXN0b3JzLgotICAgIHZhciBpdGVtOwotICAgIHZhciBmb3VuZCA9IGZh
bHNlOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkg
ewotICAgICAgICBpdGVtID0gdGhpcy5jaGlsZHJlbltpXTsKLSAgICAgICAgaWYgKGl0ZW0ucmVw
cmVzZW50ZWRPYmplY3QgPT09IHJlcHJlc2VudGVkT2JqZWN0IHx8IGlzQW5jZXN0b3IoaXRlbS5y
ZXByZXNlbnRlZE9iamVjdCwgcmVwcmVzZW50ZWRPYmplY3QpKSB7Ci0gICAgICAgICAgICBmb3Vu
ZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlm
ICghZm91bmQpCi0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBp
dGVtIHRoYXQgd2UgZm91bmQgaXMgY29ubmVjdGVkIHRvIHRoZSByb290IG9mIHRoZSB0cmVlLgot
ICAgIC8vIEJ1aWxkIHVwIGEgbGlzdCBvZiByZXByZXNlbnRlZE9iamVjdCdzIGFuY2VzdG9ycyB0
aGF0IGFyZW4ndCBhbHJlYWR5IGluIG91ciB0cmVlLgorICAgIC8vIFdhbGsgdXAgdGhlIHBhcmVu
dCBwb2ludGVycyBmcm9tIHRoZSBkZXNpcmVkIHJlcHJlc2VudGVkT2JqZWN0IAogICAgIHZhciBh
bmNlc3RvcnMgPSBbXTsKLSAgICB2YXIgY3VycmVudE9iamVjdCA9IHJlcHJlc2VudGVkT2JqZWN0
OwotICAgIHdoaWxlIChjdXJyZW50T2JqZWN0KSB7Ci0gICAgICAgIGFuY2VzdG9ycy51bnNoaWZ0
KGN1cnJlbnRPYmplY3QpOwotICAgICAgICBpZiAoY3VycmVudE9iamVjdCA9PT0gaXRlbS5yZXBy
ZXNlbnRlZE9iamVjdCkKKyAgICBmb3IgKHZhciBjdXJyZW50T2JqZWN0ID0gZ2V0UGFyZW50KHJl
cHJlc2VudGVkT2JqZWN0KTsgY3VycmVudE9iamVjdDsgIGN1cnJlbnRPYmplY3QgPSBnZXRQYXJl
bnQoY3VycmVudE9iamVjdCkpIHsKKyAgICAgICAgYW5jZXN0b3JzLnB1c2goY3VycmVudE9iamVj
dCk7CisgICAgICAgIGlmICh0aGlzLmdldENhY2hlZFRyZWVFbGVtZW50KGN1cnJlbnRPYmplY3Qp
KSAgLy8gc3RvcCBjbGltYmluZyBhcyBzb29uIGFzIHdlIGhpdAogICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGN1cnJlbnRPYmplY3QgPSBnZXRQYXJlbnQoY3VycmVudE9iamVjdCk7CiAgICAg
fQorICAgICAgICAKKyAgICBpZiAoIWN1cnJlbnRPYmplY3QpCisgICAgICAgIHJldHVybiBudWxs
OwogCi0gICAgLy8gRm9yIGVhY2ggb2YgdGhvc2UgYW5jZXN0b3JzIHdlIHBvcHVsYXRlIHRoZW0g
dG8gZmlsbCBpbiB0aGUgdHJlZS4KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5s
ZW5ndGg7ICsraSkgewotICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgY2FsbCBmaW5kVHJl
ZUVsZW1lbnQgd2l0aCB0aGUgc2FtZSByZXByZXNlbnRlZE9iamVjdAotICAgICAgICAvLyBhZ2Fp
biwgdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24uCi0gICAgICAgIGlmIChhbmNlc3RvcnNb
aV0gPT09IHJlcHJlc2VudGVkT2JqZWN0KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IC8vIEZJWE1FOiB3ZSBjb3VsZCBkbyBzb21ldGhpbmcgZmFzdGVyIHRoYW4gZmluZFRyZWVFbGVt
ZW50IHNpbmNlIHdlIHdpbGwga25vdyB0aGUgbmV4dAotICAgICAgICAvLyBhbmNlc3RvciBleGlz
dHMgaW4gdGhlIHRyZWUuCi0gICAgICAgIGl0ZW0gPSB0aGlzLmZpbmRUcmVlRWxlbWVudChhbmNl
c3RvcnNbaV0sIGlzQW5jZXN0b3IsIGdldFBhcmVudCk7Ci0gICAgICAgIGlmIChpdGVtKQotICAg
ICAgICAgICAgaXRlbS5vbnBvcHVsYXRlKCk7CisgICAgLy8gV2FsayBkb3duIHRvIHBvcHVsYXRl
IGVhY2ggYW5jZXN0b3IncyBjaGlsZHJlbiwgdG8gZmlsbCBpbiB0aGUgdHJlZSBhbmQgdGhlIGNh
Y2hlLgorICAgIGZvciAodmFyIGkgPSBhbmNlc3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkp
IHsKKyAgICAgICAgdmFyIHRyZWVFbGVtZW50ID0gdGhpcy5nZXRDYWNoZWRUcmVlRWxlbWVudChh
bmNlc3RvcnNbaV0pOworICAgICAgICBpZiAodHJlZUVsZW1lbnQpCisgICAgICAgICAgICB0cmVl
RWxlbWVudC5vbnBvcHVsYXRlKCk7ICAvLyBmaWxsIHRoZSBjYWNoZSB3aXRoIHRoZSBjaGlsZHJl
biBvZiB0cmVlRWxlbWVudAogICAgIH0KIAogICAgIHJldHVybiB0aGlzLmdldENhY2hlZFRyZWVF
bGVtZW50KHJlcHJlc2VudGVkT2JqZWN0KTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>