<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[201735] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/201735">201735</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-06-06 19:35:39 -0700 (Mon, 06 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Implement EventListenerOptions argument to addEventListener
https://bugs.webkit.org/show_bug.cgi?id=149466
&lt;rdar://problem/22802031&gt;

Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

Import new test from W3C that covers EventListenerOptions.

* web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt: Added.
* web-platform-tests/dom/events/EventListenerOptions-capture.html: Added.

Source/WebCore:

Implement AddEventListenerOptions dictionary argument to addEventListener()
and EventListenerOptions dictionary argument to removeEventListener(), as
per the latest DOM specification:
- https://dom.spec.whatwg.org/#interface-eventtarget

Firefox and Chrome already support this.

Support for AddEventListenerOptions in this patch is as follows:
- 'capture': fully supported.
- 'once': fully supported.
- 'passive': supported in the sense that preventDefault() will be ignored
             for passive event listeners. There are however currently no
             performance benefits from passing this flag. Those optimizations
             will be implemented in follow-up patches (in particular for
             Touch and Scroll events).

Tests: fast/events/AddEventListenerOptions-once-recursive.html
       fast/events/AddEventListenerOptions-once.html
       fast/events/AddEventListenerOptions-passive.html
       fast/events/removeEventListener-EventListenerOptions-capture.html
       imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html

* Modules/webaudio/AudioScheduledSourceNode.cpp:
(WebCore::AudioScheduledSourceNode::addEventListener):
(WebCore::AudioScheduledSourceNode::removeEventListener):
* Modules/webaudio/AudioScheduledSourceNode.h:
* Modules/webaudio/ScriptProcessorNode.cpp:
(WebCore::ScriptProcessorNode::addEventListener):
(WebCore::ScriptProcessorNode::removeEventListener):
* Modules/webaudio/ScriptProcessorNode.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateParametersCheckExpression):
* dom/Event.h:
(WebCore::Event::preventDefault):
(WebCore::Event::setInPassiveListener):
* dom/EventListenerMap.cpp:
(WebCore::addListenerToVector):
(WebCore::EventListenerMap::add):
* dom/EventListenerMap.h:
* dom/EventTarget.cpp:
(WebCore::EventTarget::addEventListener):
(WebCore::EventTarget::addEventListenerForBindings):
(WebCore::EventTarget::removeEventListenerForBindings):
(WebCore::EventTarget::removeEventListener):
(WebCore::EventTarget::setAttributeEventListener):
(WebCore::EventTarget::fireEventListeners):
* dom/EventTarget.h:
(WebCore::EventTarget::ListenerOptions::ListenerOptions):
(WebCore::EventTarget::AddEventListenerOptions::AddEventListenerOptions):
(WebCore::EventTarget::addEventListener):
(WebCore::EventTarget::addEventListenerForBindings):
(WebCore::EventTarget::removeEventListenerForBindings):
* dom/EventTarget.idl:
* dom/MessagePort.cpp:
(WebCore::MessagePort::addEventListener):
* dom/MessagePort.h:
* dom/Node.cpp:
(WebCore::tryAddEventListener):
(WebCore::Node::addEventListener):
(WebCore::tryRemoveEventListener):
(WebCore::Node::removeEventListener):
* dom/Node.h:
* dom/RegisteredEventListener.h:
(WebCore::RegisteredEventListener::Options::Options):
(WebCore::RegisteredEventListener::RegisteredEventListener):
(WebCore::operator==):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::addEventListener):
(WebCore::HTMLMediaElement::removeEventListener):
* html/HTMLMediaElement.h:
* page/DOMWindow.cpp:
(WebCore::DOMWindow::addEventListener):
(WebCore::DOMWindow::removeEventListener):
* page/DOMWindow.h:
* svg/SVGElement.cpp:
(WebCore::SVGElement::addEventListener):
(WebCore::SVGElement::removeEventListener):
* svg/SVGElement.h:

LayoutTests:

* fast/events/AddEventListenerOptions-once-expected.txt: Added.
* fast/events/AddEventListenerOptions-once-recursive-expected.txt: Added.
* fast/events/AddEventListenerOptions-once-recursive.html: Added.
* fast/events/AddEventListenerOptions-once.html: Added.
* fast/events/AddEventListenerOptions-passive-expected.txt: Added.
* fast/events/AddEventListenerOptions-passive.html: Added.
* fast/events/removeEventListener-EventListenerOptions-capture-expected.txt: Added.
* fast/events/removeEventListener-EventListenerOptions-capture.html: Added.

Add layout testing coverage for various aspects of the functionality.

* imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt: Added.
* imported/blink/fast/events/eventlisteneroptions/capture_default.html: Added.
* imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt: Added.
* imported/blink/fast/events/eventlisteneroptions/capture_equality.html: Added.
* imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt: Added.
* imported/blink/fast/events/eventlisteneroptions/capture_query.html: Added.
* imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt: Added.
* imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html: Added.
* imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt: Added.
* imported/blink/fast/events/eventlisteneroptions/passive_inequality.html: Added.
* imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt: Added.
* imported/blink/fast/events/eventlisteneroptions/passive_query.html: Added.

