diff options
Diffstat (limited to 'browser/actors')
-rw-r--r-- | browser/actors/AboutReaderParent.sys.mjs | 2 | ||||
-rw-r--r-- | browser/actors/ContextMenuChild.sys.mjs | 4 | ||||
-rw-r--r-- | browser/actors/FormValidationChild.sys.mjs | 2 | ||||
-rw-r--r-- | browser/actors/FormValidationParent.sys.mjs | 2 | ||||
-rw-r--r-- | browser/actors/PluginParent.sys.mjs | 2 | ||||
-rw-r--r-- | browser/actors/PromptParent.sys.mjs | 188 | ||||
-rw-r--r-- | browser/actors/RefreshBlockerChild.sys.mjs | 6 | ||||
-rw-r--r-- | browser/actors/SearchSERPTelemetryChild.sys.mjs | 52 | ||||
-rw-r--r-- | browser/actors/WebRTCChild.sys.mjs | 8 | ||||
-rw-r--r-- | browser/actors/WebRTCParent.sys.mjs | 6 |
10 files changed, 85 insertions, 187 deletions
diff --git a/browser/actors/AboutReaderParent.sys.mjs b/browser/actors/AboutReaderParent.sys.mjs index 544a257cbc..00126910ae 100644 --- a/browser/actors/AboutReaderParent.sys.mjs +++ b/browser/actors/AboutReaderParent.sys.mjs @@ -281,7 +281,7 @@ export class AboutReaderParent extends JSWindowActorParent { * @return {Promise} * @resolves JS object representing the article, or null if no article is found. */ - async _getArticle(url, browser) { + async _getArticle(url) { return lazy.ReaderMode.downloadAndParseDocument(url).catch(e => { if (e && e.newURL) { // Pass up the error so we can navigate the browser in question to the new URL: diff --git a/browser/actors/ContextMenuChild.sys.mjs b/browser/actors/ContextMenuChild.sys.mjs index e16efdc9cd..5ecbcb22e9 100644 --- a/browser/actors/ContextMenuChild.sys.mjs +++ b/browser/actors/ContextMenuChild.sys.mjs @@ -371,7 +371,7 @@ export class ContextMenuChild extends JSWindowActorChild { } // Returns true if clicked-on link targets a resource that can be saved. - _isLinkSaveable(aLink) { + _isLinkSaveable() { // We don't do the Right Thing for news/snews yet, so turn them off // until we do. return ( @@ -696,7 +696,7 @@ export class ContextMenuChild extends JSWindowActorChild { * - link * - linkURI */ - _cleanContext(aEvent) { + _cleanContext() { const context = this.context; const cleanTarget = Object.create(null); diff --git a/browser/actors/FormValidationChild.sys.mjs b/browser/actors/FormValidationChild.sys.mjs index f5ce427d03..bb67f1f1f4 100644 --- a/browser/actors/FormValidationChild.sys.mjs +++ b/browser/actors/FormValidationChild.sys.mjs @@ -138,7 +138,7 @@ export class FormValidationChild extends JSWindowActorChild { * Blur event handler in which we disconnect from the form element and * hide the popup. */ - _onBlur(aEvent) { + _onBlur() { if (this._element) { this._element.removeEventListener("input", this); this._element.removeEventListener("blur", this); diff --git a/browser/actors/FormValidationParent.sys.mjs b/browser/actors/FormValidationParent.sys.mjs index e95a8e86fb..a988b06f37 100644 --- a/browser/actors/FormValidationParent.sys.mjs +++ b/browser/actors/FormValidationParent.sys.mjs @@ -19,7 +19,7 @@ class PopupShownObserver { this._weakContext = Cu.getWeakReference(browsingContext); } - observe(subject, topic, data) { + observe(subject, topic) { let ctxt = this._weakContext.get(); let actor = ctxt.currentWindowGlobal?.getExistingActor("FormValidation"); if (!actor) { diff --git a/browser/actors/PluginParent.sys.mjs b/browser/actors/PluginParent.sys.mjs index fa93c1d5ab..14eeb38945 100644 --- a/browser/actors/PluginParent.sys.mjs +++ b/browser/actors/PluginParent.sys.mjs @@ -19,7 +19,7 @@ ChromeUtils.defineLazyGetter(lazy, "gNavigatorBundle", function () { export const PluginManager = { gmpCrashes: new Map(), - observe(subject, topic, data) { + observe(subject, topic) { switch (topic) { case "gmp-plugin-crash": this._registerGMPCrash(subject); diff --git a/browser/actors/PromptParent.sys.mjs b/browser/actors/PromptParent.sys.mjs index 4a159cbda5..83180923b9 100644 --- a/browser/actors/PromptParent.sys.mjs +++ b/browser/actors/PromptParent.sys.mjs @@ -9,42 +9,22 @@ ChromeUtils.defineESModuleGetters(lazy, { PromptUtils: "resource://gre/modules/PromptUtils.sys.mjs", BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs", }); -import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; - -XPCOMUtils.defineLazyPreferenceGetter( - lazy, - "tabChromePromptSubDialog", - "prompts.tabChromePromptSubDialog", - false -); - -XPCOMUtils.defineLazyPreferenceGetter( - lazy, - "contentPromptSubDialog", - "prompts.contentPromptSubDialog", - false -); ChromeUtils.defineLazyGetter(lazy, "gTabBrowserLocalization", function () { return new Localization(["browser/tabbrowser.ftl"], true); }); /** - * @typedef {Object} Prompt - * @property {Function} resolver - * The resolve function to be called with the data from the Prompt - * after the user closes it. - * @property {Object} tabModalPrompt - * The TabModalPrompt being shown to the user. + * @typedef {Object} Dialog */ /** - * gBrowserPrompts weakly maps BrowsingContexts to a Map of their currently - * active Prompts. + * gBrowserDialogs weakly maps BrowsingContexts to a Map of their currently + * active Dialogs. * - * @type {WeakMap<BrowsingContext, Prompt>} + * @type {WeakMap<BrowsingContext, Dialog>} */ -let gBrowserPrompts = new WeakMap(); +let gBrowserDialogs = new WeakMap(); export class PromptParent extends JSWindowActorParent { didDestroy() { @@ -54,35 +34,24 @@ export class PromptParent extends JSWindowActorParent { } /** - * Registers a new Prompt to be tracked for a particular BrowsingContext. - * We need to track a Prompt so that we can, for example, force-close the - * TabModalPrompt if the originating subframe or tab unloads or crashes. + * Registers a new dialog to be tracked for a particular BrowsingContext. + * We need to track a dialog so that we can, for example, force-close the + * dialog if the originating subframe or tab unloads or crashes. * - * @param {Object} tabModalPrompt - * The TabModalPrompt that will be shown to the user. + * @param {Dialog} dialog + * The dialog that will be shown to the user. * @param {string} id - * A unique ID to differentiate multiple Prompts coming from the same + * A unique ID to differentiate multiple dialogs coming from the same * BrowsingContext. - * @return {Promise} - * @resolves {Object} - * Resolves with the arguments returned from the TabModalPrompt when it - * is dismissed. */ - registerPrompt(tabModalPrompt, id) { - let prompts = gBrowserPrompts.get(this.browsingContext); - if (!prompts) { - prompts = new Map(); - gBrowserPrompts.set(this.browsingContext, prompts); + registerDialog(dialog, id) { + let dialogs = gBrowserDialogs.get(this.browsingContext); + if (!dialogs) { + dialogs = new Map(); + gBrowserDialogs.set(this.browsingContext, dialogs); } - let promise = new Promise(resolve => { - prompts.set(id, { - tabModalPrompt, - resolver: resolve, - }); - }); - - return promise; + dialogs.set(id, dialog); } /** @@ -94,20 +63,18 @@ export class PromptParent extends JSWindowActorParent { * BrowsingContext. */ unregisterPrompt(id) { - let prompts = gBrowserPrompts.get(this.browsingContext); - if (prompts) { - prompts.delete(id); - } + let dialogs = gBrowserDialogs.get(this.browsingContext); + dialogs?.delete(id); } /** * Programmatically closes all Prompts for the current BrowsingContext. */ forceClosePrompts() { - let prompts = gBrowserPrompts.get(this.browsingContext) || []; + let dialogs = gBrowserDialogs.get(this.browsingContext) || []; - for (let [, prompt] of prompts) { - prompt.tabModalPrompt && prompt.tabModalPrompt.abortPrompt(); + for (let [, dialog] of dialogs) { + dialog?.abort(); } } @@ -127,120 +94,19 @@ export class PromptParent extends JSWindowActorParent { } receiveMessage(message) { - let args = message.data; - let id = args._remoteId; - switch (message.name) { case "Prompt:Open": if (!this.windowContext.isActiveInTab) { return undefined; } - if ( - (args.modalType === Ci.nsIPrompt.MODAL_TYPE_CONTENT && - !lazy.contentPromptSubDialog) || - (args.modalType === Ci.nsIPrompt.MODAL_TYPE_TAB && - !lazy.tabChromePromptSubDialog) - ) { - return this.openContentPrompt(args, id); - } - return this.openPromptWithTabDialogBox(args); + return this.openPromptWithTabDialogBox(message.data); } return undefined; } /** - * Opens a TabModalPrompt for a BrowsingContext, and puts the associated browser - * in the modal state until the TabModalPrompt is closed. - * - * @param {Object} args - * The arguments passed up from the BrowsingContext to be passed directly - * to the TabModalPrompt. - * @param {string} id - * A unique ID to differentiate multiple Prompts coming from the same - * BrowsingContext. - * @return {Promise} - * Resolves when the TabModalPrompt is dismissed. - * @resolves {Object} - * The arguments returned from the TabModalPrompt. - */ - openContentPrompt(args, id) { - let browser = this.browsingContext.top.embedderElement; - if (!browser) { - throw new Error("Cannot tab-prompt without a browser!"); - } - let window = browser.ownerGlobal; - let tabPrompt = window.gBrowser.getTabModalPromptBox(browser); - let newPrompt; - let needRemove = false; - - // If the page which called the prompt is different from the the top context - // where we show the prompt, ask the prompt implementation to display the origin. - // For example, this can happen if a cross origin subframe shows a prompt. - args.showCallerOrigin = - args.promptPrincipal && - !browser.contentPrincipal.equals(args.promptPrincipal); - - let onPromptClose = () => { - let promptData = gBrowserPrompts.get(this.browsingContext); - if (!promptData || !promptData.has(id)) { - throw new Error( - "Failed to close a prompt since it wasn't registered for some reason." - ); - } - - let { resolver, tabModalPrompt } = promptData.get(id); - // It's possible that we removed the prompt during the - // appendPrompt call below. In that case, newPrompt will be - // undefined. We set the needRemove flag to remember to remove - // it right after we've finished adding it. - if (tabModalPrompt) { - tabPrompt.removePrompt(tabModalPrompt); - } else { - needRemove = true; - } - - this.unregisterPrompt(id); - - lazy.PromptUtils.fireDialogEvent( - window, - "DOMModalDialogClosed", - browser, - this.getClosingEventDetail(args) - ); - resolver(args); - browser.maybeLeaveModalState(); - }; - - try { - browser.enterModalState(); - lazy.PromptUtils.fireDialogEvent( - window, - "DOMWillOpenModalDialog", - browser, - this.getOpenEventDetail(args) - ); - - args.promptActive = true; - - newPrompt = tabPrompt.appendPrompt(args, onPromptClose); - let promise = this.registerPrompt(newPrompt, id); - - if (needRemove) { - tabPrompt.removePrompt(newPrompt); - } - - return promise; - } catch (ex) { - console.error(ex); - onPromptClose(true); - } - - return null; - } - - /** * Opens either a window prompt or TabDialogBox at the content or tab level * for a BrowsingContext, and puts the associated browser in the modal state * until the prompt is closed. @@ -349,8 +215,9 @@ export class PromptParent extends JSWindowActorParent { ); } bag = lazy.PromptUtils.objectToPropBag(args); + let promptID = args._remoteId; try { - await dialogBox.open( + let { dialog, closedPromise } = dialogBox.open( uri, { features: "resizable=no", @@ -359,7 +226,9 @@ export class PromptParent extends JSWindowActorParent { hideContent: args.isTopLevelCrossDomainAuth, }, bag - ).closedPromise; + ); + this.registerDialog(dialog, promptID); + await closedPromise; } finally { if (args.isTopLevelCrossDomainAuth) { browser.currentAuthPromptURI = null; @@ -373,6 +242,7 @@ export class PromptParent extends JSWindowActorParent { currentLocationsTabLabel ); } + this.unregisterPrompt(promptID); } } else { // Ensure we set the correct modal type at this point. diff --git a/browser/actors/RefreshBlockerChild.sys.mjs b/browser/actors/RefreshBlockerChild.sys.mjs index 6ba63298b1..f5e9611144 100644 --- a/browser/actors/RefreshBlockerChild.sys.mjs +++ b/browser/actors/RefreshBlockerChild.sys.mjs @@ -50,7 +50,7 @@ var progressListener = { * the STATE_IS_WINDOW case, which will clear any mappings from * blockedWindows. */ - onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) { + onStateChange(aWebProgress, aRequest, aStateFlags) { if ( aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW && aStateFlags & Ci.nsIWebProgressListener.STATE_STOP @@ -64,7 +64,7 @@ var progressListener = { * onRefreshAttempted has already fired for this DOM Window, will * send the appropriate refresh blocked data to the parent. */ - onLocationChange(aWebProgress, aRequest, aLocation, aFlags) { + onLocationChange(aWebProgress) { let win = aWebProgress.DOMWindow; if (this.blockedWindows.has(win)) { let data = this.blockedWindows.get(win); @@ -180,7 +180,7 @@ export class RefreshBlockerObserverChild extends JSProcessActorChild { this.filtersMap = new Map(); } - observe(subject, topic, data) { + observe(subject, topic) { switch (topic) { case "webnavigation-create": case "chrome-webnavigation-create": diff --git a/browser/actors/SearchSERPTelemetryChild.sys.mjs b/browser/actors/SearchSERPTelemetryChild.sys.mjs index c760f9a19e..e845f589b0 100644 --- a/browser/actors/SearchSERPTelemetryChild.sys.mjs +++ b/browser/actors/SearchSERPTelemetryChild.sys.mjs @@ -1077,7 +1077,11 @@ class DomainExtractor { break; } case "textContent": { - this.#fromElementsRetrieveTextContent(elements, extractedDomains); + this.#fromElementsRetrieveTextContent( + elements, + extractedDomains, + providerName + ); break; } } @@ -1197,8 +1201,26 @@ class DomainExtractor { * A list of elements from the page whose text content we want to inspect. * @param {Set<string>} extractedDomains * The result set of domains extracted from the page. + * @param {string} providerName + * The name of the search provider. */ - #fromElementsRetrieveTextContent(elements, extractedDomains) { + #fromElementsRetrieveTextContent(elements, extractedDomains, providerName) { + // Not an exhaustive regex, but it fits our purpose for this method. + const LOOSE_URL_REGEX = + /^(?:https?:\/\/)?(?:www\.)?(?:[\w\-]+\.)+(?:[\w\-]{2,})/i; + + // Known but acceptable limitations to this function, where the return + // value won't be correctly fixed up: + // 1) A url is embedded within other text. Ex: "xkcd.com is cool." + // 2) The url contains legal but unusual characters. Ex: $ ! * ' + function fixup(textContent) { + return textContent + .toLowerCase() + .replaceAll(" ", "") + .replace(/\.$/, "") + .concat(".com"); + } + for (let element of elements) { if (this.#exceedsThreshold(extractedDomains.size)) { return; @@ -1209,18 +1231,24 @@ class DomainExtractor { } let domain; - try { - domain = new URL(textContent).hostname; - } catch (e) { - domain = textContent.toLowerCase().replaceAll(" ", ""); - // If the attempt to turn the text content into a URL object only fails - // because we're missing a protocol, ".com" may already be present. - if (!domain.endsWith(".com")) { - domain = domain.concat(".com"); + if (LOOSE_URL_REGEX.test(textContent)) { + // Creating a new URL object will throw if the protocol is missing. + if (!/^https?:\/\//.test(textContent)) { + textContent = "https://" + textContent; + } + + try { + domain = new URL(textContent).hostname; + } catch (e) { + domain = fixup(textContent); } + } else { + domain = fixup(textContent); } - if (!extractedDomains.has(domain)) { - extractedDomains.add(domain); + + let processedDomain = this.#processDomain(domain, providerName); + if (processedDomain && !extractedDomains.has(processedDomain)) { + extractedDomains.add(processedDomain); } } } diff --git a/browser/actors/WebRTCChild.sys.mjs b/browser/actors/WebRTCChild.sys.mjs index 50db01709d..03ad6d389b 100644 --- a/browser/actors/WebRTCChild.sys.mjs +++ b/browser/actors/WebRTCChild.sys.mjs @@ -213,7 +213,7 @@ function getActorForWindow(window) { return null; } -function handlePCRequest(aSubject, aTopic, aData) { +function handlePCRequest(aSubject) { let { windowID, innerWindowID, callID, isSecure } = aSubject; let contentWindow = Services.wm.getOuterWindowWithId(windowID); if (!contentWindow.pendingPeerConnectionRequests) { @@ -235,7 +235,7 @@ function handlePCRequest(aSubject, aTopic, aData) { } } -function handleGUMStop(aSubject, aTopic, aData) { +function handleGUMStop(aSubject) { let contentWindow = Services.wm.getOuterWindowWithId(aSubject.windowID); let request = { @@ -250,7 +250,7 @@ function handleGUMStop(aSubject, aTopic, aData) { } } -function handleGUMRequest(aSubject, aTopic, aData) { +function handleGUMRequest(aSubject) { // Now that a getUserMedia request has been created, we should check // to see if we're supposed to have any devices muted. This needs // to occur after the getUserMedia request is made, since the global @@ -472,7 +472,7 @@ function forgetPendingListsEventually(aContentWindow) { aContentWindow.removeEventListener("unload", WebRTCChild.handleEvent); } -function updateIndicators(aSubject, aTopic, aData) { +function updateIndicators(aSubject) { if ( aSubject instanceof Ci.nsIPropertyBag && aSubject.getProperty("requestURL") == kBrowserURL diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs index 09c39e7393..806fd4abcf 100644 --- a/browser/actors/WebRTCParent.sys.mjs +++ b/browser/actors/WebRTCParent.sys.mjs @@ -609,7 +609,7 @@ function prompt(aActor, aBrowser, aRequest) { actionL10nIds.push({ id }, { id: "webrtc-action-always-block" }); secondaryActions = [ { - callback(aState) { + callback() { aActor.denyRequest(aRequest); if (!isNotNowLabelEnabled) { lazy.SitePermissions.setForPrincipal( @@ -623,7 +623,7 @@ function prompt(aActor, aBrowser, aRequest) { }, }, { - callback(aState) { + callback() { aActor.denyRequest(aRequest); lazy.SitePermissions.setForPrincipal( principal, @@ -1029,7 +1029,7 @@ function prompt(aActor, aBrowser, aRequest) { video.srcObject = stream; video.stream = stream; doc.getElementById("webRTC-preview").hidden = false; - video.onloadedmetadata = function (e) { + video.onloadedmetadata = function () { video.play(); }; }, |