Bug 1478947 [wpt PR 12201] - HTML: tests for new event handler spec, a=testonly

Automatic update from web-platform-testsHTML event handlers: More uniform naming convention

--
HTML event handlers: Use .window.js instead of .html for some files

--
HTML event handlers: Use IDL parser for list of event handlers

--
HTML event handlers: Use synchronous test() where able

--
HTML event handlers: Additionally test unshadowed event handlers

--
HTML: tests for new event handler spec

See: https://github.com/whatwg/html/pull/3850

--
HTML event handlers: Test document.createElement("body")

--

wpt-commits: db24506f8af9048c0a80d89c9981ef445d6c3af9, 3e273bc58ae2af40f4b00b514f2fd6d604ffc98d, 8bf45a39c3435737ebc862904af245d27b68efce, 776041862ca0cab7a8dd10e29361dbf3359a0b2f, fa58a12fc565fc152bff196e803fd9290dfa1bc7, fc2eba9d6f0a860c0db1457852124e320fd8d499, 8e668a6b63e5dbb68304c182fdc1f7b4e6edaf96
wpt-pr: 12201
This commit is contained in:
Timothy Gu 2018-08-02 14:28:02 +00:00 committed by moz-wptsync-bot
parent 6bdeb33c8e
commit 127f26036d
12 changed files with 363 additions and 197 deletions

View File

