/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

export class PageStyleParent extends JSWindowActorParent {
  // This has the most recent information about the content stylesheets for
  // that actor. It's populated via the PageStyle:Add and PageStyle:Clear
  // messages from the content process. It has the following structure:
  //
  // filteredStyleSheets (Array):
  //   An Array of objects with a filtered list representing all stylesheets
  //   that the current page offers. Each object has the following members:
  //
  //   title (String):
  //     The title of the stylesheet
  //
  //   disabled (bool):
  //     Whether or not the stylesheet is currently applied
  //
  //   href (String):
  //     The URL of the stylesheet. Stylesheets loaded via a data URL will
  //     have this property set to null.
  //
  // preferredStyleSheetSet (bool):
  //   Whether or not the user currently has the "Default" style selected
  //   for the current page.
  #styleSheetInfo = null;

  receiveMessage(msg) {
    // Check if things are alive:
    let browser = this.browsingContext.top.embedderElement;
    if (!browser || browser.documentGlobal.closed) {
      return;
    }

    // We always store information at the top of the frame tree.
    let actor =
      this.browsingContext.top.currentWindowGlobal.getActor("PageStyle");
    switch (msg.name) {
      case "PageStyle:Add":
        actor.addSheetInfo(msg.data);
        break;
      case "PageStyle:Clear":
        if (actor == this) {
          this.#styleSheetInfo = null;
        }
        break;
    }
  }

  /**
   * Add/append styleSheets to the _pageStyleSheets weakmap.
   *
   * @param newSheetData
   *        The stylesheet data, including new stylesheets to add,
   *        and the preferred stylesheet set for this document.
   */
  addSheetInfo(newSheetData) {
    let info = this.getSheetInfo();
    info.filteredStyleSheets.push(...newSheetData.filteredStyleSheets);
    info.preferredStyleSheetSet ||= newSheetData.preferredStyleSheetSet;
  }

  getSheetInfo() {
    if (!this.#styleSheetInfo) {
      this.#styleSheetInfo = {
        filteredStyleSheets: [],
        preferredStyleSheetSet: true,
      };
    }
    return this.#styleSheetInfo;
  }
}
