<?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>153269</bug_id>
          
          <creation_ts>2016-01-19 21:49:06 -0800</creation_ts>
          <short_desc>REGRESSION (r195305): Web Inspector: WebInspector.Object can dispatch constructor-level events multiple times</short_desc>
          <delta_ts>2016-01-21 21:54:46 -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</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikita Vasilyev">nvasilyev</reporter>
          <assigned_to name="Nikita Vasilyev">nvasilyev</assigned_to>
          <cc>bburg</cc>
    
    <cc>commit-queue</cc>
    
    <cc>graouts</cc>
    
    <cc>joepeck</cc>
    
    <cc>mattbaker</cc>
    
    <cc>nvasilyev</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1156878</commentid>
    <comment_count>0</comment_count>
    <who name="Nikita Vasilyev">nvasilyev</who>
    <bug_when>2016-01-19 21:49:06 -0800</bug_when>
    <thetext>In http://trac.webkit.org/changeset/195305 I accidentally undone https://bugs.webkit.org/show_bug.cgi?id=150579,
which re-introduced the bug.

We should bring that object.hasOwnProperty(&quot;_listeners&quot;) check back.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156879</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2016-01-19 21:49:26 -0800</bug_when>
    <thetext>&lt;rdar://problem/24253106&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156883</commentid>
    <comment_count>2</comment_count>
      <attachid>269340</attachid>
    <who name="Nikita Vasilyev">nvasilyev</who>
    <bug_when>2016-01-19 21:51:59 -0800</bug_when>
    <thetext>Created attachment 269340
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156933</commentid>
    <comment_count>3</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2016-01-20 00:31:58 -0800</bug_when>
    <thetext>I think we can write a test for this pretty easily! A test would be great!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156939</commentid>
    <comment_count>4</comment_count>
      <attachid>269340</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2016-01-20 07:05:27 -0800</bug_when>
    <thetext>Comment on attachment 269340
Patch

As Joe said, this needs a test so we don&apos;t break it once again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157191</commentid>
    <comment_count>5</comment_count>
      <attachid>269423</attachid>
    <who name="Nikita Vasilyev">nvasilyev</who>
    <bug_when>2016-01-20 20:44:45 -0800</bug_when>
    <thetext>Created attachment 269423
A Test

I wrote a test and I weren&apos;t able to reproduce the problem.

I looked closer into Bug 150579 and I realized I don&apos;t quite understand
why do we even use this propagation pattern:

    let constructor = this.constructor;
    while (constructor) {
        dispatch(constructor);

        if (!constructor.prototype.__proto__)
            break;

        constructor = constructor.prototype.__proto__.constructor;
    }

https://github.com/WebKit/webkit/blob/707ba5950cfde11635141f386dd497ee1be914e6/Source/WebInspectorUI/UserInterface/Base/Object.js#L170-L178

I commented it out and the only thing that I&apos;ve noticed stopped working was the styles sidebar.
I&apos;m trying to understand what is happening there.

Does anyone know why do we need this constructor propagation code?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157373</commentid>
    <comment_count>6</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-01-21 11:41:12 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Created attachment 269423 [details]
&gt; A Test
&gt; 
&gt; I wrote a test and I weren&apos;t able to reproduce the problem.
&gt; 
&gt; I looked closer into Bug 150579 and I realized I don&apos;t quite understand
&gt; why do we even use this propagation pattern:
&gt; 
&gt;     let constructor = this.constructor;
&gt;     while (constructor) {
&gt;         dispatch(constructor);
&gt; 
&gt;         if (!constructor.prototype.__proto__)
&gt;             break;
&gt; 
&gt;         constructor = constructor.prototype.__proto__.constructor;
&gt;     }
&gt; 
&gt; https://github.com/WebKit/webkit/blob/
&gt; 707ba5950cfde11635141f386dd497ee1be914e6/Source/WebInspectorUI/UserInterface/
&gt; Base/Object.js#L170-L178
&gt; 
&gt; I commented it out and the only thing that I&apos;ve noticed stopped working was
&gt; the styles sidebar.
&gt; I&apos;m trying to understand what is happening there.
&gt; 
&gt; Does anyone know why do we need this constructor propagation code?

