Bug 1297630 - Test certificate errors in iframes. r=Gijs
authorJohann Hofmann <jhofmann@mozilla.com>
Thu, 15 Mar 2018 12:57:11 +0100
changeset 462204 36bfb71a88eaf31a1e89f69920287e3fb74d4065
parent 462203 6c397982f283e459e1623b2b0c7b0c5546981f5c
child 462205 9c83861ca1a12f86b4de7d149c2a3968fc76db97
push id9165
push userasasaki@mozilla.com
push dateThu, 26 Apr 2018 21:04:54 +0000
treeherdermozilla-beta@064c3804de2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersGijs
bugs1297630
milestone61.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1297630 - Test certificate errors in iframes. r=Gijs This amends the browser_aboutCertError test file to cover error pages in iframes in addition to top-level pages. I figured that instead of re-writing all assertions in a separate test it would be smarter to do the same assertions we apply to the top-level error pages on frames as well. I did not update the checkWrongSystemTimeWarning test, which is currently disabled. MozReview-Commit-ID: 90fS0emPaSN
browser/base/content/test/about/browser.ini
browser/base/content/test/about/browser_aboutCertError.js
browser/base/content/test/about/dummy_page.html
--- a/browser/base/content/test/about/browser.ini
+++ b/browser/base/content/test/about/browser.ini
@@ -4,16 +4,18 @@ support-files =
   head.js
   print_postdata.sjs
   searchSuggestionEngine.sjs
   searchSuggestionEngine.xml
   test_bug959531.html
   POSTSearchEngine.xml
 
 [browser_aboutCertError.js]
+support-files =
+  dummy_page.html
 [browser_aboutHome_imitate.js]
 [browser_aboutHome_input.js]
 skip-if = true # Bug 1409054 to remove; previously skipped for intermittents, e.g., Bug 1399648
 [browser_aboutHome_search_POST.js]
 [browser_aboutHome_search_composing.js]
 skip-if = !debug && (os == "mac" || (os == "linux" && bits == 32)) # Bug 1400491, bug 1399648
 [browser_aboutHome_search_searchbar.js]
 [browser_aboutHome_search_suggestion.js]
--- a/browser/base/content/test/about/browser_aboutCertError.js
+++ b/browser/base/content/test/about/browser_aboutCertError.js
@@ -1,114 +1,160 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 // This is testing the aboutCertError page (Bug 1207107).
 
 const GOOD_PAGE = "https://example.com/";
+const GOOD_PAGE_2 = "https://example.org/";
+const DUMMY_PAGE = getRootDirectory(gTestPath).replace("chrome://mochitests/content", GOOD_PAGE) + "dummy_page.html";
 const BAD_CERT = "https://expired.example.com/";
 const UNKNOWN_ISSUER = "https://self-signed.example.com ";
 const BAD_STS_CERT = "https://badchain.include-subdomains.pinning.example.com:443";
 const {TabStateFlusher} = ChromeUtils.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {});
 const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
 
