Loading browser/components/mullvad-browser/AboutMullvadBrowserChild.sys.mjs +26 −5 Original line number Diff line number Diff line Loading @@ -5,13 +5,34 @@ export class AboutMullvadBrowserChild extends JSWindowActorChild { handleEvent(event) { switch (event.type) { case "DOMContentLoaded": this.sendQuery("AboutMullvadBrowser:GetUpdateData").then(data => { this.sendQuery("AboutMullvadBrowser:GetUpdateData").then(response => { if (response.delayed) { // Wait for DelayedUpdateData. return; } this.#dispatchUpdateData(response.updateData); }); break; } } receiveMessage(message) { switch (message.name) { case "AboutMullvadBrowser:DelayedUpdateData": this.#dispatchUpdateData(message.data); break; } } /** * Send the update data to the page. * * @param {object} data - The data to send. */ #dispatchUpdateData(data) { const updateEvent = new this.contentWindow.CustomEvent("UpdateData", { detail: Cu.cloneInto(data, this.contentWindow), }); this.contentWindow.dispatchEvent(updateEvent); }); break; } } } browser/components/mullvad-browser/AboutMullvadBrowserParent.sys.mjs +63 −20 Original line number Diff line number Diff line Loading @@ -2,12 +2,40 @@ * Actor parent class for the about:mullvad-browser page. */ export class AboutMullvadBrowserParent extends JSWindowActorParent { receiveMessage(message) { /** * Whether this instance has a preloaded browser. * * @type {boolean} */ #preloaded = false; /** * Method to be called when the browser corresponding to this actor has its * preloadedState attribute removed. */ preloadedRemoved() { if (!this.#preloaded) { return; } this.#preloaded = false; // Send in the initial data now that the page is actually going to be // visible. this.sendAsyncMessage( "AboutMullvadBrowser:DelayedUpdateData", this.#getUpdateData() ); } /** * Get the update data for the page. * * @returns {object?} - The update data, or `null` if no update should be * shown. */ #getUpdateData() { const shouldNotifyPref = "mullvadbrowser.post_update.shouldNotify"; switch (message.name) { case "AboutMullvadBrowser:GetUpdateData": { if (!Services.prefs.getBoolPref(shouldNotifyPref, false)) { return Promise.resolve(null); return null; } Services.prefs.clearUserPref(shouldNotifyPref); // Try use the same URL as the about dialog. See mullvad-browser#411. Loading @@ -20,12 +48,27 @@ export class AboutMullvadBrowserParent extends JSWindowActorParent { ); } return Promise.resolve({ return { version: Services.prefs.getCharPref( "browser.startup.homepage_override.mullvadbrowser.version" ), url: updateURL, }); }; } receiveMessage(message) { switch (message.name) { case "AboutMullvadBrowser:GetUpdateData": { const browser = this.browsingContext.top.embedderElement; if (browser?.getAttribute("preloadedState") === "preloaded") { // Wait until the page is actually about to be shown before sending // the initial data. // Otherwise the preloaded page might grab the updateData even though // it won't be shown as the landing page. See mullvad-browser#486. this.#preloaded = true; return Promise.resolve({ delayed: true }); } return Promise.resolve({ updateData: this.#getUpdateData() }); } } return undefined; Loading browser/components/tabbrowser/NewTabPagePreloading.sys.mjs +11 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,17 @@ export let NewTabPagePreloading = { this.browserCounts[countKey]--; browser.removeAttribute("preloadedState"); browser.setAttribute("autocompletepopup", "PopupAutoComplete"); // Copied from tor-browser. See mullvad-browser#486. // Let a preloaded about:mullvad-browser page know that it is no longer // preloaded (about to be shown). try { browser.browsingContext?.currentWindowGlobal ?.getActor("AboutMullvadBrowser") .preloadedRemoved(); } catch { // Not an about:mullvad-browser page with an AboutMullvadBrowserParent // instance. } } return browser; Loading Loading
browser/components/mullvad-browser/AboutMullvadBrowserChild.sys.mjs +26 −5 Original line number Diff line number Diff line Loading @@ -5,13 +5,34 @@ export class AboutMullvadBrowserChild extends JSWindowActorChild { handleEvent(event) { switch (event.type) { case "DOMContentLoaded": this.sendQuery("AboutMullvadBrowser:GetUpdateData").then(data => { this.sendQuery("AboutMullvadBrowser:GetUpdateData").then(response => { if (response.delayed) { // Wait for DelayedUpdateData. return; } this.#dispatchUpdateData(response.updateData); }); break; } } receiveMessage(message) { switch (message.name) { case "AboutMullvadBrowser:DelayedUpdateData": this.#dispatchUpdateData(message.data); break; } } /** * Send the update data to the page. * * @param {object} data - The data to send. */ #dispatchUpdateData(data) { const updateEvent = new this.contentWindow.CustomEvent("UpdateData", { detail: Cu.cloneInto(data, this.contentWindow), }); this.contentWindow.dispatchEvent(updateEvent); }); break; } } }
browser/components/mullvad-browser/AboutMullvadBrowserParent.sys.mjs +63 −20 Original line number Diff line number Diff line Loading @@ -2,12 +2,40 @@ * Actor parent class for the about:mullvad-browser page. */ export class AboutMullvadBrowserParent extends JSWindowActorParent { receiveMessage(message) { /** * Whether this instance has a preloaded browser. * * @type {boolean} */ #preloaded = false; /** * Method to be called when the browser corresponding to this actor has its * preloadedState attribute removed. */ preloadedRemoved() { if (!this.#preloaded) { return; } this.#preloaded = false; // Send in the initial data now that the page is actually going to be // visible. this.sendAsyncMessage( "AboutMullvadBrowser:DelayedUpdateData", this.#getUpdateData() ); } /** * Get the update data for the page. * * @returns {object?} - The update data, or `null` if no update should be * shown. */ #getUpdateData() { const shouldNotifyPref = "mullvadbrowser.post_update.shouldNotify"; switch (message.name) { case "AboutMullvadBrowser:GetUpdateData": { if (!Services.prefs.getBoolPref(shouldNotifyPref, false)) { return Promise.resolve(null); return null; } Services.prefs.clearUserPref(shouldNotifyPref); // Try use the same URL as the about dialog. See mullvad-browser#411. Loading @@ -20,12 +48,27 @@ export class AboutMullvadBrowserParent extends JSWindowActorParent { ); } return Promise.resolve({ return { version: Services.prefs.getCharPref( "browser.startup.homepage_override.mullvadbrowser.version" ), url: updateURL, }); }; } receiveMessage(message) { switch (message.name) { case "AboutMullvadBrowser:GetUpdateData": { const browser = this.browsingContext.top.embedderElement; if (browser?.getAttribute("preloadedState") === "preloaded") { // Wait until the page is actually about to be shown before sending // the initial data. // Otherwise the preloaded page might grab the updateData even though // it won't be shown as the landing page. See mullvad-browser#486. this.#preloaded = true; return Promise.resolve({ delayed: true }); } return Promise.resolve({ updateData: this.#getUpdateData() }); } } return undefined; Loading
browser/components/tabbrowser/NewTabPagePreloading.sys.mjs +11 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,17 @@ export let NewTabPagePreloading = { this.browserCounts[countKey]--; browser.removeAttribute("preloadedState"); browser.setAttribute("autocompletepopup", "PopupAutoComplete"); // Copied from tor-browser. See mullvad-browser#486. // Let a preloaded about:mullvad-browser page know that it is no longer // preloaded (about to be shown). try { browser.browsingContext?.currentWindowGlobal ?.getActor("AboutMullvadBrowser") .preloadedRemoved(); } catch { // Not an about:mullvad-browser page with an AboutMullvadBrowserParent // instance. } } return browser; Loading