diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js b/toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js new file mode 100644 index 000000000..5a704530a --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js @@ -0,0 +1,207 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +/* globals TestUtils */ + +var {Extension} = Components.utils.import("resource://gre/modules/Extension.jsm", {}); + +var gAddon; +var gOtherAddon; +var gManagerWindow; +var gCategoryUtilities; + +var installedAddons = []; + +function installAddon(details) { + let id = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator) + .generateUUID().number; + if (!details.manifest) { + details.manifest = {}; + } + details.manifest.applications = {gecko: {id}}; + let xpi = Extension.generateXPI(details); + + return AddonManager.installTemporaryAddon(xpi).then(addon => { + SimpleTest.registerCleanupFunction(function() { + addon.uninstall(); + + Services.obs.notifyObservers(xpi, "flush-cache-entry", null); + xpi.remove(false); + }); + + return addon; + }); +} + +add_task(function*() { + gAddon = yield installAddon({ + manifest: { + "options_ui": { + "page": "options.html", + } + }, + + files: { + "options.html": `<!DOCTYPE html> + <html> + <head> + <meta charset="UTF-8"> + <style type="text/css"> + body > p { + height: 300px; + margin: 0; + } + body.bigger > p { + height: 600px; + } + </style> + </head> + <body> + <p>The quick mauve fox jumps over the opalescent dog.</p> + </body> + </html>`, + }, + }); + + // Create another add-on with no inline options, to verify that detail + // view switches work correctly. + gOtherAddon = yield installAddon({}); + + gManagerWindow = yield open_manager("addons://list/extension"); + gCategoryUtilities = new CategoryUtilities(gManagerWindow); +}); + + +function* openDetailsBrowser(addonId) { + var addon = get_addon_element(gManagerWindow, addonId); + + is(addon.mAddon.optionsType, AddonManager.OPTIONS_TYPE_INLINE_BROWSER, + "Options should be inline browser type"); + + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + + is_element_visible(button, "Preferences button should be visible"); + + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + yield TestUtils.topicObserved(AddonManager.OPTIONS_NOTIFICATION_DISPLAYED, + (subject, data) => data == addonId); + + is(gManagerWindow.gViewController.currentViewId, + `addons://detail/${encodeURIComponent(addonId)}/preferences`, + "Current view should scroll to preferences"); + + var browser = gManagerWindow.document.querySelector( + "#detail-grid > rows > .inline-options-browser"); + var rows = browser.parentNode; + + ok(browser, "Grid should have a browser child"); + is(browser.localName, "browser", "Grid should have a browser child"); + is(browser.currentURI.spec, addon.mAddon.optionsURL, "Browser has the expected options URL loaded") + + is(browser.clientWidth, rows.clientWidth, + "Browser should be the same width as its parent node"); + + button = gManagerWindow.document.getElementById("detail-prefs-btn"); + is_element_hidden(button, "Preferences button should not be visible"); + + return browser; +} + + +add_task(function* test_inline_browser_addon() { + let browser = yield openDetailsBrowser(gAddon.id); + + let body = browser.contentDocument.body; + + function checkHeights(expected) { + is(body.clientHeight, expected, `Document body should be ${expected}px tall`); + is(body.clientHeight, body.scrollHeight, + "Document body should be tall enough to fit its contents"); + + let heightDiff = browser.clientHeight - expected; + ok(heightDiff >= 0 && heightDiff < 50, + "Browser should be slightly taller than the document body"); + } + + // Delay long enough to avoid hitting our resize rate limit. + let delay = () => new Promise(resolve => setTimeout(resolve, 300)); + + checkHeights(300); + + info("Increase the document height, and expect the browser to grow correspondingly"); + body.classList.toggle("bigger"); + + yield delay(); + + checkHeights(600); + + info("Decrease the document height, and expect the browser to shrink correspondingly"); + body.classList.toggle("bigger"); + + yield delay(); + + checkHeights(300); + + yield new Promise(resolve => + gCategoryUtilities.openType("extension", resolve)); + + browser = gManagerWindow.document.querySelector( + ".inline-options-browser"); + + is(browser, null, "Options browser should be removed from the document"); +}); + + +// Test that loading an add-on with no inline browser works as expected +// after having viewed our main test add-on. +add_task(function* test_plain_addon() { + var addon = get_addon_element(gManagerWindow, gOtherAddon.id); + + is(addon.mAddon.optionsType, null, "Add-on should have no options"); + + addon.parentNode.ensureElementIsVisible(addon); + + yield EventUtils.synthesizeMouseAtCenter(addon, { clickCount: 1 }, gManagerWindow); + + EventUtils.synthesizeMouseAtCenter(addon, { clickCount: 2 }, gManagerWindow); + + yield BrowserTestUtils.waitForEvent(gManagerWindow, "ViewChanged"); + + is(gManagerWindow.gViewController.currentViewId, + `addons://detail/${encodeURIComponent(gOtherAddon.id)}`, + "Detail view should be open"); + + var browser = gManagerWindow.document.querySelector( + "#detail-grid > rows > .inline-options-browser"); + + is(browser, null, "Detail view should have no inline browser"); + + yield new Promise(resolve => + gCategoryUtilities.openType("extension", resolve)); +}); + + +// Test that loading the original add-on details successfully creates a +// browser. +add_task(function* test_inline_browser_addon_again() { + let browser = yield openDetailsBrowser(gAddon.id); + + yield new Promise(resolve => + gCategoryUtilities.openType("extension", resolve)); + + browser = gManagerWindow.document.querySelector( + ".inline-options-browser"); + + is(browser, null, "Options browser should be removed from the document"); +}); + +add_task(function*() { + yield close_manager(gManagerWindow); + + gManagerWindow = null; + gCategoryUtilities = null; +}); |