This allows you to add a listener to a class or one of its super-classes. So:

Resource.addEventListener(&quot;foo&quot;, ...);
SourceCode.addEventListener(&quot;foo&quot;, ...);

If a Resource instance dispatches the &quot;foo&quot; event, it should fire any listeners registered on Resource *and* SourceCode. If a Script (subclass of SourceCode) fired &quot;foo&quot;, only the SourceCode listeners should fire.

The hasOwnProperty check prevented the walk up the prototype chain from firing listeners on SourceCode for Script, and then firing them again for SourceCode.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157374</commentid>
    <comment_count>7</comment_count>
      <attachid>269423</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2016-01-21 11:44:26 -0800</bug_when>
    <thetext>Comment on attachment 269423
A Test

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

&gt; LayoutTests/inspector/unit-tests/object.html:22
&gt; +            child.addEventListener(eventName, function() {

The listener should be on Parent, not an instance, and not Child to catch the bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157384</commentid>
    <comment_count>8</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2016-01-21 12:02:20 -0800</bug_when>
    <thetext>&gt; Does anyone know why do we need this constructor propagation code?

A common thing we do is addEventListeners on a constructor `A` to receive all the events that happen for instances of `A`.

There are many cases where a subclass of class `A` will dispatch an event on behalf of the base class.

For example, `DOMTreeContentView is a subclass of `ContentView` but its instances dispatches the `ContentView.Event.SelectionPathComponentsDidChange` event. In fact that event is almost always dispatched by subclasses:

&gt; Views/DOMTreeContentView.js
&gt; 369:        this.dispatchEventToListeners(WebInspector.ContentView.Event.SelectionPathComponentsDidChange);
&gt; 386:        this.dispatchEventToListeners(WebInspector.ContentView.Event.SelectionPathComponentsDidChange);

Listeners, like `ContentBrowser` want to handle any `ContentView.Event.SelectionPathComponentsDidChange` for any `ContentView`, so it registers on the `ContentView` constructor:

&gt; Views/ContentBrowser.js
&gt; 71:        WebInspector.ContentView.addEventListener(WebInspector.ContentView.Event.SelectionPathComponentsDidChange, this._contentViewSelectionPathComponentDidChange, this);

So when DOMTreeContentView dispatches the event it will be dispatched at multiple points:

    this._listeners (instance)
    this.constructor._listeners (WebInspector.DOMTreeContentView)
    this.constructor.prototype.__proto__._listeners (WebInspector.ContentView)
    ... (WebInspector.View)
    ... (WebInspectorObject)
    
I suspect removing this could would mean breaking selection path component updates all over the place. Does it?

---

Fun fact. I searched our code for examples of where we register an event on a constructor `WebInspector.Foo` where the event name is not from class Foo (e.g. not `WebInspector.Foo.Event`). I only found one example:

&gt; Controllers/CSSStyleManager.js
&gt; 37:        WebInspector.Resource.addEventListener(WebInspector.SourceCode.Event.ContentDidChange, this._resourceContentDidChange, this);

So, for any Resource instance that dispatches a SourceCode.Event.ContentDidChange event (a superclass event), the cssStyleManager will handle it. That kind of makes sense!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157537</commentid>
    <comment_count>9</comment_count>
      <attachid>269531</attachid>
    <who name="Nikita Vasilyev">nvasilyev</who>
    <bug_when>2016-01-21 18:25:36 -0800</bug_when>
    <thetext>Created attachment 269531
Patch

Tim and Joe:
Thanks for the explanation. I hadn&apos;t seen event listeners being used on classes directly; it threw me off.

I was able to reproduce the bug. The test now ensures that it&apos;s fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157545</commentid>
    <comment_count>10</comment_count>
    <who name="Nikita Vasilyev">nvasilyev</who>
    <bug_when>2016-01-21 18:36:56 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; Does anyone know why do we need this constructor propagation code?
&gt; 
&gt; A common thing we do is addEventListeners on a constructor `A` to receive
&gt; all the events that happen for instances of `A`.
&gt; 
&gt; There are many cases where a subclass of class `A` will dispatch an event on
&gt; behalf of the base class.
&gt; 
&gt; For example, `DOMTreeContentView is a subclass of `ContentView` but its
&gt; instances dispatches the
&gt; `ContentView.Event.SelectionPathComponentsDidChange` event. In fact that
&gt; event is almost always dispatched by subclasses:
&gt; 
&gt; &gt; Views/DOMTreeContentView.js
&gt; &gt; 369:        this.dispatchEventToListeners(WebInspector.ContentView.Event.SelectionPathComponentsDidChange);
&gt; &gt; 386:        this.dispatchEventToListeners(WebInspector.ContentView.Event.SelectionPathComponentsDidChange);
&gt; 
&gt; Listeners, like `ContentBrowser` want to handle any
&gt; `ContentView.Event.SelectionPathComponentsDidChange` for any `ContentView`,
&gt; so it registers on the `ContentView` constructor:
&gt; 
&gt; &gt; Views/ContentBrowser.js
&gt; &gt; 71:        WebInspector.ContentView.addEventListener(WebInspector.ContentView.Event.SelectionPathComponentsDidChange, this._contentViewSelectionPathComponentDidChange, this);
&gt; 
&gt; So when DOMTreeContentView dispatches the event it will be dispatched at
&gt; multiple points:
&gt; 
&gt;     this._listeners (instance)
&gt;     this.constructor._listeners (WebInspector.DOMTreeContentView)
&gt;     this.constructor.prototype.__proto__._listeners
&gt; (WebInspector.ContentView)
&gt;     ... (WebInspector.View)
&gt;     ... (WebInspectorObject)
&gt;     
&gt; I suspect removing this could would mean breaking selection path component
&gt; updates all over the place. Does it?

Yes, the navigation bar is empty for the Elements tab.
Seems to work well for Resources/Debugger though https://cloudup.com/cBgvs4rBVS3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157590</commentid>
    <comment_count>11</comment_count>
      <attachid>269531</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-21 21:54:42 -0800</bug_when>
    <thetext>Comment on attachment 269531
Patch

Clearing flags on attachment: 269531

Committed r195442: &lt;http://trac.webkit.org/changeset/195442&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1157591</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-21 21:54:46 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>269340</attachid>
            <date>2016-01-19 21:51:59 -0800</date>
            <delta_ts>2016-01-21 18:25:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>1809</size>
            <attacher name="Nikita Vasilyev">nvasilyev</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvQ2hhbmdlTG9nCmluZGV4IDFiN2QxNTYuLjRhYzNmOGIgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkluc3BlY3Rv
clVJL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDE2LTAxLTE5ICBOaWtpdGEgVmFzaWx5
ZXYgIDxudmFzaWx5ZXZAYXBwbGUuY29tPgorCisgICAgICAgIFJFR1JFU1NJT04gKHIxOTUzMDUp
OiBXZWIgSW5zcGVjdG9yOiBXZWJJbnNwZWN0b3IuT2JqZWN0IGNhbiBkaXNwYXRjaCBjb25zdHJ1
Y3Rvci1sZXZlbCBldmVudHMgbXVsdGlwbGUgdGltZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzI2OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgICogVXNlckludGVyZmFjZS9CYXNlL09iamVjdC5qczoK
KyAgICAgICAgKFdlYkluc3BlY3Rvci5PYmplY3QucHJvdG90eXBlLmRpc3BhdGNoRXZlbnRUb0xp
c3RlbmVycyk6CisgICAgICAgIEJyaW5nIGJhY2sgb2JqZWN0Lmhhc093blByb3BlcnR5KCJfbGlz
dGVuZXJzIikgY2hlY2suCisKIDIwMTYtMDEtMTkgIFRpbW90aHkgSGF0Y2hlciAgPHRpbW90aHlA
YXBwbGUuY29tPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IEFkZCBwcm90b2NvbCB2ZXJzaW9u
IGZvciBpT1MgOS4zCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVy
ZmFjZS9CYXNlL09iamVjdC5qcyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNl
L0Jhc2UvT2JqZWN0LmpzCmluZGV4IDBmMzUxMTguLjc0MDUyMmQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0Jhc2UvT2JqZWN0LmpzCisrKyBiL1NvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0Jhc2UvT2JqZWN0LmpzCkBAIC0xMzksNyAr
MTM5LDExIEBAIFdlYkluc3BlY3Rvci5PYmplY3QgPSBjbGFzcyBXZWJJbnNwZWN0b3JPYmplY3QK
IAogICAgICAgICBmdW5jdGlvbiBkaXNwYXRjaChvYmplY3QpCiAgICAgICAgIHsKLSAgICAgICAg
ICAgIGlmICghb2JqZWN0IHx8ICFvYmplY3QuX2xpc3RlbmVycyB8fCBldmVudC5fc3RvcHBlZFBy
b3BhZ2F0aW9uKQorICAgICAgICAgICAgaWYgKCFvYmplY3QgfHwgIW9iamVjdC5oYXNPd25Qcm9w
ZXJ0eSgiX2xpc3RlbmVycyIpIHx8IGV2ZW50Ll9zdG9wcGVkUHJvcGFnYXRpb24pCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBsZXQgbGlzdGVuZXJUeXBlc01hcCA9IG9i
amVjdC5fbGlzdGVuZXJzOworICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclR5cGVzTWFwKQogICAg
ICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICAgICAgaWYgKCEob2JqZWN0Ll9saXN0ZW5l
cnMgaW5zdGFuY2VvZiBNYXApKSB7CkBAIC0xNDcsNyArMTUxLDcgQEAgV2ViSW5zcGVjdG9yLk9i
amVjdCA9IGNsYXNzIFdlYkluc3BlY3Rvck9iamVjdAogICAgICAgICAgICAgICAgIHJldHVybjsK
ICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbGV0IGxpc3RlbmVyc1RhYmxlID0gb2JqZWN0
Ll9saXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSk7CisgICAgICAgICAgICBsZXQgbGlzdGVuZXJzVGFi
bGUgPSBsaXN0ZW5lclR5cGVzTWFwLmdldChldmVudFR5cGUpOwogICAgICAgICAgICAgaWYgKCFs
aXN0ZW5lcnNUYWJsZSkKICAgICAgICAgICAgICAgICByZXR1cm47CiAK
</data>
<flag name="review"
          id="294285"
          type_id="1"
          status="-"
          setter="bburg"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>269423</attachid>
            <date>2016-01-20 20:44:45 -0800</date>
            <delta_ts>2016-01-21 18:25:36 -0800</delta_ts>
            <desc>A Test</desc>
            <filename>WIP.txt</filename>
            <type>text/plain</type>
            <size>1676</size>
            <attacher name="Nikita Vasilyev">nvasilyev</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2luc3BlY3Rvci91bml0LXRlc3RzL29iamVjdC1leHBl
Y3RlZC50eHQgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvdW5pdC10ZXN0cy9vYmplY3QtZXhwZWN0
ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Nzg0YzkKLS0tIC9k
ZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvdW5pdC10ZXN0cy9vYmplY3QtZXhw
ZWN0ZWQudHh0CkBAIC0wLDAgKzEsNyBAQAorVGVzdGluZyBXZWJJbnNwZWN0b3IuT2JqZWN0Lgor
CisKKz09IFJ1bm5pbmcgdGVzdCBzdWl0ZTogT2JqZWN0CistLSBSdW5uaW5nIHRlc3QgY2FzZTog
RXZlbnRzIHByb3BhZ2F0aW9uCitEaXNwYXRjaCBjb3VudDogMQorCmRpZmYgLS1naXQgYS9MYXlv
dXRUZXN0cy9pbnNwZWN0b3IvdW5pdC10ZXN0cy9vYmplY3QuaHRtbCBiL0xheW91dFRlc3RzL2lu
c3BlY3Rvci91bml0LXRlc3RzL29iamVjdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjk5ODcwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0
b3IvdW5pdC10ZXN0cy9vYmplY3QuaHRtbApAQCAtMCwwICsxLDQxIEBACis8IWRvY3R5cGUgaHRt
bD4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vaHR0cC90ZXN0cy9pbnNwZWN0
b3IvcmVzb3VyY2VzL2luc3BlY3Rvci10ZXN0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+CitmdW5j
dGlvbiB0ZXN0KCkKK3sKKyAgICBsZXQgc3VpdGUgPSBJbnNwZWN0b3JUZXN0LmNyZWF0ZUFzeW5j
U3VpdGUoIk9iamVjdCIpOworCisgICAgc3VpdGUuYWRkVGVzdENhc2UoeworICAgICAgICBuYW1l
OiAiRXZlbnRzIHByb3BhZ2F0aW9uIiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJXZWJJbnNwZWN0
b3IuT2JqZWN0IHNob3VsZG4ndCBkaXNwYXRjaCBjb25zdHJ1Y3Rvci1sZXZlbCBldmVudHMgbXVs
dGlwbGUgdGltZXMiLAorICAgICAgICB0ZXN0OiBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsK
KworICAgICAgICAgICAgY2xhc3MgUGFyZW50IGV4dGVuZHMgV2ViSW5zcGVjdG9yLk9iamVjdCB7
fQorICAgICAgICAgICAgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBQYXJlbnQge30KKworICAgICAgICAg
ICAgdmFyIGNoaWxkID0gbmV3IENoaWxkOworCisgICAgICAgICAgICB2YXIgZGlzcGF0Y2hDb3Vu
dCA9IDA7CisgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gImNsaWNrZWQiOworICAgICAgICAg
ICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKCkgeworICAgICAg
ICAgICAgICAgIGRpc3BhdGNoQ291bnQrKzsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAg
ICBjaGlsZC5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoZXZlbnROYW1lKTsKKworICAgICAgICAg
ICAgSW5zcGVjdG9yVGVzdC5sb2coIkRpc3BhdGNoIGNvdW50OiAiICsgZGlzcGF0Y2hDb3VudCk7
CisKKyAgICAgICAgICAgIHJlc29sdmUoKTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgc3Vp
dGUucnVuVGVzdENhc2VzQW5kRmluaXNoKCk7Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5
IG9ubG9hZD0icnVuVGVzdCgpIj4KKyAgICA8cD5UZXN0aW5nIFdlYkluc3BlY3Rvci5PYmplY3Qu
PC9wPgorPC9ib2R5PgorPC9odG1sPgo=
</data>
<flag name="review"
          id="294357"
          type_id="1"
          status="-"
          setter="nvasilyev"
    />
    <flag name="commit-queue"
          id="294358"
          type_id="3"
          status="-"
          setter="nvasilyev"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>269531</attachid>
            <date>2016-01-21 18:25:36 -0800</date>
            <delta_ts>2016-01-21 21:54:42 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>4429</size>
            <attacher name="Nikita Vasilyev">nvasilyev</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCAwYmE4ZTJlLi5mZWQ5NjlmIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTYtMDEt
MjEgIE5pa2l0YSBWYXNpbHlldiAgPG52YXNpbHlldkBhcHBsZS5jb20+CisKKyAgICAgICAgUkVH
UkVTU0lPTiAocjE5NTMwNSk6IFdlYiBJbnNwZWN0b3I6IFdlYkluc3BlY3Rvci5PYmplY3QgY2Fu
IGRpc3BhdGNoIGNvbnN0cnVjdG9yLWxldmVsIGV2ZW50cyBtdWx0aXBsZSB0aW1lcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMjY5CisgICAgICAg
IDxyZGFyOi8vcHJvYmxlbS8yNDI1MzEwNj4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICAqIGluc3BlY3Rvci91bml0LXRlc3RzL29iamVjdC1leHBlY3Rl
ZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGluc3BlY3Rvci91bml0LXRlc3RzL29iamVjdC5odG1s
OiBBZGRlZC4KKwogMjAxNi0wMS0yMSAgUnlhbiBIYWRkYWQgIDxyeWFuaGFkZGFkQGFwcGxlLmNv
bT4KIAogICAgICAgICBSZWJhc2VsaW5lIGZhc3QvYmxvY2svZmxvYXQvb3ZlcmhhbmdpbmctdGFs
bC1ibG9jay5odG1sIGZvciBpb3Mtc2ltdWxhdG9yLXdrMgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVz
dHMvaW5zcGVjdG9yL3VuaXQtdGVzdHMvb2JqZWN0LWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3Rz
L2luc3BlY3Rvci91bml0LXRlc3RzL29iamVjdC1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3ODRjOQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRl
c3RzL2luc3BlY3Rvci91bml0LXRlc3RzL29iamVjdC1leHBlY3RlZC50eHQKQEAgLTAsMCArMSw3
IEBACitUZXN0aW5nIFdlYkluc3BlY3Rvci5PYmplY3QuCisKKworPT0gUnVubmluZyB0ZXN0IHN1
aXRlOiBPYmplY3QKKy0tIFJ1bm5pbmcgdGVzdCBjYXNlOiBFdmVudHMgcHJvcGFnYXRpb24KK0Rp
c3BhdGNoIGNvdW50OiAxCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2luc3BlY3Rvci91bml0
LXRlc3RzL29iamVjdC5odG1sIGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3VuaXQtdGVzdHMvb2Jq
ZWN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljM2U4YwotLS0g
L2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2luc3BlY3Rvci91bml0LXRlc3RzL29iamVjdC5o
dG1sCkBAIC0wLDAgKzEsMzYgQEAKKzwhZG9jdHlwZSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzxz
Y3JpcHQgc3JjPSIuLi8uLi9odHRwL3Rlc3RzL2luc3BlY3Rvci9yZXNvdXJjZXMvaW5zcGVjdG9y
LXRlc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4KK2Z1bmN0aW9uIHRlc3QoKQoreworICAgIGxl
dCBzdWl0ZSA9IEluc3BlY3RvclRlc3QuY3JlYXRlU3luY1N1aXRlKCJPYmplY3QiKTsKKworICAg
IHN1aXRlLmFkZFRlc3RDYXNlKHsKKyAgICAgICAgbmFtZTogIkV2ZW50cyBwcm9wYWdhdGlvbiIs
CisgICAgICAgIGRlc2NyaXB0aW9uOiAiV2ViSW5zcGVjdG9yLk9iamVjdCBzaG91bGRuJ3QgZGlz
cGF0Y2ggY29uc3RydWN0b3ItbGV2ZWwgZXZlbnRzIG11bHRpcGxlIHRpbWVzIiwKKyAgICAgICAg
dGVzdDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBjbGFzcyBQYXJlbnQgZXh0ZW5kcyBXZWJJ
bnNwZWN0b3IuT2JqZWN0IHt9CisgICAgICAgICAgICBjbGFzcyBDaGlsZCBleHRlbmRzIFBhcmVu
dCB7fQorCisgICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSAiY2xpY2tlZCI7CisgICAgICAg
ICAgICBsZXQgZGlzcGF0Y2hDb3VudCA9IDA7CisKKyAgICAgICAgICAgIFBhcmVudC5hZGRFdmVu
dExpc3RlbmVyKGV2ZW50TmFtZSwgKCkgPT4gZGlzcGF0Y2hDb3VudCsrKTsKKworICAgICAgICAg
ICAgbGV0IGNoaWxkID0gbmV3IENoaWxkOworICAgICAgICAgICAgY2hpbGQuZGlzcGF0Y2hFdmVu
dFRvTGlzdGVuZXJzKGV2ZW50TmFtZSk7CisKKyAgICAgICAgICAgIEluc3BlY3RvclRlc3QubG9n
KCJEaXNwYXRjaCBjb3VudDogIiArIGRpc3BhdGNoQ291bnQpOworICAgICAgICB9CisgICAgfSk7
CisKKyAgICBzdWl0ZS5ydW5UZXN0Q2FzZXNBbmRGaW5pc2goKTsKK30KKzwvc2NyaXB0PgorPC9o
ZWFkPgorPGJvZHkgb25sb2FkPSJydW5UZXN0KCkiPgorICAgIDxwPlRlc3RpbmcgV2ViSW5zcGVj
dG9yLk9iamVjdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwpp
bmRleCA2NmE0YjBiLi5mMzMzYmY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkv
Q2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEsMyAr
MSwyMSBAQAorMjAxNi0wMS0yMSAgTmlraXRhIFZhc2lseWV2ICA8bnZhc2lseWV2QGFwcGxlLmNv
bT4KKworICAgICAgICBSRUdSRVNTSU9OIChyMTk1MzA1KTogV2ViIEluc3BlY3RvcjogV2ViSW5z
cGVjdG9yLk9iamVjdCBjYW4gZGlzcGF0Y2ggY29uc3RydWN0b3ItbGV2ZWwgZXZlbnRzIG11bHRp
cGxlIHRpbWVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNTMyNjkKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzI0MjUzMTA2PgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEJyaW5nIGJhY2sgb2JqZWN0Lmhh
c093blByb3BlcnR5KCJfbGlzdGVuZXJzIikgY2hlY2suCisKKyAgICAgICAgKiBVc2VySW50ZXJm
YWNlL0Jhc2UvT2JqZWN0LmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLk9iamVjdC5wcm90b3R5
cGUuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzLmRpc3BhdGNoKToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5PYmplY3QucHJvdG90eXBlLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuT2JqZWN0KToKKyAgICAgICAgQ2hlY2sgIW9iamVjdC5fbGlzdGVuZXJz
IGJlZm9yZSAhb2JqZWN0Lmhhc093blByb3BlcnR5KCJfbGlzdGVuZXJzIikKKyAgICAgICAgYmVj
YXVzZSAhb2JqZWN0Ll9saXN0ZW5lcnMgaXMgbW9yZSBjb21tb24gY2FzZSB0aHVzIHdlIGNhbiBl
eGl0IGVhcmxpZXIKKyAgICAgICAgbW9zdCBvZiB0aGUgdGltZS4KKwogMjAxNi0wMS0yMCAgU2Fh
bSBiYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBI
b29rIHRoZSBzYW1wbGluZyBwcm9maWxlciBpbnRvIHRoZSBUaW1lbGluZXMgVUkKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0Jhc2UvT2JqZWN0LmpzIGIv
U291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQmFzZS9PYmplY3QuanMKaW5kZXgg
YTI3MTY0MC4uZTI5MDIyYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvQmFzZS9PYmplY3QuanMKKysrIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvQmFzZS9PYmplY3QuanMKQEAgLTEzOSwxMiArMTM5LDE2IEBAIFdlYkluc3BlY3Rv
ci5PYmplY3QgPSBjbGFzcyBXZWJJbnNwZWN0b3JPYmplY3QKIAogICAgICAgICBmdW5jdGlvbiBk
aXNwYXRjaChvYmplY3QpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0IHx8ICFv
YmplY3QuX2xpc3RlbmVycyB8fCBldmVudC5fc3RvcHBlZFByb3BhZ2F0aW9uKQorICAgICAgICAg
ICAgaWYgKCFvYmplY3QgfHwgZXZlbnQuX3N0b3BwZWRQcm9wYWdhdGlvbikKICAgICAgICAgICAg
ICAgICByZXR1cm47CiAKLSAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KG9iamVjdC5fbGlzdGVu
ZXJzIGluc3RhbmNlb2YgTWFwKTsKKyAgICAgICAgICAgIGxldCBsaXN0ZW5lclR5cGVzTWFwID0g
b2JqZWN0Ll9saXN0ZW5lcnM7CisgICAgICAgICAgICBpZiAoIWxpc3RlbmVyVHlwZXNNYXAgfHwg
IW9iamVjdC5oYXNPd25Qcm9wZXJ0eSgiX2xpc3RlbmVycyIpKQorICAgICAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICAgICAgY29uc29sZS5hc3NlcnQobGlzdGVuZXJUeXBlc01hcCBpbnN0
YW5jZW9mIE1hcCk7CiAKLSAgICAgICAgICAgIGxldCBsaXN0ZW5lcnNUYWJsZSA9IG9iamVjdC5f
bGlzdGVuZXJzLmdldChldmVudFR5cGUpOworICAgICAgICAgICAgbGV0IGxpc3RlbmVyc1RhYmxl
ID0gbGlzdGVuZXJUeXBlc01hcC5nZXQoZXZlbnRUeXBlKTsKICAgICAgICAgICAgIGlmICghbGlz
dGVuZXJzVGFibGUpCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>