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

"use strict";

const BAD_CERT = "https://expired.example.com/";
const REVOKED_CERT_PATH =
  "../../../../../security/manager/ssl/tests/mochitest/browser/revoked.pem";

function pemToBase64(pem) {
  return pem
    .replace(/-----BEGIN CERTIFICATE-----/, "")
    .replace(/-----END CERTIFICATE-----/, "")
    .replace(/\s+/g, "");
}

// The revoked certificate page should not offer a proceed button.
add_task(async function checkRevokedCertificateAdvancedCopy() {
  await setSecurityCertErrorsFeltPrivacyToTrue();

  const revokedPem = await IOUtils.readUTF8(getTestFilePath(REVOKED_CERT_PATH));
  const revokedCertBase64 = pemToBase64(revokedPem);

  const tab = await openErrorPage(BAD_CERT);
  const browser = tab.linkedBrowser;

  await SpecialPowers.spawn(
    browser,
    [revokedCertBase64],
    async function (revokedCert_Base64) {
      const mockErrorInfo = {
        errorCodeString: "SEC_ERROR_REVOKED_CERTIFICATE",
        errorIsOverridable: false,
        channelStatus: 0,
        overridableErrorCategory: "trust-error",
        validNotBefore: Date.now() - 1000,
        validNotAfter: Date.now() + 1000,
        certValidityRangeNotAfter: Date.now() + 1000,
        certValidityRangeNotBefore: Date.now() - 1000,
        issuerCommonName: "ca",
        errorMessage: "Peer's Certificate has been revoked.",
        hasHSTS: false,
        hasHPKP: false,
        certChainStrings: [revokedCert_Base64],
      };

      content.document.getFailedCertSecurityInfo = () => mockErrorInfo;

      const netErrorCard =
        content.document.querySelector("net-error-card").wrappedJSObject;
      const info = Cu.cloneInto(mockErrorInfo, netErrorCard);
      netErrorCard.errorInfo = info;
      netErrorCard.hostname = "revoked.example.com";
      netErrorCard.domainMismatchNames = null;
      netErrorCard.domainMismatchNamesPromise = null;
      netErrorCard.certificateErrorText = null;
      netErrorCard.certificateErrorTextPromise = null;
      netErrorCard.hideExceptionButton = netErrorCard.shouldHideExceptionButton(
        info.errorCodeString
      );
      netErrorCard.errorConfig = netErrorCard.getErrorConfig();
      netErrorCard.requestUpdate();
      await netErrorCard.getUpdateComplete();

      const advancedButton = netErrorCard.advancedButton;
      advancedButton.scrollIntoView(true);
      EventUtils.synthesizeMouseAtCenter(advancedButton, {}, content);

      await ContentTaskUtils.waitForCondition(
        () => netErrorCard.advancedContainer,
        "Advanced section should be rendered for revoked certificate"
      );
      await ContentTaskUtils.waitForCondition(
        () => netErrorCard.whyDangerous && netErrorCard.whatCanYouDo,
        "Revoked copy should be rendered"
      );

      Assert.ok(
        netErrorCard.advancedShowing,
        "Advanced details are shown for revoked certificates."
      );
      Assert.ok(
        !netErrorCard.exceptionButton,
        "Proceed button should not be shown for revoked certificates."
      );
      Assert.equal(
        netErrorCard.whyDangerous.dataset.l10nId,
        "fp-certerror-revoked-why-dangerous-body",
        "Using the 'revoked' variant of the 'Why Dangerous' copy."
      );
      Assert.equal(
        netErrorCard.whatCanYouDo.dataset.l10nId,
        "fp-certerror-revoked-what-can-you-do-body",
        "Using the 'revoked' variant of the 'What can you do' copy."
      );
      Assert.equal(
        netErrorCard.learnMoreLink.getAttribute("support-page"),
        "connection-not-secure",
        "'Learn more' link points to the standard support page."
      );
    }
  );

  BrowserTestUtils.removeTab(tab);
  await SpecialPowers.popPrefEnv();
});
