|
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/. */ |
|
5 |
|
6 "use strict"; |
|
7 |
|
8 let Cc = Components.classes; |
|
9 let Ci = Components.interfaces; |
|
10 let Cu = Components.utils; |
|
11 |
|
12 this.EXPORTED_SYMBOLS = [ "RemotePrompt" ]; |
|
13 |
|
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"); |
|
18 |
|
19 let RemotePrompt = { |
|
20 init: function() { |
|
21 let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager); |
|
22 mm.addMessageListener("Prompt:Open", this); |
|
23 }, |
|
24 |
|
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 }, |
|
36 |
|
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; |
|
43 |
|
44 function onPromptClose(forceCleanup) { |
|
45 if (newPrompt) |
|
46 tabPrompt.removePrompt(newPrompt); |
|
47 |
|
48 PromptUtils.fireDialogEvent(window, "DOMModalDialogClosed", browser); |
|
49 browser.messageManager.sendAsyncMessage("Prompt:Close", args); |
|
50 } |
|
51 |
|
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 } |
|
57 |
|
58 browser.messageManager.removeMessageListener("Prompt:ForceClose", listener); |
|
59 |
|
60 if (newPrompt) { |
|
61 newPrompt.abortPrompt(); |
|
62 } |
|
63 }); |
|
64 |
|
65 try { |
|
66 PromptUtils.fireDialogEvent(window, "DOMWillOpenModalDialog", browser); |
|
67 |
|
68 args.promptActive = true; |
|
69 |
|
70 newPrompt = tabPrompt.appendPrompt(args, onPromptClose); |
|
71 |
|
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 }, |
|
79 |
|
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); |
|
85 |
|
86 Services.ww.openWindow(window, args.uri, "_blank", |
|
87 "centerscreen,chrome,modal,titlebar", bag); |
|
88 |
|
89 PromptUtils.propBagToObject(bag, args); |
|
90 } finally { |
|
91 PromptUtils.fireDialogEvent(window, "DOMModalDialogClosed", browser); |
|
92 browser.messageManager.sendAsyncMessage("Prompt:Close", args); |
|
93 } |
|
94 } |
|
95 }; |