summaryrefslogtreecommitdiffstats
path: root/components/downloads/DownloadsUI.js
diff options
context:
space:
mode:
Diffstat (limited to 'components/downloads/DownloadsUI.js')
-rw-r--r--components/downloads/DownloadsUI.js151
1 files changed, 151 insertions, 0 deletions
diff --git a/components/downloads/DownloadsUI.js b/components/downloads/DownloadsUI.js
new file mode 100644
index 0000000..afdbda8
--- /dev/null
+++ b/components/downloads/DownloadsUI.js
@@ -0,0 +1,151 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* 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/. */
+
+/**
+ * This component implements the nsIDownloadManagerUI interface and opens the
+ * downloads panel in the most recent browser window when requested.
+ *
+ * If a specific preference is set, this component transparently forwards all
+ * calls to the original implementation in Toolkit, that shows the window UI.
+ */
+
+"use strict";
+
+////////////////////////////////////////////////////////////////////////////////
+//// Globals
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+const Cr = Components.results;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "DownloadsCommon",
+ "resource:///modules/DownloadsCommon.jsm");
+XPCOMUtils.defineLazyServiceGetter(this, "gBrowserGlue",
+ "@mozilla.org/browser/browserglue;1",
+ "nsIBrowserGlue");
+XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
+ "resource:///modules/RecentWindow.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
+ "resource://gre/modules/PrivateBrowsingUtils.jsm");
+
+////////////////////////////////////////////////////////////////////////////////
+//// DownloadsUI
+
+function DownloadsUI()
+{
+ XPCOMUtils.defineLazyGetter(this, "_toolkitUI", function () {
+ // Create Toolkit's nsIDownloadManagerUI implementation.
+ return Components.classesByID["{7dfdf0d1-aff6-4a34-bad1-d0fe74601642}"]
+ .getService(Ci.nsIDownloadManagerUI);
+ });
+}
+
+DownloadsUI.prototype = {
+ classID: Components.ID("{4d99321e-d156-455b-81f7-e7aa2308134f}"),
+
+ _xpcom_factory: XPCOMUtils.generateSingletonFactory(DownloadsUI),
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsISupports
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIDownloadManagerUI]),
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsIDownloadManagerUI
+
+ show: function DUI_show(aWindowContext, aDownload, aReason, aUsePrivateUI)
+ {
+ if (DownloadsCommon.useToolkitUI && !PrivateBrowsingUtils.isWindowPrivate(aWindowContext)) {
+ this._toolkitUI.show(aWindowContext, aDownload, aReason, aUsePrivateUI);
+ return;
+ }
+
+ if (!aReason) {
+ aReason = Ci.nsIDownloadManagerUI.REASON_USER_INTERACTED;
+ }
+
+ if (aReason == Ci.nsIDownloadManagerUI.REASON_NEW_DOWNLOAD) {
+ const kMinimized = Ci.nsIDOMChromeWindow.STATE_MINIMIZED;
+ let browserWin = gBrowserGlue.getMostRecentBrowserWindow();
+
+ if (!browserWin || browserWin.windowState == kMinimized) {
+ this._showDownloadManagerUI(aWindowContext, aUsePrivateUI);
+ }
+ else {
+ // If the indicator is visible, then new download notifications are
+ // already handled by the panel service.
+ browserWin.DownloadsButton.checkIsVisible(function(isVisible) {
+ if (!isVisible) {
+ this._showDownloadManagerUI(aWindowContext, aUsePrivateUI);
+ }
+ }.bind(this));
+ }
+ } else {
+ this._showDownloadManagerUI(aWindowContext, aUsePrivateUI);
+ }
+ },
+
+ get visible()
+ {
+ // If we're still using the toolkit downloads manager, delegate the call
+ // to it. Otherwise, return true for now, until we decide on how we want
+ // to indicate that a new download has started if a browser window is
+ // not available or minimized.
+ return DownloadsCommon.useToolkitUI ? this._toolkitUI.visible : true;
+ },
+
+ getAttention: function DUI_getAttention()
+ {
+ if (DownloadsCommon.useToolkitUI) {
+ this._toolkitUI.getAttention();
+ }
+ },
+
+ /**
+ * Helper function that opens the download manager UI.
+ */
+ _showDownloadManagerUI:
+ function DUI_showDownloadManagerUI(aWindowContext, aUsePrivateUI)
+ {
+ // If we weren't given a window context, try to find a browser window
+ // to use as our parent - and if that doesn't work, error out and give up.
+ let parentWindow = aWindowContext;
+ if (!parentWindow) {
+ parentWindow = RecentWindow.getMostRecentBrowserWindow({ private: !!aUsePrivateUI });
+ if (!parentWindow) {
+ Components.utils.reportError(
+ "Couldn't find a browser window to open the Places Downloads View " +
+ "from.");
+ return;
+ }
+ }
+
+ // If window is private then show it in a tab.
+ if (PrivateBrowsingUtils.isWindowPrivate(parentWindow)) {
+ parentWindow.openUILinkIn("about:downloads", "tab");
+ return;
+ } else {
+ let organizer = Services.wm.getMostRecentWindow("Places:Organizer");
+ if (!organizer) {
+ parentWindow.openDialog("chrome://browser/content/places/places.xul",
+ "", "chrome,toolbar=yes,dialog=no,resizable",
+ "Downloads");
+ } else {
+ organizer.PlacesOrganizer.selectLeftPaneQuery("Downloads");
+ organizer.focus();
+ }
+ }
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//// Module
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([DownloadsUI]);