Bug 1742889 - Rewrite consumers of whereToOpenLink to use BrowserUtils.whereToOpenLink. r=Gijs,search-reviewers,places-reviewers,firefox-desktop-core-reviewers ,home-newtab-reviewers,reusable-components-reviewers,hjones,nbarrett

Differential Revision: https://phabricator.services.mozilla.com/D208680
This commit is contained in:
Leeya
2024-05-03 19:05:59 +00:00
parent 35e0b65acd
commit 23b26e9421
20 changed files with 69 additions and 48 deletions

View File

@@ -6,6 +6,7 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
E10SUtils: "resource://gre/modules/E10SUtils.sys.mjs",
PlacesUIUtils: "resource:///modules/PlacesUIUtils.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
@@ -99,7 +100,7 @@ export class ClickHandlerParent extends JSWindowActorParent {
}
// This part is based on handleLinkClick.
var where = window.whereToOpenLink(data);
var where = lazy.BrowserUtils.whereToOpenLink(data);
if (where == "current") {
return;
}

View File

@@ -6,6 +6,7 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
FormHistory: "resource://gre/modules/FormHistory.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
SearchSuggestionController:
@@ -216,7 +217,7 @@ export let ContentSearch = {
// message and the time we handle it.
return;
}
let where = win.whereToOpenLink(data.originalEvent);
let where = lazy.BrowserUtils.whereToOpenLink(data.originalEvent);
// There is a chance that by the time we receive the search message, the user
// has switched away from the tab that triggered the search. If, based on the
@@ -510,11 +511,12 @@ export let ContentSearch = {
lazy.UrlbarPrefs.get("shouldHandOffToSearchMode")
);
break;
default:
default: {
let state = await this.currentStateObj();
this._broadcast("CurrentState", state);
break;
}
}
},
_suggestionDataForBrowser(browser, create = false) {

View File

@@ -295,7 +295,7 @@ var BrowserCommands = {
let where = "tab";
if (event) {
where = whereToOpenLink(event, false, true);
where = BrowserUtils.whereToOpenLink(event, false, true);
switch (where) {
case "tab":

View File

@@ -307,7 +307,7 @@ this.SyncedTabsPanelList = class SyncedTabsPanelList {
{}
),
});
if (document.defaultView.whereToOpenLink(e) != "current") {
if (BrowserUtils.whereToOpenLink(e) != "current") {
e.preventDefault();
e.stopPropagation();
} else {

View File

@@ -2523,7 +2523,7 @@ const BrowserSearch = {
event
) {
event = getRootEvent(event);
let where = whereToOpenLink(event);
let where = BrowserUtils.whereToOpenLink(event);
if (where == "current") {
// override: historically search opens in new tab
where = "tab";
@@ -4537,7 +4537,7 @@ nsBrowserAccess.prototype = {
: PrivateBrowsingUtils.isWindowPrivate(window);
switch (aWhere) {
case Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW:
case Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW: {
// FIXME: Bug 408379. So how come this doesn't send the
// referrer like the other loads do?
var url = aURI && aURI.spec;
@@ -4581,6 +4581,7 @@ nsBrowserAccess.prototype = {
console.error(ex);
}
break;
}
case Ci.nsIBrowserDOMWindow.OPEN_NEWTAB:
case Ci.nsIBrowserDOMWindow.OPEN_NEWTAB_BACKGROUND: {
// If we have an opener, that means that the caller is expecting access
@@ -4991,7 +4992,7 @@ function setToolbarVisibility(
document.documentElement.toggleAttribute(overlapAttr, false);
break;
case "newtab":
default:
default: {
let currentURI = gBrowser?.currentURI;
if (!gBrowserInit.domContentLoaded) {
let uriToLoad = gBrowserInit.uriToLoadPromise;
@@ -5010,6 +5011,7 @@ function setToolbarVisibility(
break;
}
}
}
if (toolbar.getAttribute(hidingAttribute) == (!isVisible).toString()) {
// If this call will not result in a visibility change, return early
@@ -5420,7 +5422,7 @@ function handleLinkClick(event, href, linkNode) {
return false;
}
var where = whereToOpenLink(event);
var where = BrowserUtils.whereToOpenLink(event);
if (where == "current") {
return false;
}
@@ -5493,7 +5495,7 @@ function middleMousePaste(event) {
// if it's not the current tab, we don't need to do anything because the
// browser doesn't exist.
let where = whereToOpenLink(event, true, false);
let where = BrowserUtils.whereToOpenLink(event, true, false);
let lastLocationChange;
if (where == "current") {
lastLocationChange = gBrowser.selectedBrowser.lastLocationChange;
@@ -7051,7 +7053,7 @@ function safeModeRestart() {
*/
function duplicateTabIn(aTab, where, delta) {
switch (where) {
case "window":
case "window": {
let otherWin = OpenBrowserWindow({
private: PrivateBrowsingUtils.isBrowserPrivate(aTab.linkedBrowser),
});
@@ -7073,6 +7075,7 @@ function duplicateTabIn(aTab, where, delta) {
"browser-delayed-startup-finished"
);
break;
}
case "tabshifted":
SessionStore.duplicateTab(window, aTab, delta);
// A background tab has been opened, nothing else to do here.
@@ -8085,7 +8088,7 @@ var FirefoxViewHandler = {
},
handleEvent(e) {
switch (e.type) {
case "TabSelect":
case "TabSelect": {
const selected = e.target == this.tab;
this.button?.toggleAttribute("open", selected);
this.button?.setAttribute("aria-pressed", selected);
@@ -8096,6 +8099,7 @@ var FirefoxViewHandler = {
gBrowser.visibleTabs[0].style.MozUserFocus =
e.target == this.tab ? "normal" : "";
break;
}
case "TabClose":
this.tab = null;
gBrowser.tabContainer.removeEventListener("TabSelect", this);

View File

@@ -1685,7 +1685,7 @@ class nsContextMenu {
// Change current window to the URL of the image, video, or audio.
viewMedia(e) {
let where = whereToOpenLink(e, false, false);
let where = BrowserUtils.whereToOpenLink(e, false, false);
if (where == "current") {
where = "tab";
}
@@ -2499,7 +2499,7 @@ class nsContextMenu {
let drmInfoURL =
Services.urlFormatter.formatURLPref("app.support.baseURL") +
"drm-content";
let dest = whereToOpenLink(aEvent);
let dest = BrowserUtils.whereToOpenLink(aEvent);
// Don't ever want this to open in the same tab as it'll unload the
// DRM'd video, which is going to be a bad idea in most cases.
if (dest == "current") {

View File

@@ -113,11 +113,6 @@ function getRootEvent(aEvent) {
return BrowserUtils.getRootEvent(aEvent);
}
// This is here for historical reasons. bug 1742889 covers cleaning this up.
function whereToOpenLink(e, ignoreButton, ignoreAlt) {
return BrowserUtils.whereToOpenLink(e, ignoreButton, ignoreAlt);
}
function openTrustedLinkIn(url, where, params) {
URILoadingHelper.openTrustedLinkIn(window, url, where, params);
}

View File

@@ -24,6 +24,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
BookmarkJSONUtils: "resource://gre/modules/BookmarkJSONUtils.sys.mjs",
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserUIUtils: "resource:///modules/BrowserUIUtils.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
BrowserUsageTelemetry: "resource:///modules/BrowserUsageTelemetry.sys.mjs",
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
BuiltInThemes: "resource:///modules/BuiltInThemes.sys.mjs",
@@ -1197,13 +1198,13 @@ BrowserGlue.prototype = {
case "initial-migration-did-import-default-bookmarks":
this._initPlaces(true);
break;
case "handle-xul-text-link":
case "handle-xul-text-link": {
let linkHandled = subject.QueryInterface(Ci.nsISupportsPRBool);
if (!linkHandled.data) {
let win = lazy.BrowserWindowTracker.getTopWindow();
if (win) {
data = JSON.parse(data);
let where = win.whereToOpenLink(data);
let where = lazy.BrowserUtils.whereToOpenLink(data);
// Preserve legacy behavior of non-modifier left-clicks
// opening in a new selected tab.
if (where == "current") {
@@ -1214,13 +1215,14 @@ BrowserGlue.prototype = {
}
}
break;
}
case "profile-before-change":
// Any component depending on Places should be finalized in
// _onPlacesShutdown. Any component that doesn't need to act after
// the UI has gone should be finalized in _onQuitApplicationGranted.
this._dispose();
break;
case "keyword-search":
case "keyword-search": {
// This notification is broadcast by the docshell when it "fixes up" a
// URI that it's been asked to load into a keyword search.
let engine = null;
@@ -1238,13 +1240,15 @@ BrowserGlue.prototype = {
"urlbar"
);
break;
case "xpi-signature-changed":
}
case "xpi-signature-changed": {
let disabledAddons = JSON.parse(data).disabled;
let addons = await lazy.AddonManager.getAddonsByIDs(disabledAddons);
if (addons.some(addon => addon)) {
this._notifyUnsignedAddonsDisabled();
}
break;
}
case "sync-ui-state:update":
this._updateFxaBadges(lazy.BrowserWindowTracker.getTopWindow());
break;
@@ -1262,7 +1266,7 @@ BrowserGlue.prototype = {
lazy.DownloadsViewableInternally.register();
break;
case "app-startup":
case "app-startup": {
this._earlyBlankFirstPaint(subject);
gThisInstanceIsTaskbarTab = subject.handleFlag("taskbar-tab", false);
gThisInstanceIsLaunchOnLogin = subject.handleFlag(
@@ -1297,6 +1301,7 @@ BrowserGlue.prototype = {
}
break;
}
}
},
// initialization (called on application startup)

View File

@@ -141,7 +141,7 @@ HistoryDownloadElementShell.prototype = {
// be opened.
let browserWin = BrowserWindowTracker.getTopWindow();
let openWhere = browserWin
? browserWin.whereToOpenLink(event, false, true)
? BrowserUtils.whereToOpenLink(event, false, true)
: "window";
if (["window", "tabshifted", "tab"].includes(openWhere)) {
command += ":" + openWhere;

View File

@@ -866,7 +866,7 @@ var DownloadsView = {
} else if (aEvent.shiftKey || aEvent.ctrlKey || aEvent.metaKey) {
// We adjust the command for supported modifiers to suggest where the download
// may be opened
let openWhere = target.ownerGlobal.whereToOpenLink(aEvent, false, true);
let openWhere = BrowserUtils.whereToOpenLink(aEvent, false, true);
if (["tab", "window", "tabshifted"].includes(openWhere)) {
command += ":" + openWhere;
}

View File

@@ -7,6 +7,7 @@ import { actionTypes as at } from "resource://activity-stream/common/Actions.mjs
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
DownloadsCommon: "resource:///modules/DownloadsCommon.sys.mjs",
DownloadsViewUI: "resource:///modules/DownloadsViewUI.sys.mjs",
FileUtils: "resource://gre/modules/FileUtils.sys.mjs",
@@ -166,10 +167,8 @@ export class DownloadsManager {
);
});
break;
case at.OPEN_DOWNLOAD_FILE:
const win = action._target.browser.ownerGlobal;
const openWhere =
action.data.event && win.whereToOpenLink(action.data.event);
case at.OPEN_DOWNLOAD_FILE: {
const openWhere = lazy.BrowserUtils.whereToOpenLink(action.data.event);
doDownloadAction(download => {
lazy.DownloadsCommon.openDownload(download, {
// Replace "current" or unknown value with "tab" as the default behavior
@@ -180,6 +179,7 @@ export class DownloadsManager {
});
});
break;
}
case at.UNINIT:
this.uninit();
break;

View File

@@ -24,6 +24,7 @@ const { AboutNewTab } = ChromeUtils.importESModule(
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
NewTabUtils: "resource://gre/modules/NewTabUtils.sys.mjs",
NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs",
@@ -274,7 +275,7 @@ export class PlacesFeed {
const win = action._target.browser.ownerGlobal;
win.openTrustedLinkIn(
urlToOpen,
where || win.whereToOpenLink(event),
where || lazy.BrowserUtils.whereToOpenLink(event),
params
);

View File

@@ -424,7 +424,7 @@ add_task(async function test_onAction_OPEN_LINK() {
data: { url: "https://foo.com" },
_target: {
browser: {
ownerGlobal: { openTrustedLinkIn, whereToOpenLink: () => "current" },
ownerGlobal: { openTrustedLinkIn },
},
},
};
@@ -524,7 +524,7 @@ add_task(async function test_onAction_OPEN_LINK_pocket() {
},
_target: {
browser: {
ownerGlobal: { openTrustedLinkIn, whereToOpenLink: () => "current" },
ownerGlobal: { openTrustedLinkIn },
},
},
};
@@ -551,7 +551,7 @@ add_task(async function test_onAction_OPEN_LINK_not_http() {
data: { url: "file:///foo.com" },
_target: {
browser: {
ownerGlobal: { openTrustedLinkIn, whereToOpenLink: () => "current" },
ownerGlobal: { openTrustedLinkIn },
},
},
};

View File

@@ -12,6 +12,7 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
CLIENT_NOT_CONFIGURED: "resource://services-sync/constants.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
CustomizableUI: "resource:///modules/CustomizableUI.sys.mjs",
MigrationUtils: "resource:///modules/MigrationUtils.sys.mjs",
@@ -467,7 +468,7 @@ class BookmarkState {
})
);
break;
case "tags":
case "tags": {
const newTags = value.filter(
tag => !this._originalState.tags.includes(tag)
);
@@ -491,6 +492,7 @@ class BookmarkState {
);
}
break;
}
case "keyword":
transactions.push(
lazy.PlacesTransactions.EditKeyword({
@@ -985,7 +987,7 @@ export var PlacesUIUtils = {
// whereToOpenLink doesn't return "window" when there's no browser window
// open (Bug 630255).
var where = browserWindow
? browserWindow.whereToOpenLink(aEvent, false, true)
? lazy.BrowserUtils.whereToOpenLink(aEvent, false, true)
: "window";
if (where == "window") {
// There is no browser window open, thus open a new one.
@@ -1076,7 +1078,7 @@ export var PlacesUIUtils = {
openNodeWithEvent: function PUIU_openNodeWithEvent(aNode, aEvent) {
let window = aEvent.target.ownerGlobal;
let where = window.whereToOpenLink(aEvent, false, true);
let where = lazy.BrowserUtils.whereToOpenLink(aEvent, false, true);
if (this.loadBookmarksInTabs && lazy.PlacesUtils.nodeIsBookmark(aNode)) {
if (where == "current" && !aNode.uri.startsWith("javascript:")) {
where = "tab";
@@ -1690,7 +1692,7 @@ export var PlacesUIUtils = {
doCommand(command) {
let window = this.triggerNode.ownerGlobal;
switch (command) {
case "placesCmd_copy":
case "placesCmd_copy": {
// This is a little hacky, but there is a lot of code in Places that handles
// clipboard stuff, so it's easier to reuse.
let node = {};
@@ -1735,6 +1737,7 @@ export var PlacesUIUtils = {
Ci.nsIClipboard.kGlobalClipboard
);
break;
}
case "placesCmd_open:privatewindow":
window.openTrustedLinkIn(this.triggerNode.link, "window", {
private: true,

View File

@@ -7,6 +7,7 @@
// Wrap in a block to prevent leaking to window scope.
{
ChromeUtils.defineESModuleGetters(this, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
SearchOneOffs: "resource:///modules/SearchOneOffs.sys.mjs",
});
@@ -194,7 +195,7 @@
let search = this.input.controller.getValueAt(this.selectedIndex);
// open the search results according to the clicking subtlety
let where = whereToOpenLink(aEvent, false, true);
let where = this.BrowserUtils.whereToOpenLink(aEvent, false, true);
let params = {};
// But open ctrl/cmd clicks on autocomplete items in a new background tab.

View File

@@ -12,6 +12,7 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
FormHistory: "resource://gre/modules/FormHistory.sys.mjs",
SearchSuggestionController:
"resource://gre/modules/SearchSuggestionController.sys.mjs",
@@ -317,7 +318,7 @@
if (aEvent.button == 2) {
return;
}
where = whereToOpenLink(aEvent, false, true);
where = lazy.BrowserUtils.whereToOpenLink(aEvent, false, true);
if (
newTabPref &&
!aEvent.altKey &&
@@ -885,12 +886,13 @@
goDoCommand("cmd_paste");
this.handleSearchCommand(event);
break;
case clearHistoryItem:
case clearHistoryItem: {
let param = this.textbox.getAttribute("autocompletesearchparam");
lazy.FormHistory.update({ op: "remove", fieldname: param });
this.textbox.value = "";
break;
default:
}
default: {
let cmd = event.originalTarget.getAttribute("cmd");
if (cmd) {
let controller =
@@ -899,6 +901,7 @@
}
break;
}
}
});
}
}

View File

@@ -5,6 +5,7 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
});
@@ -290,7 +291,7 @@ TabListView.prototype = {
// Middle click on a client
if (itemNode.classList.contains("client")) {
let where = getChromeWindow(this._window).whereToOpenLink(event);
let where = lazy.BrowserUtils.whereToOpenLink(event);
if (where != "current") {
this._openAllClientTabs(itemNode, where);
}
@@ -346,7 +347,7 @@ TabListView.prototype = {
},
onOpenSelected(url, event) {
let where = getChromeWindow(this._window).whereToOpenLink(event);
let where = lazy.BrowserUtils.whereToOpenLink(event);
this.props.onOpenTab(url, where, {});
},

View File

@@ -11,6 +11,7 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserUIUtils: "resource:///modules/BrowserUIUtils.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
ExtensionSearchHandler:
"resource://gre/modules/ExtensionSearchHandler.sys.mjs",
ObjectUtils: "resource://gre/modules/ObjectUtils.sys.mjs",
@@ -3048,7 +3049,7 @@ export class UrlbarInput {
// pressed, open in current tab to allow ctrl-enter to canonize URL.
where = "current";
} else {
where = this.window.whereToOpenLink(event, false, false);
where = lazy.BrowserUtils.whereToOpenLink(event, false, false);
}
if (lazy.UrlbarPrefs.get("openintab")) {
if (where == "current") {

View File

@@ -8,6 +8,7 @@ import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
ClickHandlerParent: "resource:///actors/ClickHandlerParent.sys.mjs",
UrlbarUtils: "resource:///modules/UrlbarUtils.sys.mjs",
@@ -249,8 +250,7 @@ export var WebNavigationManager = {
onContentClick(target, data) {
// We are interested only on clicks to links which are not "add to bookmark" commands
if (data.href && !data.bookmark) {
let ownerWin = target.ownerGlobal;
let where = ownerWin.whereToOpenLink(data);
let where = lazy.BrowserUtils.whereToOpenLink(data);
if (where == "current") {
this.setRecentTabTransitionData({ link: true });
}

View File

@@ -29,6 +29,10 @@ export default class MozSupportLink extends HTMLAnchorElement {
*/
#register() {
if (window.document.nodePrincipal?.isSystemPrincipal) {
ChromeUtils.defineESModuleGetters(MozSupportLink, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
});
// eslint-disable-next-line no-shadow
let { XPCOMUtils } = window.XPCOMUtils
? window
@@ -72,7 +76,7 @@ export default class MozSupportLink extends HTMLAnchorElement {
handleEvent(e) {
if (e.type == "click") {
if (window.openTrustedLinkIn) {
let where = whereToOpenLink(e, false, true);
let where = MozSupportLink.BrowserUtils.whereToOpenLink(e, false, true);
if (where == "current") {
where = "tab";
}