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

const RELATIVE_DIR = "toolkit/components/pdfjs/test/";
const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;

/**
 * Get the first and last pixels on the drawn canvas.
 * @param {Object} browser
 * @returns {Object}
 */
async function getFirstLastPixels(browser) {
  return SpecialPowers.spawn(browser, [], async function () {
    const { document } = content;
    const canvas = document.querySelector("canvas");

    Assert.ok(!!canvas, "We must have a canvas");

    const data = Array.from(
      canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height)
        .data
    );

    return {
      first: data.slice(0, 3),
      last: data.slice(-4, -1),
    };
  });
}

/**
 * Test that the pdf has the correct color depending on the high contrast mode.
 */
add_task(async function test() {
  let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
  let handlerInfo = mimeService.getFromTypeAndExtension(
    "application/pdf",
    "pdf"
  );

  // Make sure pdf.js is the default handler.
  is(
    handlerInfo.alwaysAskBeforeHandling,
    false,
    "pdf handler defaults to always-ask is false"
  );
  is(
    handlerInfo.preferredAction,
    Ci.nsIHandlerInfo.handleInternally,
    "pdf handler defaults to internal"
  );

  info("Pref action: " + handlerInfo.preferredAction);

  await SpecialPowers.pushPrefEnv({
    set: [
      ["browser.display.document_color_use", 0],
      ["browser.display.background_color", "#ff0000"],
      ["browser.display.foreground_color", "#00ff00"],
      ["browser.display.use_system_colors", false],
    ],
  });

  await BrowserTestUtils.withNewTab(
    { gBrowser, url: "about:blank" },
    async function (browser) {
      // check that PDF is opened with internal viewer
      await waitForPdfJSCanvas(
        browser,
        `${TESTROOT}file_pdfjs_hcm.pdf#zoom=800`
      );

      const { first, last } = await getFirstLastPixels(browser);
      // The first pixel must be black and not green.
      Assert.deepEqual(first, [0, 0, 0]);

      // The last pixel must be white and not red.
      Assert.deepEqual(last, [255, 255, 255]);
    }
  );

  // Enable HCM.
  await SpecialPowers.pushPrefEnv({
    set: [["ui.useAccessibilityTheme", 1]],
  });

  await BrowserTestUtils.withNewTab(
    { gBrowser, url: "about:blank" },
    async function (browser) {
      // check that PDF is opened with internal viewer
      await waitForPdfJSCanvas(
        browser,
        `${TESTROOT}file_pdfjs_hcm.pdf#zoom=800`
      );

      const { first, last } = await getFirstLastPixels(browser);
      // The first pixel must be green.
      Assert.deepEqual(first, [0, 255, 0]);

      // The last pixel must be red.
      Assert.deepEqual(last, [255, 0, 0]);
    }
  );
});
