| 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; | 
| } | 
| } | 
| }, | 
| // |