summaryrefslogtreecommitdiffstats
path: root/mobile/android/fenix/app/src/main/assets
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/fenix/app/src/main/assets')
-rw-r--r--mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js42
-rw-r--r--mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html38
-rw-r--r--mobile/android/fenix/app/src/main/assets/high_risk_error_style.css29
-rw-r--r--mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js146
-rw-r--r--mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html108
-rw-r--r--mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_style.css35
-rw-r--r--mobile/android/fenix/app/src/main/assets/searchplugins/reddit.xml11
-rw-r--r--mobile/android/fenix/app/src/main/assets/searchplugins/youtube.xml12
-rw-r--r--mobile/android/fenix/app/src/main/assets/shared_error_style.css150
9 files changed, 571 insertions, 0 deletions
diff --git a/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js b/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js
new file mode 100644
index 0000000000..f4af7d3b0d
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js
@@ -0,0 +1,42 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Handles the parsing of the ErrorPages URI and then passes them to injectValues
+ */
+function parseQuery(queryString) {
+ if (queryString[0] === '?') {
+ queryString = queryString.substr(1);
+ }
+ const query = Object.fromEntries(new URLSearchParams(queryString).entries());
+ injectValues(query);
+};
+
+/**
+ * Updates the HTML elements based on the queryMap
+ */
+function injectValues(queryMap) {
+ // Go through each element and inject the values
+ document.title = queryMap.title;
+ document.getElementById('errorTitleText').innerHTML = queryMap.title;
+ document.getElementById('errorShortDesc').innerHTML = queryMap.description;
+
+ // If no image is passed in, remove the element so as not to leave an empty iframe
+ const errorImage = document.getElementById('errorImage');
+ if (!queryMap.image) {
+ errorImage.remove();
+ } else {
+ errorImage.src = "resource://android/assets/" + queryMap.image;
+ }
+}
+
+document.addEventListener('DOMContentLoaded', function () {
+ if (window.history.length == 1) {
+ document.getElementById('backButton').style.display = 'none';
+ } else {
+ document.getElementById('backButton').addEventListener('click', () => window.history.back() );
+ }
+});
+
+parseQuery(document.documentURI);
diff --git a/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html b/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html
new file mode 100644
index 0000000000..c73012b143
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width; user-scalable=false;" />
+ <meta http-equiv="Content-Security-Policy" content="default-src resource:; object-src 'none'" />
+ <link rel="stylesheet" type="text/css" href="shared_error_style.css" />
+ <link rel="stylesheet" type="text/css" href="high_risk_error_style.css" />
+ </head>
+
+ <body id="errorPage" dir="auto">
+ <!-- PAGE CONTAINER (for styling purposes only) -->
+ <div id="errorPageContainer">
+ <!-- Error Image -->
+ <iframe id="errorImage" src="" frameborder="0"></iframe>
+
+ <!-- Error Title -->
+ <div id="errorTitle">
+ <h1 id="errorTitleText"></h1>
+ </div>
+
+ <!-- LONG CONTENT (the section most likely to require scrolling) -->
+ <div id="errorLongContent">
+ <div id="errorShortDesc"></div>
+ </div>
+
+ <!-- Back Button -->
+ <button id="backButton">Go back</button>
+ </div>
+ </body>
+
+ <script src="./highRiskErrorPages.js"></script>
+</html>
diff --git a/mobile/android/fenix/app/src/main/assets/high_risk_error_style.css b/mobile/android/fenix/app/src/main/assets/high_risk_error_style.css
new file mode 100644
index 0000000000..054b72916a
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/high_risk_error_style.css
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+:root {
+ --background-color: #c50042;
+ --text-color: #ffffff;
+ --primary-button-color: #e6e6eb;
+ --primary-button-text-color: #2f2c61;
+ --header-color: #ffffff;
+}
+
+p {
+ line-height: 20px;
+ margin: var(--moz-vertical-spacing) 0;
+ color: #ffffff;
+}
+
+/* On large width devices, apply specific styles here. Often triggered by landscape mode or tablets */
+@media (min-width: 550px) {
+ /* If the device is tall as well, add some padding to make content feel a bit more centered */
+ @media (min-height: 550px) {
+ #errorPageContainer {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ }
+}
diff --git a/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js b/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js
new file mode 100644
index 0000000000..760ce65868
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js
@@ -0,0 +1,146 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Handles the parsing of the ErrorPages URI and then passes them to injectValues
+ */
+function parseQuery(queryString) {
+ if (queryString[0] === '?') {
+ queryString = queryString.substr(1);
+ }
+ const query = Object.fromEntries(new URLSearchParams(queryString).entries());
+ injectValues(query);
+ updateShowSSL(query);
+ updateShowHSTS(query);
+};
+
+/**
+ * Updates the HTML elements based on the queryMap
+ */
+function injectValues(queryMap) {
+ const tryAgainButton = document.getElementById('errorTryAgain');
+ const continueHttpButton = document.getElementById("continueHttp");
+ const backFromHttpButton = document.getElementById('backFromHttp');
+
+ // Go through each element and inject the values
+ document.title = queryMap.title;
+ tryAgainButton.innerHTML = queryMap.button;
+ continueHttpButton.innerHTML = queryMap.continueHttpButton;
+ backFromHttpButton.innerHTML = queryMap.badCertGoBack;
+ document.getElementById('errorTitleText').innerHTML = queryMap.title;
+ document.getElementById('errorShortDesc').innerHTML = queryMap.description;
+ document.getElementById('advancedButton').innerHTML = queryMap.badCertAdvanced;
+ document.getElementById('badCertTechnicalInfo').innerHTML = queryMap.badCertTechInfo;
+ document.getElementById('advancedPanelBackButton').innerHTML = queryMap.badCertGoBack;
+ document.getElementById('advancedPanelAcceptButton').innerHTML = queryMap.badCertAcceptTemporary;
+
+ // If no image is passed in, remove the element so as not to leave an empty iframe
+ const errorImage = document.getElementById('errorImage');
+ if (!queryMap.image) {
+ errorImage.remove();
+ } else {
+ errorImage.src = "resource://android/assets/" + queryMap.image;
+ }
+
+ if (queryMap.showContinueHttp === "true") {
+ // On the "HTTPS-Only" error page "Try again" doesn't make sense since reloading the page
+ // will just show an error page again.
+ tryAgainButton.style.display = 'none';
+ } else {
+ continueHttpButton.style.display = 'none';
+ backFromHttpButton.style.display = 'none';
+ }
+};
+
+let advancedVisible = false;
+
+/**
+ * Used to show or hide the "accept" button based on the validity of the SSL certificate
+ */
+function updateShowSSL(queryMap) {
+ /** @type {'true' | 'false'} */
+ const showSSL = queryMap.showSSL;
+ if (typeof document.addCertException === 'undefined') {
+ document.getElementById('advancedButton').style.display='none';
+ } else {
+ if (showSSL === 'true') {
+ document.getElementById('advancedButton').style.display='block';
+ } else {
+ document.getElementById('advancedButton').style.display='none';
+ }
+ }
+};
+
+/**
+ * Used to show or hide the "accept" button based for the HSTS error page
+ */
+function updateShowHSTS(queryMap) {
+ const showHSTS = queryMap.showHSTS;
+ if (showHSTS === 'true') {
+ document.getElementById('advancedButton').style.display='block';
+ document.getElementById('advancedPanelAcceptButton').style.display='none';
+ }
+};
+
+/**
+ * Used to display information about the SSL certificate in `error_pages.html`
+ */
+function toggleAdvancedAndScroll() {
+ const advancedPanel = document.getElementById('badCertAdvancedPanel');
+ if (advancedVisible) {
+ advancedPanel.style.display='none';
+ } else {
+ advancedPanel.style.display='block';
+ }
+ advancedVisible = !advancedVisible;
+
+ const horizontalLine = document.getElementById("horizontalLine");
+ const advancedPanelAcceptButton = document.getElementById(
+ "advancedPanelAcceptButton"
+ );
+ const badCertAdvancedPanel = document.getElementById(
+ "badCertAdvancedPanel"
+ );
+
+ // We know that the button is being displayed
+ if (badCertAdvancedPanel.style.display === "block") {
+ horizontalLine.hidden = false;
+ advancedPanelAcceptButton.scrollIntoView({
+ behavior: "smooth",
+ block: "center",
+ inline: "nearest",
+ });
+ } else {
+ horizontalLine.hidden = true;
+ }
+};
+
+/**
+ * Used to bypass an SSL pages in `error_pages.html`
+ */
+async function acceptAndContinue(temporary) {
+ try {
+ await document.addCertException(temporary);
+ location.reload();
+ } catch (error) {
+ console.error("Unexpected error: " + error);
+ }
+};
+
+document.addEventListener('DOMContentLoaded', function () {
+ if (window.history.length == 1) {
+ document.getElementById('advancedPanelBackButton').style.display = 'none';
+ document.getElementById('backFromHttp').style.display = 'none';
+ } else {
+ document.getElementById('advancedPanelBackButton').addEventListener('click', () => window.history.back());
+ document.getElementById('backFromHttp').addEventListener('click', () => window.history.back());
+ }
+
+ document.getElementById('errorTryAgain').addEventListener('click', () => window.location.reload());
+ document.getElementById('advancedButton').addEventListener('click', toggleAdvancedAndScroll);
+ document.getElementById('advancedPanelAcceptButton').addEventListener('click', () => acceptAndContinue(true));
+ document.getElementById('continueHttp').addEventListener('click', () => document.reloadWithHttpsOnlyException());
+});
+
+parseQuery(document.documentURI);
diff --git a/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html b/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html
new file mode 100644
index 0000000000..62e0c70988
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width; user-scalable=false;" />
+ <meta http-equiv="Content-Security-Policy" content="default-src resource:; object-src 'none'" />
+ <link rel="stylesheet" type="text/css" href="shared_error_style.css" />
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="low_and_medium_risk_error_style.css"
+ />
+ </head>
+
+ <body id="errorPage" dir="auto">
+ <!-- PAGE CONTAINER (for styling purposes only) -->
+ <div id="errorPageContainer">
+ <!-- Error Image -->
+ <iframe id="errorImage" src="" frameborder="0"></iframe>
+
+ <!-- Error Title -->
+ <div id="errorTitle">
+ <h1 id="errorTitleText"></h1>
+ </div>
+
+ <!-- LONG CONTENT (the section most likely to require scrolling) -->
+ <div id="errorLongContent">
+ <div id="errorShortDesc"></div>
+ </div>
+
+ <!-- Retry Button -->
+ <button id="errorTryAgain"></button>
+
+ <!-- Advanced Button -->
+ <button
+ id="advancedButton"
+ class="buttonSecondary hidden"
+ ></button>
+
+ <!-- "Go back" Button (For HTTPS-Only error page only) -->
+ <button id="backFromHttp"></button>
+
+ <!-- "Continue to HTTP site" Button (For HTTPS-Only error page only) -->
+ <button id="continueHttp" class="buttonSecondary"></button>
+
+ <hr id="horizontalLine" hidden />
+ <div id="advancedPanelContainer">
+ <div id="badCertAdvancedPanel" hidden class="advanced-panel">
+ <p id="badCertTechnicalInfo"></p>
+ <div
+ id="advancedPanelBackButtonContainer"
+ class="advancedPanelButtonContainer"
+ >
+ <button
+ id="advancedPanelBackButton"
+ ></button>
+ </div>
+ <div
+ id="advancedPanelAcceptButtonContainer"
+ class="advancedPanelButtonContainer"
+ >
+ <button
+ id="advancedPanelAcceptButton"
+ class="buttonSecondary"
+ ></button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </body>
+
+ <script type="text/javascript">
+ if (window.history.length == 1) {
+ document.getElementById('advancedPanelBackButton').style.display = 'none';
+ }
+
+ function toggleAdvancedAndScroll() {
+ toggleAdvanced();
+
+ const horizontalLine = document.getElementById("horizontalLine");
+ const advancedPanelAcceptButton = document.getElementById(
+ "advancedPanelAcceptButton"
+ );
+ const badCertAdvancedPanel = document.getElementById(
+ "badCertAdvancedPanel"
+ );
+
+ // We know that the button is being displayed
+ if (badCertAdvancedPanel.style.display === "block") {
+ horizontalLine.hidden = false;
+ advancedPanelAcceptButton.scrollIntoView({
+ behavior: "smooth",
+ block: "center",
+ inline: "nearest",
+ });
+ } else {
+ horizontalLine.hidden = true;
+ }
+ }
+ </script>
+
+ <script src="./lowMediumErrorPages.js"></script>
+</html>
diff --git a/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_style.css b/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_style.css
new file mode 100644
index 0000000000..2b2d2792af
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_style.css
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+:root {
+ --background-color: #f9f9fb;
+ --text-color: #15141a;
+ --primary-button-color: #312a65;
+ --primary-button-text-color: #ffffff;
+ --secondary-button-color: #e0e0e6;
+ --secondary-button-text-color: #20123a;
+ --header-color: #312a65;
+}
+
+#badCertTechnicalInfo {
+ overflow: auto;
+ white-space: pre-line;
+}
+
+#advancedPanelButtonContainer {
+ display: flex;
+ justify-content: center;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background-color: #15141a;
+ --text-color: #fbfbfe;
+ --primary-button-color: #9059ff;
+ --primary-button-text-color: #ffffff;
+ --secondary-button-color: #e0e0e6;
+ --secondary-button-text-color: #312a65;
+ --header-color: #fbfbfe;
+ }
+}
diff --git a/mobile/android/fenix/app/src/main/assets/searchplugins/reddit.xml b/mobile/android/fenix/app/src/main/assets/searchplugins/reddit.xml
new file mode 100644
index 0000000000..4f761ba236
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/searchplugins/reddit.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+ <ShortName>Reddit</ShortName>
+ <Description>Search Reddit</Description>
+ <LongName>Reddit Search</LongName>
+ <Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAD9UlEQVR4AcyYA9QkSwyF69k2j59te/Bs27Zt2/batm3btu1v+55eN6p6uPec/P/MlJJCchNTCHCj2YGsuYq0+dqTxp4MJ2VmkDZLkfifh6tNfdRXY0w5weVmD1LmHtKmticLvc8kEY3RWM2huUqn+JVmR9LmDU/mSZFCiObSnJq7eIrfaLYibR7yZJIWLYZobq2htQqr/BXmIFKmuyeUSLprzcIonzanW3a9mKdxen7Kp8wdnizWhGWSxdIhH+XZTOSOxNem1DtvkcXSyf3BFvrOP3A0PHMOXLFjsO3q3eCTO+C7x+C6PWPfhHSzusqieJuxg0FYsRyG94YGv8IX98FjJ8PwXqzD1LGxRki3WBcrH1xw5bXDq1bByyl4/gL4/SVoVwMpG4rvH7d5p4ciI2xR3OVLl8DyZXDZ9sG2bx4mAF0lm3sNi9gK5UV5gH++BkO7h7ddtQuMG8I6TBoJ1+zuEiPeCBCzPLlNtHSsA3V/jG6/cmf4/F748n5dN2futBEBFCMsmgucMQk+vasYc9+z4fWpXRTlbz0YhHsPLwbVqL0uGYnm83nKO9fB/NmQ2qIYBiyU7kbZUcEmlaIPHgNvXQ3fPAI9m8O08b5rfPsaeOg4SG9ZMCOku1GKl9ckl24LH9wMnerBvFlYoRNR3w9v1dh8T+FrGdDYaWdfzcJvL/o7md0GMlvDL8/B7GnkjDnT4feXfUMyW/knpzXeuELfXQxoLAOGx3YSf+nbho0wsi+M6k/BoFgwtAcbYVAXa0yQ7kYVg9hO1T6nbGj4m+0UZugEltqIWNkwY5LtBJbaDZg0iliIlInviBaIsOl7dF/1UV+Nie8rzJ1hNcB+hWp9SwykyEb9pWAE1BYgerFo+o/1CtkfsXarfwciIC4T6B8Jtbn2HT0Art/b+ojd3KiCz6ypbrv6StrxBCyndeVOTm7UPZDNmmK91/4bGEck1ObSVwnQZds5BjJXKjGgIyWDDHOmEq5krupnlAytKrmTOWc6fduhSsopCZ44zZ1OJ0po/n+PUMiwmw+Av9+AxQuJxLKlUOMruGEfWDCHUDT5O3lC45xSyht1aUAoWlb0SyJyq8oD/n8X6v8Ctb+DX1+Ad6+Ha/eAq3eFRr8TiiHdlPwnTykTJfVioo3+iKbKCj6iyo+cCDcf6J+M8oD3bhC3iWavoth+THFP6vMqq3x8O0yfQN6YOxO+fyKY6NjLKvkXtkS1lRMoaiaGSij/vGWrxLkXtvIuLerK/Pg0tKqsXMFnkksX+w9XQXDMQGhf06/MPX1WDnny+tJi4uJu+WX1EIO7Q3p4fUhPcAzpKaaRO8k38NOsoxPd9F9qMLrYY6gttwEAUidatlp2alsAAAAASUVORK5CYII=</Image>
+ <Url type="text/html" method="get" template="https://www.reddit.com/search/?q={searchTerms}"/>
+</SearchPlugin>
diff --git a/mobile/android/fenix/app/src/main/assets/searchplugins/youtube.xml b/mobile/android/fenix/app/src/main/assets/searchplugins/youtube.xml
new file mode 100644
index 0000000000..60a7897ae4
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/searchplugins/youtube.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+ <ShortName>YouTube</ShortName>
+ <Description>Search for videos on YouTube</Description>
+ <Tags>youtube video</Tags>
+ <Image height="16" width="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABa0lEQVR42u2YoYoCURSGBzSLk62L0TJvsEywWAxabRaFlQ2GQdY38AF8Ci0Gsy9gECybRU0GkQn++4fLbjm7K8wdmQPng6+I3rkfqHPnBIZhGIbxCAiCkL7QiL7SFu3QHu3TIX2nY5rQCf1wTtxrY/eeoftMz63RcmtG7hqhj82+0RX9pDeKJ3tz1165vVQf3XxMTxQF80Tj/zbfoFeKgnqljb8C1hQFd/3b5mv0riDgTmtSQJtCiW0pIFEUkEgBc0UBcylgkXnhKAIqlWcELKSATeaFp1PgeAT6faBUyjNgIwXsfQR8s90CcZxXwF4KOHgM+GG5BOp13wEHKeDiP8CRpsBsBoShr4CLFJB6DJA5n4HBACiXswakUsA9hwCZ3Q5oNjPdjfUH6P8K6f8R6/8b1X8j03+U0H+Y03+c1v9Ao/+RUv9Dvf6xiv7Blv7RojzcHRVouDui1TzG610P4/WuOF43DMMwjAf4ArcA0xFiL427AAAAAElFTkSuQmCC</Image>
+ <Url type="text/html" template="https://www.youtube.com/results?search_query={searchTerms}&amp;page={startPage?}&amp;utm_source=opensearch" />
+ <Query role="example" searchTerms="cat" />
+</SearchPlugin>
diff --git a/mobile/android/fenix/app/src/main/assets/shared_error_style.css b/mobile/android/fenix/app/src/main/assets/shared_error_style.css
new file mode 100644
index 0000000000..5753b00a78
--- /dev/null
+++ b/mobile/android/fenix/app/src/main/assets/shared_error_style.css
@@ -0,0 +1,150 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+:root {
+ --moz-vertical-spacing: 10px;
+ --moz-background-height: 32px;
+ /* Default values just to indicate what color variables we use */
+ --background-color: #f9f9fb;
+ --text-color: #15141a;
+ --primary-button-color: #312a65;
+ --primary-button-text-color: #ffffff;
+ --secondary-button-color: #e0e0e6;
+ --secondary-button-text-color: #20123a;
+ --header-color: var(--text-color);
+}
+
+html,
+body {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+}
+
+body {
+ background-size: 64px var(--moz-background-height);
+ background-repeat: repeat-x;
+ background-color: var(--background-color);
+ color: var(--text-color);
+ padding: 0 40px;
+ font-size: 14px;
+ font-family: sharp-sans, sans-serif;
+ -moz-text-size-adjust: none;
+}
+
+ul {
+ /* Shove the list indicator so that its left aligned, but use outside so that text
+ * doesn't don't wrap the text around it */
+ padding: 0 1em;
+ margin: 0;
+ list-style-type: disc;
+}
+
+#errorShortDesc,
+li:not(:last-of-type) {
+ /* Margins between the li and buttons below it won't be collapsed. Remove the bottom margin here. */
+ margin: var(--moz-vertical-spacing) 0;
+}
+
+h1 {
+ margin: 0;
+ padding: 0;
+ margin: var(--moz-vertical-spacing) 0;
+ color: var(--header-color);
+ font-weight: bold;
+ font-size: 20px;
+ line-height: 24px;
+}
+
+p {
+ line-height: 20px;
+ margin: var(--moz-vertical-spacing) 0;
+}
+
+button {
+ display: block;
+ height: 36px;
+ box-sizing: content-box;
+ width: 100%;
+ border: 0;
+ padding: 6px 0px;
+ font-family: inherit;
+ background-color: transparent;
+ color: var(--primary-button-text-color);
+ font-size: 14px;
+ font-weight: bold;
+ margin: 0 auto;
+ text-align: center;
+ position: relative;
+}
+
+button::after {
+ background-color: var(--primary-button-color);
+ content: '';
+ border-radius: 5px;
+ display: block;
+ position: absolute;
+ top: 6px;
+ left: 0px;
+ right: 0px;
+ bottom: 6px;
+ z-index: -1;
+}
+
+hr {
+ height: 1px;
+ border: 0;
+ background: rgba(21, 20, 26, 0.12);
+ margin: 32px 0;
+}
+
+.horizontalLine {
+ margin-left: -40px;
+ margin-right: -40px;
+}
+
+.buttonSecondary {
+ background-color: transparent;
+ color: var(--secondary-button-text-color);
+}
+
+.buttonSecondary::after {
+ background-color: var(--secondary-button-color);
+}
+
+#errorPageContainer {
+ /* If the page is greater than 550px center the content.
+ * This number should be kept in sync with the media query for tablets below */
+ max-width: 550px;
+ margin: 0 auto;
+ min-height: 100%;
+}
+
+/* On large width devices, apply specific styles here. Often triggered by landscape mode or tablets */
+@media (min-width: 550px) {
+ button,
+ .buttonSecondary {
+ margin: var(--moz-vertical-spacing) auto;
+ min-width: 400px;
+ width: auto;
+ }
+
+ /* If the device is tall as well, add some padding to make content feel a bit more centered */
+ @media (min-height: 550px) {
+ #errorPageContainer {
+ padding-top: 64px;
+ min-height: calc(100% - 64px);
+ }
+ }
+}
+
+#badCertTechnicalInfo {
+ overflow: auto;
+ white-space: pre-line;
+}
+
+#advancedPanelButtonContainer {
+ display: flex;
+ justify-content: center;
+}