Commit 4469cbad authored by henry's avatar henry
Browse files

fixup! MB 39: Add home page about:mullvad-browser

MB 486: Delay the update data for preloaded about:mullvad-browser pages.
parent 629f8c06
Loading
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -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;
    }
  }
}
+63 −20
Original line number Diff line number Diff line
@@ -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.
@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -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;