diff options
Diffstat (limited to 'mobile/android/fenix/app/src/main/assets')
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}&page={startPage?}&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; +} |