Index: third_party/WebKit/LayoutTests/imported/wpt/dom/events/AddEventListenerOptions-once2.html |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/dom/events/AddEventListenerOptions-once2.html b/third_party/WebKit/LayoutTests/imported/wpt/dom/events/AddEventListenerOptions-once2.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b1bf3baa538ce25d6f951a8785279f13bd518234 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/dom/events/AddEventListenerOptions-once2.html |
@@ -0,0 +1,130 @@ |
+<!DOCTYPE html> |
+<meta charset="utf-8"> |
+<title>EventListenerOptions.once</title> |
dtapuska
2016/08/12 18:44:02
You shouldn't add a test to the imported directory
Anton Obzhirov
2016/08/15 22:18:00
OK, didn't know, thanks for pointing out. I guess
|
+<link rel="author" title="Anton Obzhirov" href="mailto:a.obzhirov@samsung.com"> |
+<!-- Rick Byers's AddEventListenerOptions-passive.html test was used as a template. --> |
+<link rel="help" href="https://dom.spec.whatwg.org/#dom-addeventlisteneroptions-once"> |
+<script src="/resources/testharness.js"></script> |
+<script src="/resources/testharnessreport.js"></script> |
+<div id="log"></div> |
+ |
+<script> |
+ |
+test(function() { |
+ var supportsOnce = false; |
+ var query_options = { |
+ get once() { |
+ supportsOnce = true; |
+ return false; |
+ }, |
+ get dummy() { |
+ assert_unreached("dummy value getter invoked"); |
+ return false; |
+ } |
+ }; |
+ |
+ document.addEventListener('test_event', null, query_options); |
+ assert_true(supportsOnce, "addEventListener doesn't support the once option"); |
+ |
+ supportsOnce = false; |
+ document.removeEventListener('test_event', null, query_options); |
+ assert_false(supportsOnce, "removeEventListener supports the once option when it should not"); |
+}, "Supports once option on addEventListener only"); |
+ |
+function testOnceValue(optionsValue, expectedHandleCallCount) { |
+ var handleCallCount = 0; |
+ var handler = function() { |
+ ++handleCallCount; |
+ } |
+ |
+ document.body.addEventListener('test', handler, optionsValue); |
+ assert_equals(handleCallCount, 0, "Incorrect handleCallCount for the addEventListener step."); |
+ document.body.dispatchEvent(new Event('test')); |
+ assert_equals(handleCallCount, 1, "Incorrect handleCallCount for the first dispatchEvent step."); |
+ document.body.dispatchEvent(new Event('test')); |
+ assert_equals(handleCallCount, expectedHandleCallCount, "Incorrect handleCallCount for the second dispatchEvent step."); |
+ document.removeEventListener('test', handler, optionsValue); |
+} |
+ |
+test(function() { |
+ testOnceValue(undefined, 2); |
+ testOnceValue({}, 2); |
+ testOnceValue({once: false}, 2); |
+ testOnceValue({once: true}, 1); |
+ testOnceValue({once: 0}, 2); |
+ testOnceValue({once: 1}, 1); |
+}, "Event handler should be called only once if the 'once' option is true"); |
+ |
+test(function() { |
+ var handleCallCount = 0; |
+ var handler = function() { |
+ ++handleCallCount; |
+ document.body.dispatchEvent(new Event('test')); |
+ assert_equals(handleCallCount, 1, "Incorrect handleCallCount for the second dispatchEvent step."); |
+ } |
+ |
+ document.body.addEventListener('test', handler, { 'once': true }); |
+ assert_equals(handleCallCount, 0, "Incorrect handleCallCount for the addEventListener step."); |
+ document.body.dispatchEvent(new Event('test')); |
+ assert_equals(handleCallCount, 1, "Incorrect handleCallCount for the first dispatchEvent step."); |
+}, "Event handler shouldn't be called second time if the event is dispatched from the handler if the 'once' option is true"); |
Xidorn Quan
2016/08/13 03:20:41
It seems the existing test for once already tests
Anton Obzhirov
2016/08/15 22:18:00
Yes, this one checks the same logic, I guess the w
|
+ |
+function testOnceWithOtherHandlers(optionsValue, expectedHandleCallCount) { |
+ var handleCallCount1 = 0; |
+ var handler1 = function() { |
+ ++handleCallCount1; |
+ } |
+ var handleCallCount2 = 0; |
+ var handler2 = function() { |
+ ++handleCallCount2; |
+ } |
+ |
+ document.body.addEventListener('test', handler1, optionsValue); |
+ document.body.addEventListener('test', handler2); |
+ |
+ document.body.dispatchEvent(new Event('test')); |
+ assert_equals(handleCallCount1, 1, "Incorrect handleCallCount1 for the first dispatchEvent step."); |
+ assert_equals(handleCallCount2, 1, "Incorrect handleCallCount2 for the first dispatchEvent step."); |
+ |
+ document.body.dispatchEvent(new Event('test')); |
+ assert_equals(handleCallCount1, expectedHandleCallCount, "Incorrect handleCallCount1 for the second dispatchEvent step."); |
+ assert_equals(handleCallCount2, 2, "Incorrect handleCallCount2 for the second dispatchEvent step."); |
+ |
+ document.removeEventListener('test', handler1); |
+ document.removeEventListener('test', handler2); |
+} |
+ |
+test(function() { |
+ testOnceWithOtherHandlers({}, 2); |
+ testOnceWithOtherHandlers({once: false}, 2); |
+ testOnceWithOtherHandlers({once: true}, 1); |
+}, "'once' behavior of one listener should be unaffected by the presence of other listeners"); |
Xidorn Quan
2016/08/13 03:20:41
This test looks like something the existing test a
Anton Obzhirov
2016/08/15 22:18:00
On 2016/08/13 03:20:41, Xidorn Quan wrote:
> This
|
+ |
+function testOptionEquivalence(optionValue1, optionValue2, expectedEquality) { |
+ var invocationCount = 0; |
+ var handler = function handler(e) { |
+ invocationCount++; |
+ } |
+ document.addEventListener('test', handler, optionValue1); |
+ document.addEventListener('test', handler, optionValue2); |
+ document.body.dispatchEvent(new Event('test', {bubbles: true})); |
+ assert_equals(invocationCount, expectedEquality ? 1 : 2, "equivalence of options " + |
+ JSON.stringify(optionValue1) + " and " + JSON.stringify(optionValue2)); |
+ document.removeEventListener('test', handler, optionValue1); |
+ document.removeEventListener('test', handler, optionValue2); |
+} |
+ |
+test(function() { |
+ // Sanity check options that should be treated as distinct handlers |
+ testOptionEquivalence({capture:true}, {capture:false, once:false}, false); |
+ testOptionEquivalence({capture:true}, {once:true}, false); |
+ |
+ // Option values that should be treated as equivalent |
+ testOptionEquivalence({}, {once:false}, true); |
+ testOptionEquivalence({once:true}, {once:false}, true); |
+ testOptionEquivalence(undefined, {once:false}, true); |
+ testOptionEquivalence({capture: true, once: false}, {capture: true, once: true}, true); |
+}, "Equivalence of option values"); |
+ |
+</script> |
+ |