From 234818e89c2126716af2b2dcbbbe3fb4633478cc Mon Sep 17 00:00:00 2001 From: Ruben Rodriguez Date: Thu, 13 Sep 2018 20:43:37 -0400 Subject: New about:home by customizing onboarding feature --- data/onboarding/bootstrap.js | 167 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 data/onboarding/bootstrap.js (limited to 'data/onboarding/bootstrap.js') diff --git a/data/onboarding/bootstrap.js b/data/onboarding/bootstrap.js new file mode 100644 index 0000000..ea97a20 --- /dev/null +++ b/data/onboarding/bootstrap.js @@ -0,0 +1,167 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* 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/. */ + +// Based on the original onboarding code with deep changes from Ruben Rodriguez +// Copyright (C) 2018 Ruben Rodriguez + +/* globals APP_STARTUP, ADDON_INSTALL */ +"use strict"; + +const {utils: Cu, interfaces: Ci} = Components; +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +XPCOMUtils.defineLazyModuleGetters(this, { + Services: "resource://gre/modules/Services.jsm", + AddonManager: "resource://gre/modules/AddonManager.jsm", +}); + +XPCOMUtils.defineLazyServiceGetter(this, "resProto", + "@mozilla.org/network/protocol;1?name=resource", + "nsISubstitutingProtocolHandler"); + +const RESOURCE_HOST = "onboarding"; + +const {PREF_STRING, PREF_BOOL, PREF_INT} = Ci.nsIPrefBranch; + +const BROWSER_READY_NOTIFICATION = "browser-delayed-startup-finished"; +const BROWSER_SESSION_STORE_NOTIFICATION = "sessionstore-windows-restored"; + +let waitingForBrowserReady = true; +let startupData; + +/** + * Set pref. Why no `getPrefs` function is due to the privilege level. + * We cannot set prefs inside a framescript but can read. + * For simplicity and efficiency, we still read prefs inside the framescript. + * + * @param {Array} prefs the array of prefs to set. + * The array element carries info to set pref, should contain + * - {String} name the pref name, such as `browser.onboarding.state` + * - {*} value the value to set + **/ +function setPrefs(type, name, value) { + switch (type) { + case "boolean": + Services.prefs.setBoolPref(name, value); + break; + case "integer": + Services.prefs.setIntPref(name, value); + break; + case "string": + Services.prefs.setStringPref(name, value); + break; + default: + throw new TypeError(`Unexpected type (${type}) for preference ${name}.`); + } +} + +async function flip(id){ + var addonObj = await AddonManager.getAddonByID(id); + + addonObj.userDisabled = addonObj.isActive; + if ( addonObj.operationsRequiringRestart != 0) + Services.mm.broadcastAsyncMessage("Onboarding:needsrestart"); + Services.mm.broadcastAsyncMessage("Onboarding:message-from-chrome", { + id : id, + active : addonObj.isActive, + installed : true + }); +} + +async function checkaddon(id){ + var addonObj = await AddonManager.getAddonByID(id); + + if (addonObj != null) + Services.mm.broadcastAsyncMessage("Onboarding:message-from-chrome", { + id : id, + active : addonObj.isActive, + installed : true + }); + else + Services.mm.broadcastAsyncMessage("Onboarding:message-from-chrome", { + id : id, + active : false, + installed : false + }); +} + +function initContentMessageListener() { + Services.mm.addMessageListener("Onboarding:OnContentMessage", msg => { + switch (msg.data.action) { + case "set-prefs": + setPrefs(msg.data.params[0].type, msg.data.params[0].name, msg.data.params[0].value); + if (msg.data.params[0].name == "browser.search.geoip.url") + setPrefs("boolean", "geo.enabled", msg.data.params[0].value != "" ); + if (msg.data.params[0].name == "captivedetect.canonicalURL") + setPrefs("boolean", "network.captive-portal-service.enabled", msg.data.params[0].value != "" ) + if (msg.data.params[0].name == "browser.safebrowsing.provider.mozilla.updateURL") + setPrefs("boolean", "privacy.trackingprotection.enabled", msg.data.params[0].value != "" ) + setPrefs("boolean", "privacy.trackingprotection.pbmode.enabled", msg.data.params[0].value != "" ) + break; + case "flip-addon": + flip(msg.data.params[0].name); + break; + case "check-addon": + checkaddon(msg.data.params[0].name); + break; + + } + }); +} + + +/** + * onBrowserReady - Continues startup of the add-on after browser is ready. + */ +function onBrowserReady() { + + waitingForBrowserReady = false; + + Services.mm.loadFrameScript("resource://onboarding/onboarding.js", true); + initContentMessageListener(); +} + +/** + * observe - nsIObserver callback to handle various browser notifications. + */ +function observe(subject, topic, data) { + switch (topic) { + case BROWSER_READY_NOTIFICATION: + Services.obs.removeObserver(observe, BROWSER_READY_NOTIFICATION); + onBrowserReady(); + break; + case BROWSER_SESSION_STORE_NOTIFICATION: + Services.obs.removeObserver(observe, BROWSER_SESSION_STORE_NOTIFICATION); + break; + } +} + +function install(aData, aReason) {} + +function uninstall(aData, aReason) {} + +function startup(aData, aReason) { + resProto.setSubstitutionWithFlags(RESOURCE_HOST, + Services.io.newURI("chrome/content/", null, aData.resourceURI), + resProto.ALLOW_CONTENT_ACCESS); + + // Cache startup data which contains stuff like the version number, etc. + // so we can use it when we init the telemetry + startupData = aData; + // Only start Onboarding when the browser UI is ready + if (Services.startup.startingUp) { + Services.obs.addObserver(observe, BROWSER_READY_NOTIFICATION); + Services.obs.addObserver(observe, BROWSER_SESSION_STORE_NOTIFICATION); + } else { + onBrowserReady(); + } +} + +function shutdown(aData, aReason) { + startupData = null; + // Stop waiting for browser to be ready + if (waitingForBrowserReady) { + Services.obs.removeObserver(observe, BROWSER_READY_NOTIFICATION); + } +} -- cgit v1.2.3