Bumping gaia.json for 1 gaia revision(s) a=gaia-bump
[gecko.git] / browser / modules / RemotePrompt.jsm
blob4c5866a6cb6fc386d300316884924c6310c07b09
1 /* vim: set ts=2 sw=2 et tw=80: */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 "use strict";
8 let Cc = Components.classes;
9 let Ci = Components.interfaces;
10 let Cu = Components.utils;
12 this.EXPORTED_SYMBOLS = [ "RemotePrompt" ];
14 Cu.import("resource:///modules/PlacesUIUtils.jsm");
15 Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
16 Cu.import("resource://gre/modules/Services.jsm");
17 Cu.import("resource://gre/modules/SharedPromptUtils.jsm");
19 let RemotePrompt = {
20   init: function() {
21     let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
22     mm.addMessageListener("Prompt:Open", this);
23   },
25   receiveMessage: function(message) {
26     switch (message.name) {
27       case "Prompt:Open":
28         if (message.data.uri) {
29           this.openModalWindow(message.data, message.target);
30         } else {
31           this.openTabPrompt(message.data, message.target)
32         }
33         break;
34     }
35   },
37   openTabPrompt: function(args, browser) {
38     let window = browser.ownerDocument.defaultView;
39     let tabPrompt = window.gBrowser.getTabModalPromptBox(browser)
40     let callbackInvoked = false;
41     let newPrompt;
42     let promptId = args._remoteId;
44     function onPromptClose(forceCleanup) {
45       if (newPrompt)
46         tabPrompt.removePrompt(newPrompt);
48       PromptUtils.fireDialogEvent(window, "DOMModalDialogClosed", browser);
49       browser.messageManager.sendAsyncMessage("Prompt:Close", args);
50     }
52     browser.messageManager.addMessageListener("Prompt:ForceClose", function listener(message) {
53       // If this was for another prompt in the same tab, ignore it.
54       if (message.data._remoteId !== promptId) {
55         return;
56       }
58       browser.messageManager.removeMessageListener("Prompt:ForceClose", listener);
60       if (newPrompt) {
61         newPrompt.abortPrompt();
62       }
63     });
65     try {
66       PromptUtils.fireDialogEvent(window, "DOMWillOpenModalDialog", browser);
68       args.promptActive = true;
70       newPrompt = tabPrompt.appendPrompt(args, onPromptClose);
72       // TODO since we don't actually open a window, need to check if
73       // there's other stuff in nsWindowWatcher::OpenWindowInternal
74       // that we might need to do here as well.
75     } catch (ex) {
76       onPromptClose(true);
77     }
78   },
80   openModalWindow: function(args, browser) {
81     let window = browser.ownerDocument.defaultView;
82     try {
83       PromptUtils.fireDialogEvent(window, "DOMWillOpenModalDialog", browser);
84       let bag = PromptUtils.objectToPropBag(args);
86       Services.ww.openWindow(window, args.uri, "_blank",
87                              "centerscreen,chrome,modal,titlebar", bag);
89       PromptUtils.propBagToObject(bag, args);
90     } finally {
91       PromptUtils.fireDialogEvent(window, "DOMModalDialogClosed", browser);
92       browser.messageManager.sendAsyncMessage("Prompt:Close", args);
93     }
94   }