+function injectErrorPageFrame(tab, src) {
+  return ContentTask.spawn(tab.linkedBrowser, {frameSrc: src}, async function({frameSrc}) {
+    let loaded = ContentTaskUtils.waitForEvent(content.wrappedJSObject, "DOMFrameContentLoaded");
+    let iframe = content.document.createElement("iframe");
+    iframe.src = frameSrc;
+    content.document.body.appendChild(iframe);
+    await loaded;
+    // We will have race conditions when accessing the frame content after setting a src,
+    // so we can't wait for AboutNetErrorLoad. Let's wait for the certerror class to
+    // appear instead (which should happen at the same time as AboutNetErrorLoad).
+    await ContentTaskUtils.waitForCondition(() =>
+      iframe.contentDocument.body.classList.contains("certerror"));
+  });
+}
+
+async function openErrorPage(src, useFrame) {
+  let tab;
+  if (useFrame) {
+    info("Loading cert error page in an iframe");
+    tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, DUMMY_PAGE);
+    await injectErrorPageFrame(tab, src);
+  } else {
+    let certErrorLoaded;
+    tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
+      gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, src);
+      let browser = gBrowser.selectedBrowser;
+      certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
+    }, false);
+    info("Loading and waiting for the cert error");
+    await certErrorLoaded;
+  }
+
+  return tab;
+}
+
 add_task(async function checkReturnToAboutHome() {
   info("Loading a bad cert page directly and making sure 'return to previous page' goes to about:home");
-  let browser;
-  let certErrorLoaded;
-  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
-    gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, BAD_CERT);
-    browser = gBrowser.selectedBrowser;
-    certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
-  }, false);
+  for (let useFrame of [false, true]) {
+    let tab = await openErrorPage(BAD_CERT, useFrame);
+    let browser = tab.linkedBrowser;
 
-  info("Loading and waiting for the cert error");
-  await certErrorLoaded;
+    is(browser.webNavigation.canGoBack, false, "!webNavigation.canGoBack");
+    is(browser.webNavigation.canGoForward, false, "!webNavigation.canGoForward");
 
-  is(browser.webNavigation.canGoBack, false, "!webNavigation.canGoBack");
-  is(browser.webNavigation.canGoForward, false, "!webNavigation.canGoForward");
+    // Populate the shistory entries manually, since it happens asynchronously
+    // and the following tests will be too soon otherwise.
+    await TabStateFlusher.flush(browser);
+    let {entries} = JSON.parse(ss.getTabState(tab));
+    is(entries.length, 1, "there is one shistory entry");
 
-  // Populate the shistory entries manually, since it happens asynchronously
-  // and the following tests will be too soon otherwise.
-  await TabStateFlusher.flush(browser);
-  let {entries} = JSON.parse(ss.getTabState(tab));
-  is(entries.length, 1, "there is one shistory entry");
+    info("Clicking the go back button on about:certerror");
+    await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
+
+      let returnButton = doc.getElementById("returnButton");
+      if (!frame) {
+        is(returnButton.getAttribute("autofocus"), "true", "returnButton has autofocus");
+      }
+      returnButton.click();
 
-  info("Clicking the go back button on about:certerror");
-  await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let returnButton = doc.getElementById("returnButton");
-    is(returnButton.getAttribute("autofocus"), "true", "returnButton has autofocus");
-    returnButton.click();
+      await ContentTaskUtils.waitForEvent(this, "pageshow", true);
+    });
 
-    await ContentTaskUtils.waitForEvent(this, "pageshow", true);
-  });
+    is(browser.webNavigation.canGoBack, true, "webNavigation.canGoBack");
+    is(browser.webNavigation.canGoForward, false, "!webNavigation.canGoForward");
+    is(gBrowser.currentURI.spec, "about:home", "Went back");
 
-  is(browser.webNavigation.canGoBack, true, "webNavigation.canGoBack");
-  is(browser.webNavigation.canGoForward, false, "!webNavigation.canGoForward");
-  is(gBrowser.currentURI.spec, "about:home", "Went back");
-
-  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  }
 });
 
 add_task(async function checkReturnToPreviousPage() {
   info("Loading a bad cert page and making sure 'return to previous page' goes back");
-  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, GOOD_PAGE);
-  let browser = gBrowser.selectedBrowser;
+  for (let useFrame of [false, true]) {
+    let tab;
+    let browser;
+    if (useFrame) {
+      tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, GOOD_PAGE);
+      browser = tab.linkedBrowser;
 
-  info("Loading and waiting for the cert error");
-  let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
-  BrowserTestUtils.loadURI(browser, BAD_CERT);
-  await certErrorLoaded;
+      BrowserTestUtils.loadURI(browser, GOOD_PAGE_2);
+      await BrowserTestUtils.browserLoaded(browser, false, GOOD_PAGE_2);
+      await injectErrorPageFrame(tab, BAD_CERT);
+    } else {
+      tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, GOOD_PAGE);
+      browser = gBrowser.selectedBrowser;
 
-  is(browser.webNavigation.canGoBack, true, "webNavigation.canGoBack");
-  is(browser.webNavigation.canGoForward, false, "!webNavigation.canGoForward");
+      info("Loading and waiting for the cert error");
+      let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
+      BrowserTestUtils.loadURI(browser, BAD_CERT);
+      await certErrorLoaded;
+    }
 