@ -287318,6 +287318,11 @@
{}
]
],
"html/webappapis/scripting/events/resources/event-handler-body.js": [
[
{}
]
],
"html/webappapis/scripting/events/resources/open-window.html": [
[
{}
@ -361544,12 +361549,6 @@
{}
]
],
"html/webappapis/scripting/events/body-exposed-window-event-handlers.html": [
[
"/html/webappapis/scripting/events/body-exposed-window-event-handlers.html",
{}
]
],
"html/webappapis/scripting/events/body-onload.html": [
[
"/html/webappapis/scripting/events/body-onload.html",
@ -361580,6 +361579,12 @@
{}
]
],
"html/webappapis/scripting/events/event-handler-attributes-windowless-body.html": [
[
"/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html",
{}
]
],
"html/webappapis/scripting/events/event-handler-javascript.html": [
[
"/html/webappapis/scripting/events/event-handler-javascript.html",
@ -361670,9 +361675,15 @@
{}
]
],
"html/webappapis/scripting/events/event-handler-spec-example.html": [
"html/webappapis/scripting/events/event-handler-removal.window.js": [
[
"/html/webappapis/scripting/events/event-handler-spec-example.html",
"/html/webappapis/scripting/events/event-handler-removal.window.html",
{}
]
],
"html/webappapis/scripting/events/event-handler-spec-example.window.js": [
[
"/html/webappapis/scripting/events/event-handler-spec-example.window.html",
{}
]
],
@ -361688,15 +361699,21 @@
{}
]
],
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html": [
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js": [
[
"/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html",
"/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.html",
{}
]
],
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html": [
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js": [
[
"/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html",
"/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.html",
{}
]
],
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js": [
[
"/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.html",
{}
]
],
@ -600647,10 +600664,6 @@
"c14a043b6ab10ab5e9e08d5bae1088f8dbf5e9c3",
"testharness"
],
"html/webappapis/scripting/events/body-exposed-window-event-handlers.html": [
"e4f00b866dba9849c8aabb4b1e2ef9b8d1d58e5d",
"testharness"
],
"html/webappapis/scripting/events/body-onload.html": [
"1e43d1ccd476a530738cfdc7846adad807ca1edc",
"testharness"
@ -600672,11 +600685,15 @@
"testharness"
],
"html/webappapis/scripting/events/event-handler-attributes-body-window.html": [
"1c87892cba7fa30533c2c28f8c0244dd90ff8548",
"4a6bee61bef240cd0947d796f7b3c2c4166b2670",
"testharness"
],
"html/webappapis/scripting/events/event-handler-attributes-window-body.html": [
"29c4c133b9ef3847146182a5fb24a4e0fd96bbfe",
"1ceed5278de7d17c4ef655a2a79e3ecc97339dbf",
"testharness"
],
"html/webappapis/scripting/events/event-handler-attributes-windowless-body.html": [
"9b81d42ff729399d57e182abc8b8950cef503e12",
"testharness"
],
"html/webappapis/scripting/events/event-handler-javascript.html": [
@ -600751,8 +600768,12 @@
"f5423d7ed448fbceb4d43ef7352b708b48ce2364",
"testharness"
],
"html/webappapis/scripting/events/event-handler-spec-example.html": [
"1f3cff426523ea5799d12b90e45f2f50eb6f8181",
"html/webappapis/scripting/events/event-handler-removal.window.js": [
"d0f75c511dd3d04e1e9334753bb0d030f0eb805e",
"testharness"
],
"html/webappapis/scripting/events/event-handler-spec-example.window.js": [
"7bfbe58bce55aad177adb18f408852d7aed08a96",
"testharness"
],
"html/webappapis/scripting/events/eventhandler-cancellation.html": [
@ -600763,12 +600784,16 @@
"aae0f1abf8bf3ced9e69e83996f76ef700c11866",
"testharness"
],
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html": [
"83ee25032c5877ed830e0070d3fff963746e290e",
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.window.js": [
"2892a4c3ab98740dc2fa8240b91217ff6dd49e17",
"testharness"
],
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html": [
"a67f66ead4ffce7b6692f01dbe6449e28f062f08",
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.window.js": [
"b39b54b0e9cea49e4628b72ddd84e236cb57e77a",
"testharness"
],
"html/webappapis/scripting/events/invalid-uncompiled-raw-handler-keeps-position.window.js": [
"f9443bf99a0a9dfd937d8d1cf3bd618a3734aa1c",
"testharness"
],
"html/webappapis/scripting/events/messageevent-constructor.https.html": [
@ -600787,6 +600812,10 @@
"d40c0b9cce8a7b9a369a30679560b0d1ab22aca0",
"support"
],
"html/webappapis/scripting/events/resources/event-handler-body.js": [
"656903cf99e6e36b491bec30d902466a83b9504f",
"support"
],
"html/webappapis/scripting/events/resources/open-window.html": [
"1d23263570e6db17d36e6bf611f4f31d231327b6",
"support"

View File

@ -1,48 +0,0 @@
<!doctype html>
<meta charset="utf-8">
<title></title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
var elements = ['body', 'frameset'];
var handlers = [
'load', 'resize', 'blur', 'focus', 'scroll',
'afterprint', 'beforeprint', 'beforeunload', 'hashchange',
'languagechange', 'message', 'offline', 'online', 'pagehide',
'pageshow', 'popstate', 'rejectionhandled', 'storage',
'unhandledrejection', 'unload'];
elements.forEach(function (elementName) {
handlers.forEach(function (eventName) {
var handlerName = "on" + eventName;
test(function() {
var windowHandler = function () { return "Handler attached to the window"; };
window[handlerName] = windowHandler;
var d = (new DOMParser).parseFromString('', 'text/html');
var b = d.createElement(elementName);
assert_equals(b[handlerName], null);
window[handlerName] = null;
}, "Return null when getting the " + eventName + " event handler of a windowless " + elementName);
test(function() {
var windowHandler = function () { return "Handler attached to the window"; };
window[handlerName] = windowHandler;
var d = (new DOMParser).parseFromString('', 'text/html');
var b = d.createElement(elementName);
b[handlerName] = function() { return "Handler attached to windowless element"; };
assert_equals(window[handlerName], windowHandler);
assert_equals(b[handlerName], null);
// Clean up window event handler
window[handlerName] = null;
}, "Ignore setting of " + eventName + " window event handlers on windowless " + elementName);
});
});
</script>

View File

@ -3,32 +3,49 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="resources/event-handler-body.js"></script>
<div id="log"></div>
<body>
<script>
function f() {
return 0;
}
setup({ explicit_done: true });
var handlers = ['blur','error','focus','load','resize','scroll',
'afterprint','beforeprint','beforeunload','hashchange',
'languagechange','message','offline','online','pagehide',
'pageshow','popstate','storage','unload'];
handlers.forEach(function(handler) {
test(function() {
document.body['on' + handler] = f;
assert_equals(window['on' + handler], f);
}, handler);
});
handlersListPromise.then(({ shadowedHandlers, notShadowedHandlers }) => {
const createdBody = document.createElement("body");
for (const [description, body, altBody] of [
["document.body", document.body, createdBody],
['document.createElement("body")', createdBody, document.body]
]) {
const f = () => 0;
handlers.forEach(function(handler) {
document.body['on' + handler] = null;
});
shadowedHandlers.forEach(function(handler) {
test(function() {
body['on' + handler] = f;
assert_equals(window['on' + handler], f, "window should reflect");
assert_equals(altBody['on' + handler], f, "alternative body should reflect");
}, `shadowed ${handler} (${description})`);
});
notShadowedHandlers.forEach(function(handler) {
test(function() {
body['on' + handler] = f;
assert_equals(window['on' + handler], null, "window should reflect");
assert_equals(altBody['on' + handler], null, "alternative body should reflect");
}, `not shadowed ${handler} (${description})`);
});
handlers.forEach(function(handler) {
test(function() {
assert_equals(document.body['on' + handler], null);
assert_equals(window['on' + handler], null);
}, handler + " removal");
[...shadowedHandlers, ...notShadowedHandlers].forEach(function(handler) {
body['on' + handler] = null;
});
shadowedHandlers.forEach(function(handler) {
test(function() {
assert_equals(body['on' + handler], null, "body should reflect changes to itself");
assert_equals(window['on' + handler], null, "window should reflect");
assert_equals(altBody['on' + handler], null, "alternative body should reflect");
}, `shadowed ${handler} removal (${description})`);
});
}
done();
});
</script>

View File

@ -3,32 +3,47 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="resources/event-handler-body.js"></script>
<div id="log"></div>
<body>
<script>
setup({ explicit_done: true });
function f() {
return 0;
}
var handlers = ['blur','error','focus','load','resize','scroll',
'afterprint','beforeprint','beforeunload','hashchange',
'languagechange','message','offline','online','pagehide',
'pageshow','popstate','storage','unload'];
handlers.forEach(function(handler) {
test(function() {
window['on' + handler] = f;
assert_equals(document.body['on' + handler], f);
}, handler);
});
handlersListPromise.then(({ shadowedHandlers, notShadowedHandlers }) => {
const body = document.createElement("body");
handlers.forEach(function(handler) {
shadowedHandlers.forEach(function(handler) {
test(function() {
window['on' + handler] = f;
assert_equals(document.body['on' + handler], f, "document.body should reflect");
assert_equals(body['on' + handler], f, "document.createElement('body') should reflect");
}, `shadowed ${handler}`);
});
notShadowedHandlers.forEach(function(handler) {
test(function() {
window['on' + handler] = f;
assert_equals(document.body['on' + handler], null, "document.body should reflect");
assert_equals(body['on' + handler], null, "document.createElement('body') should reflect");
}, `not shadowed ${handler}`);
});
[...shadowedHandlers, ...notShadowedHandlers].forEach(function(handler) {
window['on' + handler] = null;
});
});
handlers.forEach(function(handler) {
test(function() {
assert_equals(window['on' + handler], null);
assert_equals(document.body['on' + handler], null);
}, handler + " removal");
shadowedHandlers.forEach(function(handler) {
test(function() {
assert_equals(window['on' + handler], null, "window should reflect changes to itself");
assert_equals(document.body['on' + handler], null, "document.body should reflect");
assert_equals(body['on' + handler], null, "document.createElement('body') should reflect");
}, `shadowed ${handler} removal`);
});
done();
});
</script>

View File

@ -0,0 +1,71 @@
<!doctype html>
<meta charset="utf-8">
<title></title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="resources/event-handler-body.js"></script>
<script>
setup({ explicit_done: true });
const elements = ['body', 'frameset'];
handlersListPromise.then(({ shadowedHandlers, notShadowedHandlers }) => {
elements.forEach(function (elementName) {
shadowedHandlers.forEach(function (eventName) {
var handlerName = "on" + eventName;
test(function() {
var windowHandler = function () { return "Handler attached to the window"; };
window[handlerName] = windowHandler;
var d = (new DOMParser).parseFromString('', 'text/html');
var b = d.createElement(elementName);
assert_equals(b[handlerName], null);
window[handlerName] = null;
}, "Return null when getting the " + eventName + " event handler of a windowless " + elementName);
test(function() {
var windowHandler = function () { return "Handler attached to the window"; };
window[handlerName] = windowHandler;
var d = (new DOMParser).parseFromString('', 'text/html');
var b = d.createElement(elementName);
b[handlerName] = function() { return "Handler attached to windowless element"; };
assert_equals(window[handlerName], windowHandler);
assert_equals(b[handlerName], null);
// Clean up window event handler
window[handlerName] = null;
}, "Ignore setting of " + eventName + " window event handlers on windowless " + elementName);
});
notShadowedHandlers.forEach(function (eventName) {
var handlerName = "on" + eventName;
test(function() {
var windowHandler = function () { return "Handler attached to the window"; };
window[handlerName] = windowHandler;
var d = (new DOMParser).parseFromString('', 'text/html');
var b = d.createElement(elementName);
assert_equals(b[handlerName], null);
var elementHandler = function () { return "Handler attached to the element"; };
b[handlerName] = elementHandler;
assert_equals(window[handlerName], windowHandler);
assert_equals(b[handlerName], elementHandler);
// Clean up window event handler
window[handlerName] = null;
}, eventName + " is unaffected on a windowless " + elementName);
});
});
done();
});
</script>

View File

@ -0,0 +1,70 @@
test(() => {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.addEventListener('click', () => { assert_equals(++i, 1); }, false);
button.setAttribute('onclick', uncalled); // event handler is activated here
button.addEventListener('click', () => { assert_equals(++i, 2); }, false);
button.onclick = null; // but de-activated here
button.addEventListener('click', () => { assert_equals(++i, 3); }, false);
button.onclick = () => { assert_equals(++i, 4); }; // and re-activated here
button.addEventListener('click', () => { assert_equals(++i, 5); }, false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 5);
}, "Event handler set through content attribute should be removed when they are set to null.");
let happened = 0;
test(() => {
var script = "happened++;";
var button = document.createElement('button');
button.setAttribute('onclick', script); // event handler is activated here
button.onclick = null; // but de-activated here
assert_equals(button.getAttribute("onclick"), script)
button.setAttribute('onclick', script); // and re-activated here
button.click()
assert_equals(happened, 1);
}, "Event handler set through content attribute should be re-activated even if content is the same.");
test(() => {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.addEventListener('click', () => { assert_equals(++i, 1); }, false);
button.setAttribute('onclick', uncalled); // event handler is activated here
button.addEventListener('click', () => { assert_equals(++i, 2); }, false);
button.removeAttribute('onclick'); // but de-activated here
button.addEventListener('click', () => { assert_equals(++i, 3); }, false);
button.onclick = () => { assert_equals(++i, 4); }; // and re-activated here
button.addEventListener('click', () => { assert_equals(++i, 5); }, false);
button.click()
assert_equals(i, 5);
}, "Event handler set through content attribute should be deactivated when the content attribute is removed.");
test(t => {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.addEventListener('click', () => { assert_equals(++i, 1); }, false);
button.onclick = t.unreached_func('First event handler.'); // event handler is activated here
button.addEventListener('click', () => { assert_equals(++i, 2); }, false);
button.onclick = null; // but de-activated here
button.addEventListener('click', () => { assert_equals(++i, 3); }, false);
button.onclick = () => { assert_equals(++i, 4); }; // and re-activated here
button.addEventListener('click', () => { assert_equals(++i, 5); }, false);
button.click()
assert_equals(i, 5);
}, "Event handler set through IDL should be deactivated when the IDL attribute is set to null.");
test(t => {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.addEventListener('click', () => { assert_equals(++i, 1) }, false);
button.onclick = t.unreached_func('First event handler.'); // event handler is activated here
button.addEventListener('click', () => { assert_equals(++i, 3) }, false);
button.removeAttribute('onclick'); // but de-activated here
button.addEventListener('click', () => { assert_equals(++i, 4) }, false);
button.onclick = () => { assert_equals(++i, 2); }; // and re-activated here
button.addEventListener('click', () => { assert_equals(++i, 5) }, false);
button.click()
assert_equals(i, 5);
}, "Event handler set through IDL should NOT be deactivated when the content attribute is removed.");

View File

@ -1,67 +0,0 @@
<!DOCTYPE html>
<title>Event handler invocation order</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
var objects = [{}, function() {}, new Number(42), new String()];
var primitives = [42, null, undefined, ""];
objects.forEach(function(object) {
var t = async_test("Event handler listeners should be registered when they " +
"are first set to an object value (" +
format_value(object) + ").");
t.step(function() {
var i = 0;
var uncalled = "t.step(function() { assert_unreached('First event handler.') })"
var button = document.createElement('button');
button.onclick = object; // event handler listener is registered here
assert_equals(button.onclick, object);
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 2) }), false);
button.setAttribute('onclick', uncalled);
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false);
button.onclick = t.step_func(function () { assert_equals(++i, 1); });
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 4);
t.done()
});
});
primitives.forEach(function(primitive) {
var t = async_test("Event handler listeners should be registered when they " +
"are first set to an object value (" +
format_value(primitive) + ").");
t.step(function() {
var i = 0;
var uncalled = "t.step(function() { assert_unreached('First event handler.') })"
var button = document.createElement('button');
button.onclick = primitive;
assert_equals(button.onclick, null);
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 1) }), false);
button.setAttribute('onclick', uncalled); // event handler listener is registered here
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false);
button.onclick = t.step_func(function () { assert_equals(++i, 2); });
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 4);
t.done()
});
});
var t = async_test("Event handler listeners should be registered when they " +
"are first set to an object value.");
t.step(function() {
var i = 0;
var uncalled = "t.step(function() { assert_unreached('First event handler.') })"
var button = document.createElement('button');
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 1) }), false);
button.setAttribute('onclick', uncalled); // event handler listener is registered here
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false);
button.onclick = t.step_func(function () { assert_equals(++i, 2); });
button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 4);
t.done()
});
</script>

