Bug 946320 - [Australis] history widget missing a "Tabs From Other Devices" entry. r=Gijs

This commit is contained in:
Jared Wein
2014-01-03 14:57:19 -05:00
parent d005dae1f7
commit 965a42e7fd
8 changed files with 128 additions and 10 deletions

View File

@@ -569,18 +569,12 @@ HistoryMenu.prototype = {
if (!menuitem)
return;
// If Sync isn't configured yet, then don't show the menuitem.
if (Weave.Status.checkSetup() == Weave.CLIENT_NOT_CONFIGURED ||
Weave.Svc.Prefs.get("firstSync", "") == "notReady") {
if (!PlacesUIUtils.shouldShowTabsFromOtherComputersMenuitem()) {
menuitem.setAttribute("hidden", true);
return;
}
// The tabs engine might never be inited (if services.sync.registerEngines
// is modified), so make sure we avoid undefined errors.
let enabled = Weave.Service.isLoggedIn &&
Weave.Service.engineManager.get("tabs") &&
Weave.Service.engineManager.get("tabs").enabled;
let enabled = PlacesUIUtils.shouldEnableTabsFromOtherComputersMenuitem();
menuitem.setAttribute("disabled", !enabled);
menuitem.setAttribute("hidden", false);
#endif

View File

@@ -45,6 +45,13 @@
<toolbarbutton id="appMenuClearRecentHistory" tabindex="0"
label="&appMenuHistory.clearRecent.label;"
command="Tools:Sanitize"/>
#ifdef MOZ_SERVICES_SYNC
<toolbarbutton id="sync-tabs-menuitem2"
class="syncTabsMenuItem"
label="&syncTabsMenu2.label;"
oncommand="BrowserOpenSyncTabs();"
disabled="true"/>
#endif
<toolbarbutton id="appMenuRestoreLastSession" tabindex="0"
label="&appMenuHistory.restoreSession.label;"
command="Browser:RestoreLastSession"/>

View File

@@ -12,6 +12,8 @@ Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
"resource://gre/modules/PlacesUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUIUtils",
"resource:///modules/PlacesUIUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "RecentlyClosedTabsAndWindowsMenuUtils",
"resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm");
XPCOMUtils.defineLazyServiceGetter(this, "CharsetManager",
@@ -133,6 +135,21 @@ const CustomizableWidgets = [{
recentlyClosedWindows.removeChild(recentlyClosedWindows.firstChild);
}
#ifdef MOZ_SERVICES_SYNC
let tabsFromOtherComputers = doc.getElementById("sync-tabs-menuitem2");
if (PlacesUIUtils.shouldShowTabsFromOtherComputersMenuitem()) {
tabsFromOtherComputers.removeAttribute("hidden");
} else {
tabsFromOtherComputers.setAttribute("hidden", true);
}
if (PlacesUIUtils.shouldEnableTabsFromOtherComputersMenuitem()) {
tabsFromOtherComputers.removeAttribute("disabled");
} else {
tabsFromOtherComputers.setAttribute("disabled", true);
}
#endif
let tabsFragment = RecentlyClosedTabsAndWindowsMenuUtils.getTabsFragment(doc.defaultView, "toolbarbutton");
let separator = doc.getElementById("PanelUI-recentlyClosedTabs-separator");
separator.hidden = !tabsFragment.childElementCount;

View File

@@ -49,6 +49,7 @@ skip-if = os == "mac"
[browser_943683_migration_test.js]
[browser_944887_destroyWidget_should_destroy_in_palette.js]
[browser_945739_showInPrivateBrowsing_customize_mode.js]
[browser_946320_tabs_from_other_computers.js]
[browser_947987_removable_default.js]
[browser_948985_non_removable_defaultArea.js]
[browser_952963_areaType_getter_no_area.js]

View File

@@ -0,0 +1,50 @@
/* 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/. */
"use strict";
let Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences;
Cu.import("resource://gre/modules/Promise.jsm");
add_task(function() {
let shownPanelPromise = promisePanelShown(window);
PanelUI.toggle({type: "command"});
yield shownPanelPromise;
let historyButton = document.getElementById("history-panelmenu");
let historySubview = document.getElementById("PanelUI-history");
let subviewShownPromise = subviewShown(historySubview);
EventUtils.synthesizeMouseAtCenter(historyButton, {});
yield subviewShownPromise;
let tabsFromOtherComputers = document.getElementById("sync-tabs-menuitem2");
is(tabsFromOtherComputers.hidden, true, "The Tabs From Other Computers menuitem should be hidden when sync isn't enabled.");
let subviewHiddenPromise = subviewHidden(historySubview);
let panelMultiView = document.getElementById("PanelUI-multiView");
panelMultiView.showMainView();
yield subviewHiddenPromise;
// Part 2 - When Sync is enabled the menuitem should be shown.
Weave.Service.createAccount("john@doe.com", "mysecretpw",
"challenge", "response");
Weave.Service.identity.account = "john@doe.com";
Weave.Service.identity.basicPassword = "mysecretpw";
Weave.Service.identity.syncKey = Weave.Utils.generatePassphrase();
Weave.Svc.Prefs.set("firstSync", "newAccount");
Weave.Service.persistLogin();
subviewShownPromise = subviewShown(historySubview);
EventUtils.synthesizeMouseAtCenter(historyButton, {});
yield subviewShownPromise;
is(tabsFromOtherComputers.hidden, false, "The Tabs From Other Computers menuitem should be shown when sync is enabled.");
let syncPrefBranch = new Preferences("services.sync.");
syncPrefBranch.resetBranch("");
let hiddenPanelPromise = promisePanelHidden(window);
PanelUI.toggle({type: "command"});
yield hiddenPanelPromise;
});

View File

@@ -246,6 +246,36 @@ function promisePanelElementHidden(win, aPanel) {
return deferred.promise;
}
function subviewShown(aSubview) {
let deferred = Promise.defer();
let win = aSubview.ownerDocument.defaultView;
let timeoutId = win.setTimeout(() => {
deferred.reject("Subview (" + aSubview.id + ") did not show within 20 seconds.");
}, 20000);
function onViewShowing(e) {
aSubview.removeEventListener("ViewShowing", onViewShowing);
win.clearTimeout(timeoutId);
deferred.resolve();
};
aSubview.addEventListener("ViewShowing", onViewShowing);
return deferred.promise;
}
function subviewHidden(aSubview) {
let deferred = Promise.defer();
let win = aSubview.ownerDocument.defaultView;
let timeoutId = win.setTimeout(() => {
deferred.reject("Subview (" + aSubview.id + ") did not hide within 20 seconds.");
}, 20000);
function onViewHiding(e) {
aSubview.removeEventListener("ViewHiding", onViewHiding);
win.clearTimeout(timeoutId);
deferred.resolve();
};
aSubview.addEventListener("ViewHiding", onViewHiding);
return deferred.promise;
}
function waitForCondition(aConditionFn, aMaxTries=50, aCheckInterval=100) {
function tryNow() {
tries++;

View File

@@ -19,6 +19,11 @@ XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
#ifdef MOZ_SERVICES_SYNC
XPCOMUtils.defineLazyModuleGetter(this, "Weave",
"resource://services-sync/main.js");
#endif
XPCOMUtils.defineLazyGetter(this, "PlacesUtils", function() {
Cu.import("resource://gre/modules/PlacesUtils.jsm");
return PlacesUtils;
@@ -987,7 +992,21 @@ this.PlacesUIUtils = {
}
}
return queryName;
}
},
shouldShowTabsFromOtherComputersMenuitem: function() {
// If Sync isn't configured yet, then don't show the menuitem.
return Weave.Status.checkSetup() != Weave.CLIENT_NOT_CONFIGURED &&
Weave.Svc.Prefs.get("firstSync", "") != "notReady";
},
shouldEnableTabsFromOtherComputersMenuitem: function() {
// The tabs engine might never be inited (if services.sync.registerEngines
// is modified), so make sure we avoid undefined errors.
return Weave.Service.isLoggedIn &&
Weave.Service.engineManager.get("tabs") &&
Weave.Service.engineManager.get("tabs").enabled;
},
};
XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "RDF",

View File

@@ -9,7 +9,7 @@ EXTRA_COMPONENTS += [
'PlacesProtocolHandler.js',
]
EXTRA_JS_MODULES += [
EXTRA_PP_JS_MODULES += [
'PlacesUIUtils.jsm',
]