"use strict";

// This test checks whether browser.theme.getCurrent() works correctly when theme
// does not originate from extension querying the theme.
const THEME = {
  manifest: {
    theme: {
      images: {
        theme_frame: "image1.png",
      },
      colors: {
        frame: ACCENT_COLOR,
        tab_background_text: TEXT_COLOR,
      },
    },
  },
  files: {
    "image1.png": BACKGROUND,
  },
};

add_task(async function test_getcurrent() {
  const theme = ExtensionTestUtils.loadExtension(THEME);
  const extension = ExtensionTestUtils.loadExtension({
    background() {
      browser.theme.onUpdated.addListener(() => {
        browser.theme.getCurrent().then(theme => {
          browser.test.sendMessage("theme-updated", theme);
          if (!theme?.images) {
            return;
          }

          // Try to access the theme_frame image
          fetch(theme.images.theme_frame)
            .then(() => {
              browser.test.sendMessage("theme-image", { success: true });
            })
            .catch(e => {
              browser.test.sendMessage("theme-image", {
                success: false,
                error: e.message,
              });
            });
        });
      });
    },
  });

  await extension.startup();

  info("Testing getCurrent after static theme startup");
  let updatedPromise = extension.awaitMessage("theme-updated");
  let imageLoaded = extension.awaitMessage("theme-image");
  await theme.startup();
  let receivedTheme = await updatedPromise;
  Assert.ok(
    receivedTheme.images.theme_frame.includes("image1.png"),
    "getCurrent returns correct theme_frame image"
  );
  Assert.equal(
    receivedTheme.colors.frame,
    ACCENT_COLOR,
    "getCurrent returns correct frame color"
  );
  Assert.equal(
    receivedTheme.colors.tab_background_text,
    TEXT_COLOR,
    "getCurrent returns correct tab_background_text color"
  );
  Assert.deepEqual(await imageLoaded, { success: true }, "theme image loaded");

  info("Testing getCurrent after static theme unload");
  updatedPromise = extension.awaitMessage("theme-updated");
  await theme.unload();
  receivedTheme = await updatedPromise;
  Assert.equal(
    JSON.stringify({ colors: null, images: null, properties: null }),
    JSON.stringify(receivedTheme),
    "getCurrent returns empty theme"
  );

  await extension.unload();
});

add_task(async function test_getcurrent_privateBrowsing() {
  const theme = ExtensionTestUtils.loadExtension(THEME);

  const extension = ExtensionTestUtils.loadExtension({
    incognitoOverride: "spanning",
    manifest: {
      sidebar_action: {
        default_panel: "sidebar.html",
      },
    },
    // We don't want the sidebar to automatically open on extension startup.
    startupReason: "APP_STARTUP",
    files: {
      "sidebar.html": `<!DOCTYPE html>
        <html>
          <body>
            Test Extension Sidebar
            <script src="sidebar.js"></script>
          </body>
        </html>
      `,
      "sidebar.js": function () {
        browser.theme.getCurrent().then(theme => {
          if (!theme?.images) {
            browser.test.fail(
              `Missing expected images from theme.getCurrent result`
            );
            return;
          }

          // Try to access the theme_frame image
          fetch(theme.images.theme_frame)
            .then(() => {
              browser.test.sendMessage("theme-image", { success: true });
            })
            .catch(e => {
              browser.test.sendMessage("theme-image", {
                success: false,
                error: e.message,
              });
            });
        });
      },
    },
  });

  await extension.startup();
  await theme.startup();

  const privateWin = await BrowserTestUtils.openNewBrowserWindow({
    private: true,
  });

  const { ExtensionCommon } = ChromeUtils.importESModule(
    "resource://gre/modules/ExtensionCommon.sys.mjs"
  );
  const { makeWidgetId } = ExtensionCommon;
  privateWin.SidebarController.show(
    `${makeWidgetId(extension.id)}-sidebar-action`
  );

  let imageLoaded = extension.awaitMessage("theme-image");
  Assert.deepEqual(await imageLoaded, { success: true }, "theme image loaded");

  await extension.unload();
  await theme.unload();

  await BrowserTestUtils.closeWindow(privateWin);
});
