diff --git a/mobile/android/app/geckoview-prefs.js b/mobile/android/app/geckoview-prefs.js index f11a31193ddb..a1e931f59f4e 100644 --- a/mobile/android/app/geckoview-prefs.js +++ b/mobile/android/app/geckoview-prefs.js @@ -9,4 +9,7 @@ pref("privacy.trackingprotection.pbmode.enabled", false); pref("dom.ipc.processCount", 1); pref("dom.ipc.keepProcessesAlive.web", 1); -pref("dom.ipc.processPrelaunch.enabled", false); \ No newline at end of file +pref("dom.ipc.processPrelaunch.enabled", false); + +// Tell Telemetry that we're in GeckoView mode. +pref("toolkit.telemetry.isGeckoViewMode", true); diff --git a/mobile/android/components/geckoview/GeckoViewStartup.js b/mobile/android/components/geckoview/GeckoViewStartup.js index e934af523f39..45f4d63b0b80 100644 --- a/mobile/android/components/geckoview/GeckoViewStartup.js +++ b/mobile/android/components/geckoview/GeckoViewStartup.js @@ -5,6 +5,7 @@ ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetters(this, { + GeckoViewTelemetryController: "resource://gre/modules/GeckoViewTelemetryController.jsm", GeckoViewUtils: "resource://gre/modules/GeckoViewUtils.jsm", Services: "resource://gre/modules/Services.jsm", }); @@ -69,6 +70,11 @@ GeckoViewStartup.prototype = { "ContentPrefs:RemoveObserverForName", ], }); + + // This initializes Telemetry for GeckoView only in the parent process. + // The Telemetry initialization for the content process is performed in + // ContentProcessSingleton.js for consistency with Desktop Telemetry. + GeckoViewTelemetryController.setup(); break; } } diff --git a/toolkit/components/processsingleton/ContentProcessSingleton.js b/toolkit/components/processsingleton/ContentProcessSingleton.js index fe5aeeab7582..73a095cdc781 100644 --- a/toolkit/components/processsingleton/ContentProcessSingleton.js +++ b/toolkit/components/processsingleton/ContentProcessSingleton.js @@ -7,8 +7,10 @@ ChromeUtils.import("resource://gre/modules/Services.jsm"); ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); -ChromeUtils.defineModuleGetter(this, "TelemetryController", - "resource://gre/modules/TelemetryController.jsm"); +XPCOMUtils.defineLazyModuleGetters(this, { + GeckoViewTelemetryController: "resource://gre/modules/GeckoViewTelemetryController.jsm", + TelemetryController: "resource://gre/modules/TelemetryController.jsm", +}); function ContentProcessSingleton() {} ContentProcessSingleton.prototype = { @@ -20,6 +22,13 @@ ContentProcessSingleton.prototype = { switch (topic) { case "app-startup": { Services.obs.addObserver(this, "xpcom-shutdown"); + // Initialize Telemetry in the content process: use a different + // controller depending on the platform. + if (Services.prefs.getBoolPref("toolkit.telemetry.isGeckoViewMode", false)) { + GeckoViewTelemetryController.setup(); + return; + } + // Initialize Firefox Desktop Telemetry. TelemetryController.observe(null, topic, null); break; } diff --git a/toolkit/components/telemetry/TelemetryController.jsm b/toolkit/components/telemetry/TelemetryController.jsm index a8ab255ccac5..370c1bfd2374 100644 --- a/toolkit/components/telemetry/TelemetryController.jsm +++ b/toolkit/components/telemetry/TelemetryController.jsm @@ -575,22 +575,7 @@ var Impl = { // Unified Telemetry makes it opt-out. If extended Telemetry is enabled, base recording // is always on as well. if (IS_UNIFIED_TELEMETRY) { - // Enable extended Telemetry on pre-release channels and disable it - // on Release/ESR. - let prereleaseChannels = ["nightly", "aurora", "beta"]; - if (!AppConstants.MOZILLA_OFFICIAL) { - // Turn extended telemetry for local developer builds. - prereleaseChannels.push("default"); - } - const isPrereleaseChannel = - prereleaseChannels.includes(AppConstants.MOZ_UPDATE_CHANNEL); - const isReleaseCandidateOnBeta = - AppConstants.MOZ_UPDATE_CHANNEL === "release" && - Services.prefs.getCharPref("app.update.channel", null) === "beta"; - Telemetry.canRecordBase = true; - Telemetry.canRecordExtended = isPrereleaseChannel || - isReleaseCandidateOnBeta || - Services.prefs.getBoolPref(TelemetryUtils.Preferences.OverridePreRelease, false); + TelemetryUtils.setTelemetryRecordingFlags(); } else { // We're not on unified Telemetry, stick to the old behaviour for // supporting Fennec. diff --git a/toolkit/components/telemetry/TelemetryUtils.jsm b/toolkit/components/telemetry/TelemetryUtils.jsm index 85cc501a816d..64e9fdc4dcae 100644 --- a/toolkit/components/telemetry/TelemetryUtils.jsm +++ b/toolkit/components/telemetry/TelemetryUtils.jsm @@ -9,6 +9,8 @@ var EXPORTED_SYMBOLS = [ ]; ChromeUtils.import("resource://gre/modules/Services.jsm", this); +ChromeUtils.defineModuleGetter(this, "AppConstants", + "resource://gre/modules/AppConstants.jsm"); const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; @@ -201,5 +203,27 @@ var TelemetryUtils = { } catch (ex) { return Date.now(); } - } + }, + + /** + * Set the Telemetry core recording flag for Unified Telemetry. + */ + setTelemetryRecordingFlags() { + // Enable extended Telemetry on pre-release channels and disable it + // on Release/ESR. + let prereleaseChannels = ["nightly", "aurora", "beta"]; + if (!AppConstants.MOZILLA_OFFICIAL) { + // Turn extended telemetry for local developer builds. + prereleaseChannels.push("default"); + } + const isPrereleaseChannel = + prereleaseChannels.includes(AppConstants.MOZ_UPDATE_CHANNEL); + const isReleaseCandidateOnBeta = + AppConstants.MOZ_UPDATE_CHANNEL === "release" && + Services.prefs.getCharPref("app.update.channel", null) === "beta"; + Services.telemetry.canRecordBase = true; + Services.telemetry.canRecordExtended = isPrereleaseChannel || + isReleaseCandidateOnBeta || + Services.prefs.getBoolPref(this.Preferences.OverridePreRelease, false); + }, }; diff --git a/toolkit/components/telemetry/geckoview/GeckoViewTelemetryController.jsm b/toolkit/components/telemetry/geckoview/GeckoViewTelemetryController.jsm new file mode 100644 index 000000000000..859b62d4ffe4 --- /dev/null +++ b/toolkit/components/telemetry/geckoview/GeckoViewTelemetryController.jsm @@ -0,0 +1,32 @@ +/* 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/. */ + +"use strict"; + +ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); +ChromeUtils.import("resource://gre/modules/GeckoViewUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetters(this, { + Services: "resource://gre/modules/Services.jsm", + TelemetryUtils: "resource://gre/modules/TelemetryUtils.jsm", +}); + +GeckoViewUtils.initLogging("GeckoView.TelemetryController", this); + +var EXPORTED_SYMBOLS = ["GeckoViewTelemetryController"]; + +let GeckoViewTelemetryController = { + /** + * Setup the Telemetry recording flags. This must be called + * in all the processes that need to collect Telemetry. + */ + setup() { + debug `setup`; + + TelemetryUtils.setTelemetryRecordingFlags(); + + debug `setup - canRecordPrereleaseData ${Services.telemetry.canRecordPrereleaseData + }, canRecordReleaseData ${Services.telemetry.canRecordReleaseData}`; + }, +}; diff --git a/toolkit/components/telemetry/moz.build b/toolkit/components/telemetry/moz.build index 27b12ec88e69..17660b77a40a 100644 --- a/toolkit/components/telemetry/moz.build +++ b/toolkit/components/telemetry/moz.build @@ -193,5 +193,14 @@ processes_data = GENERATED_FILES['TelemetryProcessData.h'] processes_data.script = 'gen_process_data.py' processes_data.inputs = processes_files +# Add support for GeckoView: please note that building GeckoView +# implies having an Android build. The packaging step decides +# which files to include. As a consequence, we can simply only +# include the GeckoView files on all Android builds. +if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': + EXTRA_JS_MODULES += [ + 'geckoview/GeckoViewTelemetryController.jsm', + ] + with Files('**'): BUG_COMPONENT = ('Toolkit', 'Telemetry')