/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

/**
 * Tests that tabs running in the parent process can hear about updates
 * to lightweight themes via contentTheme.js.
 *
 * The test loads the History Sidebar document in a tab to avoid having
 * to create a special parent-process page for the LightweightTheme
 * JSWindow actors.
 */
add_task(async function test_in_process_tab() {
  let win = await BrowserTestUtils.openNewBrowserWindow();
  const IN_PROCESS_URI = "chrome://browser/content/places/historySidebar.xhtml";
  const SIDEBAR_BGCOLOR = "rgb(255, 0, 0)";
  // contentTheme.js will always convert the sidebar text color to rgba, so
  // we need to compare against that.
  const SIDEBAR_TEXT_COLOR = "rgba(0, 255, 0, 1)";

  await BrowserTestUtils.withNewTab(
    {
      gBrowser: win.gBrowser,
      url: IN_PROCESS_URI,
    },
    async browser => {
      await SpecialPowers.spawn(
        browser,
        [SIDEBAR_BGCOLOR, SIDEBAR_TEXT_COLOR],
        async (bgColor, textColor) => {
          let style = content.document.documentElement.style;
          Assert.notEqual(
            style.getPropertyValue("--sidebar-background-color"),
            bgColor
          );
          Assert.notEqual(
            style.getPropertyValue("--sidebar-text-color"),
            textColor
          );
        }
      );

      // Now cobble together a very simple theme that sets the sidebar background
      // and text color.
      let lwtData = {
        theme: {
          sidebar: SIDEBAR_BGCOLOR,
          sidebar_text: SIDEBAR_TEXT_COLOR,
        },
        darkTheme: null,
        window: win.docShell.outerWindowID,
      };

      Services.obs.notifyObservers(lwtData, "lightweight-theme-styling-update");

      await SpecialPowers.spawn(
        browser,
        [SIDEBAR_BGCOLOR, SIDEBAR_TEXT_COLOR],
        async (bgColor, textColor) => {
          let style = content.document.documentElement.style;
          Assert.equal(
            style.getPropertyValue("--sidebar-background-color"),
            bgColor,
            "The sidebar background text color should have been set by " +
              "contentTheme.js"
          );
          Assert.equal(
            style.getPropertyValue("--sidebar-text-color"),
            textColor,
            "The sidebar background text color should have been set by " +
              "contentTheme.js"
          );
        }
      );
    }
  );

  await BrowserTestUtils.closeWindow(win);
});
