diff options
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js b/toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js new file mode 100644 index 0000000000..52079a2632 --- /dev/null +++ b/toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js @@ -0,0 +1,418 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +"use strict"; + +Cu.import("resource://gre/modules/Promise.jsm"); +Cu.import("resource://gre/modules/AppConstants.jsm"); +var {AddonTestUtils} = Cu.import("resource://testing-common/AddonManagerTesting.jsm", {}); +var GMPScope = Cu.import("resource://gre/modules/addons/GMPProvider.jsm"); + +const TEST_DATE = new Date(2013, 0, 1, 12); + +var gManagerWindow; +var gCategoryUtilities; +var gIsEnUsLocale; + +var gMockAddons = []; + +for (let plugin of GMPScope.GMP_PLUGINS) { + let mockAddon = Object.freeze({ + id: plugin.id, + isValid: true, + isInstalled: false, + isEME: (plugin.id == "gmp-widevinecdm" || + plugin.id.indexOf("gmp-eme-") == 0) ? true : false, + }); + gMockAddons.push(mockAddon); +} + +var gInstalledAddonId = ""; +var gInstallDeferred = null; +var gPrefs = Services.prefs; +var getKey = GMPScope.GMPPrefs.getPrefKey; + +function MockGMPInstallManager() { +} + +MockGMPInstallManager.prototype = { + checkForAddons: () => Promise.resolve({ + usedFallback: true, + gmpAddons: gMockAddons + }), + + installAddon: addon => { + gInstalledAddonId = addon.id; + gInstallDeferred.resolve(); + return Promise.resolve(); + }, +}; + +var gOptionsObserver = { + lastDisplayed: null, + observe: function(aSubject, aTopic, aData) { + if (aTopic == AddonManager.OPTIONS_NOTIFICATION_DISPLAYED) { + this.lastDisplayed = aData; + } + } +}; + +function getInstallItem() { + let doc = gManagerWindow.document; + let list = doc.getElementById("addon-list"); + + let node = list.firstChild; + while (node) { + if (node.getAttribute("status") == "installing") { + return node; + } + node = node.nextSibling; + } + + return null; +} + +function openDetailsView(aId) { + let view = get_current_view(gManagerWindow); + Assert.equal(view.id, "list-view", "Should be in the list view to use this function"); + + let item = get_addon_element(gManagerWindow, aId); + Assert.ok(item, "Should have got add-on element."); + is_element_visible(item, "Add-on element should be visible."); + + item.scrollIntoView(); + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow); + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow); + + let deferred = Promise.defer(); + wait_for_view_load(gManagerWindow, deferred.resolve); + return deferred.promise; +} + +add_task(function* initializeState() { + gPrefs.setBoolPref(GMPScope.GMPPrefs.KEY_LOGGING_DUMP, true); + gPrefs.setIntPref(GMPScope.GMPPrefs.KEY_LOGGING_LEVEL, 0); + + gManagerWindow = yield open_manager(); + gCategoryUtilities = new CategoryUtilities(gManagerWindow); + + registerCleanupFunction(Task.async(function*() { + Services.obs.removeObserver(gOptionsObserver, AddonManager.OPTIONS_NOTIFICATION_DISPLAYED); + + for (let addon of gMockAddons) { + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_ENABLED, addon.id)); + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_LAST_UPDATE, addon.id)); + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_AUTOUPDATE, addon.id)); + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VERSION, addon.id)); + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VISIBLE, addon.id)); + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id)); + } + gPrefs.clearUserPref(GMPScope.GMPPrefs.KEY_LOGGING_DUMP); + gPrefs.clearUserPref(GMPScope.GMPPrefs.KEY_LOGGING_LEVEL); + gPrefs.clearUserPref(GMPScope.GMPPrefs.KEY_UPDATE_LAST_CHECK); + gPrefs.clearUserPref(GMPScope.GMPPrefs.KEY_EME_ENABLED); + yield GMPScope.GMPProvider.shutdown(); + GMPScope.GMPProvider.startup(); + })); + + let chrome = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIXULChromeRegistry); + gIsEnUsLocale = chrome.getSelectedLocale("global") == "en-US"; + + Services.obs.addObserver(gOptionsObserver, AddonManager.OPTIONS_NOTIFICATION_DISPLAYED, false); + + // Start out with plugins not being installed, disabled and automatic updates + // disabled. + gPrefs.setBoolPref(GMPScope.GMPPrefs.KEY_EME_ENABLED, true); + for (let addon of gMockAddons) { + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_ENABLED, addon.id), false); + gPrefs.setIntPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_LAST_UPDATE, addon.id), 0); + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_AUTOUPDATE, addon.id), false); + gPrefs.setCharPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VERSION, addon.id), ""); + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VISIBLE, addon.id), true); + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id), true); + } + yield GMPScope.GMPProvider.shutdown(); + GMPScope.GMPProvider.startup(); +}); + +add_task(function* testNotInstalledDisabled() { + Assert.ok(gCategoryUtilities.isTypeVisible("plugin"), "Plugin tab visible."); + yield gCategoryUtilities.openType("plugin"); + + for (let addon of gMockAddons) { + let item = get_addon_element(gManagerWindow, addon.id); + Assert.ok(item, "Got add-on element:" + addon.id); + item.parentNode.ensureElementIsVisible(item); + is(item.getAttribute("active"), "false"); + + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning"); + is_element_hidden(el, "Warning notification is hidden."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); + is_element_visible(el, "disabled-postfix is visible."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); + is_element_hidden(el, "Disable button not visible."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); + is_element_hidden(el, "Enable button not visible."); + + let menu = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "state-menulist"); + is_element_visible(menu, "State menu should be visible."); + + let neverActivate = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "never-activate-menuitem"); + is(menu.selectedItem, neverActivate, "Plugin state should be never-activate."); + } +}); + +add_task(function* testNotInstalledDisabledDetails() { + for (let addon of gMockAddons) { + yield openDetailsView(addon.id); + let doc = gManagerWindow.document; + + let el = doc.getElementsByClassName("disabled-postfix")[0]; + is_element_visible(el, "disabled-postfix is visible."); + el = doc.getElementById("detail-findUpdates-btn"); + is_element_visible(el, "Find updates link is visible."); + el = doc.getElementById("detail-warning"); + is_element_hidden(el, "Warning notification is hidden."); + el = doc.getElementsByTagName("setting")[0]; + + yield gCategoryUtilities.openType("plugin"); + } +}); + +add_task(function* testNotInstalled() { + for (let addon of gMockAddons) { + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_ENABLED, addon.id), true); + let item = get_addon_element(gManagerWindow, addon.id); + Assert.ok(item, "Got add-on element:" + addon.id); + item.parentNode.ensureElementIsVisible(item); + is(item.getAttribute("active"), "true"); + + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning"); + is_element_visible(el, "Warning notification is visible."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); + is_element_hidden(el, "disabled-postfix is hidden."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); + is_element_hidden(el, "Disable button not visible."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); + is_element_hidden(el, "Enable button not visible."); + + let menu = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "state-menulist"); + is_element_visible(menu, "State menu should be visible."); + + let alwaysActivate = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "always-activate-menuitem"); + is(menu.selectedItem, alwaysActivate, "Plugin state should be always-activate."); + } +}); + +add_task(function* testNotInstalledDetails() { + for (let addon of gMockAddons) { + yield openDetailsView(addon.id); + let doc = gManagerWindow.document; + + let el = doc.getElementsByClassName("disabled-postfix")[0]; + is_element_hidden(el, "disabled-postfix is hidden."); + el = doc.getElementById("detail-findUpdates-btn"); + is_element_visible(el, "Find updates link is visible."); + el = doc.getElementById("detail-warning"); + is_element_visible(el, "Warning notification is visible."); + el = doc.getElementsByTagName("setting")[0]; + + yield gCategoryUtilities.openType("plugin"); + } +}); + +add_task(function* testInstalled() { + for (let addon of gMockAddons) { + gPrefs.setIntPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_LAST_UPDATE, addon.id), + TEST_DATE.getTime()); + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_AUTOUPDATE, addon.id), false); + gPrefs.setCharPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VERSION, addon.id), "1.2.3.4"); + + let item = get_addon_element(gManagerWindow, addon.id); + Assert.ok(item, "Got add-on element."); + item.parentNode.ensureElementIsVisible(item); + is(item.getAttribute("active"), "true"); + + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "warning"); + is_element_hidden(el, "Warning notification is hidden."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "class", "disabled-postfix"); + is_element_hidden(el, "disabled-postfix is hidden."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); + is_element_hidden(el, "Disable button not visible."); + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); + is_element_hidden(el, "Enable button not visible."); + + let menu = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "state-menulist"); + is_element_visible(menu, "State menu should be visible."); + + let alwaysActivate = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "always-activate-menuitem"); + is(menu.selectedItem, alwaysActivate, "Plugin state should be always-activate."); + } +}); + +add_task(function* testInstalledDetails() { + for (let addon of gMockAddons) { + yield openDetailsView(addon.id); + let doc = gManagerWindow.document; + + let el = doc.getElementsByClassName("disabled-postfix")[0]; + is_element_hidden(el, "disabled-postfix is hidden."); + el = doc.getElementById("detail-findUpdates-btn"); + is_element_visible(el, "Find updates link is visible."); + el = doc.getElementById("detail-warning"); + is_element_hidden(el, "Warning notification is hidden."); + el = doc.getElementsByTagName("setting")[0]; + + let contextMenu = doc.getElementById("addonitem-popup"); + let deferred = Promise.defer(); + let listener = () => { + contextMenu.removeEventListener("popupshown", listener, false); + deferred.resolve(); + }; + contextMenu.addEventListener("popupshown", listener, false); + el = doc.getElementsByClassName("detail-view-container")[0]; + EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); + yield deferred.promise; + let menuSep = doc.getElementById("addonitem-menuseparator"); + is_element_hidden(menuSep, "Menu separator is hidden."); + contextMenu.hidePopup(); + + yield gCategoryUtilities.openType("plugin"); + } +}); + +add_task(function* testInstalledGlobalEmeDisabled() { + gPrefs.setBoolPref(GMPScope.GMPPrefs.KEY_EME_ENABLED, false); + for (let addon of gMockAddons) { + let item = get_addon_element(gManagerWindow, addon.id); + if (addon.isEME) { + Assert.ok(!item, "Couldn't get add-on element."); + } else { + Assert.ok(item, "Got add-on element."); + } + } + gPrefs.setBoolPref(GMPScope.GMPPrefs.KEY_EME_ENABLED, true); +}); + +add_task(function* testPreferencesButton() { + + let prefValues = [ + { enabled: false, version: "" }, + { enabled: false, version: "1.2.3.4" }, + { enabled: true, version: "" }, + { enabled: true, version: "1.2.3.4" }, + ]; + + for (let preferences of prefValues) { + dump("Testing preferences button with pref settings: " + + JSON.stringify(preferences) + "\n"); + for (let addon of gMockAddons) { + yield close_manager(gManagerWindow); + gManagerWindow = yield open_manager(); + gCategoryUtilities = new CategoryUtilities(gManagerWindow); + gPrefs.setCharPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VERSION, addon.id), + preferences.version); + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_ENABLED, addon.id), + preferences.enabled); + + yield gCategoryUtilities.openType("plugin"); + let doc = gManagerWindow.document; + let item = get_addon_element(gManagerWindow, addon.id); + + let button = doc.getAnonymousElementByAttribute(item, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + let deferred = Promise.defer(); + wait_for_view_load(gManagerWindow, deferred.resolve); + yield deferred.promise; + + is(gOptionsObserver.lastDisplayed, addon.id); + } + } +}); + +add_task(function* testUpdateButton() { + gPrefs.clearUserPref(GMPScope.GMPPrefs.KEY_UPDATE_LAST_CHECK); + + let originalInstallManager = GMPScope.GMPInstallManager; + Object.defineProperty(GMPScope, "GMPInstallManager", { + value: MockGMPInstallManager, + writable: true, + enumerable: true, + configurable: true + }); + + for (let addon of gMockAddons) { + yield gCategoryUtilities.openType("plugin"); + let doc = gManagerWindow.document; + let item = get_addon_element(gManagerWindow, addon.id); + + gInstalledAddonId = ""; + gInstallDeferred = Promise.defer(); + + let button = doc.getAnonymousElementByAttribute(item, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + let deferred = Promise.defer(); + wait_for_view_load(gManagerWindow, deferred.resolve); + yield deferred.promise; + + button = doc.getElementById("detail-findUpdates-btn"); + Assert.ok(button != null, "Got detail-findUpdates-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + yield gInstallDeferred.promise; + + Assert.equal(gInstalledAddonId, addon.id); + } + Object.defineProperty(GMPScope, "GMPInstallManager", { + value: originalInstallManager, + writable: true, + enumerable: true, + configurable: true + }); +}); + +add_task(function* testEmeSupport() { + for (let addon of gMockAddons) { + gPrefs.clearUserPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id)); + } + yield GMPScope.GMPProvider.shutdown(); + GMPScope.GMPProvider.startup(); + + for (let addon of gMockAddons) { + yield gCategoryUtilities.openType("plugin"); + let doc = gManagerWindow.document; + let item = get_addon_element(gManagerWindow, addon.id); + if (addon.id == GMPScope.EME_ADOBE_ID) { + if (AppConstants.isPlatformAndVersionAtLeast("win", "6")) { + Assert.ok(item, "Adobe EME supported, found add-on element."); + } else { + Assert.ok(!item, + "Adobe EME not supported, couldn't find add-on element."); + } + } else if (addon.id == GMPScope.WIDEVINE_ID) { + if (AppConstants.isPlatformAndVersionAtLeast("win", "6") || + AppConstants.platform == "macosx" || + AppConstants.platform == "linux") { + Assert.ok(item, "Widevine supported, found add-on element."); + } else { + Assert.ok(!item, + "Widevine not supported, couldn't find add-on element."); + } + } else { + Assert.ok(item, "Found add-on element."); + } + } + + for (let addon of gMockAddons) { + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_VISIBLE, addon.id), true); + gPrefs.setBoolPref(getKey(GMPScope.GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id), true); + } + yield GMPScope.GMPProvider.shutdown(); + GMPScope.GMPProvider.startup(); + +}); + +add_task(function* test_cleanup() { + yield close_manager(gManagerWindow); +}); |