[PMkit] Provide gContextMenuContentData for 'sdk/context-menu'

This commit is contained in:
JustOff 2018-04-20 21:10:10 +03:00 • committed by Roy Tam
commit 44120b666a
2 changed files with 111 additions and 0 deletions

View file

@ -60,6 +60,114 @@ addEventListener("blur", function(event) {
LoginManagerContent.onUsernameInput(event); LoginManagerContent.onUsernameInput(event);
}); });
// Provide gContextMenuContentData for 'sdk/context-menu'
var handleContentContextMenu = function (event) {
let defaultPrevented = event.defaultPrevented;
if (!Services.prefs.getBoolPref("dom.event.contextmenu.enabled")) {
let plugin = null;
try {
plugin = event.target.QueryInterface(Ci.nsIObjectLoadingContent);
} catch (e) {}
if (plugin && plugin.displayedType == Ci.nsIObjectLoadingContent.TYPE_PLUGIN) {
// Don't open a context menu for plugins.
return;
}
defaultPrevented = false;
}
if (defaultPrevented)
return;
let addonInfo = {};
let subject = {
event: event,
addonInfo: addonInfo,
};
subject.wrappedJSObject = subject;
Services.obs.notifyObservers(subject, "content-contextmenu", null);
let doc = event.target.ownerDocument;
let docLocation = doc.mozDocumentURIIfNotForErrorPages;
docLocation = docLocation && docLocation.spec;
let charSet = doc.characterSet;
let baseURI = doc.baseURI;
let referrer = doc.referrer;
let referrerPolicy = doc.referrerPolicy;
let frameOuterWindowID = doc.defaultView.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils)
.outerWindowID;
let loginFillInfo = LoginManagerContent.getFieldContext(event.target);
// The same-origin check will be done in nsContextMenu.openLinkInTab.
let parentAllowsMixedContent = !!docShell.mixedContentChannel;
// get referrer attribute from clicked link and parse it
// if per element referrer is enabled, the element referrer overrules
// the document wide referrer
if (Services.prefs.getBoolPref("network.http.enablePerElementReferrer")) {
let referrerAttrValue = Services.netUtils.parseAttributePolicyString(event.target.
getAttribute("referrerpolicy"));
if (referrerAttrValue !== Ci.nsIHttpChannel.REFERRER_POLICY_UNSET) {
referrerPolicy = referrerAttrValue;
}
}
// Media related cache info parent needs for saving
let contentType = null;
let contentDisposition = null;
if (event.target.nodeType == Ci.nsIDOMNode.ELEMENT_NODE &&
event.target instanceof Ci.nsIImageLoadingContent &&
event.target.currentURI) {
try {
let imageCache =
Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools)
.getImgCacheForDocument(doc);
let props =
imageCache.findEntryProperties(event.target.currentURI, doc);
try {
contentType = props.get("type", Ci.nsISupportsCString).data;
} catch (e) {}
try {
contentDisposition =
props.get("content-disposition", Ci.nsISupportsCString).data;
} catch (e) {}
} catch (e) {}
}
let selectionInfo = BrowserUtils.getSelectionDetails(content);
let loadContext = docShell.QueryInterface(Ci.nsILoadContext);
let userContextId = loadContext.originAttributes.userContextId;
let browser = docShell.chromeEventHandler;
let mainWin = browser.ownerGlobal;
mainWin.gContextMenuContentData = {
isRemote: false,
event: event,
popupNode: event.target,
browser: browser,
addonInfo: addonInfo,
documentURIObject: doc.documentURIObject,
docLocation: docLocation,
charSet: charSet,
referrer: referrer,
referrerPolicy: referrerPolicy,
contentType: contentType,
contentDisposition: contentDisposition,
selectionInfo: selectionInfo,
loginFillInfo,
parentAllowsMixedContent,
userContextId,
};
}
Cc["@mozilla.org/eventlistenerservice;1"]
.getService(Ci.nsIEventListenerService)
.addSystemEventListener(global, "contextmenu", handleContentContextMenu, false);
// Lazily load the finder code // Lazily load the finder code
addMessageListener("Finder:Initialize", function () { addMessageListener("Finder:Initialize", function () {
let {RemoteFinderListener} = Cu.import("resource://gre/modules/RemoteFinder.jsm", {}); let {RemoteFinderListener} = Cu.import("resource://gre/modules/RemoteFinder.jsm", {});

View file

@ -4,6 +4,8 @@
Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
var gContextMenuContentData = null;
function nsContextMenu(aXulMenu, aIsShift) { function nsContextMenu(aXulMenu, aIsShift) {
this.shouldDisplay = true; this.shouldDisplay = true;
this.initMenu(aXulMenu, aIsShift); this.initMenu(aXulMenu, aIsShift);
@ -39,6 +41,7 @@ nsContextMenu.prototype = {
}, },
hiding: function CM_hiding() { hiding: function CM_hiding() {
gContextMenuContentData = null;
InlineSpellCheckerUI.clearSuggestionsFromMenu(); InlineSpellCheckerUI.clearSuggestionsFromMenu();
InlineSpellCheckerUI.clearDictionaryListFromMenu(); InlineSpellCheckerUI.clearDictionaryListFromMenu();
InlineSpellCheckerUI.uninit(); InlineSpellCheckerUI.uninit();