diff options
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_bug562797.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/browser/browser_bug562797.js | 975 |
1 files changed, 975 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/browser/browser_bug562797.js b/toolkit/mozapps/webextensions/test/browser/browser_bug562797.js new file mode 100644 index 0000000000..55e882a057 --- /dev/null +++ b/toolkit/mozapps/webextensions/test/browser/browser_bug562797.js @@ -0,0 +1,975 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +/** + * Tests that history navigation works for the add-ons manager. + */ + +const MAIN_URL = "https://example.com/" + RELATIVE_DIR + "discovery.html"; +const SECOND_URL = "https://example.com/" + RELATIVE_DIR + "releaseNotes.xhtml"; + +var gLoadCompleteCallback = null; + +var gProgressListener = { + onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) { + // Only care about the network stop status events + if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)) || + !(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP))) + return; + + if (gLoadCompleteCallback) + executeSoon(gLoadCompleteCallback); + gLoadCompleteCallback = null; + }, + + onLocationChange: function() { }, + onSecurityChange: function() { }, + onProgressChange: function() { }, + onStatusChange: function() { }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, + Ci.nsISupportsWeakReference]), +}; + +function waitForLoad(aManager, aCallback) { + var browser = aManager.document.getElementById("discover-browser"); + browser.addProgressListener(gProgressListener); + + gLoadCompleteCallback = function() { + browser.removeProgressListener(gProgressListener); + aCallback(); + }; +} + +function clickLink(aManager, aId, aCallback) { + waitForLoad(aManager, aCallback); + + var browser = aManager.document.getElementById("discover-browser"); + + var link = browser.contentDocument.getElementById(aId); + EventUtils.sendMouseEvent({type: "click"}, link); +} + +function test() { + requestLongerTimeout(2); + + waitForExplicitFinish(); + + Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL); + + SpecialPowers.pushPrefEnv({"set": [ + ["dom.ipc.processCount", 1], + ]}, () => { + var gProvider = new MockProvider(); + gProvider.createAddons([{ + id: "test1@tests.mozilla.org", + name: "Test add-on 1", + description: "foo" + }, + { + id: "test2@tests.mozilla.org", + name: "Test add-on 2", + description: "bar" + }, + { + id: "test3@tests.mozilla.org", + name: "Test add-on 3", + type: "theme", + description: "bar" + }]); + }); + + run_next_test(); +} + +function end_test() { + finish(); +} + +function go_back(aManager) { + if (gUseInContentUI) { + gBrowser.goBack(); + } else { + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("back-btn"), + { }, aManager); + } +} + +function go_back_backspace(aManager) { + EventUtils.synthesizeKey("VK_BACK_SPACE", {}); +} + +function go_forward_backspace(aManager) { + EventUtils.synthesizeKey("VK_BACK_SPACE", {shiftKey: true}); +} + +function go_forward(aManager) { + if (gUseInContentUI) { + gBrowser.goForward(); + } else { + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("forward-btn"), + { }, aManager); + } +} + +function check_state(aManager, canGoBack, canGoForward) { + var doc = aManager.document; + + if (gUseInContentUI) { + is(gBrowser.canGoBack, canGoBack, "canGoBack should be correct"); + is(gBrowser.canGoForward, canGoForward, "canGoForward should be correct"); + } + + if (!is_hidden(doc.getElementById("back-btn"))) { + is(!doc.getElementById("back-btn").disabled, canGoBack, "Back button should have the right state"); + is(!doc.getElementById("forward-btn").disabled, canGoForward, "Forward button should have the right state"); + } +} + +function is_in_list(aManager, view, canGoBack, canGoForward) { + var doc = aManager.document; + + is(doc.getElementById("categories").selectedItem.value, view, "Should be on the right category"); + is(get_current_view(aManager).id, "list-view", "Should be on the right view"); + + check_state(aManager, canGoBack, canGoForward); +} + +function is_in_search(aManager, query, canGoBack, canGoForward) { + var doc = aManager.document; + + is(doc.getElementById("categories").selectedItem.value, "addons://search/", "Should be on the right category"); + is(get_current_view(aManager).id, "search-view", "Should be on the right view"); + is(doc.getElementById("header-search").value, query, "Should have used the right query"); + + check_state(aManager, canGoBack, canGoForward); +} + +function is_in_detail(aManager, view, canGoBack, canGoForward) { + var doc = aManager.document; + + is(doc.getElementById("categories").selectedItem.value, view, "Should be on the right category"); + is(get_current_view(aManager).id, "detail-view", "Should be on the right view"); + + check_state(aManager, canGoBack, canGoForward); +} + +function is_in_discovery(aManager, url, canGoBack, canGoForward) { + var browser = aManager.document.getElementById("discover-browser"); + + is(aManager.document.getElementById("discover-view").selectedPanel, browser, + "Browser should be visible"); + + var spec = browser.currentURI.spec; + var pos = spec.indexOf("#"); + if (pos != -1) + spec = spec.substring(0, pos); + + is(spec, url, "Should have loaded the right url"); + + check_state(aManager, canGoBack, canGoForward); +} + +function double_click_addon_element(aManager, aId) { + var addon = get_addon_element(aManager, aId); + addon.parentNode.ensureElementIsVisible(addon); + EventUtils.synthesizeMouseAtCenter(addon, { clickCount: 1 }, aManager); + EventUtils.synthesizeMouseAtCenter(addon, { clickCount: 2 }, aManager); +} + +// Tests simple forward and back navigation and that the right heading and +// category is selected +add_test(function() { + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-plugin"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 3"); + is_in_list(aManager, "addons://list/extension", false, true); + + go_forward(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 4"); + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 5"); + is_in_list(aManager, "addons://list/extension", false, true); + + double_click_addon_element(aManager, "test1@tests.mozilla.org"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 6"); + is_in_detail(aManager, "addons://list/extension", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 7"); + is_in_list(aManager, "addons://list/extension", false, true); + + close_manager(aManager, run_next_test); + }); + }); + }); + }); + }); + }); + }); +}); + +// Tests that browsing to the add-ons manager from a website and going back works +// Only relevant for in-content UI +add_test(function() { + if (!gUseInContentUI) { + run_next_test(); + return; + } + + function promiseViewLoad(manager) { + return new Promise(resolve => { + wait_for_view_load(manager, resolve); + }); + } + + function promiseManagerLoaded(manager) { + return new Promise(resolve => { + wait_for_manager_load(manager, resolve); + }); + } + + Task.spawn(function*() { + info("Part 1"); + yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/", true, true); + + info("Part 2"); + ok(!gBrowser.canGoBack, "Should not be able to go back"); + ok(!gBrowser.canGoForward, "Should not be able to go forward"); + + yield BrowserTestUtils.loadURI(gBrowser.selectedBrowser, "about:addons"); + yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let manager = yield promiseManagerLoaded(gBrowser.contentWindow.wrappedJSObject); + + info("Part 3"); + is_in_list(manager, "addons://list/extension", true, false); + + // XXX: This is less than ideal, as it's currently difficult to deal with + // the browser frame switching between remote/non-remote in e10s mode. + let promiseLoaded; + if (gMultiProcessBrowser) { + promiseLoaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + } else { + promiseLoaded = BrowserTestUtils.waitForEvent(gBrowser.selectedBrowser, "pageshow"); + } + + go_back(manager); + yield promiseLoaded; + + info("Part 4"); + is(gBrowser.currentURI.spec, "http://example.com/", "Should be showing the webpage"); + ok(!gBrowser.canGoBack, "Should not be able to go back"); + ok(gBrowser.canGoForward, "Should be able to go forward"); + + promiseLoaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + go_forward(manager); + yield promiseLoaded; + + manager = yield promiseManagerLoaded(gBrowser.contentWindow.wrappedJSObject); + info("Part 5"); + is_in_list(manager, "addons://list/extension", true, false); + + close_manager(manager, run_next_test); + }); +}); + +// Tests simple forward and back navigation and that the right heading and +// category is selected -- Keyboard navigation [Bug 565359] +// Only add the test if the backspace key navigates back and addon-manager +// loaded in a tab +add_test(function() { + + if (!gUseInContentUI || (Services.prefs.getIntPref("browser.backspace_action") != 0)) { + run_next_test(); + return; + } + + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-plugin"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back_backspace(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 3"); + is_in_list(aManager, "addons://list/extension", false, true); + + go_forward_backspace(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 4"); + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back_backspace(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 5"); + is_in_list(aManager, "addons://list/extension", false, true); + + double_click_addon_element(aManager, "test1@tests.mozilla.org"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 6"); + is_in_detail(aManager, "addons://list/extension", true, false); + + go_back_backspace(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 7"); + is_in_list(aManager, "addons://list/extension", false, true); + + close_manager(aManager, run_next_test); + }); + }); + }); + }); + }); + }); + }); +}); + + +// Tests that opening a custom first view only stores a single history entry +add_test(function() { + open_manager("addons://list/plugin", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/plugin", false, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-extension"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_list(aManager, "addons://list/extension", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 3"); + is_in_list(aManager, "addons://list/plugin", false, true); + + close_manager(aManager, run_next_test); + }); + }); + }); +}); + + +// Tests that opening a view while the manager is already open adds a new +// history entry +add_test(function() { + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + aManager.loadView("addons://list/plugin"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 3"); + is_in_list(aManager, "addons://list/extension", false, true); + + go_forward(aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 4"); + is_in_list(aManager, "addons://list/plugin", true, false); + + close_manager(aManager, run_next_test); + }); + }); + }); + }); +}); + +// Tests than navigating to a website and then going back returns to the +// previous view +// Only relevant for in-content UI +add_test(function() { + if (!gUseInContentUI) { + run_next_test(); + return; + } + + open_manager("addons://list/plugin", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/plugin", false, false); + + gBrowser.loadURI("http://example.com/"); + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "http://example.com/") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + info("Part 2"); + + executeSoon(function() { + ok(gBrowser.canGoBack, "Should be able to go back"); + ok(!gBrowser.canGoForward, "Should not be able to go forward"); + + go_back(aManager); + + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "about:addons") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + + wait_for_view_load(gBrowser.contentWindow.wrappedJSObject, function(aManager) { + info("Part 3"); + is_in_list(aManager, "addons://list/plugin", false, true); + + executeSoon(() => go_forward(aManager)); + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "http://example.com/") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + info("Part 4"); + + executeSoon(function() { + ok(gBrowser.canGoBack, "Should be able to go back"); + ok(!gBrowser.canGoForward, "Should not be able to go forward"); + + go_back(aManager); + + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "about:addons") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + wait_for_view_load(gBrowser.contentWindow.wrappedJSObject, function(aManager) { + info("Part 5"); + is_in_list(aManager, "addons://list/plugin", false, true); + + close_manager(aManager, run_next_test); + }); + }, false); + }); + }, false); + }); + }, false); + }); + }, false); + }); +}); + +// Tests that going back to search results works +add_test(function() { + // Before we open the add-ons manager, we should make sure that no filter + // has been set. If one is set, we remove it. + // This is for the check below, from bug 611459. + let store = Cc["@mozilla.org/xul/xulstore;1"].getService(Ci.nsIXULStore); + store.removeValue("about:addons", "search-filter-radiogroup", "value"); + + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + var search = aManager.document.getElementById("header-search"); + search.focus(); + search.value = "bar"; + EventUtils.synthesizeKey("VK_RETURN", {}, aManager); + + wait_for_view_load(aManager, function(aManager) { + // Remote search is meant to be checked by default (bug 611459), so we + // confirm that and then switch to a local search. + var localFilter = aManager.document.getElementById("search-filter-local"); + var remoteFilter = aManager.document.getElementById("search-filter-remote"); + + is(remoteFilter.selected, true, "Remote filter should be set by default"); + + var list = aManager.document.getElementById("search-list"); + list.ensureElementIsVisible(localFilter); + EventUtils.synthesizeMouseAtCenter(localFilter, { }, aManager); + + is(localFilter.selected, true, "Should have changed to local filter"); + + // Now we continue with the normal test. + + info("Part 2"); + is_in_search(aManager, "bar", true, false); + check_all_in_list(aManager, ["test2@tests.mozilla.org", "test3@tests.mozilla.org"]); + + double_click_addon_element(aManager, "test2@tests.mozilla.org"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 3"); + is_in_detail(aManager, "addons://search/", true, false); + + go_back(aManager); + wait_for_view_load(aManager, function(aManager) { + info("Part 4"); + is_in_search(aManager, "bar", true, true); + check_all_in_list(aManager, ["test2@tests.mozilla.org", "test3@tests.mozilla.org"]); + + go_forward(aManager); + wait_for_view_load(aManager, function(aManager) { + info("Part 5"); + is_in_detail(aManager, "addons://search/", true, false); + + close_manager(aManager, run_next_test); + }); + }); + }); + }); + }); +}); + +// Tests that going back from a webpage to a detail view loaded from a search +// result works +// Only relevant for in-content UI +add_test(function() { + if (!gUseInContentUI) { + run_next_test(); + return; + } + + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + var search = aManager.document.getElementById("header-search"); + search.focus(); + search.value = "bar"; + EventUtils.synthesizeKey("VK_RETURN", {}); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_search(aManager, "bar", true, false); + check_all_in_list(aManager, ["test2@tests.mozilla.org", "test3@tests.mozilla.org"]); + + double_click_addon_element(aManager, "test2@tests.mozilla.org"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 3"); + is_in_detail(aManager, "addons://search/", true, false); + + gBrowser.loadURI("http://example.com/"); + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "http://example.com/") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + + info("Part 4"); + executeSoon(function() { + ok(gBrowser.canGoBack, "Should be able to go back"); + ok(!gBrowser.canGoForward, "Should not be able to go forward"); + + go_back(aManager); + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "about:addons") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + + wait_for_view_load(gBrowser.contentWindow.wrappedJSObject, function(aManager) { + info("Part 5"); + is_in_detail(aManager, "addons://search/", true, true); + + go_back(aManager); + wait_for_view_load(aManager, function(aManager) { + info("Part 6"); + is_in_search(aManager, "bar", true, true); + check_all_in_list(aManager, ["test2@tests.mozilla.org", "test3@tests.mozilla.org"]); + + close_manager(aManager, run_next_test); + }); + }); + }, false); + }); + }, false); + }); + }); + }); +}); + +// Tests that refreshing a list view does not affect the history +// Only relevant for in-content UI +add_test(function() { + if (!gUseInContentUI) { + run_next_test(); + return; + } + + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-plugin"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_list(aManager, "addons://list/plugin", true, false); + + gBrowser.reload(); + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "about:addons") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + + wait_for_view_load(gBrowser.contentWindow.wrappedJSObject, function(aManager) { + info("Part 3"); + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back(aManager); + wait_for_view_load(aManager, function(aManager) { + info("Part 4"); + is_in_list(aManager, "addons://list/extension", false, true); + + close_manager(aManager, run_next_test); + }); + }); + }, false); + }); + }); +}); + +// Tests that refreshing a detail view does not affect the history +// Only relevant for in-content UI +add_test(function() { + if (!gUseInContentUI) { + run_next_test(); + return; + } + + open_manager(null, function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + double_click_addon_element(aManager, "test1@tests.mozilla.org"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_detail(aManager, "addons://list/extension", true, false); + + gBrowser.reload(); + gBrowser.addEventListener("pageshow", function(event) { + if (event.target.location != "about:addons") + return; + gBrowser.removeEventListener("pageshow", arguments.callee, false); + + wait_for_view_load(gBrowser.contentWindow.wrappedJSObject, function(aManager) { + info("Part 3"); + is_in_detail(aManager, "addons://list/extension", true, false); + + go_back(aManager); + wait_for_view_load(aManager, function(aManager) { + info("Part 4"); + is_in_list(aManager, "addons://list/extension", false, true); + + close_manager(aManager, run_next_test); + }); + }); + }, false); + }); + }); +}); + +// Tests that removing an extension from the detail view goes back and doesn't +// allow you to go forward again. +add_test(function() { + open_manager("addons://list/extension", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/extension", false, false); + + double_click_addon_element(aManager, "test1@tests.mozilla.org"); + + wait_for_view_load(aManager, function(aManager) { + info("Part 2"); + is_in_detail(aManager, "addons://list/extension", true, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("detail-uninstall-btn"), + { }, aManager); + + wait_for_view_load(aManager, function() { + if (gUseInContentUI) { + // TODO until bug 590661 is fixed the back button will be enabled + // when displaying in content + is_in_list(aManager, "addons://list/extension", true, false); + } else { + is_in_list(aManager, "addons://list/extension", false, false); + } + + close_manager(aManager, run_next_test); + }); + }); + }); +}); + +// Tests that the back and forward buttons only show up for windowed mode +add_test(function() { + open_manager(null, function(aManager) { + var doc = aManager.document; + + if (gUseInContentUI) { + var btn = document.getElementById("back-button"); + if (!btn || is_hidden(btn)) { + is_element_visible(doc.getElementById("back-btn"), "Back button should not be hidden"); + is_element_visible(doc.getElementById("forward-btn"), "Forward button should not be hidden"); + } else { + is_element_hidden(doc.getElementById("back-btn"), "Back button should be hidden"); + is_element_hidden(doc.getElementById("forward-btn"), "Forward button should be hidden"); + } + } else { + is_element_visible(doc.getElementById("back-btn"), "Back button should not be hidden"); + is_element_visible(doc.getElementById("forward-btn"), "Forward button should not be hidden"); + } + + close_manager(aManager, run_next_test); + }); +}); + +// Tests that opening the manager opens the last view +add_test(function() { + open_manager("addons://list/plugin", function(aManager) { + info("Part 1"); + is_in_list(aManager, "addons://list/plugin", false, false); + + close_manager(aManager, function() { + open_manager(null, function(aManager) { + info("Part 2"); + is_in_list(aManager, "addons://list/plugin", false, false); + + close_manager(aManager, run_next_test); + }); + }); + }); +}); + +// Tests that navigating the discovery page works when that was the first view +add_test(function() { + open_manager("addons://discover/", function(aManager) { + info("1"); + is_in_discovery(aManager, MAIN_URL, false, false); + + clickLink(aManager, "link-good", function() { + info("2"); + is_in_discovery(aManager, SECOND_URL, true, false); + + waitForLoad(aManager, function() { + info("3"); + is_in_discovery(aManager, MAIN_URL, false, true); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, SECOND_URL, true, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-plugin"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_discovery(aManager, SECOND_URL, true, true); + + go_back(aManager); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, MAIN_URL, false, true); + + close_manager(aManager, run_next_test); + }); + }); + }); + }); + + go_forward(aManager); + }); + + go_back(aManager); + }); + }); +}); + +// Tests that navigating the discovery page works when that was the second view +add_test(function() { + open_manager("addons://list/plugin", function(aManager) { + is_in_list(aManager, "addons://list/plugin", false, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-discover"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_discovery(aManager, MAIN_URL, true, false); + + clickLink(aManager, "link-good", function() { + is_in_discovery(aManager, SECOND_URL, true, false); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, MAIN_URL, true, true); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, SECOND_URL, true, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-plugin"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_list(aManager, "addons://list/plugin", true, false); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_discovery(aManager, SECOND_URL, true, true); + + go_back(aManager); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, MAIN_URL, true, true); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_list(aManager, "addons://list/plugin", false, true); + + go_forward(aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_discovery(aManager, MAIN_URL, true, true); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, SECOND_URL, true, true); + + close_manager(aManager, run_next_test); + }); + + go_forward(aManager); + }); + }); + }); + }); + }); + }); + + go_forward(aManager); + }); + + go_back(aManager); + }); + }); + }); +}); + +// Tests that when displaying in-content and opened in the background the back +// and forward buttons still appear when switching tabs +add_test(function() { + if (!gUseInContentUI) { + run_next_test(); + return; + } + + var tab = gBrowser.addTab("about:addons"); + var browser = gBrowser.getBrowserForTab(tab); + + browser.addEventListener("pageshow", function(event) { + if (event.target.location.href != "about:addons") + return; + browser.removeEventListener("pageshow", arguments.callee, true); + + wait_for_manager_load(browser.contentWindow.wrappedJSObject, function() { + wait_for_view_load(browser.contentWindow.wrappedJSObject, function(aManager) { + gBrowser.selectedTab = tab; + + var doc = aManager.document; + var btn = document.getElementById("back-button"); + if (!btn || is_hidden(btn)) { + is_element_visible(doc.getElementById("back-btn"), "Back button should not be hidden"); + is_element_visible(doc.getElementById("forward-btn"), "Forward button should not be hidden"); + } else { + is_element_hidden(doc.getElementById("back-btn"), "Back button should be hidden"); + is_element_hidden(doc.getElementById("forward-btn"), "Forward button should be hidden"); + } + + close_manager(aManager, run_next_test); + }); + }); + }, true); +}); + +// Tests that refreshing the disicovery pane integrates properly with history +add_test(function() { + open_manager("addons://list/plugin", function(aManager) { + is_in_list(aManager, "addons://list/plugin", false, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-discover"), { }, aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_discovery(aManager, MAIN_URL, true, false); + + clickLink(aManager, "link-good", function() { + is_in_discovery(aManager, SECOND_URL, true, false); + + EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-discover"), { }, aManager); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, MAIN_URL, true, false); + + go_back(aManager); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, SECOND_URL, true, true); + + go_back(aManager); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, MAIN_URL, true, true); + + go_back(aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_list(aManager, "addons://list/plugin", false, true); + + go_forward(aManager); + + wait_for_view_load(aManager, function(aManager) { + is_in_discovery(aManager, MAIN_URL, true, true); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, SECOND_URL, true, true); + + waitForLoad(aManager, function() { + is_in_discovery(aManager, MAIN_URL, true, false); + + close_manager(aManager, run_next_test); + }); + go_forward(aManager); + }); + + go_forward(aManager); + }); + }); + }); + }); + }); + }); + }); + }); +}); |