fune/toolkit/actors/BrowserElementChild.jsm
pbz 3075dbd453 Bug 1615588 - Extended nsIPromptService to support tab modal prompts. r=johannh,MattN,necko-reviewers,dragana
This patch introduces a new tab modal system prompt type. It can be opened via the nsIPromptService
with a destination BrowsingContext. These tab system prompts overlap slightly with the upper
chrome UI to differentiate them from content prompts (previously called tab prompts).

- Extended nsIPromptService and nsIPrompt to accept 3 types of modal prompts:
  - Window prompts
  - Tab (system) prompts
  - Content prompts (the old tab prompts)
- Removed prompt code from Prompter.jsm, always call PromptParent window actor instead
- Added PromptChild window actor to forward pagehide events to parent actor
- Created additional prompt methods in nsIPromptService to prompt by browsingContext and modalType
- Backwards compatibility is maintained, consumers can still open content prompts calling nsIPrompt with a content window

Differential Revision: https://phabricator.services.mozilla.com/D66446
2020-04-16 14:43:50 +00:00

55 lines
1.4 KiB
JavaScript

/* vim: set ts=2 sw=2 sts=2 et 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/. */
"use strict";
var EXPORTED_SYMBOLS = ["BrowserElementChild"];
class BrowserElementChild extends JSWindowActorChild {
handleEvent(event) {
if (
event.type == "DOMWindowClose" &&
!this.manager.browsingContext.parent
) {
this.sendAsyncMessage("DOMWindowClose", {});
}
}
receiveMessage(message) {
let context = this.manager.browsingContext;
let docShell = context.docShell;
switch (message.name) {
case "PermitUnload": {
this.sendAsyncMessage("Running", {});
let permitUnload = true;
if (docShell && docShell.contentViewer) {
permitUnload = docShell.contentViewer.permitUnload(
message.data.flags
);
}
this.sendAsyncMessage("Done", { permitUnload });
break;
}
case "EnterModalState": {
this.contentWindow.windowUtils.enterModalState();
break;
}
case "LeaveModalState": {
if (
!message.data.forceLeave &&
!this.contentWindow.windowUtils.isInModalState()
) {
break;
}
this.contentWindow.windowUtils.leaveModalState();
break;
}
}
}
}