browser/modules/RemotePrompt.jsm

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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   }
    95 };

mercurial