From 8bb505c3fa09d968c0ce31dcf681fc7ad4974670 Mon Sep 17 00:00:00 2001 From: Alex Catarineu Date: Sun, 2 Jun 2019 23:35:43 +0200 Subject: [PATCH] Bug 28822: Convert onboarding to webextension --- .../onboarding/{bootstrap.js => api.js} | 59 +++++++++++-------- browser/extensions/onboarding/background.js | 8 +++ .../onboarding/content/Onboarding.jsm | 7 ++- .../onboarding/content/onboarding.js | 3 +- browser/extensions/onboarding/install.rdf.in | 28 --------- browser/extensions/onboarding/jar.mn | 3 +- browser/extensions/onboarding/manifest.json | 26 ++++++++ browser/extensions/onboarding/moz.build | 9 ++- browser/extensions/onboarding/schema.json | 1 + browser/installer/package-manifest.in | 1 + browser/locales/Makefile.in | 1 + browser/locales/l10n.toml | 4 ++ .../permissions/nsPermissionManager.cpp | 3 + intl/strres/nsStringBundle.cpp | 2 +- 14 files changed, 92 insertions(+), 63 deletions(-) rename browser/extensions/onboarding/{bootstrap.js => api.js} (83%) create mode 100644 browser/extensions/onboarding/background.js delete mode 100644 browser/extensions/onboarding/install.rdf.in create mode 100644 browser/extensions/onboarding/manifest.json create mode 100644 browser/extensions/onboarding/schema.json diff --git a/browser/extensions/onboarding/bootstrap.js b/browser/extensions/onboarding/api.js similarity index 83% rename from browser/extensions/onboarding/bootstrap.js rename to browser/extensions/onboarding/api.js index 45f63c1c3737e..d11e525b9f8c0 100644 --- a/browser/extensions/onboarding/bootstrap.js +++ b/browser/extensions/onboarding/api.js @@ -103,7 +103,8 @@ function openTorTab(aURL, aFrameScript) { let win = Services.wm.getMostRecentWindow('navigator:browser'); if (win) { let tabBrowser = win.gBrowser; - let tab = tabBrowser.addTab(aURL); + let triggeringPrincipal = Services.scriptSecurityManager.createNullPrincipal({}); + let tab = tabBrowser.addTab(aURL, { triggeringPrincipal }); tabBrowser.selectedTab = tab; if (aFrameScript) { @@ -234,35 +235,41 @@ function observe(subject, topic, data) { } } -function install(aData, aReason) {} +this.onboarding = class extends ExtensionAPI { + onStartup() { + resProto.setSubstitutionWithFlags(RESOURCE_HOST, + Services.io.newURI("chrome/content/", null, this.extension.rootURI), + resProto.ALLOW_CONTENT_ACCESS); -function uninstall(aData, aReason) {} + if (this.extension.rootURI instanceof Ci.nsIJARURI) { + this.manifest = this.extension.rootURI.JARFile.QueryInterface(Ci.nsIFileURL).file; + } else if (this.extension.rootURI instanceof Ci.nsIFileURL) { + this.manifest = this.extension.rootURI.file; + } -function startup(aData, aReason) { - resProto.setSubstitutionWithFlags(RESOURCE_HOST, - Services.io.newURI("chrome/content/", null, aData.resourceURI), - resProto.ALLOW_CONTENT_ACCESS); + if (this.manifest) { + Components.manager.addBootstrappedManifestLocation(this.manifest); + } else { + Cu.reportError("Cannot find onboarding chrome.manifest for registring translated strings"); + } - // 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(); - syncTourChecker.init(); + // 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(); + syncTourChecker.init(); + } } -} -function shutdown(aData, aReason) { - resProto.setSubstitution(RESOURCE_HOST, null); + onShutdown() { + resProto.setSubstitution(RESOURCE_HOST, null); - startupData = null; - // Stop waiting for browser to be ready - if (waitingForBrowserReady) { - Services.obs.removeObserver(observe, BROWSER_READY_NOTIFICATION); + // Stop waiting for browser to be ready + if (waitingForBrowserReady) { + Services.obs.removeObserver(observe, BROWSER_READY_NOTIFICATION); + } + syncTourChecker.uninit(); } - syncTourChecker.uninit(); -} +}; diff --git a/browser/extensions/onboarding/background.js b/browser/extensions/onboarding/background.js new file mode 100644 index 0000000000000..63c6320a8e7f2 --- /dev/null +++ b/browser/extensions/onboarding/background.js @@ -0,0 +1,8 @@ +/* eslint-env webextensions */ + +"use strict"; + +browser.runtime.onUpdateAvailable.addListener(details => { + // By listening to but ignoring this event, any updates will + // be delayed until the next browser restart. +}); \ No newline at end of file diff --git a/browser/extensions/onboarding/content/Onboarding.jsm b/browser/extensions/onboarding/content/Onboarding.jsm index 7d422929ce916..6d4dbfa35b402 100644 --- a/browser/extensions/onboarding/content/Onboarding.jsm +++ b/browser/extensions/onboarding/content/Onboarding.jsm @@ -8,12 +8,12 @@ var EXPORTED_SYMBOLS = ["Onboarding"]; -ChromeUtils.import("resource://gre/modules/Services.jsm"); +const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); const ONBOARDING_CSS_URL = "resource://onboarding/onboarding.css"; const TORBUTTON_BUNDLE_URI = "chrome://torbutton/locale/browserOnboarding.properties"; const TORBROWSER_WELCOME_TOUR_NAME_KEY = "onboarding.tour-tor-welcome"; -const BUNDLE_URI = "chrome://onboarding/locale/onboarding.properties"; +const BUNDLE_URI = "chrome://torbutton/locale/onboarding.properties"; const UITOUR_JS_URI = "resource://onboarding/lib/UITour-lib.js"; const TOUR_AGENT_JS_URI = "resource://onboarding/onboarding-tour-agent.js"; const BRAND_SHORT_NAME = Services.strings @@ -897,6 +897,7 @@ class Onboarding { const kOnionURL = "https://3g2upl4pq6kufc4m.onion/"; // DuckDuckGo let handledTourActionClick = false; switch (id) { + case "onboarding-overlay-button-icon": case "onboarding-overlay-button": this.telemetry({ type: "onboarding-logo-click", @@ -1725,7 +1726,7 @@ class Onboarding { let tooltipStringId = Services.prefs.getStringPref(tooltipStringPrefId, defaultTourStringId); tooltip = this._bundle.formatStringFromName(tooltipStringId, [BRAND_SHORT_NAME], 1); } catch (e) { - Cu.reportError(`the provided ${tooltipStringPrefId} string is in wrong format `, e); + Cu.reportError(e); // fallback to defaultTourStringId to proceed tooltip = this._bundle.formatStringFromName(defaultTourStringId, [BRAND_SHORT_NAME], 1); } diff --git a/browser/extensions/onboarding/content/onboarding.js b/browser/extensions/onboarding/content/onboarding.js index 28a1c2e6f53ba..a447fb31b6ac1 100644 --- a/browser/extensions/onboarding/content/onboarding.js +++ b/browser/extensions/onboarding/content/onboarding.js @@ -23,8 +23,7 @@ if (Services.prefs.getBoolPref("browser.onboarding.enabled", false)) { let window = evt.target.defaultView; let location = window.location.href; - if (location == ABOUT_NEWTAB_URL || location == ABOUT_HOME_URL || - location == ABOUT_WELCOME_URL || location == ABOUT_TOR_URL) { + if (location == ABOUT_TOR_URL) { // We just want to run tests as quickly as possible // so in the automation test, we don't do `requestIdleCallback`. if (Cu.isInAutomation) { diff --git a/browser/extensions/onboarding/install.rdf.in b/browser/extensions/onboarding/install.rdf.in deleted file mode 100644 index 86e87a8a1acdb..0000000000000 --- a/browser/extensions/onboarding/install.rdf.in +++ /dev/null @@ -1,28 +0,0 @@ - - - -#filter substitution - - - - onboarding@mozilla.org - Photon onboarding - Photon onboarding - 1.0 - true - 2 - true - - - - {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - @MOZ_APP_VERSION@ - @MOZ_APP_MAXVERSION@ - - - false - - diff --git a/browser/extensions/onboarding/jar.mn b/browser/extensions/onboarding/jar.mn index 29a24ad695d15..af83e1d06e6ca 100644 --- a/browser/extensions/onboarding/jar.mn +++ b/browser/extensions/onboarding/jar.mn @@ -9,7 +9,8 @@ content/ (content/*.css) content/img/ (content/img/*) * content/onboarding-tour-agent.js (content/onboarding-tour-agent.js) -* content/onboarding.js (content/onboarding.js) + content/onboarding.js (content/onboarding.js) +* content/Onboarding.jsm (content/Onboarding.jsm) content/onboarding-tor-circuit-display.js (content/onboarding-tor-circuit-display.js) # Package UITour-lib.js in here rather than under # /browser/components/uitour to avoid "unreferenced files" error when diff --git a/browser/extensions/onboarding/manifest.json b/browser/extensions/onboarding/manifest.json new file mode 100644 index 0000000000000..077615d0c60cf --- /dev/null +++ b/browser/extensions/onboarding/manifest.json @@ -0,0 +1,26 @@ +{ + "manifest_version": 2, + "name": "Onboarding", + "version": "1.0", + + "applications": { + "gecko": { + "id": "onboarding@mozilla.org" + } + }, + + "background": { + "scripts": ["background.js"] + }, + + "experiment_apis": { + "onboarding": { + "schema": "schema.json", + "parent": { + "scopes": ["addon_parent"], + "script": "api.js", + "events": ["startup"] + } + } + } + } diff --git a/browser/extensions/onboarding/moz.build b/browser/extensions/onboarding/moz.build index 4f9c372d66de2..d2f73eb8fd74d 100644 --- a/browser/extensions/onboarding/moz.build +++ b/browser/extensions/onboarding/moz.build @@ -12,9 +12,14 @@ DEFINES['MOZ_APP_MAXVERSION'] = CONFIG['MOZ_APP_MAXVERSION'] DIRS += ['locales'] +FINAL_TARGET_FILES.features['onboarding@mozilla.org'] += [ + 'background.js', + 'manifest.json', + 'schema.json', +] + FINAL_TARGET_PP_FILES.features['onboarding@mozilla.org'] += [ - 'bootstrap.js', - 'install.rdf.in' + 'api.js', ] BROWSER_CHROME_MANIFESTS += ['test/browser/browser.ini'] diff --git a/browser/extensions/onboarding/schema.json b/browser/extensions/onboarding/schema.json new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/browser/extensions/onboarding/schema.json @@ -0,0 +1 @@ +[] diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 12953b0ab0e46..a160f316a56d8 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -264,6 +264,7 @@ @RESPATH@/browser/chrome/icons/default/default64.png @RESPATH@/browser/chrome/icons/default/default128.png #endif +@RESPATH@/browser/features/* ; [Webide Files] @RESPATH@/browser/chrome/webide@JAREXT@ diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in index 1aeb74d3ace6e..8e27ee9803d9e 100644 --- a/browser/locales/Makefile.in +++ b/browser/locales/Makefile.in @@ -72,6 +72,7 @@ chrome-%: @$(MAKE) -C ../../toolkit/locales chrome-$* @$(MAKE) -C ../../services/sync/locales chrome AB_CD=$* @$(MAKE) -C ../../extensions/spellcheck/locales chrome AB_CD=$* + @$(MAKE) -C ../extensions/onboarding/locales chrome AB_CD=$* @$(MAKE) -C ../../devtools/client/locales chrome AB_CD=$* @$(MAKE) -C ../../devtools/startup/locales chrome AB_CD=$* @$(MAKE) chrome AB_CD=$* diff --git a/browser/locales/l10n.toml b/browser/locales/l10n.toml index c994c02af01fa..6fe1445b99281 100644 --- a/browser/locales/l10n.toml +++ b/browser/locales/l10n.toml @@ -122,6 +122,10 @@ locales = [ reference = "browser/extensions/formautofill/locales/en-US/**" l10n = "{l}browser/extensions/formautofill/**" +[[paths]] + reference = "browser/extensions/onboarding/locales/en-US/**" + l10n = "{l}browser/extensions/onboarding/**" + [[paths]] reference = "browser/extensions/fxmonitor/locales/en-US/**" l10n = "{l}browser/extensions/fxmonitor/**" diff --git a/extensions/permissions/nsPermissionManager.cpp b/extensions/permissions/nsPermissionManager.cpp index aa379a1f19892..6641223516408 100644 --- a/extensions/permissions/nsPermissionManager.cpp +++ b/extensions/permissions/nsPermissionManager.cpp @@ -125,6 +125,9 @@ static const nsLiteralCString kPreloadPermissions[] = { NS_LITERAL_CSTRING("cookie"), NS_LITERAL_CSTRING("trackingprotection"), NS_LITERAL_CSTRING("trackingprotection-pb"), + // Bug 28822: Make sure uitour permissions are preloaded in content processes. + NS_LITERAL_CSTRING("uitour"), + USER_INTERACTION_PERM}; // NOTE: nullptr can be passed as aType - if it is this function will return diff --git a/intl/strres/nsStringBundle.cpp b/intl/strres/nsStringBundle.cpp index 5511b75c98799..49aa1e38f826a 100644 --- a/intl/strres/nsStringBundle.cpp +++ b/intl/strres/nsStringBundle.cpp @@ -81,7 +81,7 @@ static const char kContentBundles[][52] = { "chrome://global/locale/xbl.properties", "chrome://global/locale/xul.properties", "chrome://necko/locale/necko.properties", - "chrome://onboarding/locale/onboarding.properties", + "chrome://torbutton/locale/onboarding.properties", }; static bool IsContentBundle(const nsCString& aUrl) { -- GitLab