// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This is the shared code for security interstitials. It is used for both SSL
// interstitials and Safe Browsing interstitials.
/**
* @typedef {{
* dontProceed: function(),
* proceed: function(),
* showMoreSection: function(),
* openHelpCenter: function(),
* openDiagnostic: function(),
* reload: function(),
* openDateSettings: function(),
* openLogin: function(),
* doReport: function(),
* dontReport: function(),
* openReportingPrivacy: function(),
* openWhitepaper: function(),
* reportPhishingError: function(),
* }}
*/
// eslint-disable-next-line no-var
var certificateErrorPageController;
// Should match security_interstitials::SecurityInterstitialCommand
/** @enum {number} */
export const SecurityInterstitialCommandId = {
CMD_DONT_PROCEED: 0,
CMD_PROCEED: 1,
// Ways for user to get more information
CMD_SHOW_MORE_SECTION: 2,
CMD_OPEN_HELP_CENTER: 3,
CMD_OPEN_DIAGNOSTIC: 4,
// Primary button actions
CMD_RELOAD: 5,
CMD_OPEN_DATE_SETTINGS: 6,
CMD_OPEN_LOGIN: 7,
// Safe Browsing Extended Reporting
CMD_DO_REPORT: 8,
CMD_DONT_REPORT: 9,
CMD_OPEN_REPORTING_PRIVACY: 10,
CMD_OPEN_WHITEPAPER: 11,
// Report a phishing error.
CMD_REPORT_PHISHING_ERROR: 12,
// Open enhanced protection settings.
CMD_OPEN_ENHANCED_PROTECTION_SETTINGS: 13,
};
export const HIDDEN_CLASS = 'hidden';
/**
* A convenience method for sending commands to the parent page.
* @param {SecurityInterstitialCommandId} cmd The command to send.
*/
export function sendCommand(cmd) {
if (window.certificateErrorPageController) {
switch (cmd) {
case SecurityInterstitialCommandId.CMD_DONT_PROCEED:
certificateErrorPageController.dontProceed();
break;
case SecurityInterstitialCommandId.CMD_PROCEED:
certificateErrorPageController.proceed();
break;
case SecurityInterstitialCommandId.CMD_SHOW_MORE_SECTION:
certificateErrorPageController.showMoreSection();
break;
case SecurityInterstitialCommandId.CMD_OPEN_HELP_CENTER:
certificateErrorPageController.openHelpCenter();
break;
case SecurityInterstitialCommandId.CMD_OPEN_DIAGNOSTIC:
certificateErrorPageController.openDiagnostic();
break;
case SecurityInterstitialCommandId.CMD_RELOAD:
certificateErrorPageController.reload();
break;
case SecurityInterstitialCommandId.CMD_OPEN_DATE_SETTINGS:
certificateErrorPageController.openDateSettings();
break;
case SecurityInterstitialCommandId.CMD_OPEN_LOGIN:
certificateErrorPageController.openLogin();
break;
case SecurityInterstitialCommandId.CMD_DO_REPORT:
certificateErrorPageController.doReport();
break;
case SecurityInterstitialCommandId.CMD_DONT_REPORT:
certificateErrorPageController.dontReport();
break;
case SecurityInterstitialCommandId.CMD_OPEN_REPORTING_PRIVACY:
certificateErrorPageController.openReportingPrivacy();
break;
case SecurityInterstitialCommandId.CMD_OPEN_WHITEPAPER:
certificateErrorPageController.openWhitepaper();
break;
case SecurityInterstitialCommandId.CMD_REPORT_PHISHING_ERROR:
certificateErrorPageController.reportPhishingError();
break;
case SecurityInterstitialCommandId.CMD_OPEN_ENHANCED_PROTECTION_SETTINGS:
certificateErrorPageController.openEnhancedProtectionSettings();
break;
}
return;
}
// <if expr="not is_ios">
if (window.domAutomationController) {
window.domAutomationController.send(cmd);
}
// </if>
// <if expr="is_ios">
// Send commands for iOS committed interstitials.
/** @suppress {undefinedVars|missingProperties} */ (function() {
window.webkit.messageHandlers['IOSInterstitialMessage'].postMessage(
{'command': cmd.toString()});
})();
// </if>
}
/**
* Call this to stop clicks on <a href="#"> links from scrolling to the top of
* the page (and possibly showing a # in the link).
*/
export function preventDefaultOnPoundLinkClicks() {
const anchors = document.body.querySelectorAll('a[href="#"]');
for (const anchor of anchors) {
anchor.addEventListener('click', e => e.preventDefault());
}
}
// <if expr="is_ios">
/**
* Ensures interstitial pages on iOS aren't loaded from cache, which breaks
* the commands due to ErrorRetryStateMachine::DidFailProvisionalNavigation
* not getting triggered.
*/
function setupIosRefresh() {
const load = () => {
window.location.replace(loadTimeData.getString('url_to_reload'));
};
window.addEventListener('pageshow', function(e) {
window.onpageshow = load;
}, {once: true});
}
// </if>
// <if expr="is_ios">
document.addEventListener('DOMContentLoaded', setupIosRefresh);
// </if>