<?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>59812</bug_id>
          
          <creation_ts>2011-04-29 11:16:51 -0700</creation_ts>
          <short_desc>Refactor DOM tree traversal methods</short_desc>
          <delta_ts>2011-06-08 14:25:51 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</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>
          
          <blocked>54441</blocked>
    
    <blocked>59802</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Roland Steiner">rolandsteiner</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>dominicc</cc>
    
    <cc>hayato</cc>
    
    <cc>morrita</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>395377</commentid>
    <comment_count>0</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2011-04-29 11:16:51 -0700</bug_when>
    <thetext>Currently we have a slew of methods to climb the DOM tree in conjunction with shadow trees that should be pruned down: parent(), parentNode(), parentOrHostNode(), parentNodeGuaranteedHostFree(), shadowAncestorNode(), shadowTreeRootNode()...

Conceptually we only need:

Node
    parent()
    treeScope()

Element
    shadowRoot()

ShadowRoot
    shadowHost()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406243</commentid>
    <comment_count>1</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2011-05-18 21:40:19 -0700</bug_when>
    <thetext>ShadowRoot
    parentTreeScope()

is also needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406245</commentid>
    <comment_count>2</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-05-18 21:42:33 -0700</bug_when>
    <thetext>htmlediting is a great place to fish for those.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406892</commentid>
    <comment_count>3</comment_count>
    <who name="Dominic Cooney">dominicc</who>
    <bug_when>2011-05-19 22:46:10 -0700</bug_when>
    <thetext>Per the discussion in bug 54441 we should consider broadening the scope of this bug to not just simplify the number of accessors but provide traversals to simplify the actual uses of these.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406902</commentid>
    <comment_count>4</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2011-05-19 23:35:29 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Per the discussion in bug 54441 we should consider broadening the scope of this bug to not just simplify the number of accessors but provide traversals to simplify the actual uses of these.

IMHO refactoring more complex traversal methods (such as the Node::traverse...() functions) as discussed in bug 54441 is IMHO a separate and orthogonal issue from paring down the accessors as described here (and therefore should be different bug entries).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406905</commentid>
    <comment_count>5</comment_count>
      <attachid>94179</attachid>
    <who name="Hayato Ito">hayato</who>
    <bug_when>2011-05-19 23:38:23 -0700</bug_when>
    <thetext>Created attachment 94179
WIP - add universalTraverseNextNode</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406906</commentid>
    <comment_count>6</comment_count>
    <who name="Hayato Ito">hayato</who>
    <bug_when>2011-05-19 23:43:07 -0700</bug_when>
    <thetext>Let me share my patch (work in progress). I am trying to add a new traverseNode family, which traverses also into a shadow dom and a document in a frame element.

That function will be used in implementing a tab traversal.
The function name is a tentative name.  I&apos;ll try to implement a tab traversal using this function.

Maybe I should file a new bug entry for this patch.

