Bug 1289231 - show 'undo' notification bar, r?dolske
MozReview-Commit-ID: 1qy7GUSaowb
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -154,16 +154,17 @@ var AboutHomeListener = {
docElt.setAttribute("snippetsVersion", aData.snippetsVersion);
},
onPageLoad: function() {
addMessageListener("AboutHome:Update", this);
addEventListener("click", this, true);
addEventListener("pagehide", this, true);
+ sendAsyncMessage("AboutHome:MaybeShowAutoMigrationUndoNotification");
sendAsyncMessage("AboutHome:RequestUpdate");
},
onClick: function(aEvent) {
if (!aEvent.isTrusted || // Don't trust synthetic events
aEvent.button == 2 || aEvent.target.localName != "button") {
return;
}
--- a/browser/components/migration/AutoMigrate.jsm
+++ b/browser/components/migration/AutoMigrate.jsm
@@ -15,16 +15,18 @@ const kAutoMigrateFinishedPref = "browse
const kAutoMigrateBrowserPref = "browser.migrate.automigrate.browser";
const kPasswordManagerTopic = "passwordmgr-storage-changed";
const kPasswordManagerTopicTypes = new Set([
"addLogin",
"modifyLogin",
]);
+const kNotificationId = "abouthome-automigration-undo";
+
Cu.import("resource:///modules/MigrationUtils.jsm");
Cu.import("resource://gre/modules/Preferences.jsm");
Cu.import("resource://gre/modules/PlacesUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const AutoMigrate = {
@@ -244,16 +246,87 @@ const AutoMigrate = {
Services.obs.removeObserver(this, kPasswordManagerTopic);
} catch (ex) {}
try {
PlacesUtils.removeLazyBookmarkObserver(this);
} catch (ex) {}
Services.prefs.clearUserPref(kAutoMigrateStartedPref);
Services.prefs.clearUserPref(kAutoMigrateFinishedPref);
Services.prefs.clearUserPref(kAutoMigrateBrowserPref);
+
+ let browserWindows = Services.wm.getEnumerator("navigator:browser");
+ while (browserWindows.hasMoreElements()) {
+ let win = browserWindows.getNext();
+ if (!win.closed) {
+ for (let browser of win.gBrowser.browsers) {
+ let nb = win.gBrowser.getNotificationBox(browser);
+ let notification = nb.getNotificationWithValue(kNotificationId);
+ if (notification) {
+ nb.removeNotification(notification);
+ }
+ }
+ }
+ }
+ },
+
+ getBrowserUsedForMigration() {
+ let browserId = Services.prefs.getCharPref(kAutoMigrateBrowserPref);
+ if (browserId) {
+ return MigrationUtils.getBrowserName(browserId);
+ }
+ return null;
+ },
+
+ maybeShowUndoNotification(target) {
+ this.canUndo().then(canUndo => {
+ // The tab might have navigated since we requested the undo state:
+ if (!canUndo || target.currentURI.spec != "about:home") {
+ return;
+ }
+ let win = target.ownerGlobal;
+ let notificationBox = win.gBrowser.getNotificationBox(target);
+ if (!notificationBox || notificationBox.getNotificationWithValue("abouthome-automigration-undo")) {
+ return;
+ }
+
+ let removeNotification = () => {
+ let notification = notificationBox.getNotificationWithValue(kNotificationId);
+ notificationBox.removeNotification(notification, true);
+ };
+ let browserName = this.getBrowserUsedForMigration();
+ let message;
+ if (browserName) {
+ message = MigrationUtils.getLocalizedString("automigration.undo.message",
+ [browserName]);
+ } else {
+ message = MigrationUtils.getLocalizedString("automigration.undo.unknownBrowserMessage");
+ }
+
+ let buttons = [
+ {
+ label: MigrationUtils.getLocalizedString("automigration.undo.keep.label"),
+ accessKey: MigrationUtils.getLocalizedString("automigration.undo.keep.accesskey"),
+ callback: () => {
+ this.removeUndoOption();
+ removeNotification();
+ },
+ },
+ {
+ label: MigrationUtils.getLocalizedString("automigration.undo.dontkeep.label"),
+ accessKey: MigrationUtils.getLocalizedString("automigration.undo.dontkeep.accesskey"),
+ callback: () => {
+ this.undo();
+ removeNotification();
+ },
+ },
+ ];
+ notificationBox.appendNotification(
+ message, kNotificationId, null, notificationBox.PRIORITY_INFO_HIGH, buttons
+ );
+ });
},
QueryInterface: XPCOMUtils.generateQI(
[Ci.nsIObserver, Ci.nsINavBookmarkObserver, Ci.nsISupportsWeakReference]
),
};
AutoMigrate.init();
--- a/browser/locales/en-US/chrome/browser/migration/migration.properties
+++ b/browser/locales/en-US/chrome/browser/migration/migration.properties
@@ -65,8 +65,16 @@ 32_360se=Bookmarks
64_ie=Other Data
64_edge=Other Data
64_safari=Other Data
64_chrome=Other Data
64_firefox_other=Other Data
64_360se=Other Data
128_firefox=Windows and Tabs
+
+# Automigration undo notification.
+automigration.undo.message = We automatically imported your data from %S. Would you like to keep it?
+automigration.undo.unknownBrowserMessage = We automatically imported your data from another browser. Would you like to keep it?
+automigration.undo.keep.label = Keep
+automigration.undo.keep.accesskey = K
+automigration.undo.dontkeep.label = Don't Keep
+automigration.undo.dontkeep.accesskey = D
--- a/browser/modules/AboutHome.jsm
+++ b/browser/modules/AboutHome.jsm
@@ -10,20 +10,22 @@ var Cu = Components.utils;
this.EXPORTED_SYMBOLS = [ "AboutHomeUtils", "AboutHome" ];
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "AutoMigrate",
+ "resource:///modules/AutoMigrate.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts",
+ "resource://gre/modules/FxAccounts.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts",
- "resource://gre/modules/FxAccounts.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Promise",
"resource://gre/modules/Promise.jsm");
// Url to fetch snippets, in the urlFormatter service format.
const SNIPPETS_URL_PREF = "browser.aboutHomeSnippets.updateUrl";
// Should be bumped up if the snippets content format changes.
const STARTPAGE_VERSION = 4;
@@ -94,16 +96,17 @@ var AboutHome = {
"AboutHome:RestorePreviousSession",
"AboutHome:Downloads",
"AboutHome:Bookmarks",
"AboutHome:History",
"AboutHome:Addons",
"AboutHome:Sync",
"AboutHome:Settings",
"AboutHome:RequestUpdate",
+ "AboutHome:MaybeShowAutoMigrationUndoNotification",
],
init: function() {
let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
for (let msg of this.MESSAGES) {
mm.addMessageListener(msg, this);
}
@@ -143,16 +146,20 @@ var AboutHome = {
case "AboutHome:Settings":
window.openPreferences();
break;
case "AboutHome:RequestUpdate":
this.sendAboutHomeData(aMessage.target);
break;
+
+ case "AboutHome:MaybeShowAutoMigrationUndoNotification":
+ AutoMigrate.maybeShowUndoNotification(aMessage.target);
+ break;
}
},
// Send all the chrome-privileged data needed by about:home. This
// gets re-sent when the search engine changes.
sendAboutHomeData: function(target) {
let wrapper = {};
Components.utils.import("resource:///modules/sessionstore/SessionStore.jsm",
@@ -177,10 +184,11 @@ var AboutHome = {
target.messageManager.sendAsyncMessage("AboutHome:Update", data);
} else {
let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
mm.broadcastAsyncMessage("AboutHome:Update", data);
}
}).then(null, function onError(x) {
Cu.reportError("Error in AboutHome.sendAboutHomeData: " + x);
});
- }
+ },
+
};