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