forked from mirrors/gecko-dev
Backed out changeset fdc3f1b5e5ae (bug 1845150) Backed out changeset ba7789c89bdd (bug 1845150) Backed out changeset 6c405863be54 (bug 1845150) Backed out changeset f66e8bb15e18 (bug 1845150) Backed out changeset a75fe63bd39f (bug 1845150) Backed out changeset 91365291f80f (bug 1845150) Backed out changeset 7477fd1c48fa (bug 1845150)
122 lines
3.3 KiB
JavaScript
122 lines
3.3 KiB
JavaScript
/* 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.
|
|
*/
|
|
var gDataNotificationInfoBar = {
|
|
_OBSERVERS: [
|
|
"datareporting:notify-data-policy:request",
|
|
"datareporting:notify-data-policy:close",
|
|
],
|
|
|
|
_DATA_REPORTING_NOTIFICATION: "data-reporting",
|
|
|
|
get _log() {
|
|
let { Log } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/Log.sys.mjs"
|
|
);
|
|
delete this._log;
|
|
return (this._log = Log.repository.getLoggerWithMessagePrefix(
|
|
"Toolkit.Telemetry",
|
|
"DataNotificationInfoBar::"
|
|
));
|
|
},
|
|
|
|
init() {
|
|
window.addEventListener("unload", () => {
|
|
for (let o of this._OBSERVERS) {
|
|
Services.obs.removeObserver(this, o);
|
|
}
|
|
});
|
|
|
|
for (let o of this._OBSERVERS) {
|
|
Services.obs.addObserver(this, o, true);
|
|
}
|
|
},
|
|
|
|
_getDataReportingNotification(name = this._DATA_REPORTING_NOTIFICATION) {
|
|
return gNotificationBox.getNotificationWithValue(name);
|
|
},
|
|
|
|
_displayDataPolicyInfoBar(request) {
|
|
if (this._getDataReportingNotification()) {
|
|
return;
|
|
}
|
|
|
|
this._actionTaken = false;
|
|
|
|
let buttons = [
|
|
{
|
|
"l10n-id": "data-reporting-notification-button",
|
|
popup: null,
|
|
callback: () => {
|
|
this._actionTaken = true;
|
|
window.openPreferences("privacy-reports");
|
|
},
|
|
},
|
|
];
|
|
|
|
this._log.info("Creating data reporting policy notification.");
|
|
gNotificationBox.appendNotification(
|
|
this._DATA_REPORTING_NOTIFICATION,
|
|
{
|
|
label: {
|
|
"l10n-id": "data-reporting-notification-message",
|
|
},
|
|
priority: gNotificationBox.PRIORITY_INFO_HIGH,
|
|
eventCallback: event => {
|
|
if (event == "removed") {
|
|
Services.obs.notifyObservers(
|
|
null,
|
|
"datareporting:notify-data-policy:close"
|
|
);
|
|
}
|
|
},
|
|
},
|
|
buttons
|
|
);
|
|
// It is important to defer calling onUserNotifyComplete() until we're
|
|
// actually sure the notification was displayed. If we ever called
|
|
// onUserNotifyComplete() without showing anything to the user, that
|
|
// would be very good for user choice. It may also have legal impact.
|
|
request.onUserNotifyComplete();
|
|
},
|
|
|
|
_clearPolicyNotification() {
|
|
let notification = this._getDataReportingNotification();
|
|
if (notification) {
|
|
this._log.debug("Closing notification.");
|
|
notification.close();
|
|
}
|
|
},
|
|
|
|
observe(subject, topic, data) {
|
|
switch (topic) {
|
|
case "datareporting:notify-data-policy:request":
|
|
let request = subject.wrappedJSObject.object;
|
|
try {
|
|
this._displayDataPolicyInfoBar(request);
|
|
} catch (ex) {
|
|
request.onUserNotifyFailed(ex);
|
|
}
|
|
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: ChromeUtils.generateQI([
|
|
"nsIObserver",
|
|
"nsISupportsWeakReference",
|
|
]),
|
|
};
|