summaryrefslogtreecommitdiffstats
path: root/browser/actors/ContextMenuParent.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'browser/actors/ContextMenuParent.sys.mjs')
-rw-r--r--browser/actors/ContextMenuParent.sys.mjs117
1 files changed, 117 insertions, 0 deletions
diff --git a/browser/actors/ContextMenuParent.sys.mjs b/browser/actors/ContextMenuParent.sys.mjs
new file mode 100644
index 0000000000..4c67bc75ef
--- /dev/null
+++ b/browser/actors/ContextMenuParent.sys.mjs
@@ -0,0 +1,117 @@
+/* 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/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ FirefoxRelay: "resource://gre/modules/FirefoxRelay.sys.mjs",
+});
+
+export class ContextMenuParent extends JSWindowActorParent {
+ receiveMessage(message) {
+ let browser = this.manager.rootFrameLoader.ownerElement;
+ let win = browser.ownerGlobal;
+ // It's possible that the <xul:browser> associated with this
+ // ContextMenu message doesn't belong to a window that actually
+ // loads nsContextMenu.js. In that case, try to find the chromeEventHandler,
+ // since that'll likely be the "top" <xul:browser>, and then use its window's
+ // nsContextMenu instance instead.
+ if (!win.openContextMenu) {
+ let topBrowser = browser.ownerGlobal.docShell.chromeEventHandler;
+ win = topBrowser.ownerGlobal;
+ }
+
+ message.data.context.showRelay &&= lazy.FirefoxRelay.isEnabled;
+
+ win.openContextMenu(message, browser, this);
+ }
+
+ hiding() {
+ try {
+ this.sendAsyncMessage("ContextMenu:Hiding", {});
+ } catch (e) {
+ // This will throw if the content goes away while the
+ // context menu is still open.
+ }
+ }
+
+ reloadFrame(targetIdentifier, forceReload) {
+ this.sendAsyncMessage("ContextMenu:ReloadFrame", {
+ targetIdentifier,
+ forceReload,
+ });
+ }
+
+ getImageText(targetIdentifier) {
+ return this.sendQuery("ContextMenu:GetImageText", {
+ targetIdentifier,
+ });
+ }
+
+ toggleRevealPassword(targetIdentifier) {
+ this.sendAsyncMessage("ContextMenu:ToggleRevealPassword", {
+ targetIdentifier,
+ });
+ }
+
+ async useRelayMask(targetIdentifier, origin) {
+ if (!origin) {
+ return;
+ }
+
+ const windowGlobal = this.manager.browsingContext.currentWindowGlobal;
+ const browser = windowGlobal.rootFrameLoader.ownerElement;
+ const emailMask = await lazy.FirefoxRelay.generateUsername(browser, origin);
+ if (emailMask) {
+ this.sendAsyncMessage("ContextMenu:UseRelayMask", {
+ targetIdentifier,
+ emailMask,
+ });
+ }
+ }
+
+ reloadImage(targetIdentifier) {
+ this.sendAsyncMessage("ContextMenu:ReloadImage", { targetIdentifier });
+ }
+
+ getFrameTitle(targetIdentifier) {
+ return this.sendQuery("ContextMenu:GetFrameTitle", { targetIdentifier });
+ }
+
+ mediaCommand(targetIdentifier, command, data) {
+ let windowGlobal = this.manager.browsingContext.currentWindowGlobal;
+ let browser = windowGlobal.rootFrameLoader.ownerElement;
+ let win = browser.ownerGlobal;
+ let windowUtils = win.windowUtils;
+ this.sendAsyncMessage("ContextMenu:MediaCommand", {
+ targetIdentifier,
+ command,
+ data,
+ handlingUserInput: windowUtils.isHandlingUserInput,
+ });
+ }
+
+ canvasToBlobURL(targetIdentifier) {
+ return this.sendQuery("ContextMenu:Canvas:ToBlobURL", { targetIdentifier });
+ }
+
+ saveVideoFrameAsImage(targetIdentifier) {
+ return this.sendQuery("ContextMenu:SaveVideoFrameAsImage", {
+ targetIdentifier,
+ });
+ }
+
+ setAsDesktopBackground(targetIdentifier) {
+ return this.sendQuery("ContextMenu:SetAsDesktopBackground", {
+ targetIdentifier,
+ });
+ }
+
+ getSearchFieldBookmarkData(targetIdentifier) {
+ return this.sendQuery("ContextMenu:SearchFieldBookmarkData", {
+ targetIdentifier,
+ });
+ }
+}