(In reply to comment #5)
&gt; Created an attachment (id=94179) [details]
&gt; WIP - add universalTraverseNextNode</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406971</commentid>
    <comment_count>7</comment_count>
      <attachid>94179</attachid>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2011-05-20 02:46:52 -0700</bug_when>
    <thetext>Comment on attachment 94179
WIP - add universalTraverseNextNode

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

Refering to the discussion in bug 54441, given that the functionality is getting rather complex and specific I&apos;d also vote to move this into a separate class - or perhaps template that takes a traversal strategy trait (?).

&gt; Source/WebCore/dom/Node.cpp:1143
&gt; +    if (renderer() &amp;&amp; renderer()-&gt;isTextControl()) {

Once the conversion to new-style shadow DOM is finished, this shouldn&apos;t be necessary anymore :)

&gt; Source/WebCore/dom/Node.cpp:1149
&gt; +        return firstChild();

The code traverses first the shadow DOM, then the &quot;light&quot; DOM children. For tab traversal it may be necessary to consider the order of &lt;content&gt; elements in the shadow DOM instead - i.e., jump to the appropriate light DOM child(ren) from the shadow DOM &lt;content&gt; node(s).

&gt; Source/WebCore/dom/Node.cpp:2563
&gt; +void Node::showTreeAndMarkDeeply(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2) const

Isn&apos;t the declaration for this function missing in the header file?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>406978</commentid>
    <comment_count>8</comment_count>
    <who name="Hayato Ito">hayato</who>
    <bug_when>2011-05-20 03:24:02 -0700</bug_when>
    <thetext>Thank you for the review.

(In reply to comment #7)
&gt; (From update of attachment 94179 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=94179&amp;action=review
&gt; 
&gt; Refering to the discussion in bug 54441, given that the functionality is getting rather complex and specific I&apos;d also vote to move this into a separate class - or perhaps template that takes a traversal strategy trait (?).

Yeah, I am not sure whether this functionality should belong to a Node class or not. Maybe I&apos;ll move that to FocusController class or other suitable locations. But I haven&apos;t decided yet where we should have it.

A traversal strategy trait sounds nice, but we should be careful to implement a such a trait, which should not cause any performance impacts to existing traverseXXX functions. I don&apos;t have a clear idea about it as of now.

&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:1143
&gt; &gt; +    if (renderer() &amp;&amp; renderer()-&gt;isTextControl()) {
&gt; 
&gt; Once the conversion to new-style shadow DOM is finished, this shouldn&apos;t be necessary anymore :)

Thank you for the info. I am assuming that we should have it as of now :)

&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:1149
&gt; &gt; +        return firstChild();
&gt; 
&gt; The code traverses first the shadow DOM, then the &quot;light&quot; DOM children. For tab traversal it may be necessary to consider the order of &lt;content&gt; elements in the shadow DOM instead - i.e., jump to the appropriate light DOM child(ren) from the shadow DOM &lt;content&gt; node(s).

Nice point. Let me implement that in a next patch.

&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:2563
&gt; &gt; +void Node::showTreeAndMarkDeeply(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2) const
&gt; 
&gt; Isn&apos;t the declaration for this function missing in the header file?

True. I&apos;ll address it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407113</commentid>
    <comment_count>9</comment_count>
      <attachid>94179</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-05-20 08:37:05 -0700</bug_when>
    <thetext>Comment on attachment 94179
WIP - add universalTraverseNextNode

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

&gt; Source/WebCore/dom/Node.cpp:2541
&gt; +void Node::showTreeForThisDeeply() const

Deeply sounds like a wrong word. What are you trying to communicate here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407211</commentid>
    <comment_count>10</comment_count>
      <attachid>94179</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-20 11:19:52 -0700</bug_when>
    <thetext>Comment on attachment 94179
WIP - add universalTraverseNextNode

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

&gt; Source/WebCore/dom/Node.cpp:1137
&gt; +Node* Node::traverseNextNodeConsideringFrameAndShadow() const

Considering frame and shadow sound misleading because we certainly consider the existence of frame and shadow whenever we traverse nodes.

Maybe traverseNextNodeAcrossFrameAndShadow?

&gt; Source/WebCore/dom/Node.cpp:1142
&gt; +    if (shadowRoot(this))
&gt; +        return shadowRoot(this)-&gt;traverseNextNodeConsideringFrameAndShadow();

I would have saved the shadowRoot as a pointer here to avoid accessing rare data twice.

&gt;&gt;&gt; Source/WebCore/dom/Node.cpp:1143
&gt;&gt;&gt; +    if (renderer() &amp;&amp; renderer()-&gt;isTextControl()) {
&gt;&gt; 
&gt;&gt; Once the conversion to new-style shadow DOM is finished, this shouldn&apos;t be necessary anymore :)
&gt; 
&gt; Thank you for the info. I am assuming that we should have it as of now :)

The patch has been r+ed so it&apos;ll probably be landed before this patch gets r+.

&gt; Source/WebCore/dom/Node.cpp:1157
&gt; +    if (nextSibling())
&gt; +        return nextSibling();
&gt; +    const Node* n = this;
&gt; +    while (n &amp;&amp; !n-&gt;nextSibling())
&gt; +        n = n-&gt;parentOrHostOrFrameNode();
&gt; +    if (n)
&gt; +        return n-&gt;nextSibling();
&gt; +    return 0;

Why don&apos;t we just call traverseNextNode here instead?  I would not like to see code duplication like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>407726</commentid>
    <comment_count>11</comment_count>
    <who name="Hayato Ito">hayato</who>
    <bug_when>2011-05-22 19:21:56 -0700</bug_when>
    <thetext>Thank you for the review. As Roland said, this patch should be discussed in an another bug.
It turned out that this patch is not so useful for tab traversing for focus (bug 54441), I don&apos;t have a strong reason to submit this anymore.

I&apos;ll address your comments if I need this patch again. But that should be in an another bug.

Thank you.

(In reply to comment #10)
&gt; (From update of attachment 94179 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=94179&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:1137
&gt; &gt; +Node* Node::traverseNextNodeConsideringFrameAndShadow() const
&gt; 
&gt; Considering frame and shadow sound misleading because we certainly consider the existence of frame and shadow whenever we traverse nodes.
&gt; 
&gt; Maybe traverseNextNodeAcrossFrameAndShadow?
&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:1142
&gt; &gt; +    if (shadowRoot(this))
&gt; &gt; +        return shadowRoot(this)-&gt;traverseNextNodeConsideringFrameAndShadow();
&gt; 
&gt; I would have saved the shadowRoot as a pointer here to avoid accessing rare data twice.
&gt; 
&gt; &gt;&gt;&gt; Source/WebCore/dom/Node.cpp:1143
&gt; &gt;&gt;&gt; +    if (renderer() &amp;&amp; renderer()-&gt;isTextControl()) {
&gt; &gt;&gt; 
&gt; &gt;&gt; Once the conversion to new-style shadow DOM is finished, this shouldn&apos;t be necessary anymore :)
&gt; &gt; 
&gt; &gt; Thank you for the info. I am assuming that we should have it as of now :)
&gt; 
&gt; The patch has been r+ed so it&apos;ll probably be landed before this patch gets r+.
&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:1157
&gt; &gt; +    if (nextSibling())
&gt; &gt; +        return nextSibling();
&gt; &gt; +    const Node* n = this;
&gt; &gt; +    while (n &amp;&amp; !n-&gt;nextSibling())
&gt; &gt; +        n = n-&gt;parentOrHostOrFrameNode();
&gt; &gt; +    if (n)
&gt; &gt; +        return n-&gt;nextSibling();
&gt; &gt; +    return 0;
&gt; 
&gt; Why don&apos;t we just call traverseNextNode here instead?  I would not like to see code duplication like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417534</commentid>
    <comment_count>12</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2011-06-08 14:25:51 -0700</bug_when>
    <thetext>Closing per last comment.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>94179</attachid>
            <date>2011-05-19 23:38:23 -0700</date>
            <delta_ts>2011-05-20 11:19:52 -0700</delta_ts>
            <desc>WIP - add universalTraverseNextNode</desc>
            <filename>bug-59812-20110520153821.patch</filename>
            <type>text/plain</type>
            <size>6260</size>
            <attacher name="Hayato Ito">hayato</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODY1MjAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBiYjJlYTRiMTE1MTBlZDI4
ZmYzY2Y0OTYwNDYwN2ZkZGM0OWU1ZDc0Li4zZjdjZGE0MDBhZWYwZDNjYTQ1NTRlN2YxM2E2MjYx
MDczNjQxYWI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjYgQEAKKzIwMTEtMDUtMTkgIEhheWF0
byBJdG8gIDxoYXlhdG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZCBhIG5ldyBub2RlIHRyYXZlcnNhbCBmdW5jdGlvbiB3
aGljaCB0cmF2ZXJzZXMgaW50byBhIHNoYWRvdyByb290IGFuZAorICAgICAgICBhIGRvY3VtZW50
IGluIGEgZnJhbWUgZWxlbWVudC4KKworICAgICAgICBUaGlzIG5ldyBmdW5jdGlvbiB3aWxsIGJl
IHVzZWQgdG8gaW1wbGVtZW50IGEgdGFiIHRyYXZlcnNhbCBjb25zaWRlcmluZyBhIHNoYWRvdyBk
b20uCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU5
ODEyCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLgorCisgICAgICAgICogZG9tL05vZGUuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6ZnJhbWVEb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpzaGFk
b3dSb290KToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OnBhcmVudE9ySG9zdE9yRnJhbWVOb2Rl
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OnRyYXZlcnNlTmV4dE5vZGVDb25zaWRlcmluZ0Zy
YW1lQW5kU2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OnNob3dUcmVlRm9yVGhpc0Rl
ZXBseSk6CisgICAgICAgIChXZWJDb3JlOjp0cmF2ZXJzZVRyZWVBbmRNYXJrRGVlcGx5KToKKyAg
ICAgICAgKFdlYkNvcmU6Ok5vZGU6OnNob3dUcmVlQW5kTWFya0RlZXBseSk6CisgICAgICAgICog
ZG9tL05vZGUuaDoKKwogMjAxMS0wNS0xNiAgSGF5YXRvIEl0byAgPGhheWF0b0BjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5jcHAK
aW5kZXggYzk1OTdmYjZjZGIyMWFlN2RkZDkyZmQ5YzQ0NGYwYWVmMmEwN2ZhYS4uOWIzNjg2Y2Jh
ZDQ0OGJmZGI4NWEwNTJiZWExNGM0ODNiNTVmOTE2OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvZG9tL05vZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcApAQCAtNTUs
NiArNTUsNyBAQAogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAj
aW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVPd25lckVsZW1lbnQu
aCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJJbnNwZWN0b3JJbnN0cnVtZW50
YXRpb24uaCIKICNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCkBAIC04NDcsNyArODQ4LDE0IEBA
IGJvb2wgTm9kZTo6aGFzTm9uRW1wdHlCb3VuZGluZ0JveCgpIGNvbnN0CiAgICAgcmV0dXJuIGZh
bHNlOwogfQogCi1pbmxpbmUgc3RhdGljIFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QoTm9kZSogbm9k
ZSkKK2lubGluZSBzdGF0aWMgRG9jdW1lbnQqIGZyYW1lRG9jdW1lbnQoY29uc3QgTm9kZSogbm9k
ZSkKK3sKKyAgICBpZiAobm9kZSAmJiBub2RlLT5pc0ZyYW1lT3duZXJFbGVtZW50KCkpCisgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBIVE1MRnJhbWVPd25lckVsZW1lbnQqPihub2Rl
KS0+Y29udGVudERvY3VtZW50KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2lubGluZSBzdGF0aWMg
U2hhZG93Um9vdCogc2hhZG93Um9vdChjb25zdCBOb2RlKiBub2RlKQogewogICAgIHJldHVybiBu
b2RlLT5pc0VsZW1lbnROb2RlKCkgPyB0b0VsZW1lbnQobm9kZSktPnNoYWRvd1Jvb3QoKSA6IDA7
CiB9CkBAIC0xMTE4LDYgKzExMjYsMzcgQEAgdm9pZCBOb2RlOjpyZW1vdmVDYWNoZWRMYWJlbHNO
b2RlTGlzdChEeW5hbWljTm9kZUxpc3QqIGxpc3QpCiAgICAgZGF0YS0+bV9sYWJlbHNOb2RlTGlz
dENhY2hlID0gMDsKIH0KIAorQ29udGFpbmVyTm9kZSogTm9kZTo6cGFyZW50T3JIb3N0T3JGcmFt
ZU5vZGUoKSBjb25zdAoreworICAgIENvbnRhaW5lck5vZGUqIHBhcmVudCA9IHBhcmVudE9ySG9z
dE5vZGUoKTsKKyAgICBpZiAoIXBhcmVudCAmJiBkb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAg
ICBwYXJlbnQgPSBkb2N1bWVudCgpLT5mcmFtZSgpLT5vd25lckVsZW1lbnQoKTsKKyAgICByZXR1
cm4gcGFyZW50OworfQorCitOb2RlKiBOb2RlOjp0cmF2ZXJzZU5leHROb2RlQ29uc2lkZXJpbmdG
cmFtZUFuZFNoYWRvdygpIGNvbnN0Cit7CisgICAgaWYgKGlzRnJhbWVPd25lckVsZW1lbnQoKSkK
KyAgICAgICAgcmV0dXJuIGZyYW1lRG9jdW1lbnQodGhpcyk7CisgICAgaWYgKHNoYWRvd1Jvb3Qo
dGhpcykpCisgICAgICAgIHJldHVybiBzaGFkb3dSb290KHRoaXMpLT50cmF2ZXJzZU5leHROb2Rl
Q29uc2lkZXJpbmdGcmFtZUFuZFNoYWRvdygpOworICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRl
cmVyKCktPmlzVGV4dENvbnRyb2woKSkgeworICAgICAgICBOb2RlKiBpbm5lclRleHRFbGVtZW50
ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJlcigpKS0+aW5uZXJUZXh0
RWxlbWVudCgpOworICAgICAgICBpZiAoaW5uZXJUZXh0RWxlbWVudCkKKyAgICAgICAgICAgIHJl
dHVybiBpbm5lclRleHRFbGVtZW50OworICAgIH0KKyAgICBpZiAoZmlyc3RDaGlsZCgpKQorICAg
ICAgICByZXR1cm4gZmlyc3RDaGlsZCgpOworICAgIGlmIChuZXh0U2libGluZygpKQorICAgICAg
ICByZXR1cm4gbmV4dFNpYmxpbmcoKTsKKyAgICBjb25zdCBOb2RlKiBuID0gdGhpczsKKyAgICB3
aGlsZSAobiAmJiAhbi0+bmV4dFNpYmxpbmcoKSkKKyAgICAgICAgbiA9IG4tPnBhcmVudE9ySG9z
dE9yRnJhbWVOb2RlKCk7CisgICAgaWYgKG4pCisgICAgICAgIHJldHVybiBuLT5uZXh0U2libGlu
ZygpOworICAgIHJldHVybiAwOworfQorCiBOb2RlKiBOb2RlOjp0cmF2ZXJzZU5leHROb2RlKGNv
bnN0IE5vZGUqIHN0YXlXaXRoaW4pIGNvbnN0CiB7CiAgICAgaWYgKGZpcnN0Q2hpbGQoKSkKQEAg
LTI0OTksNiArMjUzOCw0MCBAQCB2b2lkIE5vZGU6OmZvcm1hdEZvckRlYnVnZ2VyKGNoYXIqIGJ1
ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAogICAgIHN0cm5jcHkoYnVmZmVyLCByZXN1bHQu
dXRmOCgpLmRhdGEoKSwgbGVuZ3RoIC0gMSk7CiB9CiAKK3ZvaWQgTm9kZTo6c2hvd1RyZWVGb3JU
aGlzRGVlcGx5KCkgY29uc3QKK3sKKyAgICBzaG93VHJlZUFuZE1hcmtEZWVwbHkodGhpcywgIioi
KTsKK30KKworc3RhdGljIHZvaWQgdHJhdmVyc2VUcmVlQW5kTWFya0RlZXBseShjb25zdCBTdHJp
bmcmIGJhc2VJbmRlbnQsIGNvbnN0IE5vZGUqIHJvb3ROb2RlLCBjb25zdCBOb2RlKiBtYXJrZWRO
b2RlMSwgY29uc3QgY2hhciogbWFya2VkTGFiZWwxLCBjb25zdCBOb2RlKiBtYXJrZWROb2RlMiwg
Y29uc3QgY2hhciogbWFya2VkTGFiZWwyKQoreworICAgIGZvciAoY29uc3QgTm9kZSogbm9kZSA9
IHJvb3ROb2RlOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZUNvbnNpZGVyaW5n
RnJhbWVBbmRTaGFkb3coKSkgeworICAgICAgICBpZiAobm9kZSA9PSBtYXJrZWROb2RlMSkKKyAg
ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtYXJrZWRMYWJlbDEpOworICAgICAgICBp
ZiAobm9kZSA9PSBtYXJrZWROb2RlMikKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMi
LCBtYXJrZWRMYWJlbDIpOworCisgICAgICAgIFN0cmluZyBpbmRlbnQgPSBiYXNlSW5kZW50Owor
ICAgICAgICBmb3IgKGNvbnN0IE5vZGUqIHRtcE5vZGUgPSBub2RlOyB0bXBOb2RlICYmIHRtcE5v
ZGUgIT0gcm9vdE5vZGU7IHRtcE5vZGUgPSB0bXBOb2RlLT5wYXJlbnRPckhvc3RPckZyYW1lTm9k
ZSgpKQorICAgICAgICAgICAgaW5kZW50ICs9ICJcdCI7CisgICAgICAgIGZwcmludGYoc3RkZXJy
LCAiJXMiLCBpbmRlbnQudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIG5vZGUtPnNob3dOb2RlKCk7
CisKKyAgICB9Cit9CisKK3ZvaWQgTm9kZTo6c2hvd1RyZWVBbmRNYXJrRGVlcGx5KGNvbnN0IE5v
ZGUqIG1hcmtlZE5vZGUxLCBjb25zdCBjaGFyKiBtYXJrZWRMYWJlbDEsIGNvbnN0IE5vZGUqIG1h
cmtlZE5vZGUyLCBjb25zdCBjaGFyKiBtYXJrZWRMYWJlbDIpIGNvbnN0Cit7CisgICAgY29uc3Qg
Tm9kZSogcm9vdE5vZGU7CisgICAgY29uc3QgTm9kZSogbm9kZSA9IHRoaXM7CisgICAgd2hpbGUg
KG5vZGUtPnBhcmVudE9ySG9zdE9yRnJhbWVOb2RlKCkpCisgICAgICAgIG5vZGUgPSBub2RlLT5w
YXJlbnRPckhvc3RPckZyYW1lTm9kZSgpOworICAgIHJvb3ROb2RlID0gbm9kZTsKKworICAgIFN0
cmluZyBzdGFydGluZ0luZGVudDsKKyAgICB0cmF2ZXJzZVRyZWVBbmRNYXJrRGVlcGx5KHN0YXJ0
aW5nSW5kZW50LCByb290Tm9kZSwgbWFya2VkTm9kZTEsIG1hcmtlZExhYmVsMSwgbWFya2VkTm9k
ZTIsIG1hcmtlZExhYmVsMik7Cit9CisKICNlbmRpZgogCiAvLyAtLS0tLS0tLQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgK
aW5kZXggM2ZmOGY0YTZmZmE1NjE2YmFmMGI3ODNlYzVjMDUwZWIyN2NiYjk5NS4uZDQyYTE2MDli
Mzk4OGJiNTQ2Mzk3NjkwMzQzY2JhZjlkM2Q4MzZmMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvZG9tL05vZGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCkBAIC0yMTgsNiAr
MjE4LDkgQEAgcHVibGljOgogICAgIGJvb2wgaXNJblNoYWRvd1RyZWUoKTsKICAgICAvLyBOb2Rl
J3MgcGFyZW50LCBzaGFkb3cgdHJlZSBob3N0LCBvciBTVkcgdXNlLgogICAgIENvbnRhaW5lck5v
ZGUqIHBhcmVudE9ySG9zdE5vZGUoKSBjb25zdDsKKyAgICAvLyBOb2RlJ3MgcGFyZW50LCBzaGFk
b3cgdHJlZSBob3N0LCBTVkcgdXNlLCBvciBGcmFtZU93bmVyRWxlbWVudCBvZiBhIGN1cnJlbnQg
ZnJhbWUuCisgICAgQ29udGFpbmVyTm9kZSogcGFyZW50T3JIb3N0T3JGcmFtZU5vZGUoKSBjb25z
dDsKKwogICAgIC8vIFVzZSB3aGVuIGl0J3MgZ3VhcmFudGVlZCB0byB0aGF0IHNoYWRvd0hvc3Qg
aXMgMCBhbmQgc3ZnU2hhZG93SG9zdCBpcyAwLgogICAgIENvbnRhaW5lck5vZGUqIHBhcmVudE5v
ZGVHdWFyYW50ZWVkSG9zdEZyZWUoKSBjb25zdDsKIApAQCAtNDAwLDYgKzQwMyw5IEBAIHB1Ymxp
YzoKICAgICBOb2RlKiB0cmF2ZXJzZVByZXZpb3VzTm9kZVBvc3RPcmRlcihjb25zdCBOb2RlKiBz
dGF5V2l0aGluID0gMCkgY29uc3Q7CiAgICAgTm9kZSogdHJhdmVyc2VQcmV2aW91c1NpYmxpbmdQ
b3N0T3JkZXIoY29uc3QgTm9kZSogc3RheVdpdGhpbiA9IDApIGNvbnN0OwogCisgICAgLy8gTGlr
ZSB0cmF2ZXJzYWxOZXh0Tm9kZSwgYnV0IHRyYXZlcnNpbmcgYWxzbyBpbnRvIGEgc2hhZG93IHJv
b3QgYW5kIGEgZG9jdW1lbnQgaW4gYSBmcmFtZSBlbGVtZW50LgorICAgIE5vZGUqIHRyYXZlcnNl
TmV4dE5vZGVDb25zaWRlcmluZ0ZyYW1lQW5kU2hhZG93KCkgY29uc3Q7CisKICAgICB2b2lkIGNo
ZWNrU2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBFeGNlcHRpb25Db2RlJik7
CiAgICAgYm9vbCBpc0Rlc2NlbmRhbnRPZihjb25zdCBOb2RlKikgY29uc3Q7CiAgICAgYm9vbCBj
b250YWlucyhjb25zdCBOb2RlKikgY29uc3Q7CkBAIC00OTUsNiArNTAxLDcgQEAgcHVibGljOgog
ICAgIHZvaWQgc2hvd05vZGUoY29uc3QgY2hhciogcHJlZml4ID0gIiIpIGNvbnN0OwogICAgIHZv
aWQgc2hvd1RyZWVGb3JUaGlzKCkgY29uc3Q7CiAgICAgdm9pZCBzaG93VHJlZUFuZE1hcmsoY29u
c3QgTm9kZSogbWFya2VkTm9kZTEsIGNvbnN0IGNoYXIqIG1hcmtlZExhYmVsMSwgY29uc3QgTm9k
ZSogbWFya2VkTm9kZTIgPSAwLCBjb25zdCBjaGFyKiBtYXJrZWRMYWJlbDIgPSAwKSBjb25zdDsK
KyAgICB2b2lkIHNob3dUcmVlRm9yVGhpc0RlZXBseSgpIGNvbnN0OwogI2VuZGlmCiAKICAgICB2
b2lkIHJlZ2lzdGVyRHluYW1pY05vZGVMaXN0KER5bmFtaWNOb2RlTGlzdCopOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>