summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js')
-rw-r--r--toolkit/mozapps/webextensions/test/browser/browser_gmpProvider.js418
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 000000000..52079a263
--- /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);
+});