-  // Populate the shistory entries manually, since it happens asynchronously
-  // and the following tests will be too soon otherwise.
-  await TabStateFlusher.flush(browser);
-  let {entries} = JSON.parse(ss.getTabState(tab));
-  is(entries.length, 2, "there are two shistory entries");
+    is(browser.webNavigation.canGoBack, true, "webNavigation.canGoBack");
+    is(browser.webNavigation.canGoForward, false, "!webNavigation.canGoForward");
+
+    // Populate the shistory entries manually, since it happens asynchronously
+    // and the following tests will be too soon otherwise.
+    await TabStateFlusher.flush(browser);
+    let {entries} = JSON.parse(ss.getTabState(tab));
+    is(entries.length, 2, "there are two shistory entries");
 
-  info("Clicking the go back button on about:certerror");
-  await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let returnButton = doc.getElementById("returnButton");
-    returnButton.click();
+    info("Clicking the go back button on about:certerror");
+    await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
+      let returnButton = doc.getElementById("returnButton");
+      returnButton.click();
 
-    await ContentTaskUtils.waitForEvent(this, "pageshow", true);
-  });
+      await ContentTaskUtils.waitForEvent(this, "pageshow", true);
+    });
 
-  is(browser.webNavigation.canGoBack, false, "!webNavigation.canGoBack");
-  is(browser.webNavigation.canGoForward, true, "webNavigation.canGoForward");
-  is(gBrowser.currentURI.spec, GOOD_PAGE, "Went back");
+    is(browser.webNavigation.canGoBack, false, "!webNavigation.canGoBack");
+    is(browser.webNavigation.canGoForward, true, "webNavigation.canGoForward");
+    is(gBrowser.currentURI.spec, GOOD_PAGE, "Went back");
 
-  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  }
 });
 
 add_task(async function checkBadStsCert() {
   info("Loading a badStsCert and making sure exception button doesn't show up");
-  await BrowserTestUtils.openNewForegroundTab(gBrowser, GOOD_PAGE);
-  let browser = gBrowser.selectedBrowser;
 
-  info("Loading and waiting for the cert error");
-  let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
-  BrowserTestUtils.loadURI(browser, BAD_STS_CERT);
-  await certErrorLoaded;
+  for (let useFrame of [false, true]) {
+    let tab = await openErrorPage(BAD_STS_CERT, useFrame);
+    let browser = tab.linkedBrowser;
 
-  let exceptionButtonHidden = await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let exceptionButton = doc.getElementById("exceptionDialogButton");
-    return exceptionButton.hidden;
-  });
-  ok(exceptionButtonHidden, "Exception button is hidden");
+    let exceptionButtonHidden = await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
+      let exceptionButton = doc.getElementById("exceptionDialogButton");
+      return exceptionButton.hidden;
+    });
 
