diff -r 000000000000 -r 6474c204b198 browser/base/content/browser-data-submission-info-bar.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/base/content/browser-data-submission-info-bar.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,136 @@ +# 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/. + +/** + * Represents an info bar that shows a data submission notification. + */ +let gDataNotificationInfoBar = { + _OBSERVERS: [ + "datareporting:notify-data-policy:request", + "datareporting:notify-data-policy:close", + ], + + _DATA_REPORTING_NOTIFICATION: "data-reporting", + + get _notificationBox() { + delete this._notificationBox; + return this._notificationBox = document.getElementById("global-notificationbox"); + }, + + get _log() { + let Log = Cu.import("resource://gre/modules/Log.jsm", {}).Log; + delete this._log; + return this._log = Log.repository.getLogger("Services.DataReporting.InfoBar"); + }, + + init: function() { + window.addEventListener("unload", function onUnload() { + window.removeEventListener("unload", onUnload, false); + + for (let o of this._OBSERVERS) { + Services.obs.removeObserver(this, o); + } + }.bind(this), false); + + for (let o of this._OBSERVERS) { + Services.obs.addObserver(this, o, true); + } + }, + + _getDataReportingNotification: function (name=this._DATA_REPORTING_NOTIFICATION) { + return this._notificationBox.getNotificationWithValue(name); + }, + + _displayDataPolicyInfoBar: function (request) { + if (this._getDataReportingNotification()) { + return; + } + + let brandBundle = document.getElementById("bundle_brand"); + let appName = brandBundle.getString("brandShortName"); + let vendorName = brandBundle.getString("vendorShortName"); + + let message = gNavigatorBundle.getFormattedString( + "dataReportingNotification.message", + [appName, vendorName]); + + this._actionTaken = false; + + let buttons = [{ + label: gNavigatorBundle.getString("dataReportingNotification.button.label"), + accessKey: gNavigatorBundle.getString("dataReportingNotification.button.accessKey"), + popup: null, + callback: function () { + // Clicking the button to go to the preferences tab constitutes + // acceptance of the data upload policy for Firefox Health Report. + // This will ensure the checkbox is checked. The user has the option of + // unchecking it. + request.onUserAccept("info-bar-button-pressed"); + this._actionTaken = true; + window.openAdvancedPreferences("dataChoicesTab"); + }.bind(this), + }]; + + this._log.info("Creating data reporting policy notification."); + let notification = this._notificationBox.appendNotification( + message, + this._DATA_REPORTING_NOTIFICATION, + null, + this._notificationBox.PRIORITY_INFO_HIGH, + buttons, + function onEvent(event) { + if (event == "removed") { + if (!this._actionTaken) { + request.onUserAccept("info-bar-dismissed"); + } + + Services.obs.notifyObservers(null, "datareporting:notify-data-policy:close", null); + } + }.bind(this) + ); + + // Tell the notification request we have displayed the notification. + request.onUserNotifyComplete(); + }, + + _clearPolicyNotification: function () { + let notification = this._getDataReportingNotification(); + if (notification) { + this._log.debug("Closing notification."); + notification.close(); + } + }, + + onNotifyDataPolicy: function (request) { + try { + this._displayDataPolicyInfoBar(request); + } catch (ex) { + request.onUserNotifyFailed(ex); + } + }, + + observe: function(subject, topic, data) { + switch (topic) { + case "datareporting:notify-data-policy:request": + this.onNotifyDataPolicy(subject.wrappedJSObject.object); + break; + + case "datareporting:notify-data-policy:close": + // If this observer fires, it means something else took care of + // responding. Therefore, we don't need to do anything. So, we + // act like we took action and clear state. + this._actionTaken = true; + this._clearPolicyNotification(); + break; + + default: + } + }, + + QueryInterface: XPCOMUtils.generateQI([ + Ci.nsIObserver, + Ci.nsISupportsWeakReference, + ]), +}; +