mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 13:55:43 +00:00
Bug 1072980 - Ensure event.currentTarget is correct in event shim (r=ally)
This commit is contained in:
parent
eba54da711
commit
b17fddbc37
@ -42,9 +42,9 @@ function checkState(tab) {
|
||||
// deserialized in the content scope. And in this case, since RegExps are
|
||||
// not currently Xrayable (see bug 1014991), trying to pull |obj3| (a RegExp)
|
||||
// off of an Xrayed Object won't work. So we need to waive.
|
||||
runInContent(tab.linkedBrowser, function(win, event) {
|
||||
return Cu.waiveXrays(event.state).obj3.toString();
|
||||
}, aEvent).then(function(stateStr) {
|
||||
runInContent(tab.linkedBrowser, function(win, state) {
|
||||
return Cu.waiveXrays(state).obj3.toString();
|
||||
}, aEvent.state).then(function(stateStr) {
|
||||
is(stateStr, '/^a$/', "second popstate object.");
|
||||
|
||||
// Make sure that the new-elem node is present in the document. If it's
|
||||
|
@ -421,13 +421,17 @@ let EventTargetParent = {
|
||||
// If there's already an identical listener, don't do anything.
|
||||
for (let i = 0; i < forType.length; i++) {
|
||||
if (forType[i].listener === listener &&
|
||||
forType[i].target === target &&
|
||||
forType[i].useCapture === useCapture &&
|
||||
forType[i].wantsUntrusted === wantsUntrusted) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
forType.push({listener: listener, wantsUntrusted: wantsUntrusted, useCapture: useCapture});
|
||||
forType.push({listener: listener,
|
||||
target: target,
|
||||
wantsUntrusted: wantsUntrusted,
|
||||
useCapture: useCapture});
|
||||
},
|
||||
|
||||
removeEventListener: function(target, type, listener, useCapture) {
|
||||
@ -445,7 +449,9 @@ let EventTargetParent = {
|
||||
let forType = setDefault(listeners, type, []);
|
||||
|
||||
for (let i = 0; i < forType.length; i++) {
|
||||
if (forType[i].listener === listener && forType[i].useCapture === useCapture) {
|
||||
if (forType[i].listener === listener &&
|
||||
forType[i].target === target &&
|
||||
forType[i].useCapture === useCapture) {
|
||||
forType.splice(i, 1);
|
||||
NotificationTracker.remove(["event", type, useCapture]);
|
||||
break;
|
||||
@ -473,18 +479,29 @@ let EventTargetParent = {
|
||||
|
||||
// Make a copy in case they call removeEventListener in the listener.
|
||||
let handlers = [];
|
||||
for (let {listener, wantsUntrusted, useCapture} of forType) {
|
||||
for (let {listener, target, wantsUntrusted, useCapture} of forType) {
|
||||
if ((wantsUntrusted || isTrusted) && useCapture == capturing) {
|
||||
handlers.push(listener);
|
||||
handlers.push([listener, target]);
|
||||
}
|
||||
}
|
||||
|
||||
for (let handler of handlers) {
|
||||
for (let [handler, target] of handlers) {
|
||||
let EventProxy = {
|
||||
get: function(actualEvent, name) {
|
||||
if (name == "currentTarget") {
|
||||
return target;
|
||||
} else {
|
||||
return actualEvent[name];
|
||||
}
|
||||
}
|
||||
};
|
||||
let proxyEvent = new Proxy(event, EventProxy);
|
||||
|
||||
try {
|
||||
if ("handleEvent" in handler) {
|
||||
handler.handleEvent(event);
|
||||
handler.handleEvent(proxyEvent);
|
||||
} else {
|
||||
handler.call(event.target, event);
|
||||
handler.call(event.target, proxyEvent);
|
||||
}
|
||||
} catch (e) {
|
||||
Cu.reportError(e);
|
||||
|
Loading…
Reference in New Issue
Block a user