summaryrefslogtreecommitdiffstats
path: root/comm/suite/browser/nsBrowserContentListener.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/browser/nsBrowserContentListener.js')
-rw-r--r--comm/suite/browser/nsBrowserContentListener.js138
1 files changed, 138 insertions, 0 deletions
diff --git a/comm/suite/browser/nsBrowserContentListener.js b/comm/suite/browser/nsBrowserContentListener.js
new file mode 100644
index 0000000000..7e618f4f85
--- /dev/null
+++ b/comm/suite/browser/nsBrowserContentListener.js
@@ -0,0 +1,138 @@
+/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const nsIWebBrowserChrome = Ci.nsIWebBrowserChrome;
+
+function nsBrowserContentListener(toplevelWindow, contentWindow)
+{
+ // this one is not as easy as you would hope.
+ // need to convert toplevelWindow to an XPConnected object, instead
+ // of a DOM-based object, to be able to QI() it to nsIXULWindow
+
+ this.init(toplevelWindow, contentWindow);
+}
+
+/* implements nsIURIContentListener */
+
+nsBrowserContentListener.prototype =
+{
+ init: function(toplevelWindow, contentWindow)
+ {
+ this.toplevelWindow = toplevelWindow;
+ this.contentWindow = contentWindow;
+
+ // hook up the whole parent chain thing
+ var windowDocShell = this.convertWindowToDocShell(toplevelWindow);
+ if (windowDocShell) {
+ windowDocshell
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIURIContentListener)
+ .parentContentListener = this;
+ }
+
+ var registerWindow = false;
+ try {
+ var treeItem = contentWindow.docShell.QueryInterface(Ci.nsIDocShellTreeItem);
+ var treeOwner = treeItem.treeOwner;
+ var interfaceRequestor = treeOwner.QueryInterface(Ci.nsIInterfaceRequestor);
+ var webBrowserChrome = interfaceRequestor.getInterface(nsIWebBrowserChrome);
+ if (webBrowserChrome)
+ {
+ var chromeFlags = webBrowserChrome.chromeFlags;
+ var res = chromeFlags & nsIWebBrowserChrome.CHROME_ALL;
+ var res2 = chromeFlags & nsIWebBrowserChrome.CHROME_DEFAULT;
+ if ( res == nsIWebBrowserChrome.CHROME_ALL || res2 == nsIWebBrowserChrome.CHROME_DEFAULT)
+ {
+ registerWindow = true;
+ }
+ }
+ } catch (ex) {}
+
+ // register ourselves
+ if (registerWindow)
+ {
+ var uriLoader = Cc["@mozilla.org/uriloader;1"].getService(Ci.nsIURILoader);
+ uriLoader.registerContentListener(this);
+ }
+ },
+ close: function()
+ {
+ this.contentWindow = null;
+ var uriLoader = Cc["@mozilla.org/uriloader;1"].getService(Ci.nsIURILoader);
+
+ uriLoader.unRegisterContentListener(this);
+ },
+ QueryInterface: function(iid)
+ {
+ if (iid.equals(Ci.nsIURIContentListener) ||
+ iid.equals(Ci.nsISupportsWeakReference) ||
+ iid.equals(Ci.nsISupports))
+ return this;
+
+ throw Cr.NS_ERROR_NO_INTERFACE;
+ },
+
+ doContent: function(contentType, isContentPreferred, request, contentHandler)
+ {
+ // forward the doContent to our content area webshell
+ var docShell = this.contentWindow.docShell;
+ if (Services.prefs.getIntPref("browser.link.open_external") == nsIBrowserDOMWindow.OPEN_NEWTAB) {
+ var newTab = gBrowser.loadOneTab("about:blank", {
+ inBackground: Services.prefs.getBoolPref("browser.tabs.loadDivertedInBackground")});
+ docShell = gBrowser.getBrowserForTab(newTab).docShell;
+ }
+
+ var contentListener;
+ try {
+ contentListener =
+ docShell.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIURIContentListener);
+ } catch (ex) {
+ dump(ex);
+ }
+
+ if (!contentListener) return false;
+
+ return contentListener.doContent(contentType, isContentPreferred, request, contentHandler);
+
+ },
+
+ isPreferred: function(contentType, desiredContentType)
+ {
+ if (Services.prefs.getIntPref("browser.link.open_external") == nsIBrowserDOMWindow.OPEN_NEWWINDOW)
+ return false;
+
+ try {
+ var webNavInfo =
+ Cc["@mozilla.org/webnavigation-info;1"]
+ .getService(Ci.nsIWebNavigationInfo);
+ return webNavInfo.isTypeSupported(contentType, null);
+ } catch (e) {
+ // XXX propagate failures other than "NS_ERROR_NOT_AVAILABLE"?
+ // This seems to never get called, so not like it matters....
+ return false;
+ }
+ },
+ canHandleContent: function(contentType, isContentPreferred, desiredContentType)
+ {
+ var docShell = this.contentWindow.docShell;
+ var contentListener;
+ try {
+ contentListener =
+ docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIURIContentListener);
+ } catch (ex) {
+ dump(ex);
+ }
+ if (!contentListener) return false;
+
+ return contentListener.canHandleContent(contentType, isContentPreferred, desiredContentType);
+ },
+ convertWindowToDocShell: function(win) {
+ // don't know how to do this
+ return null;
+ },
+ loadCookie: null,
+ parentContentListener: null
+}