From 5d4d3b07aa69eab1468b8bbb93e13de6236a3812 Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Mon, 7 Jan 2013 16:10:21 -0800 Subject: [PATCH 01/18] Bug 718066 - Enable Firefox Health Report in browser app; r=mconnor --- browser/confvars.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/confvars.sh b/browser/confvars.sh index 66142e7715a..c8b6bf4ed8f 100755 --- a/browser/confvars.sh +++ b/browser/confvars.sh @@ -28,6 +28,7 @@ MOZ_SAFE_BROWSING=1 MOZ_SERVICES_AITC=1 MOZ_SERVICES_COMMON=1 MOZ_SERVICES_CRYPTO=1 +MOZ_SERVICES_HEALTHREPORT=1 MOZ_SERVICES_METRICS=1 MOZ_SERVICES_SYNC=1 MOZ_APP_VERSION=$FIREFOX_VERSION From 2c64128155ea592547f7391dd8112813c99471a3 Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Mon, 7 Jan 2013 16:29:25 -0800 Subject: [PATCH 02/18] Bug 827602 - Execute queued operations in FIFO not LIFO; r=rnewman --- services/metrics/collector.jsm | 2 +- services/metrics/storage.jsm | 3 +- .../tests/xpcshell/test_metrics_storage.js | 44 +++++++++++++++++++ services/metrics/tests/xpcshell/xpcshell.ini | 1 - 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/services/metrics/collector.jsm b/services/metrics/collector.jsm index 4040fe3b44e..285e08bff07 100644 --- a/services/metrics/collector.jsm +++ b/services/metrics/collector.jsm @@ -83,7 +83,7 @@ Collector.prototype = Object.freeze({ return; } - let [provider, deferred] = this._providerInitQueue.pop(); + let [provider, deferred] = this._providerInitQueue.shift(); this._providerInitializing = true; this._log.info("Initializing provider with storage: " + provider.name); diff --git a/services/metrics/storage.jsm b/services/metrics/storage.jsm index 4d553aada60..790488e9c0c 100644 --- a/services/metrics/storage.jsm +++ b/services/metrics/storage.jsm @@ -1251,6 +1251,7 @@ MetricsStorageSqliteBackend.prototype = Object.freeze({ throw new Error("enqueueOperation expects a function. Got: " + typeof(func)); } + this._log.trace("Enqueueing operation."); let deferred = Promise.defer(); this._queuedOperations.push([func, deferred]); @@ -1268,7 +1269,7 @@ MetricsStorageSqliteBackend.prototype = Object.freeze({ } this._log.trace("Performing queued operation."); - let [func, deferred] = this._queuedOperations.pop(); + let [func, deferred] = this._queuedOperations.shift(); let promise; try { diff --git a/services/metrics/tests/xpcshell/test_metrics_storage.js b/services/metrics/tests/xpcshell/test_metrics_storage.js index 0045c9bf2b8..6844f2081e2 100644 --- a/services/metrics/tests/xpcshell/test_metrics_storage.js +++ b/services/metrics/tests/xpcshell/test_metrics_storage.js @@ -195,6 +195,50 @@ add_task(function test_field_registration_repopulation() { yield backend.close(); }); +add_task(function test_enqueue_operation_execution_order() { + let backend = yield Metrics.Storage("enqueue_operation_execution_order"); + + let executionCount = 0; + + let fns = { + op1: function () { + do_check_eq(executionCount, 1); + }, + + op2: function () { + do_check_eq(executionCount, 2); + }, + + op3: function () { + do_check_eq(executionCount, 3); + }, + }; + + function enqueuedOperation(fn) { + let deferred = Promise.defer(); + + CommonUtils.nextTick(function onNextTick() { + executionCount++; + fn(); + deferred.resolve(); + }); + + return deferred.promise; + } + + let promises = []; + for (let i = 1; i <= 3; i++) { + let fn = fns["op" + i]; + promises.push(backend.enqueueOperation(enqueuedOperation.bind(this, fn))); + } + + for (let promise of promises) { + yield promise; + } + + yield backend.close(); +}); + add_task(function test_enqueue_operation_many() { let backend = yield Metrics.Storage("enqueue_operation_many"); diff --git a/services/metrics/tests/xpcshell/xpcshell.ini b/services/metrics/tests/xpcshell/xpcshell.ini index 94d7dba6281..43a3f2b2502 100644 --- a/services/metrics/tests/xpcshell/xpcshell.ini +++ b/services/metrics/tests/xpcshell/xpcshell.ini @@ -6,4 +6,3 @@ tail = [test_metrics_provider.js] [test_metrics_collector.js] [test_metrics_storage.js] -skip-if = true From de8b381d0aa7f9dadc01fe990bdf255089803e7b Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Tue, 8 Jan 2013 12:07:27 -0800 Subject: [PATCH 03/18] Bug 827910 - Only include details for "plugin" and "extension" add-ons; r=rnewman --- services/healthreport/providers.jsm | 16 ++++++++++++++-- .../tests/xpcshell/test_provider_addons.js | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/services/healthreport/providers.jsm b/services/healthreport/providers.jsm index 418bab5c0d6..c9c476d8197 100644 --- a/services/healthreport/providers.jsm +++ b/services/healthreport/providers.jsm @@ -728,6 +728,13 @@ AddonsProvider.prototype = Object.freeze({ "onUninstalled", ], + // Add-on types for which full details are uploaded in the + // ActiveAddonsMeasurement. All other types are ignored. + FULL_DETAIL_TYPES: [ + "plugin", + "extension", + ], + name: "org.mozilla.addons", measurementTypes: [ @@ -815,6 +822,13 @@ AddonsProvider.prototype = Object.freeze({ let data = {addons: {}, counts: {}}; for (let addon of addons) { + let type = addon.type; + data.counts[type] = (data.counts[type] || 0) + 1; + + if (this.FULL_DETAIL_TYPES.indexOf(addon.type) == -1) { + continue; + } + let optOutPref = "extensions." + addon.id + ".getAddons.cache.enabled"; if (!this._prefs.get(optOutPref, true)) { this._log.debug("Ignoring add-on that's opted out of AMO updates: " + @@ -837,8 +851,6 @@ AddonsProvider.prototype = Object.freeze({ data.addons[addon.id] = obj; - let type = addon.type; - data.counts[type] = (data.counts[type] || 0) + 1; } return data; diff --git a/services/healthreport/tests/xpcshell/test_provider_addons.js b/services/healthreport/tests/xpcshell/test_provider_addons.js index db7934cb1eb..cee1fd2c91e 100644 --- a/services/healthreport/tests/xpcshell/test_provider_addons.js +++ b/services/healthreport/tests/xpcshell/test_provider_addons.js @@ -75,6 +75,19 @@ add_task(function test_collect() { installDate: now, updateDate: now, }, + // Is counted but full details are omitted because it is a theme. + { + id: "addon2", + userDisabled: false, + appDisabled: false, + version: "3", + type: "theme", + scope: 1, + foreignInstall: false, + hasBinaryComponents: false, + installDate: now, + updateDate: now, + }, ]; monkeypatchAddons(provider, addons); @@ -109,9 +122,10 @@ add_task(function test_collect() { do_check_true(data.days.hasDay(now)); value = data.days.getDay(now); - do_check_eq(value.size, 2); + do_check_eq(value.size, 3); do_check_eq(value.get("extension"), 1); do_check_eq(value.get("plugin"), 1); + do_check_eq(value.get("theme"), 1); yield provider.shutdown(); yield storage.close(); From 51123697674aea4f443bd295d5037181d2addeca Mon Sep 17 00:00:00 2001 From: Mike Connor Date: Thu, 3 Jan 2013 23:45:15 -0500 Subject: [PATCH 04/18] Bug 809094 - Move data upload choices to Advanced pref pane, add FHR option; r=gavin, gps --- browser/app/profile/firefox.js | 4 + browser/components/preferences/advanced.js | 101 +++++++++++++++-- browser/components/preferences/advanced.xul | 100 +++++++++++++---- .../preferences/in-content/advanced.js | 103 ++++++++++++++++-- .../preferences/in-content/advanced.xul | 80 +++++++++++--- .../preferences/in-content/tests/Makefile.in | 4 + .../in-content/tests/browser_healthreport.js | 45 ++++++++ .../components/preferences/tests/Makefile.in | 4 + .../preferences/tests/browser_healthreport.js | 52 +++++++++ .../chrome/browser/preferences/advanced.dtd | 24 +++- services/healthreport/healthreport-prefs.js | 2 +- 11 files changed, 453 insertions(+), 66 deletions(-) create mode 100644 browser/components/preferences/in-content/tests/browser_healthreport.js create mode 100644 browser/components/preferences/tests/browser_healthreport.js diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index e2954eeb440..2606af4a99f 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -857,6 +857,10 @@ pref("breakpad.reportURL", "http://crash-stats.mozilla.com/report/index/"); pref("toolkit.crashreporter.pluginHangSubmitURL", "https://hang-reports.mozilla.org/submit"); +// URL for "Learn More" for Crash Reporter +pref("toolkit.crashreporter.infoURL", + "http://www.mozilla.com/legal/privacy/firefox.html#crash-reporter"); + // base URL for web-based support pages pref("app.support.baseURL", "http://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/"); diff --git a/browser/components/preferences/advanced.js b/browser/components/preferences/advanced.js index 01600da210d..aab770cba90 100644 --- a/browser/components/preferences/advanced.js +++ b/browser/components/preferences/advanced.js @@ -48,9 +48,11 @@ var gAdvancedPane = { #ifdef MOZ_CRASHREPORTER this.initSubmitCrashes(); #endif -#ifdef MOZ_TELEMETRY_ON_BY_DEFAULT this.initTelemetry(); +#ifdef MOZ_SERVICES_HEALTHREPORT + this.initSubmitHealthReport(); #endif + this.updateActualCacheSize("disk"); this.updateActualCacheSize("offline"); @@ -129,6 +131,36 @@ var gAdvancedPane = { return checkbox.checked ? (this._storedSpellCheck == 2 ? 2 : 1) : 0; }, + /** + * When the user toggles the layers.acceleration.disabled pref, + * sync its new value to the gfx.direct2d.disabled pref too. + */ + updateHardwareAcceleration: function() + { +#ifdef XP_WIN + var fromPref = document.getElementById("layers.acceleration.disabled"); + var toPref = document.getElementById("gfx.direct2d.disabled"); + toPref.value = fromPref.value; +#endif + }, + + // DATA CHOICES TAB + + /** + * Set up or hide the Learn More links for various data collection options + */ + _setupLearnMoreLink: function (pref, element) { + // set up the Learn More link with the correct URL + let url = Services.prefs.getCharPref(pref); + let el = document.getElementById(element); + + if (url) { + el.setAttribute("href", url); + } else { + el.setAttribute("hidden", "true"); + } + }, + /** * */ @@ -142,6 +174,7 @@ var gAdvancedPane = { } catch (e) { checkbox.style.display = "none"; } + this._setupLearnMoreLink("toolkit.crashreporter.infoURL", "crashReporterLearnMore"); }, /** @@ -157,16 +190,19 @@ var gAdvancedPane = { } catch (e) { } }, -#ifdef MOZ_TELEMETRY_ON_BY_DEFAULT + /** * When telemetry is opt-out, verify if the user explicitly rejected the * telemetry prompt, and if so reflect his choice in the current preference * value. This doesn't cover the case where the user refused telemetry in the * prompt but later enabled it in preferences in builds before the fix for * bug 737600. + * + * In all cases, set up the Learn More link sanely */ initTelemetry: function () { +#ifdef MOZ_TELEMETRY_ON_BY_DEFAULT const PREF_TELEMETRY_ENABLED = "toolkit.telemetry.enabledPreRelease"; let enabled = Services.prefs.getBoolPref(PREF_TELEMETRY_ENABLED); let rejected = false; @@ -176,8 +212,11 @@ var gAdvancedPane = { if (enabled && rejected) { Services.prefs.setBoolPref(PREF_TELEMETRY_ENABLED, false); } - }, #endif +#ifdef MOZ_TELEMETRY_REPORTING + this._setupLearnMoreLink("toolkit.telemetry.infoURL", "telemetryLearnMore"); +#endif + }, /** * When the user toggles telemetry, update the rejected value as well, so we @@ -191,19 +230,57 @@ var gAdvancedPane = { displayed.value = @MOZ_TELEMETRY_DISPLAY_REV@; }, +#ifdef MOZ_SERVICES_HEALTHREPORT /** - * When the user toggles the layers.acceleration.disabled pref, - * sync its new value to the gfx.direct2d.disabled pref too. + * Initialize the health report service reference and checkbox. */ - updateHardwareAcceleration: function() - { -#ifdef XP_WIN - var fromPref = document.getElementById("layers.acceleration.disabled"); - var toPref = document.getElementById("gfx.direct2d.disabled"); - toPref.value = fromPref.value; -#endif + initSubmitHealthReport: function () { + this._setupLearnMoreLink("healthreport.infoURL", "FHRLearnMore"); + + let reporter = Components.classes["@mozilla.org/healthreport/service;1"] + .getService(Components.interfaces.nsISupports) + .wrappedJSObject + .reporter; + + let checkbox = document.getElementById("submitHealthReportBox"); + + if (!reporter) { + checkbox.setAttribute("disabled", "true"); + return; + } + + checkbox.checked = reporter.dataSubmissionPolicyAccepted; }, + /** + * Update the health report policy acceptance with state from checkbox. + */ + updateSubmitHealthReport: function () { + let reporter = Components.classes["@mozilla.org/healthreport/service;1"] + .getService(Components.interfaces.nsISupports) + .wrappedJSObject + .reporter; + + if (!reporter) { + return; + } + + let checkbox = document.getElementById("submitHealthReportBox"); + + let accepted = reporter.dataSubmissionPolicyAccepted; + + if (checkbox.checked && !accepted) { + reporter.recordPolicyAcceptance("pref-checkbox-checked"); + return; + } + + if (!checkbox.checked && accepted) { + reporter.recordPolicyRejection("pref-checkbox-unchecked"); + return; + } + }, +#endif + // NETWORK TAB /* diff --git a/browser/components/preferences/advanced.xul b/browser/components/preferences/advanced.xul index a53d2cd86b9..bf00de5a913 100644 --- a/browser/components/preferences/advanced.xul +++ b/browser/components/preferences/advanced.xul @@ -50,6 +50,8 @@ type="bool"/> #endif + + #ifdef MOZ_TELEMETRY_REPORTING - + - + #ifdef MOZ_UPDATER @@ -115,7 +117,7 @@ name="security.disable_button.openDeviceManager" type="bool"/> - + #ifdef HAVE_SHELL_SERVICE @@ -128,6 +130,7 @@ + @@ -180,11 +183,11 @@ preference="layout.spellcheckDefault"/> +#ifdef HAVE_SHELL_SERVICE -#ifdef HAVE_SHELL_SERVICE @@ -197,20 +200,71 @@ &isDefault.label; -#ifdef MOZ_CRASHREPORTER - -#endif -#endif -#ifdef MOZ_TELEMETRY_REPORTING - -#endif +#endif +#ifndef MOZ_TELEMETRY_REPORTING +#ifndef MOZ_SERVICES_HEALTHREPORT +#ifndef MOZ_CRASHREPORTER +#define HIDE_DATACHOICES +#endif +#endif +#endif +#ifndef HIDE_DATACHOICES + + +#ifdef MOZ_TELEMETRY_REPORTING + + + &telemetryDesc.label; + + + + + +#endif +#ifdef MOZ_SERVICES_HEALTHREPORT + + + &FHRDesc.label; + + + + + +#endif +#ifdef MOZ_CRASHREPORTER + + + &crashReporterDesc.label; + + + + + + +#endif + +#endif @@ -239,11 +293,11 @@ @@ -389,9 +443,9 @@ - - @@ -402,15 +456,15 @@ #endif