-  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    ok(exceptionButtonHidden, "Exception button is hidden");
+
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  }
 });
 
 // This checks that the appinfo.appBuildID starts with a date string,
 // which is required for the misconfigured system time check.
 add_task(async function checkAppBuildIDIsDate() {
   let appBuildID = Services.appinfo.appBuildID;
   let year = parseInt(appBuildID.substr(0, 4), 10);
   let month = parseInt(appBuildID.substr(4, 2), 10);
@@ -216,165 +262,152 @@ add_task(async function checkWrongSystem
 
   is(message.divDisplay, "none", "Wrong time message information is not visible");
 
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 }).skip(); // Skipping because of bug 1414804.
 
 add_task(async function checkAdvancedDetails() {
   info("Loading a bad cert page and verifying the main error and advanced details section");
-  let browser;
-  let certErrorLoaded;
-  await BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
-    gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, BAD_CERT);
-    browser = gBrowser.selectedBrowser;
-    certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
-  }, false);
+  for (let useFrame of [false, true]) {
+    let tab = await openErrorPage(BAD_CERT, useFrame);
+    let browser = tab.linkedBrowser;
 
-  info("Loading and waiting for the cert error");
-  await certErrorLoaded;
+    let message = await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
+
+      let shortDescText = doc.getElementById("errorShortDescText");
+      info("Main error text: " + shortDescText.textContent);
+      ok(shortDescText.textContent.includes("expired.example.com"),
+         "Should list hostname in error message.");
 
-  let message = await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let shortDescText = doc.getElementById("errorShortDescText");
-    info("Main error text: " + shortDescText.textContent);
-    ok(shortDescText.textContent.includes("expired.example.com"),
-       "Should list hostname in error message.");
+      let advancedButton = doc.getElementById("advancedButton");
+      advancedButton.click();
+      let el = doc.getElementById("errorCode");
+      return { textContent: el.textContent, tagName: el.tagName };
+    });
+    is(message.textContent, "SEC_ERROR_EXPIRED_CERTIFICATE",
+       "Correct error message found");
+    is(message.tagName, "a", "Error message is a link");
 
-    let advancedButton = doc.getElementById("advancedButton");
-    advancedButton.click();
-    let el = doc.getElementById("errorCode");
-    return { textContent: el.textContent, tagName: el.tagName };
-  });
-  is(message.textContent, "SEC_ERROR_EXPIRED_CERTIFICATE",
-     "Correct error message found");
-  is(message.tagName, "a", "Error message is a link");
+    message = await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
 
-  message = await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let errorCode = doc.getElementById("errorCode");
-    errorCode.click();
-    let div = doc.getElementById("certificateErrorDebugInformation");
-    let text = doc.getElementById("certificateErrorText");
+      let errorCode = doc.getElementById("errorCode");
+      errorCode.click();
+      let div = doc.getElementById("certificateErrorDebugInformation");
+      let text = doc.getElementById("certificateErrorText");
 
-    let serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
-                     .getService(Ci.nsISerializationHelper);
-    let serializable =  docShell.failedChannel.securityInfo
-                                .QueryInterface(Ci.nsITransportSecurityInfo)
-                                .QueryInterface(Ci.nsISerializable);
-    let serializedSecurityInfo = serhelper.serializeToString(serializable);
-    return {
-      divDisplay: content.getComputedStyle(div).display,
-      text: text.textContent,
-      securityInfoAsString: serializedSecurityInfo
-    };
-  });
-  isnot(message.divDisplay, "none", "Debug information is visible");
-  ok(message.text.includes(BAD_CERT), "Correct URL found");
-  ok(message.text.includes("Certificate has expired"),
-     "Correct error message found");
-  ok(message.text.includes("HTTP Strict Transport Security: false"),
-     "Correct HSTS value found");
-  ok(message.text.includes("HTTP Public Key Pinning: false"),
-     "Correct HPKP value found");
-  let certChain = getCertChain(message.securityInfoAsString);
-  ok(message.text.includes(certChain), "Found certificate chain");
+      let serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
+                       .getService(Ci.nsISerializationHelper);
+      let serializable =  doc.docShell.failedChannel.securityInfo
+                                      .QueryInterface(Ci.nsITransportSecurityInfo)
+                                      .QueryInterface(Ci.nsISerializable);
+      let serializedSecurityInfo = serhelper.serializeToString(serializable);
+      return {
+        divDisplay: content.getComputedStyle(div).display,
+        text: text.textContent,
+        securityInfoAsString: serializedSecurityInfo
+      };
+    });
+    isnot(message.divDisplay, "none", "Debug information is visible");
+    ok(message.text.includes(BAD_CERT), "Correct URL found");
+    ok(message.text.includes("Certificate has expired"),
+       "Correct error message found");
+    ok(message.text.includes("HTTP Strict Transport Security: false"),
+       "Correct HSTS value found");
+    ok(message.text.includes("HTTP Public Key Pinning: false"),
+       "Correct HPKP value found");
+    let certChain = getCertChain(message.securityInfoAsString);
+    ok(message.text.includes(certChain), "Found certificate chain");
 
