const TEST_URL =
  getRootDirectory(gTestPath).replace(
    "chrome://mochitests/content",
    "https://example.com"
  ) + "empty_file.html";

/*
 * Register cleanup function to reset prefs after other tasks have run.
 */

add_task(async function () {
  // Note: SpecialPowers.pushPrefEnv has problems with the "Enable DRM"
  // button on the notification box toggling the prefs. So manually
  // set/unset the prefs the UI we're testing toggles.
  let emeWasEnabled = Services.prefs.getBoolPref("media.eme.enabled", false);
  let cdmWasEnabled = Services.prefs.getBoolPref(
    "media.gmp-widevinecdm.enabled",
    false
  );

  // Restore the preferences to their pre-test state on test finish.
  registerCleanupFunction(function () {
    // Unlock incase lock test threw and didn't unlock.
    Services.prefs.unlockPref("media.eme.enabled");
    Services.prefs.setBoolPref("media.eme.enabled", emeWasEnabled);
    Services.prefs.setBoolPref("media.gmp-widevinecdm.enabled", cdmWasEnabled);
  });
});

/*
 * Bug 1366167 - Tests that the "Enable DRM" prompt shows if EME is requested while EME is disabled.
 */

add_task(async function test_drm_prompt_shows_for_toplevel() {
  await BrowserTestUtils.withNewTab(TEST_URL, async function (browser) {
    // Turn off EME and Widevine CDM.
    Services.prefs.setBoolPref("media.eme.enabled", false);
    Services.prefs.setBoolPref("media.gmp-widevinecdm.enabled", false);

    // Have content request access to Widevine, UI should drop down to
    // prompt user to enable DRM.
    let result = await SpecialPowers.spawn(browser, [], async function () {
      try {
        let config = [
          {
            initDataTypes: ["webm"],
            videoCapabilities: [{ contentType: 'video/webm; codecs="vp9"' }],
          },
        ];
        await content.navigator.requestMediaKeySystemAccess(
          "com.widevine.alpha",
          config
        );
      } catch (ex) {
        return { rejected: true };
      }
      return { rejected: false };
    });
    is(
      result.rejected,
      true,
      "EME request should be denied because EME disabled."
    );

    // Verify the UI prompt showed.
    let box = gBrowser.getNotificationBox(browser);
    let notification = box.currentNotification;

    ok(notification, "Notification should be visible");
    is(
      notification.getAttribute("value"),
      "drmContentDisabled",
      "Should be showing the right notification"
    );

    // Verify the "Enable DRM" button is there.
    let buttons = notification.buttonContainer.querySelectorAll(
      ".notification-button"
    );
    is(buttons.length, 1, "Should have one button.");

    // Prepare a Promise that should resolve when the "Enable DRM" button's
    // page reload completes.
    let refreshPromise = BrowserTestUtils.browserLoaded(browser);
    buttons[0].click();

    // Wait for the reload to complete.
    await refreshPromise;

    // Verify clicking the "Enable DRM" button enabled DRM.
    let enabled = Services.prefs.getBoolPref("media.eme.enabled", true);
    is(
      enabled,
      true,
      "EME should be enabled after click on 'Enable DRM' button"
    );
  });
});

add_task(async function test_eme_locked() {
  await BrowserTestUtils.withNewTab(TEST_URL, async function (browser) {
    // Turn off EME and Widevine CDM.
    Services.prefs.setBoolPref("media.eme.enabled", false);
    Services.prefs.lockPref("media.eme.enabled");

    // Have content request access to Widevine, UI should drop down to
    // prompt user to enable DRM.
    let result = await SpecialPowers.spawn(browser, [], async function () {
      try {
        let config = [
          {
            initDataTypes: ["webm"],
            videoCapabilities: [{ contentType: 'video/webm; codecs="vp9"' }],
          },
        ];
        await content.navigator.requestMediaKeySystemAccess(
          "com.widevine.alpha",
          config
        );
      } catch (ex) {
        return { rejected: true };
      }
      return { rejected: false };
    });
    is(
      result.rejected,
      true,
      "EME request should be denied because EME disabled."
    );

    // Verify the UI prompt did not show.
    let box = gBrowser.getNotificationBox(browser);
    let notification = box.currentNotification;

    is(
      notification,
      null,
      "Notification should not be displayed since pref is locked"
    );

    // Unlock the pref for any tests that follow.
    Services.prefs.unlockPref("media.eme.enabled");
  });
});

/*
 * Bug 1642465 - Ensure cross origin frames requesting access prompt in the same way as same origin.
 */

add_task(async function test_drm_prompt_shows_for_cross_origin_iframe() {
  await BrowserTestUtils.withNewTab(TEST_URL, async function (browser) {
    // Turn off EME and Widevine CDM.
    Services.prefs.setBoolPref("media.eme.enabled", false);
    Services.prefs.setBoolPref("media.gmp-widevinecdm.enabled", false);

    // Have content request access to Widevine, UI should drop down to
    // prompt user to enable DRM.
    const CROSS_ORIGIN_URL = TEST_URL.replace("example.com", "example.org");
    let result = await SpecialPowers.spawn(
      browser,
      [CROSS_ORIGIN_URL],
      async function (crossOriginUrl) {
        let frame = content.document.createElement("iframe");
        frame.src = crossOriginUrl;
        await new Promise(resolve => {
          frame.addEventListener("load", () => {
            resolve();
          });
          content.document.body.appendChild(frame);
        });

        return content.SpecialPowers.spawn(frame, [], async function () {
          try {
            let config = [
              {
                initDataTypes: ["webm"],
                videoCapabilities: [
                  { contentType: 'video/webm; codecs="vp9"' },
                ],
              },
            ];
            await content.navigator.requestMediaKeySystemAccess(
              "com.widevine.alpha",
              config
            );
          } catch (ex) {
            return { rejected: true };
          }
          return { rejected: false };
        });
      }
    );
    is(
      result.rejected,
      true,
      "EME request should be denied because EME disabled."
    );

    // Verify the UI prompt showed.
    let box = gBrowser.getNotificationBox(browser);
    let notification = box.currentNotification;

    ok(notification, "Notification should be visible");
    is(
      notification.getAttribute("value"),
      "drmContentDisabled",
      "Should be showing the right notification"
    );

    // Verify the "Enable DRM" button is there.
    let buttons = notification.buttonContainer.querySelectorAll(
      ".notification-button"
    );
    is(buttons.length, 1, "Should have one button.");

    // Prepare a Promise that should resolve when the "Enable DRM" button's
    // page reload completes.
    let refreshPromise = BrowserTestUtils.browserLoaded(browser);
    buttons[0].click();

    // Wait for the reload to complete.
    await refreshPromise;

    // Verify clicking the "Enable DRM" button enabled DRM.
    let enabled = Services.prefs.getBoolPref("media.eme.enabled", true);
    is(
      enabled,
      true,
      "EME should be enabled after click on 'Enable DRM' button"
    );
  });
});