Import blink tests for this functionality.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioScheduledSourceNodecpp">trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioScheduledSourceNodeh">trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioScriptProcessorNodecpp">trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioScriptProcessorNodeh">trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCoredomEventh">trunk/Source/WebCore/dom/Event.h</a></li>
<li><a href="#trunkSourceWebCoredomEventListenerMapcpp">trunk/Source/WebCore/dom/EventListenerMap.cpp</a></li>
<li><a href="#trunkSourceWebCoredomEventListenerMaph">trunk/Source/WebCore/dom/EventListenerMap.h</a></li>
<li><a href="#trunkSourceWebCoredomEventTargetcpp">trunk/Source/WebCore/dom/EventTarget.cpp</a></li>
<li><a href="#trunkSourceWebCoredomEventTargeth">trunk/Source/WebCore/dom/EventTarget.h</a></li>
<li><a href="#trunkSourceWebCoredomEventTargetidl">trunk/Source/WebCore/dom/EventTarget.idl</a></li>
<li><a href="#trunkSourceWebCoredomMessagePortcpp">trunk/Source/WebCore/dom/MessagePort.cpp</a></li>
<li><a href="#trunkSourceWebCoredomMessagePorth">trunk/Source/WebCore/dom/MessagePort.h</a></li>
<li><a href="#trunkSourceWebCoredomNodecpp">trunk/Source/WebCore/dom/Node.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodeh">trunk/Source/WebCore/dom/Node.h</a></li>
<li><a href="#trunkSourceWebCoredomRegisteredEventListenerh">trunk/Source/WebCore/dom/RegisteredEventListener.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowh">trunk/Source/WebCore/page/DOMWindow.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGElementcpp">trunk/Source/WebCore/svg/SVGElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGElementh">trunk/Source/WebCore/svg/SVGElement.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasteventsAddEventListenerOptionsonceexpectedtxt">trunk/LayoutTests/fast/events/AddEventListenerOptions-once-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsAddEventListenerOptionsoncerecursiveexpectedtxt">trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsAddEventListenerOptionsoncerecursivehtml">trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsAddEventListenerOptionsoncehtml">trunk/LayoutTests/fast/events/AddEventListenerOptions-once.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsAddEventListenerOptionspassiveexpectedtxt">trunk/LayoutTests/fast/events/AddEventListenerOptions-passive-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsAddEventListenerOptionspassivehtml">trunk/LayoutTests/fast/events/AddEventListenerOptions-passive.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsremoveEventListenerEventListenerOptionscaptureexpectedtxt">trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsremoveEventListenerEventListenerOptionscapturehtml">trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture.html</a></li>
<li>trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/</li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_defaultexpectedtxt">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_defaulthtml">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default.html</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_equalityexpectedtxt">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_equalityhtml">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality.html</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_queryexpectedtxt">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_queryhtml">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query.html</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_dispatchexpectedtxt">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_dispatchhtml">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_inequalityexpectedtxt">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_inequalityhtml">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality.html</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_queryexpectedtxt">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_queryhtml">trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomeventsEventListenerOptionscaptureexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomeventsEventListenerOptionscapturehtml">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/LayoutTests/ChangeLog        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -1,3 +1,37 @@
</span><ins>+2016-06-06  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Implement EventListenerOptions argument to addEventListener
+        https://bugs.webkit.org/show_bug.cgi?id=149466
+        &lt;rdar://problem/22802031&gt;
+
+        Reviewed by Dean Jackson.
+
+        * fast/events/AddEventListenerOptions-once-expected.txt: Added.
+        * fast/events/AddEventListenerOptions-once-recursive-expected.txt: Added.
+        * fast/events/AddEventListenerOptions-once-recursive.html: Added.
+        * fast/events/AddEventListenerOptions-once.html: Added.
+        * fast/events/AddEventListenerOptions-passive-expected.txt: Added.
+        * fast/events/AddEventListenerOptions-passive.html: Added.
+        * fast/events/removeEventListener-EventListenerOptions-capture-expected.txt: Added.
+        * fast/events/removeEventListener-EventListenerOptions-capture.html: Added.
+
+        Add layout testing coverage for various aspects of the functionality.
+
+        * imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt: Added.
+        * imported/blink/fast/events/eventlisteneroptions/capture_default.html: Added.
+        * imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt: Added.
+        * imported/blink/fast/events/eventlisteneroptions/capture_equality.html: Added.
+        * imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt: Added.
+        * imported/blink/fast/events/eventlisteneroptions/capture_query.html: Added.
+        * imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt: Added.
+        * imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html: Added.
+        * imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt: Added.
+        * imported/blink/fast/events/eventlisteneroptions/passive_inequality.html: Added.
+        * imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt: Added.
+        * imported/blink/fast/events/eventlisteneroptions/passive_query.html: Added.
+
+        Import blink tests for this functionality.
+
</ins><span class="cx"> 2016-06-06  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r201730.
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsAddEventListenerOptionsonceexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/AddEventListenerOptions-once-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/AddEventListenerOptions-once-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/AddEventListenerOptions-once-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+Tests support for 'once' member in AddEventListenerOptions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+document.body.addEventListener('test', listenerFunction, { 'once': true })
+PASS listenerCallCount is 0
+document.body.dispatchEvent(new Event('test'))
+PASS listenerCallCount is 1
+document.body.dispatchEvent(new Event('test'))
+PASS listenerCallCount is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsAddEventListenerOptionsoncerecursiveexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+Tests support for 'once' member in AddEventListenerOptions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+document.body.addEventListener('test', listenerFunction, { 'once': true })
+PASS listenerCallCount is 0
+document.body.dispatchEvent(new Event('test'))
+PASS listenerCallCount is 1
+document.body.dispatchEvent(new Event('test'))
+PASS listenerCallCount is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsAddEventListenerOptionsoncerecursivehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/AddEventListenerOptions-once-recursive.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;Tests support for 'once' member in AddEventListenerOptions.&quot;);
+
+var listenerCallCount = 0;
+function listenerFunction()
+{
+    ++listenerCallCount;
+
+    if (listenerCallCount == 1)
+        document.body.dispatchEvent(new Event('test'));
+}
+
+evalAndLog(&quot;document.body.addEventListener('test', listenerFunction, { 'once': true })&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;0&quot;);
+evalAndLog(&quot;document.body.dispatchEvent(new Event('test'))&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;1&quot;);
+evalAndLog(&quot;document.body.dispatchEvent(new Event('test'))&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;1&quot;);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsAddEventListenerOptionsoncehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/AddEventListenerOptions-once.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/AddEventListenerOptions-once.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/AddEventListenerOptions-once.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;Tests support for 'once' member in AddEventListenerOptions.&quot;);
+
+var listenerCallCount = 0;
+function listenerFunction()
+{
+    ++listenerCallCount;
+}
+
+evalAndLog(&quot;document.body.addEventListener('test', listenerFunction, { 'once': true })&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;0&quot;);
+evalAndLog(&quot;document.body.dispatchEvent(new Event('test'))&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;1&quot;);
+evalAndLog(&quot;document.body.dispatchEvent(new Event('test'))&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;1&quot;);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsAddEventListenerOptionspassiveexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/AddEventListenerOptions-passive-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/AddEventListenerOptions-passive-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/AddEventListenerOptions-passive-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+Tests support for 'passive' member in AddEventListenerOptions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+document.body.addEventListener('test', passiveListenerFunction, { 'passive': true })
+document.body.dispatchEvent(testEvent1)
+PASS listenerCallCount is 1
+PASS testEvent1.defaultPrevented is false
+
+document.body.addEventListener('test', activeListenerFunction, { })
+document.body.dispatchEvent(testEvent2)
+PASS listenerCallCount is 2
+PASS testEvent2.defaultPrevented is true
+
+document.body.addEventListener('test', activeListenerFunction, { 'passive': false })
+document.body.dispatchEvent(testEvent2)
+PASS listenerCallCount is 2
+PASS testEvent2.defaultPrevented is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsAddEventListenerOptionspassivehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/AddEventListenerOptions-passive.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/AddEventListenerOptions-passive.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/AddEventListenerOptions-passive.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;Tests support for 'passive' member in AddEventListenerOptions.&quot;);
+
+var listenerCallCount = 0;
+function passiveListenerFunction(ev)
+{
+    ++listenerCallCount;
+    ev.preventDefault();
+}
+
+function activeListenerFunction(ev)
+{
+    ++listenerCallCount;
+    ev.preventDefault();
+}
+
+evalAndLog(&quot;document.body.addEventListener('test', passiveListenerFunction, { 'passive': true })&quot;);
+var testEvent1 = new Event('test', { 'cancelable': true });
+evalAndLog(&quot;document.body.dispatchEvent(testEvent1)&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;1&quot;);
+shouldBeFalse(&quot;testEvent1.defaultPrevented&quot;);
+
+debug(&quot;&quot;);
+listenerCallCount = 0;
+// 'passive should be false by default.
+evalAndLog(&quot;document.body.addEventListener('test', activeListenerFunction, { })&quot;);
+var testEvent2 = new Event('test', { 'cancelable': true });
+evalAndLog(&quot;document.body.dispatchEvent(testEvent2)&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;2&quot;);
+shouldBeTrue(&quot;testEvent2.defaultPrevented&quot;);
+document.body.removeEventListener('test', activeListenerFunction);
+
+debug(&quot;&quot;);
+listenerCallCount = 0;
+evalAndLog(&quot;document.body.addEventListener('test', activeListenerFunction, { 'passive': false })&quot;);
+var testEvent2 = new Event('test', { 'cancelable': true });
+evalAndLog(&quot;document.body.dispatchEvent(testEvent2)&quot;);
+shouldBe(&quot;listenerCallCount&quot;, &quot;2&quot;);
+shouldBeTrue(&quot;testEvent2.defaultPrevented&quot;);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsremoveEventListenerEventListenerOptionscaptureexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+Tests support for calling removeEventListener() with an EventListenerOptions dictionary
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS testAddThenRemove(undefined, false) is true
+PASS testAddThenRemove(undefined, { 'capture': false }) is true
+PASS testAddThenRemove(undefined, { }) is true
+PASS testAddThenRemove(undefined, undefined) is true
+PASS testAddThenRemove(undefined, true) is false
+PASS testAddThenRemove(undefined, { 'capture': true }) is false
+
+PASS testAddThenRemove(false, false) is true
+PASS testAddThenRemove(false, { 'capture': false }) is true
+PASS testAddThenRemove(false, { }) is true
+PASS testAddThenRemove(false, undefined) is true
+PASS testAddThenRemove(false, true) is false
+PASS testAddThenRemove(false, { 'capture': true }) is false
+
+PASS testAddThenRemove({ 'capture': false }, false) is true
+PASS testAddThenRemove({ 'capture': false }, { 'capture': false }) is true
+PASS testAddThenRemove({ 'capture': false }, { }) is true
+PASS testAddThenRemove({ 'capture': false }, undefined) is true
+PASS testAddThenRemove({ 'capture': false }, true) is false
+PASS testAddThenRemove({ 'capture': false }, { 'capture': true }) is false
+
+PASS testAddThenRemove({ }, false) is true
+PASS testAddThenRemove({ }, { 'capture': false }) is true
+PASS testAddThenRemove({ }, { }) is true
+PASS testAddThenRemove({ }, undefined) is true
+PASS testAddThenRemove({ }, true) is false
+PASS testAddThenRemove({ }, { 'capture': true }) is false
+
+PASS testAddThenRemove(true, true) is true
+PASS testAddThenRemove(true, { 'capture': true }) is true
+PASS testAddThenRemove(true, { }) is false
+PASS testAddThenRemove(true, undefined) is false
+PASS testAddThenRemove(true, false) is false
+PASS testAddThenRemove(true, { 'capture': false }) is false
+
+PASS testAddThenRemove({ 'capture': true } , true) is true
+PASS testAddThenRemove({ 'capture': true }, { 'capture': true }) is true
+PASS testAddThenRemove({ 'capture': true }, { }) is false
+PASS testAddThenRemove({ 'capture': true }, undefined) is false
+PASS testAddThenRemove({ 'capture': true }, false) is false
+PASS testAddThenRemove({ 'capture': true }, { 'capture': false }) is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsremoveEventListenerEventListenerOptionscapturehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/removeEventListener-EventListenerOptions-capture.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,93 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;Tests support for calling removeEventListener() with an EventListenerOptions dictionary&quot;);
+
+var wasListenerCalled = false;
+function listenerFunction(ev)
+{
+    wasListenerCalled = true;
+}
+
+function isListenerRegistered()
+{
+    document.body.dispatchEvent(new Event('test'));
+    var result = wasListenerCalled;
+    wasListenerCalled = false;
+    return result;
+}
+
+function testAddThenRemove(addOptions, removeOptions)
+{
+    document.body.addEventListener('test', listenerFunction, addOptions);
+    if (!isListenerRegistered())
+        testFailed(&quot;Failed to add event listener with given options&quot;);
+    document.body.removeEventListener('test', listenerFunction, removeOptions);
+    var result = !isListenerRegistered();
+
+    // clean up.
+    capture = false;
+    if (typeof(addOptions) === &quot;boolean&quot;)
+        capture = addOptions;
+    else if (typeof(addOptions) === &quot;object&quot;)
+        capture = addOptions.capture;
+    document.body.removeEventListener('test', listenerFunction, capture);
+
+    return result;
+}
+
+testAddThenRemove(undefined, undefined, true);
+
+// capture is false by default.
+shouldBeTrue(&quot;testAddThenRemove(undefined, false)&quot;);
+shouldBeTrue(&quot;testAddThenRemove(undefined, { 'capture': false })&quot;);
+shouldBeTrue(&quot;testAddThenRemove(undefined, { })&quot;);
+shouldBeTrue(&quot;testAddThenRemove(undefined, undefined)&quot;);
+shouldBeFalse(&quot;testAddThenRemove(undefined, true)&quot;);
+shouldBeFalse(&quot;testAddThenRemove(undefined, { 'capture': true })&quot;);
+
+debug(&quot;&quot;);
+shouldBeTrue(&quot;testAddThenRemove(false, false)&quot;);
+shouldBeTrue(&quot;testAddThenRemove(false, { 'capture': false })&quot;);
+shouldBeTrue(&quot;testAddThenRemove(false, { })&quot;);
+shouldBeTrue(&quot;testAddThenRemove(false, undefined)&quot;);
+shouldBeFalse(&quot;testAddThenRemove(false, true)&quot;);
+shouldBeFalse(&quot;testAddThenRemove(false, { 'capture': true })&quot;);
+
+debug(&quot;&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ 'capture': false }, false)&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ 'capture': false }, { 'capture': false })&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ 'capture': false }, { })&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ 'capture': false }, undefined)&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ 'capture': false }, true)&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ 'capture': false }, { 'capture': true })&quot;);
+
+debug(&quot;&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ }, false)&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ }, { 'capture': false })&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ }, { })&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ }, undefined)&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ }, true)&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ }, { 'capture': true })&quot;);
+
+debug(&quot;&quot;);
+shouldBeTrue(&quot;testAddThenRemove(true, true)&quot;);
+shouldBeTrue(&quot;testAddThenRemove(true, { 'capture': true })&quot;);
+shouldBeFalse(&quot;testAddThenRemove(true, { })&quot;);
+shouldBeFalse(&quot;testAddThenRemove(true, undefined)&quot;);
+shouldBeFalse(&quot;testAddThenRemove(true, false)&quot;);
+shouldBeFalse(&quot;testAddThenRemove(true, { 'capture': false })&quot;);
+
+debug(&quot;&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ 'capture': true } , true)&quot;);
+shouldBeTrue(&quot;testAddThenRemove({ 'capture': true }, { 'capture': true })&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ 'capture': true }, { })&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ 'capture': true }, undefined)&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ 'capture': true }, false)&quot;);
+shouldBeFalse(&quot;testAddThenRemove({ 'capture': true }, { 'capture': false })&quot;);
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_defaultexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+
+PASS True value 
+PASS False value 
+PASS Empty object 
+PASS Null object 
+PASS Undefined object 
+PASS Positive value 
+PASS Negative value 
+PASS NaN value 
+PASS Postive zero value 
+PASS Negative zero value 
+PASS Empty string value 
+PASS Non empty string value 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_defaulthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default.html                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_default.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;body/&gt;
+&lt;script src=&quot;../../../../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+
+&lt;script&gt;
+
+function testCaptureValue(captureValue, expectedValue, test) {
+  var handlerPhase = undefined;
+  var handler = function handler(e) {
+      assert_equals(handlerPhase, undefined);
+      handlerPhase = e.eventPhase;
+  }
+  document.addEventListener('test', handler, captureValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  document.removeEventListener('test', handler, captureValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  assert_equals(handlerPhase, expectedValue);
+  test.done();
+}
+
+test(function(t) { testCaptureValue(true, Event.CAPTURING_PHASE, t); }, &quot;True value&quot;);
+test(function(t) { testCaptureValue(false, Event.BUBBLING_PHASE, t); }, &quot;False value&quot;);
+test(function(t) { testCaptureValue({}, Event.BUBBLING_PHASE, t); }, &quot;Empty object&quot;);
+test(function(t) { testCaptureValue(null, Event.BUBBLING_PHASE, t); }, &quot;Null object&quot;);
+test(function(t) { testCaptureValue(undefined, Event.BUBBLING_PHASE, t); }, &quot;Undefined object&quot;);
+test(function(t) { testCaptureValue(2.3, Event.CAPTURING_PHASE, t); }, &quot;Positive value&quot;);
+test(function(t) { testCaptureValue(-1000.3, Event.CAPTURING_PHASE, t); }, &quot;Negative value&quot;);
+test(function(t) { testCaptureValue(NaN, Event.BUBBLING_PHASE, t); }, &quot;NaN value&quot;);
+test(function(t) { testCaptureValue(+0.0, Event.BUBBLING_PHASE, t); }, &quot;Postive zero value&quot;);
+test(function(t) { testCaptureValue(-0.0, Event.BUBBLING_PHASE, t); }, &quot;Negative zero value&quot;);
+test(function(t) { testCaptureValue(&quot;&quot;, Event.BUBBLING_PHASE, t); }, &quot;Empty string value&quot;);
+test(function(t) { testCaptureValue(&quot;AAAA&quot;, Event.CAPTURING_PHASE, t); }, &quot;Non empty string value&quot;);
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_equalityexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+
+PASS Empty object 
+PASS Capture false 
+PASS Capture true 
+PASS Non-empty object 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_equalityhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality.html                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_equality.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;body/&gt;
+&lt;script src=&quot;../../../../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+
+&lt;script&gt;
+function testOptionEquality(addOptionValue, removeOptionValue, test) {
+  var handler = function handler(e) {
+      assert_unreached(&quot;dummy value getter invoked&quot;);
+  }
+  document.addEventListener('test', handler, addOptionValue);
+  document.removeEventListener('test', handler, removeOptionValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  test.done();
+}
+
+test(function(t) { testOptionEquality({}, false, t); }, &quot;Empty object&quot;);
+test(function(t) { testOptionEquality({'capture': false}, false, t); }, &quot;Capture false&quot;);
+test(function(t) { testOptionEquality({'capture': true}, true, t); }, &quot;Capture true&quot;);
+test(function(t) { testOptionEquality({'dummy': true}, false, t); }, &quot;Non-empty object&quot;);
+
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_queryexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+
+PASS Supports Capture 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionscapture_queryhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query.html                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/capture_query.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;body/&gt;
+&lt;script src=&quot;../../../../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+
+&lt;script&gt;
+test(function(t) {
+    var supportsCapture = false;
+    var query_function = function(e) {};
+    var query_options = {
+        get capture() {
+            supportsCapture = true;
+            return false;
+        },
+        get dummy() {
+            assert_unreached(&quot;dummy value getter invoked&quot;);
+            return false;
+        }
+    };
+
+    document.addEventListener('test_event', query_function, query_options);
+    assert_true(supportsCapture);
+    supportsCapture = false;
+    document.removeEventListener('test_event', query_function, query_options);
+    assert_true(supportsCapture);
+    t.done();
+}, &quot;Supports Capture&quot;);
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_dispatchexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+
+PASS Two argument register 
+PASS Prevent default capture false 
+PASS Prevent default capture true 
+PASS Prevent default with empty object 
+PASS Prevent default with passive false 
+PASS Prevent default with passive true  
+PASS Passive and Blocking Registered Handlers 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_dispatchhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;body/&gt;
+&lt;script src=&quot;../../../../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+
+&lt;!-- This test is run with normal layout tests with passiveEventListeners
+     enabled and in virtual/stable with passiveEventListeners disabled --&gt;
+&lt;script&gt;
+
+function testTwoArgumentRegister() {
+  var handler = function handler(e) {
+    e.preventDefault();
+  }
+  document.addEventListener('test', handler);
+  assert_equals(false, document.body.dispatchEvent(new Event('test', {'bubbles': true, 'cancelable': true})));
+  document.removeEventListener('test', handler);
+  assert_equals(true, document.body.dispatchEvent(new Event('test', {'bubbles': true, 'cancelable': true})));
+}
+
+function testPassiveValue(registerValue, expectedValue, test) {
+  var handler = function handler(e) {
+    e.preventDefault();
+  }
+  document.addEventListener('test', handler, registerValue);
+  var event = new Event('test', {'bubbles': true, 'cancelable': true});
+  assert_equals(expectedValue, document.body.dispatchEvent(event));
+  assert_equals(!expectedValue, event.defaultPrevented);
+  document.removeEventListener('test', handler, registerValue);
+  assert_equals(true, document.body.dispatchEvent(new Event('test', {'bubbles': true, 'cancelable': true})));
+  test.done();
+}
+
+function testTwoHandlers() {
+  var passive_called = undefined;
+  var blocking_called = undefined;
+  var passive_handler = function handler(e) {
+    passive_called = true;
+  }
+  var blocking_handler = function handler(e) {
+    blocking_called = true;
+    e.preventDefault();
+  }
+  document.addEventListener('test', passive_handler, {&quot;passive&quot; : true});
+  document.addEventListener('test', blocking_handler, {&quot;passive&quot; : false});
+  var event = new Event('test', {'bubbles': true, 'cancelable': true});
+  document.body.dispatchEvent(event);
+  assert_true(passive_called);
+  assert_true(blocking_called);
+  assert_true(event.defaultPrevented);
+  document.removeEventListener('test', passive_handler, {});
+  document.removeEventListener('test', blocking_handler, {});
+}
+
+test(testTwoArgumentRegister, &quot;Two argument register&quot;);
+test(function(t) { testPassiveValue(false, false, t); }, &quot;Prevent default capture false&quot;);
+test(function(t) { testPassiveValue(true, false, t); }, &quot;Prevent default capture true&quot;);
+test(function(t) { testPassiveValue({}, false, t); }, &quot;Prevent default with empty object&quot;);
+test(function(t) { testPassiveValue({passive: false}, false, t); }, &quot;Prevent default with passive false&quot;);
+test(function(t) { testPassiveValue({passive: true}, true, t); }, &quot;Prevent default with passive true &quot;);
+test(testTwoHandlers, &quot;Passive and Blocking Registered Handlers&quot;);
+
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_inequalityexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+
+PASS Passive Handler 
+PASS Non Passive Handler 
+PASS Passive Handler And Non Passive Capturing 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_inequalityhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality.html                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_inequality.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;body/&gt;
+&lt;script src=&quot;../../../../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+
+&lt;script&gt;
+
+function passiveHandlerAddNonPassive() {
+  var handler = function handler(e) {
+    e.preventDefault();
+    assert_false(e.defaultPrevented);
+  }
+  document.addEventListener('test', handler, {&quot;passive&quot;: true});
+  document.addEventListener('test', handler, {&quot;passive&quot;: false});
+  document.body.dispatchEvent(new Event('test', {'bubbles': true, 'cancelable': true}));
+}
+
+function nonPassiveHandlerAddPassive() {
+  var handler = function handler(e) {
+    e.preventDefault();
+    assert_true(e.defaultPrevented);
+  }
+  document.addEventListener('test', handler, {&quot;passive&quot;: false});
+  document.addEventListener('test', handler, {&quot;passive&quot;: true});
+  document.body.dispatchEvent(new Event('test', {'bubbles': true, 'cancelable': true}));
+}
+
+function passiveHandlerAddNonPassiveCapturing() {
+  var handlersCalled = 0;
+  var handler = function handler(e) {
+    handlersCalled++;
+  }
+  document.addEventListener('test', handler, {&quot;passive&quot;: true});
+  document.addEventListener('test', handler, {&quot;passive&quot;: false, &quot;capture&quot;: true});
+  document.body.dispatchEvent(new Event('test', {'bubbles': true, 'cancelable': true}));
+  assert_equals(handlersCalled, 2, &quot;Handlers called correct number of times&quot;);
+}
+
+test(passiveHandlerAddNonPassive, &quot;Passive Handler&quot;);
+test(nonPassiveHandlerAddPassive, &quot;Non Passive Handler&quot;);
+test(passiveHandlerAddNonPassiveCapturing, &quot;Passive Handler And Non Passive Capturing&quot;);
+
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_queryexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+
+PASS Supports Passive 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedblinkfasteventseventlisteneroptionspassive_queryhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query.html                                (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/events/eventlisteneroptions/passive_query.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;body/&gt;
+&lt;script src=&quot;../../../../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../../../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+
+&lt;!-- This test is run with normal layout tests with passiveEventListeners
+     enabled and in virtual/stable with passiveEventListeners disabled --&gt;
+&lt;script&gt;
+test(function(t) {
+    var supportsPassive = false;
+    var query_function = function(e) {};
+    var query_options = {
+        get passive() {
+            supportsPassive = true;
+            return false;
+        },
+        get dummy() {
+            assert_unreached(&quot;dummy value getter invoked&quot;);
+            return false;
+        }
+    };
+
+    document.addEventListener('test_event', query_function, query_options);
+    assert_equals(supportsPassive, true);
+    t.done();
+}, &quot;Supports Passive&quot;);
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-06-06  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Implement EventListenerOptions argument to addEventListener
+        https://bugs.webkit.org/show_bug.cgi?id=149466
+        &lt;rdar://problem/22802031&gt;
+
+        Reviewed by Dean Jackson.
+
+        Import new test from W3C that covers EventListenerOptions.
+
+        * web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt: Added.
+        * web-platform-tests/dom/events/EventListenerOptions-capture.html: Added.
+
</ins><span class="cx"> 2016-06-06  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r201730.
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomeventsEventListenerOptionscaptureexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+
+PASS Capture boolean should be honored correctly 
+PASS Capture option should be honored correctly 
+PASS Supports capture option 
+PASS Equivalence of option values 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomeventsEventListenerOptionscapturehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html (0 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -0,0 +1,98 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;title&gt;EventListenerOptions.capture&lt;/title&gt;
+&lt;link rel=&quot;author&quot; title=&quot;Rick Byers&quot; href=&quot;mailto:rbyers@chromium.org&quot;&gt;
+&lt;link rel=&quot;help&quot; href=&quot;https://dom.spec.whatwg.org/#dom-eventlisteneroptions-capture&quot;&gt;
+&lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+&lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+
+function testCaptureValue(captureValue, expectedValue) {
+  var handlerPhase = undefined;
+  var handler = function handler(e) {
+    assert_equals(handlerPhase, undefined, &quot;Handler invoked after remove&quot;);
+    handlerPhase = e.eventPhase;
+  }
+  document.addEventListener('test', handler, captureValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  document.removeEventListener('test', handler, captureValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  assert_equals(handlerPhase, expectedValue, &quot;Incorrect event phase for value: &quot; + JSON.stringify(captureValue));
+}
+
+test(function() {
+  testCaptureValue(true, Event.CAPTURING_PHASE);
+  testCaptureValue(false, Event.BUBBLING_PHASE);
+  testCaptureValue(null, Event.BUBBLING_PHASE);
+  testCaptureValue(undefined, Event.BUBBLING_PHASE);
+  testCaptureValue(2.3, Event.CAPTURING_PHASE);
+  testCaptureValue(-1000.3, Event.CAPTURING_PHASE);
+  testCaptureValue(NaN, Event.BUBBLING_PHASE);
+  testCaptureValue(+0.0, Event.BUBBLING_PHASE);
+  testCaptureValue(-0.0, Event.BUBBLING_PHASE);
+  testCaptureValue(&quot;&quot;, Event.BUBBLING_PHASE);
+  testCaptureValue(&quot;AAAA&quot;, Event.CAPTURING_PHASE);
+}, &quot;Capture boolean should be honored correctly&quot;);
+
+test(function() {
+  testCaptureValue({}, Event.BUBBLING_PHASE);
+  testCaptureValue({capture:true}, Event.CAPTURING_PHASE);
+  testCaptureValue({capture:false}, Event.BUBBLING_PHASE);
+  testCaptureValue({capture:2}, Event.CAPTURING_PHASE);
+  testCaptureValue({capture:0}, Event.BUBBLING_PHASE);
+}, &quot;Capture option should be honored correctly&quot;);
+
+test(function() {
+  var supportsCapture = false;
+  var query_options = {
+    get capture() {
+      supportsCapture = true;
+      return false;
+    },
+    get dummy() {
+      assert_unreached(&quot;dummy value getter invoked&quot;);
+      return false;
+    }
+  };
+
+  document.addEventListener('test_event', null, query_options);
+  assert_true(supportsCapture, &quot;addEventListener doesn't support the capture option&quot;);
+  supportsCapture = false;
+  document.removeEventListener('test_event', null, query_options);
+  assert_true(supportsCapture, &quot;removeEventListener doesn't support the capture option&quot;);
+}, &quot;Supports capture option&quot;);
+
+function testOptionEquality(addOptionValue, removeOptionValue, expectedEquality) {
+  var handlerInvoked = false;
+  var handler = function handler(e) {
+    assert_equals(handlerInvoked, false, &quot;Handler invoked multiple times&quot;);
+    handlerInvoked = true;
+  }
+  document.addEventListener('test', handler, addOptionValue);
+  document.removeEventListener('test', handler, removeOptionValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  assert_equals(!handlerInvoked, expectedEquality, &quot;equivalence of options &quot; +
+    JSON.stringify(addOptionValue) + &quot; and &quot; + JSON.stringify(removeOptionValue));
+  if (handlerInvoked)
+    document.removeEventListener('test', handler, addOptionValue);
+}
+
+test(function() {
+  // Option values that should be treated as equivalent
+  testOptionEquality({}, false, true);
+  testOptionEquality({capture: false}, false, true);
+  testOptionEquality(true, {capture: true}, true);
+  testOptionEquality({capture: null}, undefined, true);
+  testOptionEquality({capture: true}, {dummy: false, capture: 1}, true);
+  testOptionEquality({dummy: true}, false, true);
+
+  // Option values that should be treated as distinct
+  testOptionEquality(true, false, false);
+  testOptionEquality(true, {capture:false}, false);
+  testOptionEquality({}, true, false);
+
+}, &quot;Equivalence of option values&quot;);
+
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/ChangeLog        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -1,3 +1,90 @@
</span><ins>+2016-06-06  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Implement EventListenerOptions argument to addEventListener
+        https://bugs.webkit.org/show_bug.cgi?id=149466
+        &lt;rdar://problem/22802031&gt;
+
+        Reviewed by Dean Jackson.
+
+        Implement AddEventListenerOptions dictionary argument to addEventListener()
+        and EventListenerOptions dictionary argument to removeEventListener(), as
+        per the latest DOM specification:
+        - https://dom.spec.whatwg.org/#interface-eventtarget
+
+        Firefox and Chrome already support this.
+
+        Support for AddEventListenerOptions in this patch is as follows:
+        - 'capture': fully supported.
+        - 'once': fully supported.
+        - 'passive': supported in the sense that preventDefault() will be ignored
+                     for passive event listeners. There are however currently no
+                     performance benefits from passing this flag. Those optimizations
+                     will be implemented in follow-up patches (in particular for
+                     Touch and Scroll events).
+
+        Tests: fast/events/AddEventListenerOptions-once-recursive.html
+               fast/events/AddEventListenerOptions-once.html
+               fast/events/AddEventListenerOptions-passive.html
+               fast/events/removeEventListener-EventListenerOptions-capture.html
+               imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html
+
+        * Modules/webaudio/AudioScheduledSourceNode.cpp:
+        (WebCore::AudioScheduledSourceNode::addEventListener):
+        (WebCore::AudioScheduledSourceNode::removeEventListener):
+        * Modules/webaudio/AudioScheduledSourceNode.h:
+        * Modules/webaudio/ScriptProcessorNode.cpp:
+        (WebCore::ScriptProcessorNode::addEventListener):
+        (WebCore::ScriptProcessorNode::removeEventListener):
+        * Modules/webaudio/ScriptProcessorNode.h:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateParametersCheckExpression):
+        * dom/Event.h:
+        (WebCore::Event::preventDefault):
+        (WebCore::Event::setInPassiveListener):
+        * dom/EventListenerMap.cpp:
+        (WebCore::addListenerToVector):
+        (WebCore::EventListenerMap::add):
+        * dom/EventListenerMap.h:
+        * dom/EventTarget.cpp:
+        (WebCore::EventTarget::addEventListener):
+        (WebCore::EventTarget::addEventListenerForBindings):
+        (WebCore::EventTarget::removeEventListenerForBindings):
+        (WebCore::EventTarget::removeEventListener):
+        (WebCore::EventTarget::setAttributeEventListener):
+        (WebCore::EventTarget::fireEventListeners):
+        * dom/EventTarget.h:
+        (WebCore::EventTarget::ListenerOptions::ListenerOptions):
+        (WebCore::EventTarget::AddEventListenerOptions::AddEventListenerOptions):
+        (WebCore::EventTarget::addEventListener):
+        (WebCore::EventTarget::addEventListenerForBindings):
+        (WebCore::EventTarget::removeEventListenerForBindings):
+        * dom/EventTarget.idl:
+        * dom/MessagePort.cpp:
+        (WebCore::MessagePort::addEventListener):
+        * dom/MessagePort.h:
+        * dom/Node.cpp:
+        (WebCore::tryAddEventListener):
+        (WebCore::Node::addEventListener):
+        (WebCore::tryRemoveEventListener):
+        (WebCore::Node::removeEventListener):
+        * dom/Node.h:
+        * dom/RegisteredEventListener.h:
+        (WebCore::RegisteredEventListener::Options::Options):
+        (WebCore::RegisteredEventListener::RegisteredEventListener):
+        (WebCore::operator==):
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::addEventListener):
+        (WebCore::HTMLMediaElement::removeEventListener):
+        * html/HTMLMediaElement.h:
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::addEventListener):
+        (WebCore::DOMWindow::removeEventListener):
+        * page/DOMWindow.h:
+        * svg/SVGElement.cpp:
+        (WebCore::SVGElement::addEventListener):
+        (WebCore::SVGElement::removeEventListener):
+        * svg/SVGElement.h:
+
</ins><span class="cx"> 2016-06-06  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r201730.
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioScheduledSourceNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -201,17 +201,17 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool AudioScheduledSourceNode::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool AudioScheduledSourceNode::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    bool success = AudioNode::addEventListener(eventType, WTFMove(listener), useCapture);
</del><ins>+    bool success = AudioNode::addEventListener(eventType, WTFMove(listener), options);
</ins><span class="cx">     if (success &amp;&amp; eventType == eventNames().endedEvent)
</span><span class="cx">         m_hasEndedListener = hasEventListeners(eventNames().endedEvent);
</span><span class="cx">     return success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool AudioScheduledSourceNode::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool AudioScheduledSourceNode::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    bool success = AudioNode::removeEventListener(eventType, listener, useCapture);
</del><ins>+    bool success = AudioNode::removeEventListener(eventType, listener, options);
</ins><span class="cx">     if (success &amp;&amp; eventType == eventNames().endedEvent)
</span><span class="cx">         m_hasEndedListener = hasEventListeners(eventNames().endedEvent);
</span><span class="cx">     return success;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioScheduledSourceNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -101,8 +101,8 @@
</span><span class="cx">     static const double UnknownTime;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
-    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture) override;
</del><ins>+    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
+    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;) override;
</ins><span class="cx">     void removeAllEventListeners() override;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioScriptProcessorNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -273,17 +273,17 @@
</span><span class="cx">     return std::numeric_limits&lt;double&gt;::infinity();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ScriptProcessorNode::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool ScriptProcessorNode::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    bool success = AudioNode::addEventListener(eventType, WTFMove(listener), useCapture);
</del><ins>+    bool success = AudioNode::addEventListener(eventType, WTFMove(listener), options);
</ins><span class="cx">     if (success &amp;&amp; eventType == eventNames().audioprocessEvent)
</span><span class="cx">         m_hasAudioProcessListener = hasEventListeners(eventNames().audioprocessEvent);
</span><span class="cx">     return success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ScriptProcessorNode::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool ScriptProcessorNode::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    bool success = AudioNode::removeEventListener(eventType, listener, useCapture);
</del><ins>+    bool success = AudioNode::removeEventListener(eventType, listener, options);
</ins><span class="cx">     if (success &amp;&amp; eventType == eventNames().audioprocessEvent)
</span><span class="cx">         m_hasAudioProcessListener = hasEventListeners(eventNames().audioprocessEvent);
</span><span class="cx">     return success;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioScriptProcessorNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -73,8 +73,8 @@
</span><span class="cx"> 
</span><span class="cx">     void fireProcessEvent();
</span><span class="cx"> 
</span><del>-    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
-    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture) override;
</del><ins>+    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
+    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;) override;
</ins><span class="cx">     void removeAllEventListeners() override;
</span><span class="cx"> 
</span><span class="cx">     // Double buffering
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -1678,7 +1678,10 @@
</span><span class="cx">                 push(@andExpression, &quot;(${value}.isNull() || ${value}.isObject())&quot;);
</span><span class="cx">             }
</span><span class="cx">             $usedArguments{$parameterIndex} = 1;
</span><del>-        } elsif ($codeGenerator-&gt;GetArrayOrSequenceType($type) || $codeGenerator-&gt;IsTypedArrayType($type) || $codeGenerator-&gt;IsWrapperType($type)) {
</del><ins>+        } elsif ($codeGenerator-&gt;IsDictionaryType($parameter-&gt;type)) {
+            push(@andExpression, &quot;(${value}.isUndefinedOrNull() || ${value}.isObject())&quot;);
+            $usedArguments{$parameterIndex} = 1;
+        } elsif (($codeGenerator-&gt;GetArrayOrSequenceType($type) || $codeGenerator-&gt;IsTypedArrayType($type) || $codeGenerator-&gt;IsWrapperType($type)) &amp;&amp; $type ne &quot;EventListener&quot;) {
</ins><span class="cx">             my $condition = &quot;&quot;;
</span><span class="cx"> 
</span><span class="cx">             if ($parameter-&gt;isNullable) {
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Event.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Event.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/Event.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -172,7 +172,7 @@
</span><span class="cx">     bool defaultPrevented() const { return m_defaultPrevented; }
</span><span class="cx">     void preventDefault()
</span><span class="cx">     {
</span><del>-        if (m_cancelable)
</del><ins>+        if (m_cancelable &amp;&amp; !m_isExecutingPassiveEventListener)
</ins><span class="cx">             m_defaultPrevented = true;
</span><span class="cx">     }
</span><span class="cx">     void setDefaultPrevented(bool defaultPrevented) { m_defaultPrevented = defaultPrevented; }
</span><span class="lines">@@ -180,6 +180,8 @@
</span><span class="cx">     bool defaultHandled() const { return m_defaultHandled; }
</span><span class="cx">     void setDefaultHandled() { m_defaultHandled = true; }
</span><span class="cx"> 
</span><ins>+    void setInPassiveListener(bool value) { m_isExecutingPassiveEventListener = value; }
+
</ins><span class="cx">     bool cancelBubble() const { return m_cancelBubble; }
</span><span class="cx">     void setCancelBubble(bool cancel) { m_cancelBubble = cancel; }
</span><span class="cx"> 
</span><span class="lines">@@ -217,6 +219,7 @@
</span><span class="cx">     bool m_defaultHandled { false };
</span><span class="cx">     bool m_cancelBubble { false };
</span><span class="cx">     bool m_isTrusted { false };
</span><ins>+    bool m_isExecutingPassiveEventListener { false };
</ins><span class="cx"> 
</span><span class="cx">     unsigned short m_eventPhase { 0 };
</span><span class="cx">     EventTarget* m_currentTarget { nullptr };
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventListenerMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventListenerMap.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventListenerMap.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/EventListenerMap.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -95,9 +95,9 @@
</span><span class="cx">     return types;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool addListenerToVector(EventListenerVector* vector, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+static bool addListenerToVector(EventListenerVector* vector, Ref&lt;EventListener&gt;&amp;&amp; listener, const RegisteredEventListener::Options&amp; options)
</ins><span class="cx"> {
</span><del>-    RegisteredEventListener registeredListener(WTFMove(listener), useCapture);
</del><ins>+    RegisteredEventListener registeredListener(WTFMove(listener), options);
</ins><span class="cx"> 
</span><span class="cx">     if (vector-&gt;find(registeredListener) != notFound)
</span><span class="cx">         return false; // Duplicate listener.
</span><span class="lines">@@ -106,17 +106,17 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool EventListenerMap::add(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool EventListenerMap::add(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const RegisteredEventListener::Options&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     assertNoActiveIterators();
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; entry : m_entries) {
</span><span class="cx">         if (entry.first == eventType)
</span><del>-            return addListenerToVector(entry.second.get(), WTFMove(listener), useCapture);
</del><ins>+            return addListenerToVector(entry.second.get(), WTFMove(listener), options);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_entries.append(std::make_pair(eventType, std::make_unique&lt;EventListenerVector&gt;()));
</span><del>-    return addListenerToVector(m_entries.last().second.get(), WTFMove(listener), useCapture);
</del><ins>+    return addListenerToVector(m_entries.last().second.get(), WTFMove(listener), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static bool removeListenerFromVector(EventListenerVector* listenerVector, EventListener&amp; listener, bool useCapture, size_t&amp; indexOfRemovedListener)
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventListenerMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventListenerMap.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventListenerMap.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/EventListenerMap.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -54,7 +54,8 @@
</span><span class="cx">     bool containsCapturing(const AtomicString&amp; eventType) const;
</span><span class="cx"> 
</span><span class="cx">     void clear();
</span><del>-    bool add(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture);
</del><ins>+
+    bool add(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const RegisteredEventListener::Options&amp;);
</ins><span class="cx">     bool remove(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture, size_t&amp; indexOfRemovedListener);
</span><span class="cx">     EventListenerVector* find(const AtomicString&amp; eventType);
</span><span class="cx">     Vector&lt;AtomicString&gt; eventTypes() const;
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventTargetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventTarget.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventTarget.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/EventTarget.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -75,28 +75,26 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool EventTarget::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool EventTarget::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    return ensureEventTargetData().eventListenerMap.add(eventType, WTFMove(listener), useCapture);
</del><ins>+    return ensureEventTargetData().eventListenerMap.add(eventType, WTFMove(listener), { options.capture, options.passive, options.once });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventTarget::addEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+void EventTarget::addEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    // FIXME: listener is not supposed to be nullable.
</del><span class="cx">     if (!listener)
</span><span class="cx">         return;
</span><del>-    addEventListener(eventType, listener.releaseNonNull(), useCapture);
</del><ins>+    addEventListener(eventType, listener.releaseNonNull(), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventTarget::removeEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+void EventTarget::removeEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    // FIXME: listener is not supposed to be nullable.
</del><span class="cx">     if (!listener)
</span><span class="cx">         return;
</span><del>-    removeEventListener(eventType, *listener, useCapture);
</del><ins>+    removeEventListener(eventType, *listener, options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool EventTarget::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool EventTarget::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     EventTargetData* d = eventTargetData();
</span><span class="cx">     if (!d)
</span><span class="lines">@@ -104,7 +102,7 @@
</span><span class="cx"> 
</span><span class="cx">     size_t indexOfRemovedListener;
</span><span class="cx"> 
</span><del>-    if (!d-&gt;eventListenerMap.remove(eventType, listener, useCapture, indexOfRemovedListener))
</del><ins>+    if (!d-&gt;eventListenerMap.remove(eventType, listener, options.capture, indexOfRemovedListener))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     // Notify firing events planning to invoke the listener at 'index' that
</span><span class="lines">@@ -131,7 +129,7 @@
</span><span class="cx">     clearAttributeEventListener(eventType);
</span><span class="cx">     if (!listener)
</span><span class="cx">         return false;
</span><del>-    return addEventListener(eventType, listener.releaseNonNull(), false);
</del><ins>+    return addEventListener(eventType, listener.releaseNonNull());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EventListener* EventTarget::getAttributeEventListener(const AtomicString&amp; eventType)
</span><span class="lines">@@ -259,7 +257,11 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (; i &lt; size; ++i) {
</span><del>-        RegisteredEventListener&amp; registeredListener = entry[i];
</del><ins>+        RegisteredEventListener registeredListener = entry[i];
+
+        if (registeredListener.isMarkedForRemoval)
+            continue;
+
</ins><span class="cx">         if (event.eventPhase() == Event::CAPTURING_PHASE &amp;&amp; !registeredListener.useCapture)
</span><span class="cx">             continue;
</span><span class="cx">         if (event.eventPhase() == Event::BUBBLING_PHASE &amp;&amp; registeredListener.useCapture)
</span><span class="lines">@@ -270,12 +272,27 @@
</span><span class="cx">         if (event.immediatePropagationStopped())
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+        if (registeredListener.isPassive)
+            event.setInPassiveListener(true);
+
+        // Mark listener for removal before executing the listener, in case the listener tries to
+        // dispatch an event that would cause it to get executed again.
+        if (registeredListener.isOnce)
+            registeredListener.isMarkedForRemoval = true;
+
</ins><span class="cx">         InspectorInstrumentationCookie cookie = InspectorInstrumentation::willHandleEvent(context, event);
</span><span class="cx">         // To match Mozilla, the AT_TARGET phase fires both capturing and bubbling
</span><span class="cx">         // event listeners, even though that violates some versions of the DOM spec.
</span><span class="cx">         registeredListener.listener-&gt;handleEvent(context, &amp;event);
</span><span class="cx">         InspectorInstrumentation::didHandleEvent(cookie);
</span><ins>+
+        if (registeredListener.isPassive)
+            event.setInPassiveListener(false);
+
+        if (registeredListener.isOnce)
+            removeEventListener(event.type(), *registeredListener.listener, ListenerOptions(registeredListener.useCapture));
</ins><span class="cx">     }
</span><ins>+
</ins><span class="cx">     d-&gt;firingEventIterators-&gt;removeLast();
</span><span class="cx"> 
</span><span class="cx">     if (document)
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventTargeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventTarget.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventTarget.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/EventTarget.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -121,10 +121,31 @@
</span><span class="cx">     virtual DOMWindow* toDOMWindow();
</span><span class="cx">     virtual bool isMessagePort() const;
</span><span class="cx"> 
</span><ins>+    struct ListenerOptions {
+        ListenerOptions(bool capture = false)
+            : capture(capture)
+        { }
+
+        bool capture;
+    };
+
+    struct AddEventListenerOptions : public ListenerOptions {
+        AddEventListenerOptions(bool capture = false, bool passive = false, bool once = false)
+            : ListenerOptions(capture)
+            , passive(passive)
+            , once(once)
+        { }
+
+        bool passive;
+        bool once;
+    };
+
</ins><span class="cx">     void addEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp;, bool useCapture);
</span><span class="cx">     void removeEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp;, bool useCapture);
</span><del>-    virtual bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture);
-    virtual bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture);
</del><ins>+    void addEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;);
+    void removeEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp;, const ListenerOptions&amp;);
+    virtual bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp; = { });
+    virtual bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;);
</ins><span class="cx"> 
</span><span class="cx">     virtual void removeAllEventListeners();
</span><span class="cx">     virtual bool dispatchEvent(Event&amp;);
</span><span class="lines">@@ -209,6 +230,16 @@
</span><span class="cx">     return d-&gt;eventListenerMap.containsCapturing(eventType);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void EventTarget::addEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
+{
+    addEventListenerForBindings(eventType, WTFMove(listener), AddEventListenerOptions(useCapture));
+}
+
+inline void EventTarget::removeEventListenerForBindings(const AtomicString&amp; eventType, RefPtr&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
+{
+    removeEventListenerForBindings(eventType, WTFMove(listener), ListenerOptions(useCapture));
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // EventTarget_h
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventTargetidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventTarget.idl (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventTarget.idl        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/EventTarget.idl        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -25,6 +25,11 @@
</span><span class="cx">     JSCustomToNativeObject,
</span><span class="cx">     ObjCProtocol,
</span><span class="cx"> ] interface EventTarget {
</span><ins>+#if defined(LANGUAGE_JAVASCRIPT) &amp;&amp; LANGUAGE_JAVASCRIPT
+    [ImplementedAs=addEventListenerForBindings] void addEventListener([AtomicString] DOMString type, EventListener? listener, optional AddEventListenerOptions options);
+    [ImplementedAs=removeEventListenerForBindings] void removeEventListener([AtomicString] DOMString type, EventListener? listener, optional EventListenerOptions options);
+#endif
+
</ins><span class="cx">     // FIXME: The 'type' and 'listener' parameters should not be optional.
</span><span class="cx">     [ObjCLegacyUnnamedParameters, ImplementedAs=addEventListenerForBindings] void addEventListener([AtomicString] optional DOMString type = &quot;undefined&quot;, optional EventListener? listener, optional boolean useCapture = false);
</span><span class="cx">     [ObjCLegacyUnnamedParameters, ImplementedAs=removeEventListenerForBindings] void removeEventListener([AtomicString] optional DOMString type = &quot;undefined&quot;, optional EventListener? listener, optional boolean useCapture = false);
</span><span class="lines">@@ -32,3 +37,13 @@
</span><span class="cx">     // FIXME: event should not be nullable.
</span><span class="cx">     [ImplementedAs=dispatchEventForBindings, RaisesException] boolean dispatchEvent(Event? event);
</span><span class="cx"> };
</span><ins>+
+dictionary EventListenerOptions {
+    boolean capture = false;
+};
+
+dictionary AddEventListenerOptions {
+    boolean capture = false;
+    boolean passive = false;
+    boolean once = false;
+};
</ins></span></pre></div>
<a id="trunkSourceWebCoredomMessagePortcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessagePort.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessagePort.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/MessagePort.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -221,11 +221,11 @@
</span><span class="cx">     return portArray;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool MessagePort::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool MessagePort::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     if (listener-&gt;isAttribute() &amp;&amp; eventType == eventNames().messageEvent)
</span><span class="cx">         start();
</span><del>-    return EventTargetWithInlineData::addEventListener(eventType, WTFMove(listener), useCapture);
</del><ins>+    return EventTargetWithInlineData::addEventListener(eventType, WTFMove(listener), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoredomMessagePorth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessagePort.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessagePort.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/MessagePort.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">         // A port gets neutered when it is transferred to a new owner via postMessage().
</span><span class="cx">         bool isNeutered() { return !m_entangledChannel; }
</span><span class="cx"> 
</span><del>-        bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
</del><ins>+        bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         explicit MessagePort(ScriptExecutionContext&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/Node.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -1907,9 +1907,9 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline bool tryAddEventListener(Node* targetNode, const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+static inline bool tryAddEventListener(Node* targetNode, const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const EventTarget::AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    if (!targetNode-&gt;EventTarget::addEventListener(eventType, listener.copyRef(), useCapture))
</del><ins>+    if (!targetNode-&gt;EventTarget::addEventListener(eventType, listener.copyRef(), options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     targetNode-&gt;document().addListenerTypeIfNeeded(eventType);
</span><span class="lines">@@ -1927,7 +1927,7 @@
</span><span class="cx">     // This code was added to address &lt;rdar://problem/5846492&gt; Onorientationchange event not working for document.body.
</span><span class="cx">     // Forward this call to addEventListener() to the window since these are window-only events.
</span><span class="cx">     if (eventType == eventNames().orientationchangeEvent || eventType == eventNames().resizeEvent)
</span><del>-        targetNode-&gt;document().domWindow()-&gt;addEventListener(eventType, WTFMove(listener), useCapture);
</del><ins>+        targetNode-&gt;document().domWindow()-&gt;addEventListener(eventType, WTFMove(listener), options);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><span class="cx">     if (eventNames().isTouchEventType(eventType))
</span><span class="lines">@@ -1943,14 +1943,14 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Node::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool Node::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    return tryAddEventListener(this, eventType, WTFMove(listener), useCapture);
</del><ins>+    return tryAddEventListener(this, eventType, WTFMove(listener), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString&amp; eventType, EventListener&amp; listener, const EventTarget::ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    if (!targetNode-&gt;EventTarget::removeEventListener(eventType, listener, useCapture))
</del><ins>+    if (!targetNode-&gt;EventTarget::removeEventListener(eventType, listener, options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Notify Document that the listener has vanished. We need to keep track of a number of
</span><span class="lines">@@ -1968,7 +1968,7 @@
</span><span class="cx">     // This code was added to address &lt;rdar://problem/5846492&gt; Onorientationchange event not working for document.body.
</span><span class="cx">     // Forward this call to removeEventListener() to the window since these are window-only events.
</span><span class="cx">     if (eventType == eventNames().orientationchangeEvent || eventType == eventNames().resizeEvent)
</span><del>-        targetNode-&gt;document().domWindow()-&gt;removeEventListener(eventType, listener, useCapture);
</del><ins>+        targetNode-&gt;document().domWindow()-&gt;removeEventListener(eventType, listener, options);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><span class="cx">     if (eventNames().isTouchEventType(eventType))
</span><span class="lines">@@ -1984,9 +1984,9 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Node::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool Node::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    return tryRemoveEventListener(this, eventType, listener, useCapture);
</del><ins>+    return tryRemoveEventListener(this, eventType, listener, options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> typedef HashMap&lt;Node*, std::unique_ptr&lt;EventTargetData&gt;&gt; EventTargetDataMap;
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/Node.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -507,8 +507,8 @@
</span><span class="cx">     EventTargetInterface eventTargetInterface() const override;
</span><span class="cx">     ScriptExecutionContext* scriptExecutionContext() const final; // Implemented in Document.h
</span><span class="cx"> 
</span><del>-    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
-    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture) override;
</del><ins>+    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
+    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     using EventTarget::dispatchEvent;
</span><span class="cx">     bool dispatchEvent(Event&amp;) override;
</span></span></pre></div>
<a id="trunkSourceWebCoredomRegisteredEventListenerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/RegisteredEventListener.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/RegisteredEventListener.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/dom/RegisteredEventListener.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -31,6 +31,26 @@
</span><span class="cx"> 
</span><span class="cx">     class RegisteredEventListener {
</span><span class="cx">     public:
</span><ins>+        struct Options {
+            Options(bool capture = false, bool passive = false, bool once = false)
+                : capture(capture)
+                , passive(passive)
+                , once(once)
+            { }
+
+            bool capture;
+            bool passive;
+            bool once;
+        };
+
+        RegisteredEventListener(Ref&lt;EventListener&gt;&amp;&amp; listener, const Options&amp; options)
+            : listener(WTFMove(listener))
+            , useCapture(options.capture)
+            , isPassive(options.passive)
+            , isOnce(options.once)
+        {
+        }
+
</ins><span class="cx">         RegisteredEventListener(Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</span><span class="cx">             : listener(WTFMove(listener))
</span><span class="cx">             , useCapture(useCapture)
</span><span class="lines">@@ -38,11 +58,16 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         RefPtr&lt;EventListener&gt; listener;
</span><del>-        bool useCapture;
</del><ins>+        bool useCapture { false };
+        bool isPassive { false };
+        bool isOnce { false };
+        bool isMarkedForRemoval { false };
</ins><span class="cx">     };
</span><span class="cx">     
</span><span class="cx">     inline bool operator==(const RegisteredEventListener&amp; a, const RegisteredEventListener&amp; b)
</span><span class="cx">     {
</span><ins>+        // Other data members are purposefully not checked. The DOM specification says that upon adding / removing
+        // EventListeners, we should only check the type and the capture flag.
</ins><span class="cx">         return *a.listener == *b.listener &amp;&amp; a.useCapture == b.useCapture;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -5228,13 +5228,13 @@
</span><span class="cx">     return HTMLElement::dispatchEvent(event);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool HTMLMediaElement::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool HTMLMediaElement::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     if (eventType != eventNames().webkitplaybacktargetavailabilitychangedEvent)
</span><del>-        return Node::addEventListener(eventType, WTFMove(listener), useCapture);
</del><ins>+        return Node::addEventListener(eventType, WTFMove(listener), options);
</ins><span class="cx"> 
</span><span class="cx">     bool isFirstAvailabilityChangedListener = !hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent);
</span><del>-    if (!Node::addEventListener(eventType, WTFMove(listener), useCapture))
</del><ins>+    if (!Node::addEventListener(eventType, WTFMove(listener), options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (isFirstAvailabilityChangedListener) {
</span><span class="lines">@@ -5248,12 +5248,12 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool HTMLMediaElement::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool HTMLMediaElement::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     if (eventType != eventNames().webkitplaybacktargetavailabilitychangedEvent)
</span><del>-        return Node::removeEventListener(eventType, listener, useCapture);
</del><ins>+        return Node::removeEventListener(eventType, listener, options);
</ins><span class="cx"> 
</span><del>-    if (!Node::removeEventListener(eventType, listener, useCapture))
</del><ins>+    if (!Node::removeEventListener(eventType, listener, options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     bool didRemoveLastAvailabilityChangedListener = !hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -342,8 +342,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     void webkitShowPlaybackTargetPicker();
</span><del>-    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
-    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture) override;
</del><ins>+    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
+    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     void wirelessRoutesAvailableDidChange() override;
</span><span class="cx">     bool canPlayToWirelessPlaybackTarget() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -1722,9 +1722,9 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DOMWindow::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool DOMWindow::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    if (!EventTarget::addEventListener(eventType, WTFMove(listener), useCapture))
</del><ins>+    if (!EventTarget::addEventListener(eventType, WTFMove(listener), options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (Document* document = this-&gt;document()) {
</span><span class="lines">@@ -1825,9 +1825,9 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DOMWindow::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool DOMWindow::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    if (!EventTarget::removeEventListener(eventType, listener, useCapture))
</del><ins>+    if (!EventTarget::removeEventListener(eventType, listener, options.capture))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (Document* document = this-&gt;document()) {
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/page/DOMWindow.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -279,8 +279,8 @@
</span><span class="cx"> 
</span><span class="cx">         // Events
</span><span class="cx">         // EventTarget API
</span><del>-        bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
-        bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture) override;
</del><ins>+        bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
+        bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;) override;
</ins><span class="cx">         void removeAllEventListeners() override;
</span><span class="cx"> 
</span><span class="cx">         using EventTarget::dispatchEvent;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGElement.cpp (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGElement.cpp        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/svg/SVGElement.cpp        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -528,10 +528,10 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SVGElement::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, bool useCapture)
</del><ins>+bool SVGElement::addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp; listener, const AddEventListenerOptions&amp; options)
</ins><span class="cx"> {   
</span><span class="cx">     // Add event listener to regular DOM element
</span><del>-    if (!Node::addEventListener(eventType, listener.copyRef(), useCapture))
</del><ins>+    if (!Node::addEventListener(eventType, listener.copyRef(), options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (containingShadowRoot())
</span><span class="lines">@@ -541,17 +541,17 @@
</span><span class="cx">     ASSERT(!instanceUpdatesBlocked());
</span><span class="cx">     for (auto* instance : instances()) {
</span><span class="cx">         ASSERT(instance-&gt;correspondingElement() == this);
</span><del>-        bool result = instance-&gt;Node::addEventListener(eventType, listener.copyRef(), useCapture);
</del><ins>+        bool result = instance-&gt;Node::addEventListener(eventType, listener.copyRef(), options);
</ins><span class="cx">         ASSERT_UNUSED(result, result);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SVGElement::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, bool useCapture)
</del><ins>+bool SVGElement::removeEventListener(const AtomicString&amp; eventType, EventListener&amp; listener, const ListenerOptions&amp; options)
</ins><span class="cx"> {
</span><span class="cx">     if (containingShadowRoot())
</span><del>-        return Node::removeEventListener(eventType, listener, useCapture);
</del><ins>+        return Node::removeEventListener(eventType, listener, options);
</ins><span class="cx"> 
</span><span class="cx">     // EventTarget::removeEventListener creates a PassRefPtr around the given EventListener
</span><span class="cx">     // object when creating a temporary RegisteredEventListener object used to look up the
</span><span class="lines">@@ -561,7 +561,7 @@
</span><span class="cx">     Ref&lt;EventListener&gt; protector(listener);
</span><span class="cx"> 
</span><span class="cx">     // Remove event listener from regular DOM element
</span><del>-    if (!Node::removeEventListener(eventType, listener, useCapture))
</del><ins>+    if (!Node::removeEventListener(eventType, listener, options))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     // Remove event listener from all shadow tree DOM element instances
</span><span class="lines">@@ -569,7 +569,7 @@
</span><span class="cx">     for (auto&amp; instance : instances()) {
</span><span class="cx">         ASSERT(instance-&gt;correspondingElement() == this);
</span><span class="cx"> 
</span><del>-        if (instance-&gt;Node::removeEventListener(eventType, listener, useCapture))
</del><ins>+        if (instance-&gt;Node::removeEventListener(eventType, listener, options))
</ins><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="cx">         // This case can only be hit for event listeners created from markup
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGElement.h (201734 => 201735)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGElement.h        2016-06-07 00:36:45 UTC (rev 201734)
+++ trunk/Source/WebCore/svg/SVGElement.h        2016-06-07 02:35:39 UTC (rev 201735)
</span><span class="lines">@@ -133,8 +133,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool haveLoadedRequiredResources();
</span><span class="cx"> 
</span><del>-    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, bool useCapture) override;
-    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, bool useCapture) override;
</del><ins>+    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
+    bool removeEventListener(const AtomicString&amp; eventType, EventListener&amp;, const ListenerOptions&amp;) override;
</ins><span class="cx">     bool hasFocusEventListeners() const;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_REGIONS)
</span></span></pre>
</div>
</div>

</body>
</html>