Skip to content

Commit

Permalink
Bug 1332965 - addEventListener shim should work with an option object…
Browse files Browse the repository at this point in the history
… given as third parameter, r=billm.
  • Loading branch information
fqueze committed Jan 25, 2017
1 parent 1a66390 commit 390f0b4
Showing 1 changed file with 41 additions and 4 deletions.
45 changes: 41 additions & 4 deletions toolkit/components/addoncompat/RemoteAddonsParent.jsm
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,28 @@ var EventTargetParent = {
};
EventTargetParent.init();

// This function returns a listener that will remove itself the first time
// it is fired.
var selfRemovingListeners = new WeakMap();
function makeSelfRemovingListener(addon, target, type, listener, useCapture) {
if (selfRemovingListeners.has(listener)) {
return selfRemovingListeners.get(listener);
}

function selfRemovingListener(event) {
EventTargetInterposition.methods.removeEventListener(addon, target, type,
listener, useCapture);
if ("handleEvent" in listener) {
listener.handleEvent(event);
} else {
listener.call(event.target, event);
}
}
selfRemovingListeners.set(listener, selfRemovingListener);

return selfRemovingListener;
}

// This function returns a listener that will not fire on events where
// the target is a remote xul:browser element itself. We'd rather let
// the child process handle the event and pass it up via
Expand Down Expand Up @@ -631,18 +653,33 @@ function makeFilteringListener(eventType, listener) {
var EventTargetInterposition = new Interposition("EventTargetInterposition");

EventTargetInterposition.methods.addEventListener =
function(addon, target, type, listener, useCapture, wantsUntrusted) {
function(addon, target, type, listener, options, wantsUntrusted) {
let delayed = CompatWarning.delayedWarning(
`Registering a ${type} event listener on content DOM nodes` +
" needs to happen in the content process.",
addon, CompatWarning.warnings.DOM_events);

EventTargetParent.addEventListener(addon, target, type, listener, useCapture, wantsUntrusted, delayed);
target.addEventListener(type, makeFilteringListener(type, listener), useCapture, wantsUntrusted);
let useCapture =
options === true || (typeof options == "object" && options.capture) || false;
if (typeof options == "object" && options.once) {
listener = makeSelfRemovingListener(addon, target, type, listener, useCapture);
}

EventTargetParent.addEventListener(addon, target, type, listener,
useCapture, wantsUntrusted, delayed);
target.addEventListener(type, makeFilteringListener(type, listener),
useCapture, wantsUntrusted);
};

EventTargetInterposition.methods.removeEventListener =
function(addon, target, type, listener, useCapture) {
function(addon, target, type, listener, options) {
let useCapture =
options === true || (typeof options == "object" && options.capture) || false;

if (selfRemovingListeners.has(listener)) {
listener = selfRemovingListeners.get(listener);
}

EventTargetParent.removeEventListener(addon, target, type, listener, useCapture);
target.removeEventListener(type, makeFilteringListener(type, listener), useCapture);
};
Expand Down

0 comments on commit 390f0b4

Please sign in to comment.