jsdom
Version:
A JavaScript implementation of many web standards
146 lines (132 loc) • 2.88 kB
JavaScript
const { appendHandler, createEventAccessor } = require("../helpers/create-event-accessor");
// Must be kept in sync with GlobalEventHandlers.webidl.
const events = new Set([
"abort",
"auxclick",
"beforeinput",
"beforematch",
"beforetoggle",
"blur",
"cancel",
"canplay",
"canplaythrough",
"change",
"click",
"close",
"contextlost",
"contextmenu",
"contextrestored",
"copy",
"cuechange",
"cut",
"dblclick",
"drag",
"dragend",
"dragenter",
"dragleave",
"dragover",
"dragstart",
"drop",
"durationchange",
"emptied",
"ended",
"error",
"focus",
"formdata",
"input",
"invalid",
"keydown",
"keypress",
"keyup",
"load",
"loadeddata",
"loadedmetadata",
"loadstart",
"mousedown",
"mouseenter",
"mouseleave",
"mousemove",
"mouseout",
"mouseover",
"mouseup",
"paste",
"pause",
"play",
"playing",
"progress",
"ratechange",
"reset",
"resize",
"scroll",
"scrollend",
"securitypolicyviolation",
"seeked",
"seeking",
"select",
"slotchange",
"stalled",
"submit",
"suspend",
"timeupdate",
"toggle",
"volumechange",
"waiting",
"webkitanimationend",
"webkitanimationiteration",
"webkitanimationstart",
"webkittransitionend",
"wheel",
"touchstart",
"touchend",
"touchmove",
"touchcancel"
]);
class GlobalEventHandlersImpl {
_initGlobalEvents() {
this._registeredHandlers = new Set();
this._eventHandlers = Object.create(null);
}
_getEventHandlerTarget() {
return this;
}
_getEventHandlerFor(event) {
const target = this._getEventHandlerTarget(event);
if (!target) {
return null;
}
return target._eventHandlers[event];
}
_setEventHandlerFor(event, handler) {
const target = this._getEventHandlerTarget(event);
if (!target) {
return;
}
if (!target._registeredHandlers.has(event) && handler !== null) {
target._registeredHandlers.add(event);
appendHandler(target, event);
}
target._eventHandlers[event] = handler;
}
_globalEventChanged(event) {
const propName = "on" + event;
if (!(propName in this)) {
return;
}
// Only translate attribute changes into properties when runScripts: "dangerously" is set.
// Documents without a browsing context (i.e. without a _defaultView) never run scripts.
const runScripts = "_runScripts" in this ? this._runScripts : (this._ownerDocument._defaultView || {})._runScripts;
if (runScripts !== "dangerously") {
return;
}
const val = this.getAttributeNS(null, propName);
const handler = val === null ? null : { body: val };
this._setEventHandlerFor(event, handler);
}
}
for (const event of events) {
createEventAccessor(GlobalEventHandlersImpl.prototype, event);
}
module.exports = {
implementation: GlobalEventHandlersImpl
};
;