Bug 1953575 - move gShareUtils to its own module, r=firefox-desktop-core-reviewers ,tabbrowser-reviewers,dao
Differential Revision: https://phabricator.services.mozilla.com/D241485
This commit is contained in:
@@ -77,6 +77,7 @@ ChromeUtils.defineESModuleGetters(this, {
|
||||
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
|
||||
SessionStartup: "resource:///modules/sessionstore/SessionStartup.sys.mjs",
|
||||
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
|
||||
SharingUtils: "resource:///modules/SharingUtils.sys.mjs",
|
||||
ShoppingSidebarParent: "resource:///actors/ShoppingSidebarParent.sys.mjs",
|
||||
ShoppingSidebarManager: "resource:///actors/ShoppingSidebarParent.sys.mjs",
|
||||
ShortcutUtils: "resource://gre/modules/ShortcutUtils.sys.mjs",
|
||||
@@ -2053,7 +2054,7 @@ let gFileMenu = {
|
||||
this.updateImportCommandEnabledState();
|
||||
this.updateTabCloseCountState();
|
||||
if (AppConstants.platform == "macosx") {
|
||||
gShareUtils.updateShareURLMenuItem(
|
||||
SharingUtils.updateShareURLMenuItem(
|
||||
gBrowser.selectedBrowser,
|
||||
document.getElementById("menu_savePage")
|
||||
);
|
||||
@@ -2062,215 +2063,6 @@ let gFileMenu = {
|
||||
},
|
||||
};
|
||||
|
||||
let gShareUtils = {
|
||||
/**
|
||||
* Updates a sharing item in a given menu, creating it if necessary.
|
||||
*/
|
||||
updateShareURLMenuItem(browser, insertAfterEl) {
|
||||
if (!Services.prefs.getBoolPref("browser.menu.share_url.allow", true)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We only support "share URL" on macOS and on Windows:
|
||||
if (AppConstants.platform != "macosx" && AppConstants.platform != "win") {
|
||||
return;
|
||||
}
|
||||
|
||||
let shareURL = insertAfterEl.nextElementSibling;
|
||||
if (!shareURL?.matches(".share-tab-url-item")) {
|
||||
shareURL = this._createShareURLMenuItem(insertAfterEl);
|
||||
}
|
||||
|
||||
shareURL.browserToShare = Cu.getWeakReference(browser);
|
||||
if (AppConstants.platform == "win") {
|
||||
// We disable the item on Windows, as there's no submenu.
|
||||
// On macOS, we handle this inside the menupopup.
|
||||
shareURL.hidden = !BrowserUtils.getShareableURL(browser.currentURI);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates and returns the "Share" menu item.
|
||||
*/
|
||||
_createShareURLMenuItem(insertAfterEl) {
|
||||
let menu = insertAfterEl.parentNode;
|
||||
let shareURL = null;
|
||||
if (AppConstants.platform == "win") {
|
||||
shareURL = this._buildShareURLItem(menu.id);
|
||||
} else if (AppConstants.platform == "macosx") {
|
||||
shareURL = this._buildShareURLMenu(menu.id);
|
||||
}
|
||||
shareURL.className = "share-tab-url-item";
|
||||
|
||||
let l10nID =
|
||||
menu.id == "tabContextMenu"
|
||||
? "tab-context-share-url"
|
||||
: "menu-file-share-url";
|
||||
document.l10n.setAttributes(shareURL, l10nID);
|
||||
|
||||
menu.insertBefore(shareURL, insertAfterEl.nextSibling);
|
||||
return shareURL;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns a menu item specifically for accessing Windows sharing services.
|
||||
*/
|
||||
_buildShareURLItem() {
|
||||
let shareURLMenuItem = document.createXULElement("menuitem");
|
||||
shareURLMenuItem.addEventListener("command", this);
|
||||
return shareURLMenuItem;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns a menu specifically for accessing macOSx sharing services .
|
||||
*/
|
||||
_buildShareURLMenu() {
|
||||
let menu = document.createXULElement("menu");
|
||||
let menuPopup = document.createXULElement("menupopup");
|
||||
menuPopup.addEventListener("popupshowing", this);
|
||||
menu.appendChild(menuPopup);
|
||||
return menu;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the sharing data for a given DOM node.
|
||||
*/
|
||||
getDataToShare(node) {
|
||||
let browser = node.browserToShare?.get();
|
||||
let urlToShare = null;
|
||||
let titleToShare = null;
|
||||
|
||||
if (browser) {
|
||||
let maybeToShare = BrowserUtils.getShareableURL(browser.currentURI);
|
||||
if (maybeToShare) {
|
||||
urlToShare = maybeToShare;
|
||||
titleToShare = browser.contentTitle;
|
||||
}
|
||||
}
|
||||
return { urlToShare, titleToShare };
|
||||
},
|
||||
|
||||
/**
|
||||
* Populates the "Share" menupopup on macOSx.
|
||||
*/
|
||||
initializeShareURLPopup(menuPopup) {
|
||||
if (AppConstants.platform != "macosx") {
|
||||
return;
|
||||
}
|
||||
|
||||
// Empty menupopup
|
||||
while (menuPopup.firstChild) {
|
||||
menuPopup.firstChild.remove();
|
||||
}
|
||||
|
||||
let { urlToShare } = this.getDataToShare(menuPopup.parentNode);
|
||||
|
||||
// If we can't share the current URL, we display the items disabled,
|
||||
// but enable the "more..." item at the bottom, to allow the user to
|
||||
// change sharing preferences in the system dialog.
|
||||
let shouldEnable = !!urlToShare;
|
||||
if (!urlToShare) {
|
||||
// Fake it so we can ask the sharing service for services:
|
||||
urlToShare = makeURI("https://mozilla.org/");
|
||||
}
|
||||
|
||||
let sharingService = gBrowser.MacSharingService;
|
||||
let currentURI = gURLBar.makeURIReadable(urlToShare).displaySpec;
|
||||
let services = sharingService.getSharingProviders(currentURI);
|
||||
|
||||
services.forEach(share => {
|
||||
let item = document.createXULElement("menuitem");
|
||||
item.classList.add("menuitem-iconic");
|
||||
item.setAttribute("label", share.menuItemTitle);
|
||||
item.setAttribute("share-name", share.name);
|
||||
item.setAttribute("image", share.image);
|
||||
if (!shouldEnable) {
|
||||
item.setAttribute("disabled", "true");
|
||||
}
|
||||
menuPopup.appendChild(item);
|
||||
});
|
||||
menuPopup.appendChild(document.createXULElement("menuseparator"));
|
||||
let moreItem = document.createXULElement("menuitem");
|
||||
document.l10n.setAttributes(moreItem, "menu-share-more");
|
||||
moreItem.classList.add("menuitem-iconic", "share-more-button");
|
||||
menuPopup.appendChild(moreItem);
|
||||
|
||||
menuPopup.addEventListener("command", this);
|
||||
menuPopup.parentNode
|
||||
.closest("menupopup")
|
||||
.addEventListener("popuphiding", this);
|
||||
menuPopup.setAttribute("data-initialized", true);
|
||||
},
|
||||
|
||||
onShareURLCommand(event) {
|
||||
// Only call sharing services for the "Share" menu item. These services
|
||||
// are accessed from a submenu popup for MacOS or the "Share" menu item
|
||||
// for Windows. Use .closest() as a hack to find either the item itself
|
||||
// or a parent with the right class.
|
||||
let target = event.target.closest(".share-tab-url-item");
|
||||
if (!target) {
|
||||
return;
|
||||
}
|
||||
|
||||
// urlToShare/titleToShare may be null, in which case only the "more"
|
||||
// item is enabled, so handle that case first:
|
||||
if (event.target.classList.contains("share-more-button")) {
|
||||
gBrowser.MacSharingService.openSharingPreferences();
|
||||
return;
|
||||
}
|
||||
|
||||
let { urlToShare, titleToShare } = this.getDataToShare(target);
|
||||
let currentURI = gURLBar.makeURIReadable(urlToShare).displaySpec;
|
||||
|
||||
if (AppConstants.platform == "win") {
|
||||
WindowsUIUtils.shareUrl(currentURI, titleToShare);
|
||||
return;
|
||||
}
|
||||
|
||||
// On macOSX platforms
|
||||
let shareName = event.target.getAttribute("share-name");
|
||||
|
||||
if (shareName) {
|
||||
gBrowser.MacSharingService.shareUrl(shareName, currentURI, titleToShare);
|
||||
}
|
||||
},
|
||||
|
||||
onPopupHiding(event) {
|
||||
// We don't want to rebuild the contents of the "Share" menupopup if only its submenu is
|
||||
// hidden. So bail if this isn't the top menupopup in the DOM tree:
|
||||
if (event.target.parentNode.closest("menupopup")) {
|
||||
return;
|
||||
}
|
||||
// Otherwise, clear its "data-initialized" attribute.
|
||||
let menupopup = event.target.querySelector(
|
||||
".share-tab-url-item"
|
||||
)?.menupopup;
|
||||
menupopup?.removeAttribute("data-initialized");
|
||||
|
||||
event.target.removeEventListener("popuphiding", this);
|
||||
},
|
||||
|
||||
onPopupShowing(event) {
|
||||
if (!event.target.hasAttribute("data-initialized")) {
|
||||
this.initializeShareURLPopup(event.target);
|
||||
}
|
||||
},
|
||||
|
||||
handleEvent(aEvent) {
|
||||
switch (aEvent.type) {
|
||||
case "command":
|
||||
this.onShareURLCommand(aEvent);
|
||||
break;
|
||||
case "popuphiding":
|
||||
this.onPopupHiding(aEvent);
|
||||
break;
|
||||
case "popupshowing":
|
||||
this.onPopupShowing(aEvent);
|
||||
break;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens a new tab with the userContextId specified as an attribute of
|
||||
* sourceEvent. This attribute is propagated to the top level originAttributes
|
||||
|
||||
Reference in New Issue
Block a user