2019-06-08 04:09:46 +03:00
|
|
|
/* 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 = ["ContextMenuParent"];
|
|
|
|
|
|
|
|
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;
|
2019-06-19 00:12:01 +03:00
|
|
|
|
|
|
|
// If this context menu happens to be for a tabbed browser window,
|
|
|
|
// we need to check to see if we're in Responsive Design Mode. This is
|
|
|
|
// because we need to convince nsContextMenu to use the top-level browser
|
|
|
|
// for the tab, rather than the mozbrowser iframe actually showing the
|
|
|
|
// web content. This is a workaround until we can get bug 1559456 fixed.
|
|
|
|
if (win.gBrowser) {
|
|
|
|
let tab = win.gBrowser.getTabForBrowser(browser);
|
|
|
|
if (tab && tab.isResponsiveDesignMode) {
|
|
|
|
browser = topBrowser;
|
|
|
|
}
|
|
|
|
}
|
2019-06-08 04:09:46 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
doCustomCommand(generatedItemId, handlingUserInput) {
|
|
|
|
this.sendAsyncMessage("ContextMenu:DoCustomCommand", {
|
|
|
|
generatedItemId,
|
|
|
|
handlingUserInput,
|
|
|
|
});
|
|
|
|
}
|
Bug 1505913 - make plugin click-to-play and crash handling fission-compatible, r=mconley
At a high level, this change does the following:
- move the pluginchild actor to be a JSWindowActorChild
- move the parent handling from browser-plugins into a JSWindowActorParent
- move the crash handling from ContentCrashHandlers.jsm to the parent actor,
using a `PluginManager` object. It needs to talk to the actors (and vice
versa), so this seemed a better fit than spreading actor implementation
details to other JSMs.
- switch to using plugin IDs to identify plugins cross-process, instead of
combinations of names or other properties of the plugin tag. As part of that,
ensured plugin IDs are unique between "fake" plugins and the other ones.
- drop support for having a notification for more than 1 plugin. We only support
Flash, in practice, so there didn't seem to be much point in the added
complexity of trying to support more than 1 thing.
Some notes:
- the previous implementation mixes runIDs (for NPAPI plugin process "runs")
and GMP pluginIDs when doing crashreporting. AFAICT there is no guarantee
these don't conflict, so I've split them out to avoid issues. There's a
pluginCrashID object I pass around instead that has either a runID or
pluginID. Happy to rename some more for clarity.
- the previous implementation used `pluginInfo` and `plugin` for a bunch of
different types of variables. I've tried to be consistent, where:
* `pluginElement` is a DOM element for a plugin
* `activationInfo` is a JS object used to track click to play state for a plugin
* `plugin` is a plugintag as returned by the pluginhost service
* `pluginCrashID` is an identifier for a crashed plugin (see previous point).
- I'm still using broadcastAsyncMessage to tell the content processes about
gmp plugin crashes and plugin crash submission updates, because there's no
guarantee the actors are instantiated (for gmp plugins) nor can the parent
easily find out which actors to talk to (for either gmp or npapi plugins).
Open to suggestions there, too. I think our best bet might be moving that to
IPDL-based IPC within the GMP code, but that feels like a separate bug.
Differential Revision: https://phabricator.services.mozilla.com/D37665
--HG--
rename : browser/base/content/browser-plugins.js => browser/actors/PluginParent.jsm
extra : moz-landing-system : lando
2019-07-24 01:04:40 +03:00
|
|
|
|
|
|
|
pluginCommand(command, targetIdentifier) {
|
|
|
|
this.sendAsyncMessage("ContextMenu:PluginCommand", {
|
|
|
|
command,
|
|
|
|
targetIdentifier,
|
|
|
|
});
|
|
|
|
}
|
2019-06-08 04:09:46 +03:00
|
|
|
}
|