View File

@ -0,0 +1,51 @@
var objects = [{}, function() {}, new Number(42), new String()];
var primitives = [42, null, undefined, ""];
objects.forEach(function(object) {
test(function() {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.onclick = object; // event handler listener is registered here
assert_equals(button.onclick, object);
button.addEventListener('click', function () { assert_equals(++i, 2) }, false);
button.setAttribute('onclick', uncalled);
button.addEventListener('click', function () { assert_equals(++i, 3) }, false);
button.onclick = function () { assert_equals(++i, 1); };
button.addEventListener('click', function () { assert_equals(++i, 4) }, false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 4);
}, "Event handler listeners should be registered when they are first set to an object value " +
"(" + format_value(object) + ").");
});
primitives.forEach(function(primitive) {
test(function() {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.onclick = primitive;
assert_equals(button.onclick, null);
button.addEventListener('click', function () { assert_equals(++i, 1) }, false);
button.setAttribute('onclick', uncalled); // event handler listener is registered here
button.addEventListener('click', function () { assert_equals(++i, 3) }, false);
button.onclick = function () { assert_equals(++i, 2); };
button.addEventListener('click', function () { assert_equals(++i, 4) }, false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 4);
}, "Event handler listeners should be registered when they are first set to an object value " +
"(" + format_value(primitive) + ").");
});
test(function() {
var i = 0;
var uncalled = "assert_unreached('First event handler.');"
var button = document.createElement('button');
button.addEventListener('click', function () { assert_equals(++i, 1) }, false);
button.setAttribute('onclick', uncalled); // event handler listener is registered here
button.addEventListener('click', function () { assert_equals(++i, 3) }, false);
button.onclick = function () { assert_equals(++i, 2); };
button.addEventListener('click', function () { assert_equals(++i, 4) }, false);
button.click()
assert_equals(button.getAttribute("onclick"), uncalled)
assert_equals(i, 4);
}, "Event handler listeners should be registered when they are first set to an object value.");