-  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  }
 });
 
 add_task(async function checkAdvancedDetailsForHSTS() {
   info("Loading a bad STS cert page and verifying the advanced details section");
-  let browser;
-  let certErrorLoaded;
-  await BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
-    gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, BAD_STS_CERT);
-    browser = gBrowser.selectedBrowser;
-    certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
-  }, false);
+  for (let useFrame of [false, true]) {
+    let tab = await openErrorPage(BAD_STS_CERT, useFrame);
+    let browser = tab.linkedBrowser;
 
-  info("Loading and waiting for the cert error");
-  await certErrorLoaded;
+    let message = await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
 
-  let message = await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let advancedButton = doc.getElementById("advancedButton");
-    advancedButton.click();
-    let ec = doc.getElementById("errorCode");
-    let cdl = doc.getElementById("cert_domain_link");
-    return {
-      ecTextContent: ec.textContent,
-      ecTagName: ec.tagName,
-      cdlTextContent: cdl.textContent,
-      cdlTagName: cdl.tagName
-    };
-  });
+      let advancedButton = doc.getElementById("advancedButton");
+      advancedButton.click();
+      let ec = doc.getElementById("errorCode");
+      let cdl = doc.getElementById("cert_domain_link");
+      return {
+        ecTextContent: ec.textContent,
+        ecTagName: ec.tagName,
+        cdlTextContent: cdl.textContent,
+        cdlTagName: cdl.tagName
+      };
+    });
+
+    const badStsUri = Services.io.newURI(BAD_STS_CERT);
+    is(message.ecTextContent, "SSL_ERROR_BAD_CERT_DOMAIN",
+       "Correct error message found");
+    is(message.ecTagName, "a", "Error message is a link");
+    const url = badStsUri.prePath.slice(badStsUri.prePath.indexOf(".") + 1);
+    is(message.cdlTextContent, url,
+       "Correct cert_domain_link contents found");
+    is(message.cdlTagName, "a", "cert_domain_link is a link");
+
+    message = await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
 
