michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: dump("######################## BrowserElementChildPreload.js loaded\n"); michael@0: michael@0: var BrowserElementIsReady = false; michael@0: michael@0: let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; michael@0: Cu.import("resource://gre/modules/XPCOMUtils.jsm"); michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/BrowserElementPromptService.jsm"); michael@0: michael@0: // Event whitelisted for bubbling. michael@0: let whitelistedEvents = [ michael@0: Ci.nsIDOMKeyEvent.DOM_VK_ESCAPE, // Back button. michael@0: Ci.nsIDOMKeyEvent.DOM_VK_SLEEP, // Power button. michael@0: Ci.nsIDOMKeyEvent.DOM_VK_CONTEXT_MENU, michael@0: Ci.nsIDOMKeyEvent.DOM_VK_F5, // Search button. michael@0: Ci.nsIDOMKeyEvent.DOM_VK_PAGE_UP, // Volume up. michael@0: Ci.nsIDOMKeyEvent.DOM_VK_PAGE_DOWN // Volume down. michael@0: ]; michael@0: michael@0: function debug(msg) { michael@0: //dump("BrowserElementChildPreload - " + msg + "\n"); michael@0: } michael@0: michael@0: function sendAsyncMsg(msg, data) { michael@0: // Ensure that we don't send any messages before BrowserElementChild.js michael@0: // finishes loading. michael@0: if (!BrowserElementIsReady) michael@0: return; michael@0: michael@0: if (!data) { michael@0: data = { }; michael@0: } michael@0: michael@0: data.msg_name = msg; michael@0: sendAsyncMessage('browser-element-api:call', data); michael@0: } michael@0: michael@0: function sendSyncMsg(msg, data) { michael@0: // Ensure that we don't send any messages before BrowserElementChild.js michael@0: // finishes loading. michael@0: if (!BrowserElementIsReady) michael@0: return; michael@0: michael@0: if (!data) { michael@0: data = { }; michael@0: } michael@0: michael@0: data.msg_name = msg; michael@0: return sendSyncMessage('browser-element-api:call', data); michael@0: } michael@0: michael@0: let CERTIFICATE_ERROR_PAGE_PREF = 'security.alternate_certificate_error_page'; michael@0: michael@0: let NS_ERROR_MODULE_BASE_OFFSET = 0x45; michael@0: let NS_ERROR_MODULE_SECURITY= 21; michael@0: function NS_ERROR_GET_MODULE(err) { michael@0: return ((((err) >> 16) - NS_ERROR_MODULE_BASE_OFFSET) & 0x1fff); michael@0: } michael@0: michael@0: function NS_ERROR_GET_CODE(err) { michael@0: return ((err) & 0xffff); michael@0: } michael@0: michael@0: let SEC_ERROR_BASE = Ci.nsINSSErrorsService.NSS_SEC_ERROR_BASE; michael@0: let SEC_ERROR_UNKNOWN_ISSUER = (SEC_ERROR_BASE + 13); michael@0: let SEC_ERROR_CA_CERT_INVALID = (SEC_ERROR_BASE + 36); michael@0: let SEC_ERROR_UNTRUSTED_ISSUER = (SEC_ERROR_BASE + 20); michael@0: let SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE = (SEC_ERROR_BASE + 30); michael@0: let SEC_ERROR_UNTRUSTED_CERT = (SEC_ERROR_BASE + 21); michael@0: let SEC_ERROR_EXPIRED_CERTIFICATE = (SEC_ERROR_BASE + 11); michael@0: let SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED = (SEC_ERROR_BASE + 176); michael@0: michael@0: let SSL_ERROR_BASE = Ci.nsINSSErrorsService.NSS_SSL_ERROR_BASE; michael@0: let SSL_ERROR_BAD_CERT_DOMAIN = (SSL_ERROR_BASE + 12); michael@0: michael@0: function getErrorClass(errorCode) { michael@0: let NSPRCode = -1 * NS_ERROR_GET_CODE(errorCode); michael@0: michael@0: switch (NSPRCode) { michael@0: case SEC_ERROR_UNKNOWN_ISSUER: michael@0: case SEC_ERROR_UNTRUSTED_ISSUER: michael@0: case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE: michael@0: case SEC_ERROR_UNTRUSTED_CERT: michael@0: case SSL_ERROR_BAD_CERT_DOMAIN: michael@0: case SEC_ERROR_EXPIRED_CERTIFICATE: michael@0: case SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED: michael@0: case SEC_ERROR_CA_CERT_INVALID: michael@0: return Ci.nsINSSErrorsService.ERROR_CLASS_BAD_CERT; michael@0: default: michael@0: return Ci.nsINSSErrorsService.ERROR_CLASS_SSL_PROTOCOL; michael@0: } michael@0: michael@0: return null; michael@0: } michael@0: michael@0: const OBSERVED_EVENTS = [ michael@0: 'fullscreen-origin-change', michael@0: 'ask-parent-to-exit-fullscreen', michael@0: 'ask-parent-to-rollback-fullscreen', michael@0: 'xpcom-shutdown', michael@0: 'activity-done' michael@0: ]; michael@0: michael@0: /** michael@0: * The BrowserElementChild implements one half of