Index: lib/child/contentPolicy.js |
=================================================================== |
--- a/lib/child/contentPolicy.js |
+++ b/lib/child/contentPolicy.js |
@@ -303,26 +303,43 @@ var PolicyImplementation = |
shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) |
{ |
return Ci.nsIContentPolicy.ACCEPT; |
}, |
// |
// nsIObserver interface implementation |
// |
- observe: function(subject, topic, data, uri, opener) |
+ _openers: new WeakMap(), |
+ |
+ observe: function(subject, topic, data, uri) |
{ |
switch (topic) |
{ |
case "content-document-global-created": |
{ |
- if (!opener && subject instanceof Ci.nsIDOMWindow) |
- opener = subject.opener; |
+ let opener = this._openers.get(subject); |
+ if (opener && Components.utils.isDeadWrapper(opener)) |
+ opener = null; |
+ |
if (!opener) |
- return; |
+ { |
+ // We don't know the opener for this window yet, try to find it |
+ if (subject instanceof Ci.nsIDOMWindow) |
+ opener = subject.opener; |
+ |
+ if (!opener) |
+ return; |
+ |
+ // The opener might be an intermediate window, get the real one |
+ while (opener.location == "about:blank" && opener.opener) |
+ opener = opener.opener; |
+ |
+ this._openers.set(subject, opener); |
+ } |
if (!uri && subject instanceof Ci.nsIDOMWindow) |
uri = subject.location.href; |
if (!shouldAllow(opener, opener.document, "POPUP", uri)) |
{ |
subject.stop(); |
Utils.runAsync(() => subject.close()); |
} |
@@ -332,17 +349,17 @@ var PolicyImplementation = |
// initiated asynchronously. Wait for that. |
Utils.runAsync(() => |
{ |
let channel = subject.QueryInterface(Ci.nsIInterfaceRequestor) |
.getInterface(Ci.nsIDocShell) |
.QueryInterface(Ci.nsIDocumentLoader) |
.documentChannel; |
if (channel) |
- this.observe(subject, topic, data, channel.URI.spec, opener); |
+ this.observe(subject, topic, data, channel.URI.spec); |
}); |
} |
break; |
} |
} |
}, |
// |