-  const badStsUri = Services.io.newURI(BAD_STS_CERT);
-  is(message.ecTextContent, "SSL_ERROR_BAD_CERT_DOMAIN",
-     "Correct error message found");
-  is(message.ecTagName, "a", "Error message is a link");
-  const url = badStsUri.prePath.slice(badStsUri.prePath.indexOf(".") + 1);
-  is(message.cdlTextContent, url,
-     "Correct cert_domain_link contents found");
-  is(message.cdlTagName, "a", "cert_domain_link is a link");
-
-  message = await ContentTask.spawn(browser, null, async function() {
-    let doc = content.document;
-    let errorCode = doc.getElementById("errorCode");
-    errorCode.click();
-    let div = doc.getElementById("certificateErrorDebugInformation");
-    let text = doc.getElementById("certificateErrorText");
+      let errorCode = doc.getElementById("errorCode");
+      errorCode.click();
+      let div = doc.getElementById("certificateErrorDebugInformation");
+      let text = doc.getElementById("certificateErrorText");
 
-    let serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
-                     .getService(Ci.nsISerializationHelper);
-    let serializable =  docShell.failedChannel.securityInfo
-                                .QueryInterface(Ci.nsITransportSecurityInfo)
-                                .QueryInterface(Ci.nsISerializable);
-    let serializedSecurityInfo = serhelper.serializeToString(serializable);
-    return {
-      divDisplay: content.getComputedStyle(div).display,
-      text: text.textContent,
-      securityInfoAsString: serializedSecurityInfo
-    };
-  });
-  isnot(message.divDisplay, "none", "Debug information is visible");
-  ok(message.text.includes(badStsUri.spec), "Correct URL found");
-  ok(message.text.includes("requested domain name does not match the server\u2019s certificate"),
-     "Correct error message found");
-  ok(message.text.includes("HTTP Strict Transport Security: false"),
-     "Correct HSTS value found");
-  ok(message.text.includes("HTTP Public Key Pinning: true"),
-     "Correct HPKP value found");
-  let certChain = getCertChain(message.securityInfoAsString);
-  ok(message.text.includes(certChain), "Found certificate chain");
+      let serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
+                       .getService(Ci.nsISerializationHelper);
+      let serializable =  doc.docShell.failedChannel.securityInfo
+                                      .QueryInterface(Ci.nsITransportSecurityInfo)
+                                      .QueryInterface(Ci.nsISerializable);
+      let serializedSecurityInfo = serhelper.serializeToString(serializable);
+      return {
+        divDisplay: content.getComputedStyle(div).display,
+        text: text.textContent,
+        securityInfoAsString: serializedSecurityInfo
+      };
+    });
+    isnot(message.divDisplay, "none", "Debug information is visible");
+    ok(message.text.includes(badStsUri.spec), "Correct URL found");
+    ok(message.text.includes("requested domain name does not match the server\u2019s certificate"),
+       "Correct error message found");
+    ok(message.text.includes("HTTP Strict Transport Security: false"),
+       "Correct HSTS value found");
+    ok(message.text.includes("HTTP Public Key Pinning: true"),
+       "Correct HPKP value found");
+    let certChain = getCertChain(message.securityInfoAsString);
+    ok(message.text.includes(certChain), "Found certificate chain");
 
-  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  }
 });
 
 add_task(async function checkUnknownIssuerLearnMoreLink() {
   info("Loading a cert error for self-signed pages and checking the correct link is shown");
-  let browser;
-  let certErrorLoaded;
-  await BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
-    gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, UNKNOWN_ISSUER);
-    browser = gBrowser.selectedBrowser;
-    certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
-  }, false);
+  for (let useFrame of [false, true]) {
+    let tab = await openErrorPage(UNKNOWN_ISSUER, useFrame);
+    let browser = tab.linkedBrowser;
 
-  info("Loading and waiting for the cert error");
-  await certErrorLoaded;
+    let href = await ContentTask.spawn(browser, {frame: useFrame}, async function({frame}) {
+      let doc = frame ? content.document.querySelector("iframe").contentDocument : content.document;
+      let learnMoreLink = doc.getElementById("learnMoreLink");
+      return learnMoreLink.href;
+    });
+    ok(href.endsWith("security-error"), "security-error in the Learn More URL");
 
-  let href = await ContentTask.spawn(browser, null, async function() {
-    let learnMoreLink = content.document.getElementById("learnMoreLink");
-    return learnMoreLink.href;
-  });
-  ok(href.endsWith("security-error"), "security-error in the Learn More URL");
-
-  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  }
 });
 
 function getCertChain(securityInfoAsString) {
   let certChain = "";
   const serhelper = Cc["@mozilla.org/network/serialization-helper;1"]
                        .getService(Ci.nsISerializationHelper);
   let securityInfo = serhelper.deserializeObject(securityInfoAsString);
   securityInfo.QueryInterface(Ci.nsITransportSecurityInfo);
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/about/dummy_page.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>Dummy test page</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8"></meta>
+</head>
+<body>
+<p>Dummy test page</p>
+</body>
+</html>