mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-24 09:27:31 +09:00
import FIREFOX_52_6_0esr_RELEASE from mozilla-esr52 hg repo
This commit is contained in:
commit
dcd9973243
150858 changed files with 23884658 additions and 0 deletions
|
|
@ -0,0 +1,81 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>AddEventListenerOptions.once</title>
|
||||
<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
|
||||
<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 invoked_once = false;
|
||||
var invoked_normal = false;
|
||||
function handler_once() {
|
||||
invoked_once = true;
|
||||
}
|
||||
function handler_normal() {
|
||||
invoked_normal = true;
|
||||
}
|
||||
|
||||
document.addEventListener('test', handler_once, {once: true});
|
||||
document.addEventListener('test', handler_normal);
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_once, true, "Once handler should be invoked");
|
||||
assert_equals(invoked_normal, true, "Normal handler should be invoked");
|
||||
|
||||
invoked_once = false;
|
||||
invoked_normal = false;
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_once, false, "Once handler shouldn't be invoked again");
|
||||
assert_equals(invoked_normal, true, "Normal handler should be invoked again");
|
||||
document.removeEventListener('test', handler_normal);
|
||||
}, "Once listener should be invoked only once");
|
||||
|
||||
test(function() {
|
||||
var invoked_count = 0;
|
||||
function handler() {
|
||||
invoked_count++;
|
||||
if (invoked_count == 1)
|
||||
document.dispatchEvent(new Event('test'));
|
||||
}
|
||||
document.addEventListener('test', handler, {once: true});
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_count, 1, "Once handler should only be invoked once");
|
||||
|
||||
invoked_count = 0;
|
||||
function handler2() {
|
||||
invoked_count++;
|
||||
if (invoked_count == 1)
|
||||
document.addEventListener('test', handler2, {once: true});
|
||||
if (invoked_count <= 2)
|
||||
document.dispatchEvent(new Event('test'));
|
||||
}
|
||||
document.addEventListener('test', handler2, {once: true});
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_count, 2, "Once handler should only be invoked once after each adding");
|
||||
}, "Once listener should be invoked only once even if the event is nested");
|
||||
|
||||
test(function() {
|
||||
var invoked_count = 0;
|
||||
function handler() {
|
||||
invoked_count++;
|
||||
}
|
||||
|
||||
document.addEventListener('test', handler, {once: true});
|
||||
document.addEventListener('test', handler);
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_count, 1, "The handler should only be added once");
|
||||
|
||||
invoked_count = 0;
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_count, 0, "The handler was added as a once listener");
|
||||
|
||||
invoked_count = 0;
|
||||
document.addEventListener('test', handler, {once: true});
|
||||
document.removeEventListener('test', handler);
|
||||
document.dispatchEvent(new Event('test'));
|
||||
assert_equals(invoked_count, 0, "The handler should have been removed");
|
||||
}, "Once listener should be added / removed like normal listeners");
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
<!DOCTYPE HTML>
|
||||
<meta charset="utf-8">
|
||||
<title>EventListenerOptions.passive</title>
|
||||
<link rel="author" title="Rick Byers" href="mailto:rbyers@chromium.org">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-addeventlisteneroptions-passive">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
|
||||
test(function() {
|
||||
var supportsPassive = false;
|
||||
var query_options = {
|
||||
get passive() {
|
||||
supportsPassive = true;
|
||||
return false;
|
||||
},
|
||||
get dummy() {
|
||||
assert_unreached("dummy value getter invoked");
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('test_event', null, query_options);
|
||||
assert_true(supportsPassive, "addEventListener doesn't support the passive option");
|
||||
|
||||
supportsPassive = false;
|
||||
document.removeEventListener('test_event', null, query_options);
|
||||
assert_false(supportsPassive, "removeEventListener supports the passive option when it should not");
|
||||
}, "Supports passive option on addEventListener only");
|
||||
|
||||
function testPassiveValue(optionsValue, expectedDefaultPrevented) {
|
||||
var defaultPrevented = undefined;
|
||||
var handler = function handler(e) {
|
||||
assert_false(e.defaultPrevented, "Event prematurely marked defaultPrevented");
|
||||
e.preventDefault();
|
||||
defaultPrevented = e.defaultPrevented;
|
||||
}
|
||||
document.addEventListener('test', handler, optionsValue);
|
||||
var uncanceled = document.body.dispatchEvent(new Event('test', {bubbles: true, cancelable: true}));
|
||||
|
||||
assert_equals(defaultPrevented, expectedDefaultPrevented, "Incorrect defaultPrevented for options: " + JSON.stringify(optionsValue));
|
||||
assert_equals(uncanceled, !expectedDefaultPrevented, "Incorrect return value from dispatchEvent");
|
||||
|
||||
document.removeEventListener('test', handler, optionsValue);
|
||||
}
|
||||
|
||||
test(function() {
|
||||
testPassiveValue(undefined, true);
|
||||
testPassiveValue({}, true);
|
||||
testPassiveValue({passive: false}, true);
|
||||
testPassiveValue({passive: true}, false);
|
||||
testPassiveValue({passive: 0}, true);
|
||||
testPassiveValue({passive: 1}, false);
|
||||
}, "preventDefault should be ignored if-and-only-if the passive option is true");
|
||||
|
||||
function testPassiveWithOtherHandlers(optionsValue, expectedDefaultPrevented) {
|
||||
var handlerInvoked1 = false;
|
||||
var dummyHandler1 = function() {
|
||||
handlerInvoked1 = true;
|
||||
};
|
||||
var handlerInvoked2 = false;
|
||||
var dummyHandler2 = function() {
|
||||
handlerInvoked2 = true;
|
||||
};
|
||||
|
||||
document.addEventListener('test', dummyHandler1, {passive:true});
|
||||
document.addEventListener('test', dummyHandler2);
|
||||
|
||||
testPassiveValue(optionsValue, expectedDefaultPrevented);
|
||||
|
||||
assert_true(handlerInvoked1, "Extra passive handler not invoked");
|
||||
assert_true(handlerInvoked2, "Extra non-passive handler not invoked");
|
||||
|
||||
document.removeEventListener('test', dummyHandler1);
|
||||
document.removeEventListener('test', dummyHandler2);
|
||||
}
|
||||
|
||||
test(function() {
|
||||
testPassiveWithOtherHandlers({}, true);
|
||||
testPassiveWithOtherHandlers({passive: false}, true);
|
||||
testPassiveWithOtherHandlers({passive: true}, false);
|
||||
}, "passive behavior of one listener should be unaffeted by the presence of other listeners");
|
||||
|
||||
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, passive:false}, false);
|
||||
testOptionEquivalence({capture:true}, {passive:true}, false);
|
||||
|
||||
// Option values that should be treated as equivalent
|
||||
testOptionEquivalence({}, {passive:false}, true);
|
||||
testOptionEquivalence({passive:true}, {passive:false}, true);
|
||||
testOptionEquivalence(undefined, {passive:true}, true);
|
||||
testOptionEquivalence({capture: true, passive: false}, {capture: true, passive: true}, true);
|
||||
|
||||
}, "Equivalence of option values");
|
||||
|
||||
</script>
|
||||
19
testing/web-platform/tests/dom/events/CustomEvent.html
Normal file
19
testing/web-platform/tests/dom/events/CustomEvent.html
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<!doctype html>
|
||||
<title>CustomEvent</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var type = "foo";
|
||||
|
||||
var target = document.createElement("div");
|
||||
target.addEventListener(type, this.step_func(function(evt) {
|
||||
assert_equals(evt.type, type);
|
||||
}), true);
|
||||
|
||||
var fooEvent = document.createEvent("CustomEvent");
|
||||
fooEvent.initEvent(type, true, true);
|
||||
target.dispatchEvent(fooEvent);
|
||||
});
|
||||
</script>
|
||||
23
testing/web-platform/tests/dom/events/Event-constants.html
Normal file
23
testing/web-platform/tests/dom/events/Event-constants.html
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<!doctype html>
|
||||
<title>Event constants</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../constants.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
var objects;
|
||||
setup(function() {
|
||||
objects = [
|
||||
[Event, "Event interface object"],
|
||||
[Event.prototype, "Event prototype object"],
|
||||
[document.createEvent("Event"), "Event object"],
|
||||
[document.createEvent("CustomEvent"), "CustomEvent object"]
|
||||
]
|
||||
})
|
||||
testConstants(objects, [
|
||||
["NONE", 0],
|
||||
["CAPTURING_PHASE", 1],
|
||||
["AT_TARGET", 2],
|
||||
["BUBBLING_PHASE", 3]
|
||||
], "eventPhase")
|
||||
</script>
|
||||
115
testing/web-platform/tests/dom/events/Event-constructors.html
Normal file
115
testing/web-platform/tests/dom/events/Event-constructors.html
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
<!doctype html>
|
||||
<title>Event constructors</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
test(function() {
|
||||
assert_throws(new TypeError(), function() {
|
||||
new Event()
|
||||
})
|
||||
})
|
||||
test(function() {
|
||||
var test_error = { name: "test" }
|
||||
assert_throws(test_error, function() {
|
||||
new Event({ toString: function() { throw test_error; } })
|
||||
})
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("")
|
||||
assert_equals(ev.type, "")
|
||||
assert_equals(ev.target, null)
|
||||
assert_equals(ev.currentTarget, null)
|
||||
assert_equals(ev.eventPhase, Event.NONE)
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, false)
|
||||
assert_equals(ev.defaultPrevented, false)
|
||||
assert_equals(ev.isTrusted, false)
|
||||
assert_true(ev.timeStamp > 0)
|
||||
assert_true("initEvent" in ev)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("test")
|
||||
assert_equals(ev.type, "test")
|
||||
assert_equals(ev.target, null)
|
||||
assert_equals(ev.currentTarget, null)
|
||||
assert_equals(ev.eventPhase, Event.NONE)
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, false)
|
||||
assert_equals(ev.defaultPrevented, false)
|
||||
assert_equals(ev.isTrusted, false)
|
||||
assert_true(ev.timeStamp > 0)
|
||||
assert_true("initEvent" in ev)
|
||||
})
|
||||
test(function() {
|
||||
assert_throws(new TypeError(), function() { Event("test") },
|
||||
'Calling Event constructor without "new" must throw');
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("I am an event", { bubbles: true, cancelable: false})
|
||||
assert_equals(ev.type, "I am an event")
|
||||
assert_equals(ev.bubbles, true)
|
||||
assert_equals(ev.cancelable, false)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("@", { bubblesIGNORED: true, cancelable: true})
|
||||
assert_equals(ev.type, "@")
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, true)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("@", { "bubbles\0IGNORED": true, cancelable: true})
|
||||
assert_equals(ev.type, "@")
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, true)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("Xx", { cancelable: true})
|
||||
assert_equals(ev.type, "Xx")
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, true)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("Xx", {})
|
||||
assert_equals(ev.type, "Xx")
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, false)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new Event("Xx", {bubbles: true, cancelable: false, sweet: "x"})
|
||||
assert_equals(ev.type, "Xx")
|
||||
assert_equals(ev.bubbles, true)
|
||||
assert_equals(ev.cancelable, false)
|
||||
assert_equals(ev.sweet, undefined)
|
||||
})
|
||||
test(function() {
|
||||
var called = []
|
||||
var ev = new Event("Xx", {
|
||||
get cancelable() {
|
||||
called.push("cancelable")
|
||||
return false
|
||||
},
|
||||
get bubbles() {
|
||||
called.push("bubbles")
|
||||
return true;
|
||||
},
|
||||
get sweet() {
|
||||
called.push("sweet")
|
||||
return "x"
|
||||
}
|
||||
})
|
||||
assert_array_equals(called, ["bubbles", "cancelable"])
|
||||
assert_equals(ev.type, "Xx")
|
||||
assert_equals(ev.bubbles, true)
|
||||
assert_equals(ev.cancelable, false)
|
||||
assert_equals(ev.sweet, undefined)
|
||||
})
|
||||
test(function() {
|
||||
var ev = new CustomEvent("$", {detail: 54, sweet: "x", sweet2: "x", cancelable:true})
|
||||
assert_equals(ev.type, "$")
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, true)
|
||||
assert_equals(ev.sweet, undefined)
|
||||
assert_equals(ev.detail, 54)
|
||||
})
|
||||
</script>
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>Event.defaultPrevented is not reset after dipatchEvent()</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id=log></div>
|
||||
<input id="target" type="hidden" value=""/>
|
||||
<script>
|
||||
test(function() {
|
||||
var EVENT = "foo";
|
||||
var TARGET = document.getElementById("target");
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(EVENT, true, true);
|
||||
|
||||
TARGET.addEventListener(EVENT, this.step_func(function(e) {
|
||||
e.preventDefault();
|
||||
assert_true(e.defaultPrevented, "during dispatch");
|
||||
}), true);
|
||||
TARGET.dispatchEvent(evt);
|
||||
|
||||
assert_true(evt.defaultPrevented, "after dispatch");
|
||||
assert_equals(evt.target, TARGET);
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
<!doctype html>
|
||||
<title>Event.defaultPrevented</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
var ev;
|
||||
test(function() {
|
||||
ev = document.createEvent("Event");
|
||||
assert_equals(ev.defaultPrevented, false, "defaultPrevented");
|
||||
}, "When an event is created, defaultPrevented should be initialized to false.");
|
||||
test(function() {
|
||||
ev.initEvent("foo", true, false);
|
||||
assert_equals(ev.bubbles, true, "bubbles");
|
||||
assert_equals(ev.cancelable, false, "cancelable");
|
||||
assert_equals(ev.defaultPrevented, false, "defaultPrevented");
|
||||
}, "initEvent should work correctly (not cancelable).");
|
||||
test(function() {
|
||||
assert_equals(ev.cancelable, false, "cancelable (before)");
|
||||
ev.preventDefault();
|
||||
assert_equals(ev.cancelable, false, "cancelable (after)");
|
||||
assert_equals(ev.defaultPrevented, false, "defaultPrevented");
|
||||
}, "preventDefault() should not change defaultPrevented if cancelable is false.");
|
||||
test(function() {
|
||||
ev.initEvent("foo", true, true);
|
||||
assert_equals(ev.bubbles, true, "bubbles");
|
||||
assert_equals(ev.cancelable, true, "cancelable");
|
||||
assert_equals(ev.defaultPrevented, false, "defaultPrevented");
|
||||
}, "initEvent should work correctly (cancelable).");
|
||||
test(function() {
|
||||
assert_equals(ev.cancelable, true, "cancelable (before)");
|
||||
ev.preventDefault();
|
||||
assert_equals(ev.cancelable, true, "cancelable (after)");
|
||||
assert_equals(ev.defaultPrevented, true, "defaultPrevented");
|
||||
}, "preventDefault() should change defaultPrevented if cancelable is true.");
|
||||
test(function() {
|
||||
ev.initEvent("foo", true, true);
|
||||
assert_equals(ev.bubbles, true, "bubbles");
|
||||
assert_equals(ev.cancelable, true, "cancelable");
|
||||
assert_equals(ev.defaultPrevented, false, "defaultPrevented");
|
||||
}, "initEvent should unset defaultPrevented.");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title> Event.bubbles attribute is set to false </title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-initevent">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
function targetsForDocumentChain(document) {
|
||||
return [
|
||||
document,
|
||||
document.documentElement,
|
||||
document.getElementsByTagName("body")[0],
|
||||
document.getElementById("table"),
|
||||
document.getElementById("table-body"),
|
||||
document.getElementById("parent")
|
||||
];
|
||||
}
|
||||
|
||||
function testChain(document, targetParents, phases, event_type) {
|
||||
var target = document.getElementById("target");
|
||||
var targets = targetParents.concat(target);
|
||||
var expected_targets = targets.concat(target);
|
||||
|
||||
var actual_targets = [], actual_phases = [];
|
||||
var test_event = function(evt) {
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_phases.push(evt.eventPhase);
|
||||
}
|
||||
|
||||
for (var i = 0; i < targets.length; i++) {
|
||||
targets[i].addEventListener(event_type, test_event, true);
|
||||
targets[i].addEventListener(event_type, test_event, false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, false, true);
|
||||
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "targets");
|
||||
assert_array_equals(actual_phases, phases, "phases");
|
||||
}
|
||||
|
||||
var phasesForDocumentChain = [
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.AT_TARGET,
|
||||
Event.AT_TARGET,
|
||||
];
|
||||
|
||||
test(function () {
|
||||
var chainWithWindow = [window].concat(targetsForDocumentChain(document));
|
||||
testChain(
|
||||
document, chainWithWindow, [Event.CAPTURING_PHASE].concat(phasesForDocumentChain), "click");
|
||||
}, "In window.document with click event");
|
||||
|
||||
test(function () {
|
||||
testChain(document, targetsForDocumentChain(document), phasesForDocumentChain, "load");
|
||||
}, "In window.document with load event")
|
||||
|
||||
test(function () {
|
||||
var documentClone = document.cloneNode(true);
|
||||
testChain(
|
||||
documentClone, targetsForDocumentChain(documentClone), phasesForDocumentChain, "click");
|
||||
}, "In window.document.cloneNode(true)");
|
||||
|
||||
test(function () {
|
||||
var newDocument = new Document();
|
||||
newDocument.appendChild(document.documentElement.cloneNode(true));
|
||||
testChain(
|
||||
newDocument, targetsForDocumentChain(newDocument), phasesForDocumentChain, "click");
|
||||
}, "In new Document()");
|
||||
|
||||
test(function () {
|
||||
var HTMLDocument = document.implementation.createHTMLDocument();
|
||||
HTMLDocument.body.appendChild(document.getElementById("table").cloneNode(true));
|
||||
testChain(
|
||||
HTMLDocument, targetsForDocumentChain(HTMLDocument), phasesForDocumentChain, "click");
|
||||
}, "In DOMImplementation.createHTMLDocument()");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title> Event.bubbles attribute is set to false </title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-initevent">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
function concatReverse(a) {
|
||||
return a.concat(a.map(function(x) { return x }).reverse());
|
||||
}
|
||||
|
||||
function targetsForDocumentChain(document) {
|
||||
return [
|
||||
document,
|
||||
document.documentElement,
|
||||
document.getElementsByTagName("body")[0],
|
||||
document.getElementById("table"),
|
||||
document.getElementById("table-body"),
|
||||
document.getElementById("parent")
|
||||
];
|
||||
}
|
||||
|
||||
function testChain(document, targetParents, phases, event_type) {
|
||||
var target = document.getElementById("target");
|
||||
var targets = targetParents.concat(target);
|
||||
var expected_targets = concatReverse(targets);
|
||||
|
||||
var actual_targets = [], actual_phases = [];
|
||||
var test_event = function(evt) {
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_phases.push(evt.eventPhase);
|
||||
}
|
||||
|
||||
for (var i = 0; i < targets.length; i++) {
|
||||
targets[i].addEventListener(event_type, test_event, true);
|
||||
targets[i].addEventListener(event_type, test_event, false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "targets");
|
||||
assert_array_equals(actual_phases, phases, "phases");
|
||||
}
|
||||
|
||||
var phasesForDocumentChain = [
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.AT_TARGET,
|
||||
Event.AT_TARGET,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
];
|
||||
|
||||
test(function () {
|
||||
var chainWithWindow = [window].concat(targetsForDocumentChain(document));
|
||||
var phases = [Event.CAPTURING_PHASE].concat(phasesForDocumentChain, Event.BUBBLING_PHASE);
|
||||
testChain(document, chainWithWindow, phases, "click");
|
||||
}, "In window.document with click event");
|
||||
|
||||
test(function () {
|
||||
testChain(document, targetsForDocumentChain(document), phasesForDocumentChain, "load");
|
||||
}, "In window.document with load event")
|
||||
|
||||
test(function () {
|
||||
var documentClone = document.cloneNode(true);
|
||||
testChain(
|
||||
documentClone, targetsForDocumentChain(documentClone), phasesForDocumentChain, "click");
|
||||
}, "In window.document.cloneNode(true)");
|
||||
|
||||
test(function () {
|
||||
var newDocument = new Document();
|
||||
newDocument.appendChild(document.documentElement.cloneNode(true));
|
||||
testChain(
|
||||
newDocument, targetsForDocumentChain(newDocument), phasesForDocumentChain, "click");
|
||||
}, "In new Document()");
|
||||
|
||||
test(function () {
|
||||
var HTMLDocument = document.implementation.createHTMLDocument();
|
||||
HTMLDocument.body.appendChild(document.getElementById("table").cloneNode(true));
|
||||
testChain(
|
||||
HTMLDocument, targetsForDocumentChain(HTMLDocument), phasesForDocumentChain, "click");
|
||||
}, "In DOMImplementation.createHTMLDocument()");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Click event on an element not in the document</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var EVENT = "click";
|
||||
var TARGET = document.createElement("somerandomelement");
|
||||
var t = async_test("Click event can be dispatched to an element that is not in the document.")
|
||||
TARGET.addEventListener(EVENT, t.step_func(function(evt) {
|
||||
assert_equals(evt.target, TARGET);
|
||||
t.done();
|
||||
}), true);
|
||||
var e = document.createEvent("Event");
|
||||
e.initEvent(EVENT, true, true);
|
||||
TARGET.dispatchEvent(e);
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title> Dispatch additional events inside an event listener </title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<script>
|
||||
async_test(function() {
|
||||
var event_type = "bar";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var tbody = document.getElementById("table-body");
|
||||
var table = document.getElementById("table");
|
||||
var body = document.body;
|
||||
var html = document.documentElement;
|
||||
var targets = [window, document, html, body, table, tbody, parent, target];
|
||||
var expected_targets = [
|
||||
window,
|
||||
document,
|
||||
html,
|
||||
body,
|
||||
table,
|
||||
tbody,
|
||||
parent,
|
||||
target,
|
||||
target,
|
||||
parent,
|
||||
tbody,
|
||||
table,
|
||||
body,
|
||||
html,
|
||||
document,
|
||||
window
|
||||
];
|
||||
var expected_listeners = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1];
|
||||
|
||||
var actual_targets = [], actual_listeners = [];
|
||||
var test_event_function = function(i) {
|
||||
return this.step_func(function(evt) {
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_listeners.push(i);
|
||||
|
||||
if (evt.eventPhase != evt.BUBBLING_PHASE && evt.currentTarget.foo != 1) {
|
||||
evt.currentTarget.removeEventListener(event_type, event_handlers[0], true);
|
||||
evt.currentTarget.addEventListener(event_type, event_handlers[2], true);
|
||||
evt.currentTarget.foo = 1;
|
||||
}
|
||||
|
||||
if (evt.eventPhase != evt.CAPTURING_PHASE && evt.currentTarget.foo != 3) {
|
||||
evt.currentTarget.removeEventListener(event_type, event_handlers[0], false);
|
||||
evt.currentTarget.addEventListener(event_type, event_handlers[3], false);
|
||||
evt.currentTarget.foo = 3;
|
||||
}
|
||||
});
|
||||
}.bind(this);
|
||||
var event_handlers = [
|
||||
test_event_function(0),
|
||||
test_event_function(1),
|
||||
test_event_function(2),
|
||||
test_event_function(3),
|
||||
];
|
||||
|
||||
for (var i = 0; i < targets.length; ++i) {
|
||||
targets[i].addEventListener(event_type, event_handlers[0], true);
|
||||
targets[i].addEventListener(event_type, event_handlers[1], false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "actual_targets");
|
||||
assert_array_equals(actual_listeners, expected_listeners, "actual_listeners");
|
||||
|
||||
this.done();
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title> Multiple dispatchEvent() and stopPropagation() </title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id=log></div>
|
||||
|
||||
<div id="parent" style="display: none">
|
||||
<input id="target" type="hidden" value=""/>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
test(function() {
|
||||
var event_type = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var actual_result;
|
||||
var test_event = function(evt) {
|
||||
actual_result.push(evt.currentTarget);
|
||||
|
||||
if (parent == evt.currentTarget) {
|
||||
evt.stopPropagation();
|
||||
}
|
||||
};
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
|
||||
target.addEventListener(event_type, test_event, false);
|
||||
parent.addEventListener(event_type, test_event, false);
|
||||
document.addEventListener(event_type, test_event, false);
|
||||
window.addEventListener(event_type, test_event, false);
|
||||
|
||||
actual_result = [];
|
||||
target.dispatchEvent(evt);
|
||||
assert_array_equals(actual_result, [target, parent]);
|
||||
|
||||
actual_result = [];
|
||||
parent.dispatchEvent(evt);
|
||||
assert_array_equals(actual_result, [parent]);
|
||||
|
||||
actual_result = [];
|
||||
document.dispatchEvent(evt);
|
||||
assert_array_equals(actual_result, [document, window]);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>EventTarget.addEventListener: capture argument omitted</title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
test(function() {
|
||||
var event_type = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var targets = [
|
||||
target,
|
||||
document.getElementById("parent"),
|
||||
document.getElementById("table-body"),
|
||||
document.getElementById("table"),
|
||||
document.body,
|
||||
document.documentElement,
|
||||
document,
|
||||
window
|
||||
];
|
||||
var phases = [
|
||||
Event.AT_TARGET,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE
|
||||
];
|
||||
|
||||
var actual_targets = [], actual_phases = [];
|
||||
var test_event = function(evt) {
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_phases.push(evt.eventPhase);
|
||||
}
|
||||
|
||||
for (var i = 0; i < targets.length; i++) {
|
||||
targets[i].addEventListener(event_type, test_event);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
for (var i = 0; i < targets.length; i++) {
|
||||
targets[i].removeEventListener(event_type, test_event);
|
||||
}
|
||||
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, targets, "targets");
|
||||
assert_array_equals(actual_phases, phases, "phases");
|
||||
}, "EventTarget.addEventListener with the capture argument omitted");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Event phases order</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
async_test(function() {
|
||||
document.addEventListener('DOMContentLoaded', this.step_func_done(function() {
|
||||
var parent = document.getElementById('parent');
|
||||
var child = document.getElementById('child');
|
||||
|
||||
var order = [];
|
||||
|
||||
parent.addEventListener('click', this.step_func(function(){ order.push(1) }), true);
|
||||
child.addEventListener('click', this.step_func(function(){ order.push(2) }), false);
|
||||
parent.addEventListener('click', this.step_func(function(){ order.push(3) }), false);
|
||||
|
||||
child.dispatchEvent(new Event('click', {bubbles: true}));
|
||||
|
||||
assert_array_equals(order, [1, 2, 3]);
|
||||
}));
|
||||
}, "Event phases order");
|
||||
</script>
|
||||
<div id="parent">
|
||||
<div id="child"></div>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<!doctype html>
|
||||
<title>Custom event on an element in another document</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var doc = document.implementation.createHTMLDocument("Demo");
|
||||
var element = doc.createElement("div");
|
||||
var called = false;
|
||||
element.addEventListener("foo", this.step_func(function(ev) {
|
||||
assert_false(called);
|
||||
called = true;
|
||||
assert_equals(ev.target, element);
|
||||
}));
|
||||
doc.body.appendChild(element);
|
||||
|
||||
var event = new Event("foo");
|
||||
element.dispatchEvent(event);
|
||||
assert_true(called);
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title> Calling stopPropagation() prior to dispatchEvent() </title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id=log></div>
|
||||
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<script>
|
||||
test(function() {
|
||||
var event = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var tbody = document.getElementById("table-body");
|
||||
var table = document.getElementById("table");
|
||||
var body = document.body;
|
||||
var html = document.documentElement;
|
||||
var current_targets = [window, document, html, body, table, tbody, parent, target];
|
||||
var expected_targets = [];
|
||||
var actual_targets = [];
|
||||
var expected_phases = [];
|
||||
var actual_phases = [];
|
||||
|
||||
var test_event = function(evt) {
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_phases.push(evt.eventPhase);
|
||||
};
|
||||
|
||||
for (var i = 0; i < current_targets.length; ++i) {
|
||||
current_targets[i].addEventListener(event, test_event, true);
|
||||
current_targets[i].addEventListener(event, test_event, false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event, true, true);
|
||||
evt.stopPropagation();
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "actual_targets");
|
||||
assert_array_equals(actual_phases, expected_phases, "actual_phases");
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=urf-8>
|
||||
<title>EventTarget#dispatchEvent(): redispatching a native event</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
async_test(function() {
|
||||
var event;
|
||||
document.addEventListener("DOMContentLoaded", this.step_func(function(e) {
|
||||
assert_true(e.isTrusted, "Should be trusted when first handled");
|
||||
event = e;
|
||||
}), true);
|
||||
|
||||
window.onload = this.step_func_done(function() {
|
||||
var received = 0;
|
||||
var target = document.createElement("span");
|
||||
target.addEventListener("DOMContentLoaded", this.step_func(function(e) {
|
||||
assert_false(e.isTrusted, "Should not be trusted during redispatching");
|
||||
++received;
|
||||
}), true);
|
||||
assert_true(event.isTrusted, "Should be trusted before redispatching");
|
||||
target.dispatchEvent(event);
|
||||
assert_false(event.isTrusted, "Should not be trusted after redispatching");
|
||||
assert_equals(received, 1);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title> Dispatch additional events inside an event listener </title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
test(function() {
|
||||
var event_type = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var tbody = document.getElementById("table-body");
|
||||
var table = document.getElementById("table");
|
||||
var body = document.body;
|
||||
var html = document.documentElement;
|
||||
var targets = [window, document, html, body, table, tbody, parent, target];
|
||||
var expected_targets = [
|
||||
window, document, html, body, table,
|
||||
target, parent, tbody,
|
||||
table, body, html, document, window,
|
||||
tbody, parent, target];
|
||||
var actual_targets = [];
|
||||
var expected_types = [
|
||||
"foo", "foo", "foo", "foo", "foo",
|
||||
"bar", "bar", "bar",
|
||||
"bar", "bar", "bar", "bar", "bar",
|
||||
"foo", "foo", "foo"
|
||||
];
|
||||
|
||||
var actual_targets = [], actual_types = [];
|
||||
var test_event = this.step_func(function(evt) {
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_types.push(evt.type);
|
||||
|
||||
if (table == evt.currentTarget && event_type == evt.type) {
|
||||
var e = document.createEvent("Event");
|
||||
e.initEvent("bar", true, true);
|
||||
target.dispatchEvent(e);
|
||||
}
|
||||
});
|
||||
|
||||
for (var i = 0; i < targets.length; ++i) {
|
||||
targets[i].addEventListener(event_type, test_event, true);
|
||||
targets[i].addEventListener("bar", test_event, false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, false, true);
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "actual_targets");
|
||||
assert_array_equals(actual_types, expected_types, "actual_types");
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title> Determined event propagation path - target moved </title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
test(function() {
|
||||
var event_type = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var tbody = document.getElementById("table-body");
|
||||
var table = document.getElementById("table");
|
||||
var body = document.body;
|
||||
var html = document.documentElement;
|
||||
var targets = [window, document, html, body, table, tbody, parent, target];
|
||||
var expected_targets = targets.concat([target, parent, tbody, table, body, html, document, window]);
|
||||
var phases = [
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.AT_TARGET,
|
||||
Event.AT_TARGET,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
];
|
||||
|
||||
var actual_targets = [], actual_phases = [];
|
||||
var test_event = this.step_func(function(evt) {
|
||||
if (parent === target.parentNode) {
|
||||
var table_row = document.getElementById("table-row");
|
||||
table_row.appendChild(parent.removeChild(target));
|
||||
}
|
||||
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_phases.push(evt.eventPhase);
|
||||
});
|
||||
|
||||
for (var i = 0; i < targets.length; i++) {
|
||||
targets[i].addEventListener(event_type, test_event, true);
|
||||
targets[i].addEventListener(event_type, test_event, false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "targets");
|
||||
assert_array_equals(actual_phases, phases, "phases");
|
||||
}, "Event propagation path when an element in it is moved within the DOM");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>Determined event propagation path - target removed</title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
test(function() {
|
||||
var event_type = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var tbody = document.getElementById("table-body");
|
||||
var table = document.getElementById("table");
|
||||
var body = document.body;
|
||||
var html = document.documentElement;
|
||||
var targets = [window, document, html, body, table, tbody, parent, target];
|
||||
var expected_targets = targets.concat([target, parent, tbody, table, body, html, document, window]);
|
||||
var phases = [
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.CAPTURING_PHASE,
|
||||
Event.AT_TARGET,
|
||||
Event.AT_TARGET,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
Event.BUBBLING_PHASE,
|
||||
];
|
||||
|
||||
var actual_targets = [], actual_phases = [];
|
||||
var test_event = this.step_func(function(evt) {
|
||||
if (parent === target.parentNode) {
|
||||
parent.removeChild(target);
|
||||
}
|
||||
|
||||
actual_targets.push(evt.currentTarget);
|
||||
actual_phases.push(evt.eventPhase);
|
||||
});
|
||||
|
||||
for (var i = 0; i < targets.length; i++) {
|
||||
targets[i].addEventListener(event_type, test_event, true);
|
||||
targets[i].addEventListener(event_type, test_event, false);
|
||||
}
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
target.dispatchEvent(evt);
|
||||
|
||||
assert_array_equals(actual_targets, expected_targets, "targets");
|
||||
assert_array_equals(actual_phases, phases, "phases");
|
||||
}, "Event propagation path when an element in it is removed from the DOM");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="UTF-8">
|
||||
<title>Throwing in event listeners</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
setup({allow_uncaught_exception:true})
|
||||
|
||||
test(function() {
|
||||
var errorEvents = 0;
|
||||
window.onerror = this.step_func(function(e) {
|
||||
assert_equals(typeof e, 'string');
|
||||
++errorEvents;
|
||||
});
|
||||
|
||||
var element = document.createElement('div');
|
||||
|
||||
element.addEventListener('click', function() {
|
||||
throw new Error('Error from only listener');
|
||||
});
|
||||
|
||||
element.dispatchEvent(new Event('click'));
|
||||
|
||||
assert_equals(errorEvents, 1);
|
||||
}, "Throwing in event listener with a single listeners");
|
||||
|
||||
test(function() {
|
||||
var errorEvents = 0;
|
||||
window.onerror = this.step_func(function(e) {
|
||||
assert_equals(typeof e, 'string');
|
||||
++errorEvents;
|
||||
});
|
||||
|
||||
var element = document.createElement('div');
|
||||
|
||||
var secondCalled = false;
|
||||
|
||||
element.addEventListener('click', function() {
|
||||
throw new Error('Error from first listener');
|
||||
});
|
||||
element.addEventListener('click', this.step_func(function() {
|
||||
secondCalled = true;
|
||||
}), false);
|
||||
|
||||
element.dispatchEvent(new Event('click'));
|
||||
|
||||
assert_equals(errorEvents, 1);
|
||||
assert_true(secondCalled);
|
||||
}, "Throwing in event listener with multiple listeners");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Re-initializing events while dispatching them</title>
|
||||
<link rel="author" title="Josh Matthews" href="mailto:josh@joshmatthews.net">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
var events = {
|
||||
'KeyboardEvent': {
|
||||
'constructor': function() { return new KeyboardEvent("type", {key: "A"}); },
|
||||
'init': function(ev) { ev.initKeyboardEvent("type2", true, true, null, "a", 1, "", true, "") },
|
||||
'check': function(ev) {
|
||||
assert_equals(ev.key, "A", "initKeyboardEvent key setter should short-circuit");
|
||||
assert_false(ev.repeat, "initKeyboardEvent repeat setter should short-circuit");
|
||||
assert_equals(ev.location, 0, "initKeyboardEvent location setter should short-circuit");
|
||||
}
|
||||
},
|
||||
'MouseEvent': {
|
||||
'constructor': function() { return new MouseEvent("type"); },
|
||||
'init': function(ev) { ev.initMouseEvent("type2", true, true, null, 0, 1, 1, 1, 1, true, true, true, true, 1, null) },
|
||||
'check': function(ev) {
|
||||
assert_equals(ev.screenX, 0, "initMouseEvent screenX setter should short-circuit");
|
||||
assert_equals(ev.screenY, 0, "initMouseEvent screenY setter should short-circuit");
|
||||
assert_equals(ev.clientX, 0, "initMouseEvent clientX setter should short-circuit");
|
||||
assert_equals(ev.clientY, 0, "initMouseEvent clientY setter should short-circuit");
|
||||
assert_false(ev.ctrlKey, "initMouseEvent ctrlKey setter should short-circuit");
|
||||
assert_false(ev.altKey, "initMouseEvent altKey setter should short-circuit");
|
||||
assert_false(ev.shiftKey, "initMouseEvent shiftKey setter should short-circuit");
|
||||
assert_false(ev.metaKey, "initMouseEvent metaKey setter should short-circuit");
|
||||
assert_equals(ev.button, 0, "initMouseEvent button setter should short-circuit");
|
||||
}
|
||||
},
|
||||
'CustomEvent': {
|
||||
'constructor': function() { return new CustomEvent("type") },
|
||||
'init': function(ev) { ev.initCustomEvent("type2", true, true, 1) },
|
||||
'check': function(ev) {
|
||||
assert_equals(ev.detail, null, "initCustomEvent detail setter should short-circuit");
|
||||
}
|
||||
},
|
||||
'UIEvent': {
|
||||
'constructor': function() { return new UIEvent("type") },
|
||||
'init': function(ev) { ev.initUIEvent("type2", true, true, window, 1) },
|
||||
'check': function(ev) {
|
||||
assert_equals(ev.view, null, "initUIEvent view setter should short-circuit");
|
||||
assert_equals(ev.detail, 0, "initUIEvent detail setter should short-circuit");
|
||||
}
|
||||
},
|
||||
'Event': {
|
||||
'constructor': function() { return new Event("type") },
|
||||
'init': function(ev) { ev.initEvent("type2", true, true) },
|
||||
'check': function(ev) {
|
||||
assert_equals(ev.bubbles, false, "initEvent bubbles setter should short-circuit");
|
||||
assert_equals(ev.cancelable, false, "initEvent cancelable setter should short-circuit");
|
||||
assert_equals(ev.type, "type", "initEvent type setter should short-circuit");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var names = Object.keys(events);
|
||||
for (var i = 0; i < names.length; i++) {
|
||||
var t = async_test("Calling init" + names[i] + " while dispatching.");
|
||||
t.step(function() {
|
||||
var e = events[names[i]].constructor();
|
||||
|
||||
var target = document.createElement("div")
|
||||
target.addEventListener("type", t.step_func(function() {
|
||||
events[names[i]].init(e);
|
||||
|
||||
var o = e;
|
||||
while ((o = Object.getPrototypeOf(o))) {
|
||||
if (!(o.constructor.name in events)) {
|
||||
break;
|
||||
}
|
||||
events[o.constructor.name].check(e);
|
||||
}
|
||||
}), false);
|
||||
|
||||
assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
|
||||
});
|
||||
t.done();
|
||||
}
|
||||
</script>
|
||||
118
testing/web-platform/tests/dom/events/Event-initEvent.html
Normal file
118
testing/web-platform/tests/dom/events/Event-initEvent.html
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Event.initEvent</title>
|
||||
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
var booleans = [true, false];
|
||||
booleans.forEach(function(bubbles) {
|
||||
booleans.forEach(function(cancelable) {
|
||||
test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type", bubbles, cancelable)
|
||||
|
||||
// Step 3.
|
||||
// Stop (immediate) propagation flag is tested later
|
||||
assert_equals(e.defaultPrevented, false, "defaultPrevented")
|
||||
// Step 4.
|
||||
assert_equals(e.isTrusted, false, "isTrusted")
|
||||
// Step 5.
|
||||
assert_equals(e.target, null, "target")
|
||||
// Step 6.
|
||||
assert_equals(e.type, "type", "type")
|
||||
// Step 7.
|
||||
assert_equals(e.bubbles, bubbles, "bubbles")
|
||||
// Step 8.
|
||||
assert_equals(e.cancelable, cancelable, "cancelable")
|
||||
}, "Properties of initEvent(type, " + bubbles + ", " + cancelable + ")")
|
||||
})
|
||||
})
|
||||
|
||||
test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type 1", true, false)
|
||||
assert_equals(e.type, "type 1", "type (first init)")
|
||||
assert_equals(e.bubbles, true, "bubbles (first init)")
|
||||
assert_equals(e.cancelable, false, "cancelable (first init)")
|
||||
|
||||
e.initEvent("type 2", false, true)
|
||||
assert_equals(e.type, "type 2", "type (second init)")
|
||||
assert_equals(e.bubbles, false, "bubbles (second init)")
|
||||
assert_equals(e.cancelable, true, "cancelable (second init)")
|
||||
}, "Calling initEvent multiple times (getting type).")
|
||||
|
||||
test(function() {
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=998809
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type 1", true, false)
|
||||
assert_equals(e.bubbles, true, "bubbles (first init)")
|
||||
assert_equals(e.cancelable, false, "cancelable (first init)")
|
||||
|
||||
e.initEvent("type 2", false, true)
|
||||
assert_equals(e.type, "type 2", "type (second init)")
|
||||
assert_equals(e.bubbles, false, "bubbles (second init)")
|
||||
assert_equals(e.cancelable, true, "cancelable (second init)")
|
||||
}, "Calling initEvent multiple times (not getting type).")
|
||||
|
||||
// Step 2.
|
||||
async_test(function() {
|
||||
// https://www.w3.org/Bugs/Public/show_bug.cgi?id=17715
|
||||
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type", false, false)
|
||||
assert_equals(e.type, "type", "type (first init)")
|
||||
assert_equals(e.bubbles, false, "bubbles (first init)")
|
||||
assert_equals(e.cancelable, false, "cancelable (first init)")
|
||||
|
||||
var target = document.createElement("div")
|
||||
target.addEventListener("type", this.step_func(function() {
|
||||
e.initEvent("fail", true, true)
|
||||
assert_equals(e.type, "type", "type (second init)")
|
||||
assert_equals(e.bubbles, false, "bubbles (second init)")
|
||||
assert_equals(e.cancelable, false, "cancelable (second init)")
|
||||
}), false)
|
||||
|
||||
assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
|
||||
|
||||
this.done()
|
||||
}, "Calling initEvent must not have an effect during dispatching.")
|
||||
|
||||
test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.stopPropagation()
|
||||
e.initEvent("type", false, false)
|
||||
var target = document.createElement("div")
|
||||
var called = false
|
||||
target.addEventListener("type", function() { called = true }, false)
|
||||
assert_true(target.dispatchEvent(e), "dispatchEvent must return true")
|
||||
assert_true(called, "Listener must be called")
|
||||
}, "Calling initEvent must unset the stop propagation flag.")
|
||||
|
||||
test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.stopImmediatePropagation()
|
||||
e.initEvent("type", false, false)
|
||||
var target = document.createElement("div")
|
||||
var called = false
|
||||
target.addEventListener("type", function() { called = true }, false)
|
||||
assert_true(target.dispatchEvent(e), "dispatchEvent must return true")
|
||||
assert_true(called, "Listener must be called")
|
||||
}, "Calling initEvent must unset the stop immediate propagation flag.")
|
||||
|
||||
async_test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type", false, false)
|
||||
|
||||
var target = document.createElement("div")
|
||||
target.addEventListener("type", this.step_func(function() {
|
||||
e.initEvent("type2", true, true);
|
||||
assert_equals(e.type, "type", "initEvent type setter should short-circuit");
|
||||
assert_false(e.bubbles, "initEvent bubbles setter should short-circuit");
|
||||
assert_false(e.cancelable, "initEvent cancelable setter should short-circuit");
|
||||
}), false)
|
||||
assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
|
||||
|
||||
this.done()
|
||||
}, "Calling initEvent during propagation.")
|
||||
</script>
|
||||
41
testing/web-platform/tests/dom/events/Event-propagation.html
Normal file
41
testing/web-platform/tests/dom/events/Event-propagation.html
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<!doctype html>
|
||||
<title>Event propagation tests</title>
|
||||
<link rel=author title="Aryeh Gregor" href=ayg@aryeh.name>
|
||||
<div id=log></div>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
function testPropagationFlag(ev, expected, desc) {
|
||||
test(function() {
|
||||
var called = false;
|
||||
var callback = function() { called = true };
|
||||
this.add_cleanup(function() {
|
||||
document.head.removeEventListener("foo", callback)
|
||||
});
|
||||
document.head.addEventListener("foo", callback);
|
||||
document.head.dispatchEvent(ev);
|
||||
assert_equals(called, expected, "Propagation flag");
|
||||
// dispatchEvent resets the propagation flags so it will happily dispatch
|
||||
// the event the second time around.
|
||||
document.head.dispatchEvent(ev);
|
||||
assert_equals(called, true, "Propagation flag after first dispatch");
|
||||
}, desc);
|
||||
}
|
||||
|
||||
var ev = document.createEvent("Event");
|
||||
ev.initEvent("foo", true, false);
|
||||
testPropagationFlag(ev, true, "Newly-created Event");
|
||||
ev.stopPropagation();
|
||||
testPropagationFlag(ev, false, "After stopPropagation()");
|
||||
ev.initEvent("foo", true, false);
|
||||
testPropagationFlag(ev, true, "Reinitialized after stopPropagation()");
|
||||
|
||||
var ev = document.createEvent("Event");
|
||||
ev.initEvent("foo", true, false);
|
||||
ev.stopImmediatePropagation();
|
||||
testPropagationFlag(ev, false, "After stopImmediatePropagation()");
|
||||
ev.initEvent("foo", true, false);
|
||||
testPropagationFlag(ev, true, "Reinitialized after stopImmediatePropagation()");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Event constructors</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
function assert_props(iface, event, defaults) {
|
||||
assert_true(event instanceof self[iface]);
|
||||
expected[iface].properties.forEach(function(p) {
|
||||
var property = p[0], value = p[defaults ? 1 : 2];
|
||||
assert_true(property in event,
|
||||
"Event " + format_value(event) + " should have a " +
|
||||
property + " property");
|
||||
assert_equals(event[property], value,
|
||||
"The value of the " + property + " property should be " +
|
||||
format_value(value));
|
||||
});
|
||||
if ("parent" in expected[iface]) {
|
||||
assert_props(expected[iface].parent, event, defaults);
|
||||
}
|
||||
}
|
||||
|
||||
var EventModifierInit = [
|
||||
["ctrlKey", false, true],
|
||||
["shiftKey", false, true],
|
||||
["altKey", false, true],
|
||||
["metaKey", false, true],
|
||||
];
|
||||
var expected = {
|
||||
"Event": {
|
||||
"properties": [
|
||||
["bubbles", false, true],
|
||||
["cancelable", false, true],
|
||||
],
|
||||
},
|
||||
|
||||
"UIEvent": {
|
||||
"parent": "Event",
|
||||
"properties": [
|
||||
["view", null, window],
|
||||
["detail", 0, 7],
|
||||
],
|
||||
},
|
||||
|
||||
"FocusEvent": {
|
||||
"parent": "UIEvent",
|
||||
"properties": [
|
||||
["relatedTarget", null, document],
|
||||
],
|
||||
},
|
||||
|
||||
"MouseEvent": {
|
||||
"parent": "UIEvent",
|
||||
"properties": EventModifierInit.concat([
|
||||
["screenX", 0, 40],
|
||||
["screenY", 0, 40],
|
||||
["clientX", 0, 40],
|
||||
["clientY", 0, 40],
|
||||
["button", 0, 40],
|
||||
["buttons", 0, 40],
|
||||
["relatedTarget", null, document],
|
||||
]),
|
||||
},
|
||||
|
||||
"WheelEvent": {
|
||||
"parent": "MouseEvent",
|
||||
"properties": [
|
||||
["deltaX", 0.0, 3.1],
|
||||
["deltaY", 0.0, 3.1],
|
||||
["deltaZ", 0.0, 3.1],
|
||||
["deltaMode", 0, 40],
|
||||
],
|
||||
},
|
||||
|
||||
"KeyboardEvent": {
|
||||
"parent": "UIEvent",
|
||||
"properties": EventModifierInit.concat([
|
||||
["key", "", "string"],
|
||||
["code", "", "string"],
|
||||
["location", 0, 7],
|
||||
["repeat", false, true],
|
||||
["isComposing", false, true],
|
||||
["charCode", 0, 7],
|
||||
["keyCode", 0, 7],
|
||||
["which", 0, 7],
|
||||
]),
|
||||
},
|
||||
|
||||
"CompositionEvent": {
|
||||
"parent": "UIEvent",
|
||||
"properties": [
|
||||
["data", "", "string"],
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
Object.keys(expected).forEach(function(iface) {
|
||||
test(function() {
|
||||
var event = new self[iface]("type");
|
||||
assert_props(iface, event, true);
|
||||
}, iface + " constructor (no argument)");
|
||||
|
||||
test(function() {
|
||||
var event = new self[iface]("type", undefined);
|
||||
assert_props(iface, event, true);
|
||||
}, iface + " constructor (undefined argument)");
|
||||
|
||||
test(function() {
|
||||
var event = new self[iface]("type", null);
|
||||
assert_props(iface, event, true);
|
||||
}, iface + " constructor (null argument)");
|
||||
|
||||
test(function() {
|
||||
var event = new self[iface]("type", {});
|
||||
assert_props(iface, event, true);
|
||||
}, iface + " constructor (empty argument)");
|
||||
|
||||
test(function() {
|
||||
var dictionary = {};
|
||||
expected[iface].properties.forEach(function(p) {
|
||||
var property = p[0], value = p[1];
|
||||
dictionary[property] = value;
|
||||
});
|
||||
var event = new self[iface]("type", dictionary);
|
||||
assert_props(iface, event, true);
|
||||
}, iface + " constructor (argument with default values)");
|
||||
|
||||
test(function() {
|
||||
function fill_in(iface, dictionary) {
|
||||
if ("parent" in expected[iface]) {
|
||||
fill_in(expected[iface].parent, dictionary)
|
||||
}
|
||||
expected[iface].properties.forEach(function(p) {
|
||||
var property = p[0], value = p[2];
|
||||
dictionary[property] = value;
|
||||
});
|
||||
}
|
||||
|
||||
var dictionary = {};
|
||||
fill_in(iface, dictionary);
|
||||
|
||||
var event = new self[iface]("type", dictionary);
|
||||
assert_props(iface, event, false);
|
||||
}, iface + " constructor (argument with non-default values)");
|
||||
});
|
||||
|
||||
test(function () {
|
||||
assert_throws(new TypeError(), function() {
|
||||
new UIEvent("x", { view: 7 })
|
||||
});
|
||||
}, "UIEvent constructor (view argument with wrong type)")
|
||||
</script>
|
||||
35
testing/web-platform/tests/dom/events/Event-type-empty.html
Normal file
35
testing/web-platform/tests/dom/events/Event-type-empty.html
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Event.type set to the empty string</title>
|
||||
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-type">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
function do_test(t, e) {
|
||||
assert_equals(e.type, "", "type");
|
||||
assert_equals(e.bubbles, false, "bubbles");
|
||||
assert_equals(e.cancelable, false, "cancelable");
|
||||
|
||||
var target = document.createElement("div");
|
||||
var handled = false;
|
||||
target.addEventListener("", t.step_func(function(e) {
|
||||
handled = true;
|
||||
}));
|
||||
assert_true(target.dispatchEvent(e));
|
||||
assert_true(handled);
|
||||
}
|
||||
|
||||
async_test(function() {
|
||||
var e = document.createEvent("Event");
|
||||
e.initEvent("", false, false);
|
||||
do_test(this, e);
|
||||
this.done();
|
||||
}, "initEvent");
|
||||
|
||||
async_test(function() {
|
||||
var e = new Event("");
|
||||
do_test(this, e);
|
||||
this.done();
|
||||
}, "Constructor");
|
||||
</script>
|
||||
22
testing/web-platform/tests/dom/events/Event-type.html
Normal file
22
testing/web-platform/tests/dom/events/Event-type.html
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Event.type</title>
|
||||
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-type">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
assert_equals(e.type, "");
|
||||
}, "Event.type should initially be the empty string");
|
||||
test(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("foo", false, false)
|
||||
assert_equals(e.type, "foo")
|
||||
}, "Event.type should be initialized by initEvent");
|
||||
test(function() {
|
||||
var e = new Event("bar")
|
||||
assert_equals(e.type, "bar")
|
||||
}, "Event.type should be initialized by the constructor");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>EventListener::handleEvent()</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
test(function(t) {
|
||||
var event = "foo";
|
||||
var target = document.getElementById("target");
|
||||
|
||||
var event_listener = {
|
||||
"handleEvent": function(evt) {
|
||||
var that = this;
|
||||
t.step(function() {
|
||||
assert_equals(evt.type, event);
|
||||
assert_equals(evt.target, target);
|
||||
assert_equals(that, event_listener);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event, true, true);
|
||||
|
||||
target.addEventListener(event, event_listener, true);
|
||||
target.dispatchEvent(evt);
|
||||
});
|
||||
</script>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title></title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<iframe src="{{location[scheme]}}://{{domains[www1]}}:{{ports[http][0]}}{{location[path]}}/../EventListener-incumbent-global-subframe-1.sub.html"></iframe>
|
||||
<script>
|
||||
|
||||
var t = async_test("Check the incumbent global EventListeners are called with");
|
||||
|
||||
onload = t.step_func(function() {
|
||||
onmessage = t.step_func_done(function(e) {
|
||||
var d = e.data;
|
||||
assert_equals(d.actual, d.expected, d.reason);
|
||||
});
|
||||
|
||||
frames[0].postMessage("start", "*");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title></title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<iframe src="{{location[scheme]}}://{{domains[www1]}}:{{ports[http][0]}}{{location[path]}}/../EventListener-incumbent-global-subframe-2.sub.html"></iframe>
|
||||
<script>
|
||||
|
||||
var t = async_test("Check the incumbent global EventListeners are called with");
|
||||
|
||||
onload = t.step_func(function() {
|
||||
onmessage = t.step_func_done(function(e) {
|
||||
var d = e.data;
|
||||
assert_equals(d.actual, d.expected, d.reason);
|
||||
});
|
||||
|
||||
frames[0].postMessage("start", "*");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<iframe src="{{location[scheme]}}://{{domains[www2]}}:{{ports[http][0]}}{{location[path]}}/../EventListener-incumbent-global-subsubframe.sub.html"></iframe>
|
||||
<script>
|
||||
document.domain = "{{host}}";
|
||||
onmessage = function(e) {
|
||||
if (e.data == "start") {
|
||||
frames[0].document.body.addEventListener("click", frames[0].postMessage.bind(frames[0], "respond", "*", undefined));
|
||||
frames[0].postMessage("sendclick", "*");
|
||||
} else {
|
||||
parent.postMessage(e.data, "*");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<iframe src="{{location[scheme]}}://{{domains[www2]}}:{{ports[http][0]}}{{location[path]}}/../EventListener-incumbent-global-subsubframe.sub.html"></iframe>
|
||||
<script>
|
||||
document.domain = "{{host}}";
|
||||
onmessage = function(e) {
|
||||
if (e.data == "start") {
|
||||
frames[0].document.body.addEventListener("click", frames[0].getTheListener());
|
||||
frames[0].postMessage("sendclick", "*");
|
||||
} else {
|
||||
parent.postMessage(e.data, "*");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
<script>
|
||||
function getTheListener() {
|
||||
return postMessage.bind(this, "respond", "*", undefined)
|
||||
}
|
||||
document.domain = "{{host}}";
|
||||
onmessage = function (e) {
|
||||
if (e.data == "sendclick") {
|
||||
document.body.click();
|
||||
} else {
|
||||
parent.postMessage(
|
||||
{
|
||||
actual: e.origin,
|
||||
expected: "{{location[scheme]}}://{{domains[www1]}}:{{ports[http][0]}}",
|
||||
reason: "Incumbent should have been the caller of addEventListener()"
|
||||
},
|
||||
"*")
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
<!DOCTYPE HTML>
|
||||
<meta charset="utf-8">
|
||||
<title>EventListenerOptions.capture</title>
|
||||
<link rel="author" title="Rick Byers" href="mailto:rbyers@chromium.org">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventlisteneroptions-capture">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
|
||||
function testCaptureValue(captureValue, expectedValue) {
|
||||
var handlerPhase = undefined;
|
||||
var handler = function handler(e) {
|
||||
assert_equals(handlerPhase, undefined, "Handler invoked after remove");
|
||||
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, "Incorrect event phase for value: " + 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("", Event.BUBBLING_PHASE);
|
||||
testCaptureValue("AAAA", Event.CAPTURING_PHASE);
|
||||
}, "Capture boolean should be honored correctly");
|
||||
|
||||
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);
|
||||
}, "Capture option should be honored correctly");
|
||||
|
||||
test(function() {
|
||||
var supportsCapture = false;
|
||||
var query_options = {
|
||||
get capture() {
|
||||
supportsCapture = true;
|
||||
return false;
|
||||
},
|
||||
get dummy() {
|
||||
assert_unreached("dummy value getter invoked");
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('test_event', null, query_options);
|
||||
assert_true(supportsCapture, "addEventListener doesn't support the capture option");
|
||||
supportsCapture = false;
|
||||
document.removeEventListener('test_event', null, query_options);
|
||||
assert_true(supportsCapture, "removeEventListener doesn't support the capture option");
|
||||
}, "Supports capture option");
|
||||
|
||||
function testOptionEquality(addOptionValue, removeOptionValue, expectedEquality) {
|
||||
var handlerInvoked = false;
|
||||
var handler = function handler(e) {
|
||||
assert_equals(handlerInvoked, false, "Handler invoked multiple times");
|
||||
handlerInvoked = true;
|
||||
}
|
||||
document.addEventListener('test', handler, addOptionValue);
|
||||
document.removeEventListener('test', handler, removeOptionValue);
|
||||
document.body.dispatchEvent(new Event('test', {bubbles: true}));
|
||||
assert_equals(!handlerInvoked, expectedEquality, "equivalence of options " +
|
||||
JSON.stringify(addOptionValue) + " and " + 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);
|
||||
|
||||
}, "Equivalence of option values");
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>EventTarget.addEventListener</title>
|
||||
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
// Step 1.
|
||||
test(function() {
|
||||
assert_equals(document.addEventListener("x", null, false), undefined);
|
||||
assert_equals(document.addEventListener("x", null, true), undefined);
|
||||
assert_equals(document.addEventListener("x", null), undefined);
|
||||
}, "Adding a null event listener should succeed");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>EventTarget.dispatchEvent: return value</title>
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-preventdefault">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-defaultprevented">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<table id="table" border="1" style="display: none">
|
||||
<tbody id="table-body">
|
||||
<tr id="table-row">
|
||||
<td id="table-cell">Shady Grove</td>
|
||||
<td>Aeolian</td>
|
||||
</tr>
|
||||
<tr id="parent">
|
||||
<td id="target">Over the river, Charlie</td>
|
||||
<td>Dorian</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
test(function() {
|
||||
var event_type = "foo";
|
||||
var target = document.getElementById("target");
|
||||
var parent = document.getElementById("parent");
|
||||
var default_prevented;
|
||||
|
||||
parent.addEventListener(event_type, function(e) {}, true);
|
||||
target.addEventListener(event_type, function(e) {
|
||||
evt.preventDefault();
|
||||
default_prevented = evt.defaultPrevented;
|
||||
}, true);
|
||||
target.addEventListener(event_type, function(e) {}, true);
|
||||
|
||||
var evt = document.createEvent("Event");
|
||||
evt.initEvent(event_type, true, true);
|
||||
|
||||
assert_true(parent.dispatchEvent(evt));
|
||||
assert_false(target.dispatchEvent(evt));
|
||||
assert_true(default_prevented);
|
||||
}, "Return value of EventTarget.dispatchEvent.");
|
||||
</script>
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>EventTarget.dispatchEvent</title>
|
||||
<link rel="author" title="Olli Pettay" href="mailto:Olli.Pettay@gmail.com">
|
||||
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/dom/nodes/Document-createEvent.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
setup({
|
||||
"allow_uncaught_exception": true,
|
||||
})
|
||||
|
||||
test(function() {
|
||||
assert_throws(new TypeError(), function() { document.dispatchEvent(null) })
|
||||
}, "Calling dispatchEvent(null).")
|
||||
|
||||
for (var alias in aliases) {
|
||||
test(function() {
|
||||
var e = document.createEvent(alias)
|
||||
assert_equals(e.type, "", "Event type should be empty string before initialization")
|
||||
assert_throws("InvalidStateError", function() { document.dispatchEvent(e) })
|
||||
}, "If the event's initialized flag is not set, an InvalidStateError must be thrown (" + alias + ").")
|
||||
}
|
||||
|
||||
var dispatch_dispatch = async_test("If the event's dispatch flag is set, an InvalidStateError must be thrown.")
|
||||
dispatch_dispatch.step(function() {
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type", false, false)
|
||||
|
||||
var target = document.createElement("div")
|
||||
target.addEventListener("type", dispatch_dispatch.step_func(function() {
|
||||
assert_throws("InvalidStateError", function() {
|
||||
target.dispatchEvent(e)
|
||||
})
|
||||
assert_throws("InvalidStateError", function() {
|
||||
document.dispatchEvent(e)
|
||||
})
|
||||
}), false)
|
||||
|
||||
assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
|
||||
|
||||
dispatch_dispatch.done()
|
||||
})
|
||||
|
||||
test(function() {
|
||||
// https://www.w3.org/Bugs/Public/show_bug.cgi?id=17713
|
||||
// https://www.w3.org/Bugs/Public/show_bug.cgi?id=17714
|
||||
|
||||
var e = document.createEvent("Event")
|
||||
e.initEvent("type", false, false)
|
||||
|
||||
var called = []
|
||||
|
||||
var target = document.createElement("div")
|
||||
target.addEventListener("type", function() {
|
||||
called.push("First")
|
||||
throw new Error()
|
||||
}, false)
|
||||
|
||||
target.addEventListener("type", function() {
|
||||
called.push("Second")
|
||||
}, false)
|
||||
|
||||
assert_equals(target.dispatchEvent(e), true, "dispatchEvent must return true")
|
||||
assert_array_equals(called, ["First", "Second"],
|
||||
"Should have continued to call other event listeners")
|
||||
}, "Exceptions from event listeners must not be propagated.")
|
||||
|
||||
async_test(function() {
|
||||
var results = []
|
||||
var outerb = document.createElement("b")
|
||||
var middleb = outerb.appendChild(document.createElement("b"))
|
||||
var innerb = middleb.appendChild(document.createElement("b"))
|
||||
outerb.addEventListener("x", this.step_func(function() {
|
||||
middleb.addEventListener("x", this.step_func(function() {
|
||||
results.push("middle")
|
||||
}), true)
|
||||
results.push("outer")
|
||||
}), true)
|
||||
innerb.dispatchEvent(new Event("x"))
|
||||
assert_array_equals(results, ["outer", "middle"])
|
||||
this.done()
|
||||
}, "Event listeners added during dispatch should be called");
|
||||
|
||||
async_test(function() {
|
||||
var results = []
|
||||
var b = document.createElement("b")
|
||||
b.addEventListener("x", this.step_func(function() {
|
||||
results.push(1)
|
||||
}), true)
|
||||
b.addEventListener("x", this.step_func(function() {
|
||||
results.push(2)
|
||||
}), false)
|
||||
b.addEventListener("x", this.step_func(function() {
|
||||
results.push(3)
|
||||
}), true)
|
||||
b.dispatchEvent(new Event("x"))
|
||||
assert_array_equals(results, [1, 2, 3])
|
||||
this.done()
|
||||
}, "Event listeners should be called in order of addition")
|
||||
</script>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>EventTarget.removeEventListener</title>
|
||||
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
|
||||
<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
// Step 1.
|
||||
test(function() {
|
||||
assert_equals(document.removeEventListener("x", null, false), undefined);
|
||||
assert_equals(document.removeEventListener("x", null, true), undefined);
|
||||
assert_equals(document.removeEventListener("x", null), undefined);
|
||||
}, "removing a null event listener should succeed");
|
||||
</script>
|
||||
25
testing/web-platform/tests/dom/events/ProgressEvent.html
Normal file
25
testing/web-platform/tests/dom/events/ProgressEvent.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<!doctype html>
|
||||
<title>ProgressEvent constructor</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<div id=log></div>
|
||||
<script>
|
||||
test(function() {
|
||||
var ev = new ProgressEvent("test")
|
||||
assert_equals(ev.type, "test")
|
||||
assert_equals(ev.target, null)
|
||||
assert_equals(ev.currentTarget, null)
|
||||
assert_equals(ev.eventPhase, Event.NONE)
|
||||
assert_equals(ev.bubbles, false)
|
||||
assert_equals(ev.cancelable, false)
|
||||
assert_equals(ev.defaultPrevented, false)
|
||||
assert_equals(ev.isTrusted, false)
|
||||
assert_true(ev.timeStamp > 0)
|
||||
assert_true("initEvent" in ev)
|
||||
}, "Default event values.")
|
||||
test(function() {
|
||||
var e = document.createEvent("ProgressEvent");
|
||||
var eProto = Object.getPrototypeOf(e);
|
||||
assert_equals(eProto, ProgressEvent.prototype);
|
||||
}, "document.createEvent() should work with ProgressEvent.");
|
||||
</script>
|
||||
Loading…
Add table
Add a link
Reference in a new issue