View File

@ -1,10 +1,3 @@
<!doctype html>
<meta charset="utf-8">
<title>Invalid uncompiled raw handlers should only be compiled when about to call them.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
setup({ allow_uncaught_exception: true });
test(function() {
@ -20,6 +13,4 @@ test(function() {
div.dispatchEvent(new Event("click"));
assert_equals(div.onclick, null);
assert_array_equals(events, ["click 1", "error", "click 2"]);
});
</script>
</body>
}, "Invalid uncompiled raw handlers should only be compiled when about to call them");

View File

@ -1,10 +1,3 @@
<!doctype html>
<meta charset="utf-8">
<title>Invalid uncompiled raw handlers should only be compiled once.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
setup({ allow_uncaught_exception: true });
var errors = 0;
@ -18,6 +11,4 @@ test(function() {
assert_equals(e.onclick, null);
assert_equals(e.onclick, null);
assert_equals(errors, 1);
});
</script>
</body>
}, "Invalid uncompiled raw handlers should only be compiled once");

View File

@ -0,0 +1,20 @@
setup({ allow_uncaught_exception: true });
test(function() {
var events = [];
window.onerror = function() {
events.push("error");
};
var div = document.createElement("div");
div.addEventListener("click", function (e) { events.push("click 1"); });
div.setAttribute("onclick", "}");
div.addEventListener("click", function (e) { events.push("click 3"); });
assert_equals(div.onclick, null);
assert_array_equals(events, ["error"]);
events = [];
div.onclick = function (e) { events.push("click 2"); };
div.dispatchEvent(new Event("click"));
assert_array_equals(events, ["click 1", "click 2", "click 3"]);
}, "Compiling invalid uncompiled raw handlers should keep the position in event listener list");

View File

@ -0,0 +1,26 @@
const windowReflectingBodyElementEventHandlerSet =
new Set(['blur', 'error', 'focus', 'load', 'resize', 'scroll']);
function handlersInInterface(mainIDL, name) {
return mainIDL.find(idl => idl.name === name).members.map(member => member.name.slice(2));
}
const handlersListPromise = fetch("/interfaces/html.idl").then(res => res.text()).then(htmlIDL => {
const parsedHTMLIDL = WebIDL2.parse(htmlIDL);
const windowEventHandlers = handlersInInterface(parsedHTMLIDL, "WindowEventHandlers");
const globalEventHandlers = handlersInInterface(parsedHTMLIDL, "GlobalEventHandlers");
const documentAndElementEventHandlers = handlersInInterface(parsedHTMLIDL, "DocumentAndElementEventHandlers");
const shadowedHandlers = [
...windowReflectingBodyElementEventHandlerSet,
...windowEventHandlers
];
const notShadowedHandlers = [
...globalEventHandlers.filter(name => !windowReflectingBodyElementEventHandlerSet.has(name)),
...documentAndElementEventHandlers
];
return {
shadowedHandlers,
notShadowedHandlers
};
});