2010-08-02 16:37:56 -07:00
|
|
|
|
# ***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
|
#
|
|
|
|
|
# The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
|
# the License. You may obtain a copy of the License at
|
|
|
|
|
# http://www.mozilla.org/MPL/
|
|
|
|
|
#
|
|
|
|
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
|
# for the specific language governing rights and limitations under the
|
|
|
|
|
# License.
|
|
|
|
|
#
|
|
|
|
|
# The Original Code is the Bookmarks Sync.
|
|
|
|
|
#
|
|
|
|
|
# The Initial Developer of the Original Code is the Mozilla Foundation.
|
|
|
|
|
# Portions created by the Initial Developer are Copyright (C) 2007
|
|
|
|
|
# the Initial Developer. All Rights Reserved.
|
|
|
|
|
#
|
|
|
|
|
# Contributor(s):
|
|
|
|
|
# Dan Mills <thunder@mozilla.com>
|
|
|
|
|
# Chris Beard <cbeard@mozilla.com>
|
|
|
|
|
# Dan Mosedale <dmose@mozilla.org>
|
|
|
|
|
# Paul O’Shannessy <paul@oshannessy.com>
|
2010-09-15 06:55:04 -07:00
|
|
|
|
# Philipp von Weitershausen <philipp@weitershausen.de>
|
2010-08-02 16:37:56 -07:00
|
|
|
|
#
|
|
|
|
|
# Alternatively, the contents of this file may be used under the terms of
|
|
|
|
|
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
|
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
|
# of those above. If you wish to allow use of your version of this file only
|
|
|
|
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
|
# use your version of this file under the terms of the MPL, indicate your
|
|
|
|
|
# decision by deleting the provisions above and replace them with the notice
|
|
|
|
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
|
# the provisions above, a recipient may use your version of this file under
|
|
|
|
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
|
#
|
|
|
|
|
# ***** END LICENSE BLOCK *****
|
|
|
|
|
|
|
|
|
|
// gSyncUI handles updating the tools menu
|
|
|
|
|
let gSyncUI = {
|
2011-08-26 14:01:35 -07:00
|
|
|
|
_obs: ["weave:service:sync:start",
|
2011-07-29 18:48:15 -07:00
|
|
|
|
"weave:service:sync:delayed",
|
|
|
|
|
"weave:service:quota:remaining",
|
|
|
|
|
"weave:service:setup-complete",
|
|
|
|
|
"weave:service:login:start",
|
|
|
|
|
"weave:service:login:finish",
|
|
|
|
|
"weave:service:logout:finish",
|
2011-08-26 14:01:35 -07:00
|
|
|
|
"weave:service:start-over",
|
|
|
|
|
"weave:ui:login:error",
|
|
|
|
|
"weave:ui:sync:error",
|
2011-08-30 15:38:31 -07:00
|
|
|
|
"weave:ui:sync:finish",
|
|
|
|
|
"weave:ui:clear-error"],
|
2011-07-29 18:48:15 -07:00
|
|
|
|
|
|
|
|
|
_unloaded: false,
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
init: function SUI_init() {
|
2011-02-17 14:05:41 -08:00
|
|
|
|
// Proceed to set up the UI if Sync has already started up.
|
|
|
|
|
// Otherwise we'll do it when Sync is firing up.
|
|
|
|
|
if (Weave.Status.ready) {
|
|
|
|
|
this.initUI();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-11 18:28:27 -07:00
|
|
|
|
Services.obs.addObserver(this, "weave:service:ready", true);
|
2010-08-28 13:42:29 -07:00
|
|
|
|
|
|
|
|
|
// Remove the observer if the window is closed before the observer
|
|
|
|
|
// was triggered.
|
2011-07-29 18:48:15 -07:00
|
|
|
|
window.addEventListener("unload", function onUnload() {
|
|
|
|
|
gSyncUI._unloaded = true;
|
|
|
|
|
window.removeEventListener("unload", onUnload, false);
|
2010-08-28 13:42:29 -07:00
|
|
|
|
Services.obs.removeObserver(gSyncUI, "weave:service:ready");
|
2011-07-29 18:48:15 -07:00
|
|
|
|
|
|
|
|
|
if (Weave.Status.ready) {
|
|
|
|
|
gSyncUI._obs.forEach(function(topic) {
|
|
|
|
|
Services.obs.removeObserver(gSyncUI, topic);
|
|
|
|
|
});
|
|
|
|
|
}
|
2010-08-28 13:42:29 -07:00
|
|
|
|
}, false);
|
2010-08-11 18:28:27 -07:00
|
|
|
|
},
|
2011-02-17 14:05:41 -08:00
|
|
|
|
|
2010-08-11 18:28:27 -07:00
|
|
|
|
initUI: function SUI_initUI() {
|
2010-08-02 16:37:56 -07:00
|
|
|
|
// If this is a browser window?
|
|
|
|
|
if (gBrowser) {
|
2011-07-29 18:48:15 -07:00
|
|
|
|
this._obs.push("weave:notification:added");
|
2010-08-02 16:37:56 -07:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-29 18:48:15 -07:00
|
|
|
|
this._obs.forEach(function(topic) {
|
2011-02-17 14:06:00 -08:00
|
|
|
|
Services.obs.addObserver(this, topic, true);
|
|
|
|
|
}, this);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
|
|
|
|
|
// Find the alltabs-popup, only if there is a gBrowser
|
|
|
|
|
if (gBrowser) {
|
|
|
|
|
let popup = document.getElementById("alltabs-popup");
|
2010-12-15 14:48:53 -08:00
|
|
|
|
if (popup) {
|
2011-02-17 14:06:00 -08:00
|
|
|
|
popup.addEventListener(
|
|
|
|
|
"popupshowing", this.alltabsPopupShowing.bind(this), true);
|
2010-12-15 14:48:53 -08:00
|
|
|
|
}
|
2010-09-10 10:47:57 -07:00
|
|
|
|
|
|
|
|
|
if (Weave.Notifications.notifications.length)
|
|
|
|
|
this.initNotifications();
|
2010-08-02 16:37:56 -07:00
|
|
|
|
}
|
|
|
|
|
this.updateUI();
|
|
|
|
|
},
|
2011-07-29 18:48:15 -07:00
|
|
|
|
|
2010-09-10 10:47:57 -07:00
|
|
|
|
initNotifications: function SUI_initNotifications() {
|
|
|
|
|
const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
|
|
|
|
let notificationbox = document.createElementNS(XULNS, "notificationbox");
|
|
|
|
|
notificationbox.id = "sync-notifications";
|
|
|
|
|
notificationbox.setAttribute("flex", "1");
|
|
|
|
|
|
|
|
|
|
let bottombox = document.getElementById("browser-bottombox");
|
2010-09-23 09:09:55 -07:00
|
|
|
|
bottombox.insertBefore(notificationbox, bottombox.firstChild);
|
2010-09-10 10:47:57 -07:00
|
|
|
|
|
|
|
|
|
// Force a style flush to ensure that our binding is attached.
|
|
|
|
|
notificationbox.clientTop;
|
|
|
|
|
|
|
|
|
|
// notificationbox will listen to observers from now on.
|
|
|
|
|
Services.obs.removeObserver(this, "weave:notification:added");
|
|
|
|
|
},
|
2010-08-02 16:37:56 -07:00
|
|
|
|
|
|
|
|
|
_wasDelayed: false,
|
|
|
|
|
|
|
|
|
|
_needsSetup: function SUI__needsSetup() {
|
|
|
|
|
let firstSync = "";
|
|
|
|
|
try {
|
|
|
|
|
firstSync = Services.prefs.getCharPref("services.sync.firstSync");
|
|
|
|
|
} catch (e) { }
|
2010-09-07 18:37:46 -07:00
|
|
|
|
return Weave.Status.checkSetup() == Weave.CLIENT_NOT_CONFIGURED ||
|
2010-08-02 16:37:56 -07:00
|
|
|
|
firstSync == "notReady";
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
updateUI: function SUI_updateUI() {
|
|
|
|
|
let needsSetup = this._needsSetup();
|
2010-09-15 11:26:27 -07:00
|
|
|
|
document.getElementById("sync-setup-state").hidden = !needsSetup;
|
|
|
|
|
document.getElementById("sync-syncnow-state").hidden = needsSetup;
|
2010-08-02 16:37:56 -07:00
|
|
|
|
|
2010-09-15 19:24:10 -07:00
|
|
|
|
if (!gBrowser)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
let button = document.getElementById("sync-button");
|
|
|
|
|
if (!button)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
button.removeAttribute("status");
|
|
|
|
|
this._updateLastSyncTime();
|
|
|
|
|
if (needsSetup)
|
|
|
|
|
button.removeAttribute("tooltiptext");
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
alltabsPopupShowing: function(event) {
|
|
|
|
|
// Should we show the menu item?
|
2011-02-17 14:06:00 -08:00
|
|
|
|
//XXXphilikon We should remove the check for isLoggedIn here and have
|
|
|
|
|
// about:sync-tabs auto-login (bug 583344)
|
2010-08-02 16:37:56 -07:00
|
|
|
|
if (!Weave.Service.isLoggedIn || !Weave.Engines.get("tabs").enabled)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
let label = this._stringBundle.GetStringFromName("tabs.fromOtherComputers.label");
|
|
|
|
|
|
|
|
|
|
let popup = document.getElementById("alltabs-popup");
|
2010-12-15 14:48:53 -08:00
|
|
|
|
if (!popup)
|
|
|
|
|
return;
|
2011-07-29 18:48:15 -07:00
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
let menuitem = document.createElement("menuitem");
|
|
|
|
|
menuitem.setAttribute("id", "sync-tabs-menuitem");
|
|
|
|
|
menuitem.setAttribute("label", label);
|
|
|
|
|
menuitem.setAttribute("class", "alltabs-item");
|
|
|
|
|
menuitem.setAttribute("oncommand", "BrowserOpenSyncTabs();");
|
|
|
|
|
|
|
|
|
|
// Fake the tab object on the menu entries, so that we don't have to worry
|
|
|
|
|
// about removing them ourselves. They will just get cleaned up by popup
|
2010-09-15 23:09:27 -07:00
|
|
|
|
// binding.
|
2010-08-02 16:37:56 -07:00
|
|
|
|
menuitem.tab = { "linkedBrowser": { "currentURI": { "spec": label } } };
|
|
|
|
|
|
2011-02-19 02:35:02 -08:00
|
|
|
|
let sep = document.getElementById("alltabs-popup-separator");
|
2010-08-02 16:37:56 -07:00
|
|
|
|
popup.insertBefore(menuitem, sep);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Functions called by observers
|
|
|
|
|
onActivityStart: function SUI_onActivityStart() {
|
2010-09-15 19:24:10 -07:00
|
|
|
|
if (!gBrowser)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
let button = document.getElementById("sync-button");
|
|
|
|
|
if (!button)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
button.setAttribute("status", "active");
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onSyncDelay: function SUI_onSyncDelay() {
|
|
|
|
|
// basically, we want to just inform users that stuff is going to take a while
|
|
|
|
|
let title = this._stringBundle.GetStringFromName("error.sync.no_node_found.title");
|
|
|
|
|
let description = this._stringBundle.GetStringFromName("error.sync.no_node_found");
|
2010-09-23 15:19:42 -07:00
|
|
|
|
let buttons = [new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.serverStatusButton.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.serverStatusButton.accesskey"),
|
2010-10-08 08:57:04 -07:00
|
|
|
|
function() { gSyncUI.openServerStatus(); return true; }
|
2010-09-23 15:19:42 -07:00
|
|
|
|
)];
|
|
|
|
|
let notification = new Weave.Notification(
|
|
|
|
|
title, description, null, Weave.Notifications.PRIORITY_INFO, buttons);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
Weave.Notifications.replaceTitle(notification);
|
|
|
|
|
this._wasDelayed = true;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onLoginFinish: function SUI_onLoginFinish() {
|
|
|
|
|
// Clear out any login failure notifications
|
|
|
|
|
let title = this._stringBundle.GetStringFromName("error.login.title");
|
2011-08-30 15:38:31 -07:00
|
|
|
|
this.clearError(title);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
2011-10-26 18:26:53 -07:00
|
|
|
|
// Set visibility of "Setup Sync" link
|
|
|
|
|
showSetupSyncAboutHome: function SUI_showSetupSyncAboutHome(toShow) {
|
|
|
|
|
let browsers = gBrowser.browsers;
|
|
|
|
|
for (let i = 0; i < browsers.length; i++) {
|
|
|
|
|
let b = browsers[i];
|
|
|
|
|
if ("about:home" == b.currentURI.spec) {
|
|
|
|
|
b.contentDocument.getElementById("setupSyncLink").hidden = !toShow;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onSetupComplete: function SUI_onSetupComplete() {
|
|
|
|
|
// Remove "setup sync" link in about:home if it is open.
|
|
|
|
|
this.showSetupSyncAboutHome(false);
|
|
|
|
|
|
|
|
|
|
onLoginFinish();
|
|
|
|
|
},
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
onLoginError: function SUI_onLoginError() {
|
|
|
|
|
// if login fails, any other notifications are essentially moot
|
|
|
|
|
Weave.Notifications.removeAll();
|
|
|
|
|
|
|
|
|
|
// if we haven't set up the client, don't show errors
|
2011-08-26 14:01:35 -07:00
|
|
|
|
if (this._needsSetup()) {
|
2010-08-02 16:37:56 -07:00
|
|
|
|
this.updateUI();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let title = this._stringBundle.GetStringFromName("error.login.title");
|
2011-08-26 14:01:35 -07:00
|
|
|
|
|
|
|
|
|
let description;
|
|
|
|
|
if (Weave.Status.sync == Weave.PROLONGED_SYNC_FAILURE) {
|
|
|
|
|
// Convert to days
|
|
|
|
|
let lastSync =
|
|
|
|
|
Services.prefs.getIntPref("services.sync.errorhandler.networkFailureReportTimeout") / 86400;
|
|
|
|
|
description =
|
|
|
|
|
this._stringBundle.formatStringFromName("error.sync.prolonged_failure", [lastSync], 1);
|
|
|
|
|
} else {
|
|
|
|
|
let reason = Weave.Utils.getErrorString(Weave.Status.login);
|
|
|
|
|
description =
|
|
|
|
|
this._stringBundle.formatStringFromName("error.sync.description", [reason], 1);
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
let buttons = [];
|
|
|
|
|
buttons.push(new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName("error.login.prefs.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName("error.login.prefs.accesskey"),
|
|
|
|
|
function() { gSyncUI.openPrefs(); return true; }
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
let notification = new Weave.Notification(title, description, null,
|
|
|
|
|
Weave.Notifications.PRIORITY_WARNING, buttons);
|
|
|
|
|
Weave.Notifications.replaceTitle(notification);
|
|
|
|
|
this.updateUI();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onLogout: function SUI_onLogout() {
|
|
|
|
|
this.updateUI();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onStartOver: function SUI_onStartOver() {
|
2011-08-30 15:38:31 -07:00
|
|
|
|
this.clearError();
|
2011-10-26 18:26:53 -07:00
|
|
|
|
// Make "setup sync" link visible in about:home if it is open.
|
|
|
|
|
this.showSetupSyncAboutHome(true);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
2010-09-15 06:55:04 -07:00
|
|
|
|
onQuotaNotice: function onQuotaNotice(subject, data) {
|
|
|
|
|
let title = this._stringBundle.GetStringFromName("warning.sync.quota.label");
|
|
|
|
|
let description = this._stringBundle.GetStringFromName("warning.sync.quota.description");
|
|
|
|
|
let buttons = [];
|
|
|
|
|
buttons.push(new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.viewQuotaButton.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.viewQuotaButton.accesskey"),
|
|
|
|
|
function() { gSyncUI.openQuotaDialog(); return true; }
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
let notification = new Weave.Notification(
|
|
|
|
|
title, description, null, Weave.Notifications.PRIORITY_WARNING, buttons);
|
|
|
|
|
Weave.Notifications.replaceTitle(notification);
|
|
|
|
|
},
|
|
|
|
|
|
2010-09-23 15:19:42 -07:00
|
|
|
|
openServerStatus: function () {
|
|
|
|
|
let statusURL = Services.prefs.getCharPref("services.sync.statusURL");
|
|
|
|
|
window.openUILinkIn(statusURL, "tab");
|
|
|
|
|
},
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
// Commands
|
|
|
|
|
doSync: function SUI_doSync() {
|
2011-08-26 14:01:35 -07:00
|
|
|
|
setTimeout(function() Weave.ErrorHandler.syncAndReportErrors(), 0);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
2010-09-10 10:00:55 -07:00
|
|
|
|
handleToolbarButton: function SUI_handleStatusbarButton() {
|
2010-09-15 11:26:27 -07:00
|
|
|
|
if (this._needsSetup())
|
2010-08-02 16:37:56 -07:00
|
|
|
|
this.openSetup();
|
|
|
|
|
else
|
2010-09-15 11:26:27 -07:00
|
|
|
|
this.doSync();
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
//XXXzpao should be part of syncCommon.js - which we might want to make a module...
|
|
|
|
|
// To be fixed in a followup (bug 583366)
|
2011-10-26 18:26:51 -07:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Invoke the Sync setup wizard.
|
|
|
|
|
*
|
|
|
|
|
* @param wizardType
|
|
|
|
|
* Indicates type of wizard to launch:
|
|
|
|
|
* null -- regular set up wizard
|
|
|
|
|
* "pair" -- pair a device first
|
|
|
|
|
* "reset" -- reset sync
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
openSetup: function SUI_openSetup(wizardType) {
|
2010-08-02 16:37:56 -07:00
|
|
|
|
let win = Services.wm.getMostRecentWindow("Weave:AccountSetup");
|
|
|
|
|
if (win)
|
|
|
|
|
win.focus();
|
|
|
|
|
else {
|
|
|
|
|
window.openDialog("chrome://browser/content/syncSetup.xul",
|
2011-10-26 18:26:51 -07:00
|
|
|
|
"weaveSetup", "centerscreen,chrome,resizable=no",
|
|
|
|
|
wizardType);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2011-10-26 18:26:51 -07:00
|
|
|
|
openAddDevice: function () {
|
|
|
|
|
if (!Weave.Utils.ensureMPUnlocked())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
let win = Services.wm.getMostRecentWindow("Sync:AddDevice");
|
|
|
|
|
if (win)
|
|
|
|
|
win.focus();
|
|
|
|
|
else
|
|
|
|
|
window.openDialog("chrome://browser/content/syncAddDevice.xul",
|
|
|
|
|
"syncAddDevice", "centerscreen,chrome,resizable=no");
|
|
|
|
|
},
|
|
|
|
|
|
2010-09-15 06:55:04 -07:00
|
|
|
|
openQuotaDialog: function SUI_openQuotaDialog() {
|
|
|
|
|
let win = Services.wm.getMostRecentWindow("Sync:ViewQuota");
|
|
|
|
|
if (win)
|
|
|
|
|
win.focus();
|
2011-07-29 18:48:15 -07:00
|
|
|
|
else
|
2010-09-15 06:55:04 -07:00
|
|
|
|
Services.ww.activeWindow.openDialog(
|
|
|
|
|
"chrome://browser/content/syncQuota.xul", "",
|
|
|
|
|
"centerscreen,chrome,dialog,modal");
|
|
|
|
|
},
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
openPrefs: function SUI_openPrefs() {
|
|
|
|
|
openPreferences("paneSync");
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Helpers
|
2010-09-15 11:26:27 -07:00
|
|
|
|
_updateLastSyncTime: function SUI__updateLastSyncTime() {
|
|
|
|
|
if (!gBrowser)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
let syncButton = document.getElementById("sync-button");
|
2010-09-15 19:24:10 -07:00
|
|
|
|
if (!syncButton)
|
|
|
|
|
return;
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
let lastSync;
|
|
|
|
|
try {
|
2010-08-28 13:42:29 -07:00
|
|
|
|
lastSync = Services.prefs.getCharPref("services.sync.lastSync");
|
2010-08-02 16:37:56 -07:00
|
|
|
|
}
|
|
|
|
|
catch (e) { };
|
2010-09-15 11:26:27 -07:00
|
|
|
|
if (!lastSync || this._needsSetup()) {
|
|
|
|
|
syncButton.removeAttribute("tooltiptext");
|
2010-08-02 16:37:56 -07:00
|
|
|
|
return;
|
2010-09-15 11:26:27 -07:00
|
|
|
|
}
|
2010-08-02 16:37:56 -07:00
|
|
|
|
|
|
|
|
|
// Show the day-of-week and time (HH:MM) of last sync
|
|
|
|
|
let lastSyncDate = new Date(lastSync).toLocaleFormat("%a %H:%M");
|
|
|
|
|
let lastSyncLabel =
|
2011-05-30 12:51:34 -07:00
|
|
|
|
this._stringBundle.formatStringFromName("lastSync2.label", [lastSyncDate], 1);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
|
2010-09-15 11:26:27 -07:00
|
|
|
|
syncButton.setAttribute("tooltiptext", lastSyncLabel);
|
2010-08-02 16:37:56 -07:00
|
|
|
|
},
|
|
|
|
|
|
2011-08-30 15:38:31 -07:00
|
|
|
|
clearError: function SUI_clearError(errorString) {
|
|
|
|
|
Weave.Notifications.removeAll(errorString);
|
|
|
|
|
this.updateUI();
|
|
|
|
|
},
|
|
|
|
|
|
2011-08-26 14:01:35 -07:00
|
|
|
|
onSyncFinish: function SUI_onSyncFinish() {
|
2010-08-02 16:37:56 -07:00
|
|
|
|
let title = this._stringBundle.GetStringFromName("error.sync.title");
|
2011-02-03 10:54:00 -08:00
|
|
|
|
|
2011-08-26 14:01:35 -07:00
|
|
|
|
// Clear out sync failures on a successful sync
|
2011-08-30 15:38:31 -07:00
|
|
|
|
this.clearError(title);
|
2011-08-26 14:01:35 -07:00
|
|
|
|
|
|
|
|
|
if (this._wasDelayed && Weave.Status.sync != Weave.NO_SYNC_NODE_FOUND) {
|
|
|
|
|
title = this._stringBundle.GetStringFromName("error.sync.no_node_found.title");
|
2011-08-30 15:38:31 -07:00
|
|
|
|
this.clearError(title);
|
2011-08-26 14:01:35 -07:00
|
|
|
|
this._wasDelayed = false;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onSyncError: function SUI_onSyncError() {
|
|
|
|
|
let title = this._stringBundle.GetStringFromName("error.sync.title");
|
|
|
|
|
|
|
|
|
|
if (Weave.Status.login != Weave.LOGIN_SUCCEEDED) {
|
|
|
|
|
this.onLoginError();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let description;
|
|
|
|
|
if (Weave.Status.sync == Weave.PROLONGED_SYNC_FAILURE) {
|
|
|
|
|
// Convert to days
|
|
|
|
|
let lastSync =
|
|
|
|
|
Services.prefs.getIntPref("services.sync.errorhandler.networkFailureReportTimeout") / 86400;
|
|
|
|
|
description =
|
|
|
|
|
this._stringBundle.formatStringFromName("error.sync.prolonged_failure", [lastSync], 1);
|
|
|
|
|
} else {
|
2010-08-02 16:37:56 -07:00
|
|
|
|
let error = Weave.Utils.getErrorString(Weave.Status.sync);
|
2011-08-26 14:01:35 -07:00
|
|
|
|
description =
|
2010-08-02 16:37:56 -07:00
|
|
|
|
this._stringBundle.formatStringFromName("error.sync.description", [error], 1);
|
2011-08-26 14:01:35 -07:00
|
|
|
|
}
|
|
|
|
|
let priority = Weave.Notifications.PRIORITY_WARNING;
|
|
|
|
|
let buttons = [];
|
2010-08-02 16:37:56 -07:00
|
|
|
|
|
2011-08-26 14:01:35 -07:00
|
|
|
|
// Check if the client is outdated in some way
|
|
|
|
|
let outdated = Weave.Status.sync == Weave.VERSION_OUT_OF_DATE;
|
|
|
|
|
for (let [engine, reason] in Iterator(Weave.Status.engines))
|
|
|
|
|
outdated = outdated || reason == Weave.VERSION_OUT_OF_DATE;
|
|
|
|
|
|
|
|
|
|
if (outdated) {
|
|
|
|
|
description = this._stringBundle.GetStringFromName(
|
|
|
|
|
"error.sync.needUpdate.description");
|
|
|
|
|
buttons.push(new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.needUpdate.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.needUpdate.accesskey"),
|
|
|
|
|
function() { window.openUILinkIn("https://services.mozilla.com/update/", "tab"); return true; }
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
else if (Weave.Status.sync == Weave.OVER_QUOTA) {
|
|
|
|
|
description = this._stringBundle.GetStringFromName(
|
|
|
|
|
"error.sync.quota.description");
|
|
|
|
|
buttons.push(new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName(
|
|
|
|
|
"error.sync.viewQuotaButton.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName(
|
|
|
|
|
"error.sync.viewQuotaButton.accesskey"),
|
|
|
|
|
function() { gSyncUI.openQuotaDialog(); return true; } )
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
else if (Weave.Status.enforceBackoff) {
|
|
|
|
|
priority = Weave.Notifications.PRIORITY_INFO;
|
|
|
|
|
buttons.push(new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.serverStatusButton.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.serverStatusButton.accesskey"),
|
|
|
|
|
function() { gSyncUI.openServerStatus(); return true; }
|
|
|
|
|
));
|
2010-08-02 16:37:56 -07:00
|
|
|
|
}
|
|
|
|
|
else {
|
2011-08-26 14:01:35 -07:00
|
|
|
|
priority = Weave.Notifications.PRIORITY_INFO;
|
|
|
|
|
buttons.push(new Weave.NotificationButton(
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.tryAgainButton.label"),
|
|
|
|
|
this._stringBundle.GetStringFromName("error.sync.tryAgainButton.accesskey"),
|
|
|
|
|
function() { gSyncUI.doSync(); return true; }
|
|
|
|
|
));
|
2010-08-02 16:37:56 -07:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-26 14:01:35 -07:00
|
|
|
|
let notification =
|
|
|
|
|
new Weave.Notification(title, description, null, priority, buttons);
|
|
|
|
|
Weave.Notifications.replaceTitle(notification);
|
|
|
|
|
|
2010-08-02 16:37:56 -07:00
|
|
|
|
if (this._wasDelayed && Weave.Status.sync != Weave.NO_SYNC_NODE_FOUND) {
|
|
|
|
|
title = this._stringBundle.GetStringFromName("error.sync.no_node_found.title");
|
|
|
|
|
Weave.Notifications.removeAll(title);
|
|
|
|
|
this._wasDelayed = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.updateUI();
|
2010-08-11 18:28:27 -07:00
|
|
|
|
},
|
2011-07-29 18:48:15 -07:00
|
|
|
|
|
2010-08-11 18:28:27 -07:00
|
|
|
|
observe: function SUI_observe(subject, topic, data) {
|
2011-07-29 18:48:15 -07:00
|
|
|
|
if (this._unloaded) {
|
|
|
|
|
Cu.reportError("SyncUI observer called after unload: " + topic);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-11 18:28:27 -07:00
|
|
|
|
switch (topic) {
|
|
|
|
|
case "weave:service:sync:start":
|
|
|
|
|
this.onActivityStart();
|
|
|
|
|
break;
|
2011-08-26 14:01:35 -07:00
|
|
|
|
case "weave:ui:sync:finish":
|
2010-08-11 18:28:27 -07:00
|
|
|
|
this.onSyncFinish();
|
|
|
|
|
break;
|
2011-08-26 14:01:35 -07:00
|
|
|
|
case "weave:ui:sync:error":
|
2010-08-11 18:28:27 -07:00
|
|
|
|
this.onSyncError();
|
|
|
|
|
break;
|
|
|
|
|
case "weave:service:sync:delayed":
|
|
|
|
|
this.onSyncDelay();
|
|
|
|
|
break;
|
2010-09-15 06:55:04 -07:00
|
|
|
|
case "weave:service:quota:remaining":
|
|
|
|
|
this.onQuotaNotice();
|
|
|
|
|
break;
|
2010-08-11 18:28:27 -07:00
|
|
|
|
case "weave:service:setup-complete":
|
2011-10-26 18:26:53 -07:00
|
|
|
|
this.onSetupComplete();
|
2010-08-11 18:28:27 -07:00
|
|
|
|
break;
|
|
|
|
|
case "weave:service:login:start":
|
|
|
|
|
this.onActivityStart();
|
|
|
|
|
break;
|
|
|
|
|
case "weave:service:login:finish":
|
|
|
|
|
this.onLoginFinish();
|
|
|
|
|
break;
|
2011-08-26 14:01:35 -07:00
|
|
|
|
case "weave:ui:login:error":
|
2010-08-11 18:28:27 -07:00
|
|
|
|
this.onLoginError();
|
|
|
|
|
break;
|
|
|
|
|
case "weave:service:logout:finish":
|
|
|
|
|
this.onLogout();
|
|
|
|
|
break;
|
|
|
|
|
case "weave:service:start-over":
|
|
|
|
|
this.onStartOver();
|
|
|
|
|
break;
|
|
|
|
|
case "weave:service:ready":
|
|
|
|
|
this.initUI();
|
|
|
|
|
break;
|
2010-08-28 13:42:04 -07:00
|
|
|
|
case "weave:notification:added":
|
2010-09-10 10:47:57 -07:00
|
|
|
|
this.initNotifications();
|
2010-08-28 13:42:04 -07:00
|
|
|
|
break;
|
2011-08-30 15:38:31 -07:00
|
|
|
|
case "weave:ui:clear-error":
|
|
|
|
|
this.clearError();
|
|
|
|
|
break;
|
2010-08-11 18:28:27 -07:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([
|
|
|
|
|
Ci.nsIObserver,
|
|
|
|
|
Ci.nsISupportsWeakReference
|
|
|
|
|
])
|
2010-08-02 16:37:56 -07:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
XPCOMUtils.defineLazyGetter(gSyncUI, "_stringBundle", function() {
|
|
|
|
|
//XXXzpao these strings should probably be moved from /services to /browser... (bug 583381)
|
|
|
|
|
// but for now just make it work
|
|
|
|
|
return Cc["@mozilla.org/intl/stringbundle;1"].
|
|
|
|
|
getService(Ci.nsIStringBundleService).
|
|
|
|
|
createBundle("chrome://weave/locale/services/sync.properties");
|
|
|
|
|
});
|
|
|
|
|
|