diff --git a/app/src/main/assets/highRiskErrorPages.js b/app/src/main/assets/highRiskErrorPages.js new file mode 100644 index 000000000..f4af7d3b0 --- /dev/null +++ b/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/app/src/main/assets/high_risk_error_pages.html b/app/src/main/assets/high_risk_error_pages.html index c74469ca7..c73012b14 100644 --- a/app/src/main/assets/high_risk_error_pages.html +++ b/app/src/main/assets/high_risk_error_pages.html @@ -8,6 +8,7 @@ + @@ -29,14 +30,9 @@ - + - - + diff --git a/app/src/main/assets/lowMediumErrorPages.js b/app/src/main/assets/lowMediumErrorPages.js new file mode 100644 index 000000000..3fc18a9ef --- /dev/null +++ b/app/src/main/assets/lowMediumErrorPages.js @@ -0,0 +1,116 @@ +/* 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); +}; + +/** + * 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; + document.getElementById('errorTryAgain').innerHTML = queryMap.button; + 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; + } +}; + +let advancedVisible = false; + +/** + * Used to show or hide the "advanced" 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 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'; + } else { + document.getElementById('advancedPanelBackButton').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)); +}); + +parseQuery(document.documentURI); diff --git a/app/src/main/assets/low_and_medium_risk_error_pages.html b/app/src/main/assets/low_and_medium_risk_error_pages.html index baa08deff..59e662987 100644 --- a/app/src/main/assets/low_and_medium_risk_error_pages.html +++ b/app/src/main/assets/low_and_medium_risk_error_pages.html @@ -8,6 +8,7 @@ + - + @@ -52,7 +52,6 @@ >
@@ -100,5 +98,5 @@ } - + diff --git a/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt b/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt index e8ef423c8..063a73cf2 100644 --- a/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt +++ b/app/src/main/java/org/mozilla/fenix/AppRequestInterceptor.kt @@ -72,7 +72,7 @@ class AppRequestInterceptor( htmlResource = riskLevel.htmlRes ) - return RequestInterceptor.ErrorResponse.Uri(errorPageUri) + return RequestInterceptor.ErrorResponse(errorPageUri) } /** diff --git a/app/src/test/java/org/mozilla/fenix/AppRequestInterceptorTest.kt b/app/src/test/java/org/mozilla/fenix/AppRequestInterceptorTest.kt index b24cbee29..c5be4053a 100644 --- a/app/src/test/java/org/mozilla/fenix/AppRequestInterceptorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/AppRequestInterceptorTest.kt @@ -200,7 +200,7 @@ class AppRequestInterceptorTest { private fun createActualErrorPage(error: ErrorType): String { val errorPage = interceptor.onErrorRequest(session = mockk(), errorType = error, uri = null) - as RequestInterceptor.ErrorResponse.Uri + as RequestInterceptor.ErrorResponse return errorPage.uri } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index c706cedb7..23f4430eb 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "69.0.20201203202830" + const val VERSION = "69.0.20201204143142" }