]> git.parisson.com Git - pdf.js.git/commitdiff
Better way to add custom event listener.
authorBrendan Dahl <brendan.dahl@gmail.com>
Tue, 7 Feb 2012 00:06:18 +0000 (16:06 -0800)
committerBrendan Dahl <brendan.dahl@gmail.com>
Tue, 7 Feb 2012 00:06:18 +0000 (16:06 -0800)
extensions/firefox/components/PdfStreamConverter.js

index c990e80d5f1dd54f3db7b81032dda1c6848182a7..54cc6890da492fd21051c0f83b83e70cc758627a 100644 (file)
@@ -19,6 +19,18 @@ function log(aMsg) {
   Services.console.logStringMessage(msg);
   dump(msg + '\n');
 }
+function getWindow(top, id) top.QueryInterface(Ci.nsIInterfaceRequestor)
+                              .getInterface(Ci.nsIDOMWindowUtils)
+                              .getOuterWindowWithId(id);
+function windowID(win) win.QueryInterface(Ci.nsIInterfaceRequestor)
+                        .getInterface(Ci.nsIDOMWindowUtils)
+                        .outerWindowID;
+function topWindow(win) win.QueryInterface(Ci.nsIInterfaceRequestor)
+                          .getInterface(Ci.nsIWebNavigation)
+                          .QueryInterface(Ci.nsIDocShellTreeItem)
+                          .rootTreeItem
+                          .QueryInterface(Ci.nsIInterfaceRequestor)
+                          .getInterface(Ci.nsIDOMWindow);
 let application = Cc['@mozilla.org/fuel/application;1']
                     .getService(Ci.fuelIApplication);
 let privateBrowsing = Cc['@mozilla.org/privatebrowsing;1']
@@ -131,20 +143,30 @@ PdfStreamConverter.prototype = {
     // that its the one we want by its URL. When the correct DOM is found create
     // an event listener on that window for the pdf.js events that require
     // chrome priviledges.
-    var url = aRequest.URI.spec;
-    var gb = Services.wm.getMostRecentWindow('navigator:browser');
-    var domListener = function domListener(event) {
-      var doc = event.originalTarget;
-      var win = doc.defaultView;
-      if (doc.location.href === url) {
-        gb.removeEventListener('DOMContentLoaded', domListener);
-        var requestListener = new RequestListener(new ChromeActions());
-        win.addEventListener(PDFJS_EVENT_ID, function(event) {
-          requestListener.receive(event);
-        }, false, true);
+    let window = aRequest.loadGroup.groupObserver
+                  .QueryInterface(Ci.nsIWebProgress)
+                  .DOMWindow;
+    let top = topWindow(window);
+    let id = windowID(window);
+    window = null;
+
+    top.addEventListener('DOMWindowCreated', function onDOMWinCreated(event) {
+      let doc = event.originalTarget;
+      let win = doc.defaultView;
+
+      if (id == windowID(win)) {
+          top.removeEventListener('DOMWindowCreated', onDOMWinCreated, true);
+          if (!doc.documentURIObject.equals(aRequest.URI))
+            return;
+
+          let requestListener = new RequestListener(new ChromeActions);
+          win.addEventListener(PDFJS_EVENT_ID, function(event) {
+            requestListener.receive(event);
+          }, false, true);
+      } else if (!getWindow(top, id)) {
+        top.removeEventListener('DOMWindowCreated', onDOMWinCreated, true);
       }
-    };
-    gb.addEventListener('DOMContentLoaded', domListener, false);
+    }, true);
   },
 
   // nsIRequestObserver::onStopRequest