406 lines
12 KiB
JavaScript
406 lines
12 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
const { GMPInstallManager } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/GMPInstallManager.sys.mjs"
|
|
);
|
|
const { GMPPrefs, GMP_PLUGIN_IDS, WIDEVINE_L1_ID, WIDEVINE_L3_ID } =
|
|
ChromeUtils.importESModule("resource://gre/modules/GMPUtils.sys.mjs");
|
|
|
|
const TEST_DATE = new Date(2013, 0, 1, 12);
|
|
|
|
var gMockAddons = [];
|
|
|
|
for (let pluginId of GMP_PLUGIN_IDS) {
|
|
let mockAddon = Object.freeze({
|
|
id: pluginId,
|
|
isValid: true,
|
|
isInstalled: false,
|
|
isEME: pluginId == WIDEVINE_L1_ID || pluginId == WIDEVINE_L3_ID,
|
|
usedFallback: true,
|
|
});
|
|
gMockAddons.push(mockAddon);
|
|
}
|
|
|
|
var gInstalledAddonId = "";
|
|
var gInstallDeferred = null;
|
|
var gPrefs = Services.prefs;
|
|
var getKey = GMPPrefs.getPrefKey;
|
|
|
|
const MockGMPInstallManagerPrototype = {
|
|
checkForAddons: () =>
|
|
Promise.resolve({
|
|
addons: gMockAddons,
|
|
}),
|
|
|
|
installAddon: addon => {
|
|
gInstalledAddonId = addon.id;
|
|
gInstallDeferred.resolve();
|
|
return Promise.resolve();
|
|
},
|
|
};
|
|
|
|
function openDetailsView(win, id) {
|
|
let item = getAddonCard(win, id);
|
|
Assert.ok(item, "Should have got add-on element.");
|
|
is_element_visible(item, "Add-on element should be visible.");
|
|
|
|
let loaded = waitForViewLoad(win);
|
|
EventUtils.synthesizeMouseAtCenter(
|
|
item.querySelector(".addon-name-link"),
|
|
{},
|
|
item.ownerGlobal
|
|
);
|
|
return loaded;
|
|
}
|
|
|
|
add_task(async function initializeState() {
|
|
gPrefs.setBoolPref(GMPPrefs.KEY_LOGGING_DUMP, true);
|
|
gPrefs.setIntPref(GMPPrefs.KEY_LOGGING_LEVEL, 0);
|
|
|
|
registerCleanupFunction(async function () {
|
|
for (let addon of gMockAddons) {
|
|
gPrefs.clearUserPref(getKey(GMPPrefs.KEY_PLUGIN_ENABLED, addon.id));
|
|
gPrefs.clearUserPref(getKey(GMPPrefs.KEY_PLUGIN_LAST_UPDATE, addon.id));
|
|
gPrefs.clearUserPref(getKey(GMPPrefs.KEY_PLUGIN_AUTOUPDATE, addon.id));
|
|
gPrefs.clearUserPref(getKey(GMPPrefs.KEY_PLUGIN_VERSION, addon.id));
|
|
gPrefs.clearUserPref(getKey(GMPPrefs.KEY_PLUGIN_VISIBLE, addon.id));
|
|
gPrefs.clearUserPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id)
|
|
);
|
|
}
|
|
gPrefs.clearUserPref(GMPPrefs.KEY_LOGGING_DUMP);
|
|
gPrefs.clearUserPref(GMPPrefs.KEY_LOGGING_LEVEL);
|
|
gPrefs.clearUserPref(GMPPrefs.KEY_UPDATE_LAST_CHECK);
|
|
gPrefs.clearUserPref(GMPPrefs.KEY_EME_ENABLED);
|
|
});
|
|
|
|
// Start out with plugins not being installed, disabled and automatic updates
|
|
// disabled.
|
|
gPrefs.setBoolPref(GMPPrefs.KEY_EME_ENABLED, true);
|
|
for (let addon of gMockAddons) {
|
|
gPrefs.setBoolPref(getKey(GMPPrefs.KEY_PLUGIN_ENABLED, addon.id), false);
|
|
gPrefs.setIntPref(getKey(GMPPrefs.KEY_PLUGIN_LAST_UPDATE, addon.id), 0);
|
|
gPrefs.setBoolPref(getKey(GMPPrefs.KEY_PLUGIN_AUTOUPDATE, addon.id), false);
|
|
gPrefs.setCharPref(getKey(GMPPrefs.KEY_PLUGIN_VERSION, addon.id), "");
|
|
gPrefs.setBoolPref(getKey(GMPPrefs.KEY_PLUGIN_VISIBLE, addon.id), true);
|
|
gPrefs.setBoolPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id),
|
|
true
|
|
);
|
|
}
|
|
});
|
|
|
|
add_task(async function testNotInstalledDisabled() {
|
|
let win = await loadInitialView("extension");
|
|
|
|
Assert.ok(isCategoryVisible(win, "plugin"), "Plugin tab visible.");
|
|
await switchView(win, "plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
let addonCard = getAddonCard(win, addon.id);
|
|
Assert.ok(addonCard, "Got add-on element:" + addon.id);
|
|
|
|
is(
|
|
addonCard.ownerDocument.l10n.getAttributes(addonCard.addonNameEl).id,
|
|
"addon-name-disabled",
|
|
"The addon name should include a disabled postfix"
|
|
);
|
|
|
|
let cardMessage = addonCard.querySelector(
|
|
"moz-message-bar.addon-card-message"
|
|
);
|
|
is_element_hidden(cardMessage, "Warning notification is hidden");
|
|
}
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testNotInstalledDisabledDetails() {
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
await openDetailsView(win, addon.id);
|
|
let addonCard = getAddonCard(win, addon.id);
|
|
ok(addonCard, "Got add-on element: " + addon.id);
|
|
|
|
is(
|
|
win.document.l10n.getAttributes(addonCard.addonNameEl).id,
|
|
"addon-name-disabled",
|
|
"The addon name should include a disabled postfix"
|
|
);
|
|
|
|
let updatesBtn = addonCard.querySelector("[action=update-check]");
|
|
is_element_visible(updatesBtn, "Check for Updates action is visible");
|
|
let cardMessage = addonCard.querySelector(
|
|
"moz-message-bar.addon-card-message"
|
|
);
|
|
is_element_hidden(cardMessage, "Warning notification is hidden");
|
|
|
|
await switchView(win, "plugin");
|
|
}
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testNotInstalled() {
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
gPrefs.setBoolPref(getKey(GMPPrefs.KEY_PLUGIN_ENABLED, addon.id), true);
|
|
let item = getAddonCard(win, addon.id);
|
|
Assert.ok(item, "Got add-on element:" + addon.id);
|
|
|
|
let warningMessageBar = await BrowserTestUtils.waitForCondition(() => {
|
|
return item.querySelector(
|
|
"moz-message-bar.addon-card-message[type=warning]"
|
|
);
|
|
}, "Wait for the addon card message to be updated");
|
|
|
|
is_element_visible(warningMessageBar, "Warning notification is visible");
|
|
|
|
is(item.parentNode.getAttribute("section"), "0", "Should be enabled");
|
|
// Open the options menu (needed to check the disabled buttons).
|
|
const pluginOptions = item.querySelector("plugin-options");
|
|
pluginOptions.querySelector("panel-list").open = true;
|
|
const alwaysActivate = pluginOptions.querySelector(
|
|
"panel-item[action=always-activate]"
|
|
);
|
|
ok(
|
|
alwaysActivate.hasAttribute("checked"),
|
|
"Plugin state should be always-activate"
|
|
);
|
|
pluginOptions.querySelector("panel-list").open = false;
|
|
}
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testNotInstalledDetails() {
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
await openDetailsView(win, addon.id);
|
|
|
|
const addonCard = getAddonCard(win, addon.id);
|
|
let el = addonCard.querySelector("[action=update-check]");
|
|
is_element_visible(el, "Check for Updates action is visible");
|
|
|
|
let warningMessageBar = await BrowserTestUtils.waitForCondition(() => {
|
|
return addonCard.querySelector(
|
|
"moz-message-bar.addon-card-message[type=warning]"
|
|
);
|
|
}, "Wait for the addon card message to be updated");
|
|
is_element_visible(warningMessageBar, "Warning notification is visible");
|
|
|
|
await switchView(win, "plugin");
|
|
}
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testInstalled() {
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
gPrefs.setIntPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_LAST_UPDATE, addon.id),
|
|
TEST_DATE.getTime()
|
|
);
|
|
gPrefs.setBoolPref(getKey(GMPPrefs.KEY_PLUGIN_AUTOUPDATE, addon.id), false);
|
|
gPrefs.setCharPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_VERSION, addon.id),
|
|
"1.2.3.4"
|
|
);
|
|
|
|
let item = getAddonCard(win, addon.id);
|
|
Assert.ok(item, "Got add-on element.");
|
|
|
|
is(item.parentNode.getAttribute("section"), "0", "Should be enabled");
|
|
// Open the options menu (needed to check the disabled buttons).
|
|
const pluginOptions = item.querySelector("plugin-options");
|
|
pluginOptions.querySelector("panel-list").open = true;
|
|
const alwaysActivate = pluginOptions.querySelector(
|
|
"panel-item[action=always-activate]"
|
|
);
|
|
ok(
|
|
alwaysActivate.hasAttribute("checked"),
|
|
"Plugin state should be always-activate"
|
|
);
|
|
pluginOptions.querySelector("panel-list").open = false;
|
|
}
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testInstalledDetails() {
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
await openDetailsView(win, addon.id);
|
|
|
|
let card = getAddonCard(win, addon.id);
|
|
ok(card, "Got add-on element:" + addon.id);
|
|
|
|
is_element_visible(
|
|
card.querySelector("[action=update-check]"),
|
|
"Find updates link is visible"
|
|
);
|
|
|
|
await switchView(win, "plugin");
|
|
}
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testInstalledGlobalEmeDisabled() {
|
|
let win = await loadInitialView("plugin");
|
|
gPrefs.setBoolPref(GMPPrefs.KEY_EME_ENABLED, false);
|
|
|
|
for (let addon of gMockAddons) {
|
|
let item = getAddonCard(win, addon.id);
|
|
if (addon.isEME) {
|
|
is(item.parentNode.getAttribute("section"), "1", "Should be disabled");
|
|
} else {
|
|
Assert.ok(item, "Got add-on element.");
|
|
}
|
|
}
|
|
|
|
gPrefs.setBoolPref(GMPPrefs.KEY_EME_ENABLED, true);
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async 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) {
|
|
info(
|
|
"Testing preferences button with pref settings: " +
|
|
JSON.stringify(preferences)
|
|
);
|
|
for (let addon of gMockAddons) {
|
|
let win = await loadInitialView("plugin");
|
|
gPrefs.setCharPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_VERSION, addon.id),
|
|
preferences.version
|
|
);
|
|
gPrefs.setBoolPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_ENABLED, addon.id),
|
|
preferences.enabled
|
|
);
|
|
|
|
let item = getAddonCard(win, addon.id);
|
|
|
|
// Open the options menu (needed to check the more options action is enabled).
|
|
const pluginOptions = item.querySelector("plugin-options");
|
|
pluginOptions.querySelector("panel-list").open = true;
|
|
const moreOptions = pluginOptions.querySelector(
|
|
"panel-item[action=expand]"
|
|
);
|
|
ok(
|
|
!moreOptions.shadowRoot.querySelector("button").disabled,
|
|
"more options action should be enabled"
|
|
);
|
|
moreOptions.click();
|
|
|
|
await waitForViewLoad(win);
|
|
|
|
item = getAddonCard(win, addon.id);
|
|
ok(item, "The right view is loaded");
|
|
|
|
await closeView(win);
|
|
}
|
|
}
|
|
});
|
|
|
|
add_task(async function testUpdateButton() {
|
|
gPrefs.clearUserPref(GMPPrefs.KEY_UPDATE_LAST_CHECK);
|
|
|
|
// The GMPInstallManager constructor has an empty body,
|
|
// so replacing the prototype is safe.
|
|
let originalInstallManager = GMPInstallManager.prototype;
|
|
GMPInstallManager.prototype = MockGMPInstallManagerPrototype;
|
|
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
let item = getAddonCard(win, addon.id);
|
|
|
|
gInstalledAddonId = "";
|
|
gInstallDeferred = Promise.withResolvers();
|
|
|
|
let loaded = waitForViewLoad(win);
|
|
item.querySelector("[action=expand]").click();
|
|
await loaded;
|
|
let detail = getAddonCard(win, addon.id);
|
|
detail.querySelector("[action=update-check]").click();
|
|
|
|
await gInstallDeferred.promise;
|
|
Assert.equal(gInstalledAddonId, addon.id);
|
|
|
|
await switchView(win, "plugin");
|
|
}
|
|
|
|
GMPInstallManager.prototype = originalInstallManager;
|
|
|
|
await closeView(win);
|
|
});
|
|
|
|
add_task(async function testEmeSupport() {
|
|
for (let addon of gMockAddons) {
|
|
gPrefs.clearUserPref(getKey(GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id));
|
|
}
|
|
|
|
let win = await loadInitialView("plugin");
|
|
|
|
for (let addon of gMockAddons) {
|
|
let item = getAddonCard(win, addon.id);
|
|
if (addon.id == WIDEVINE_L1_ID) {
|
|
if (
|
|
AppConstants.MOZ_WMF_CDM &&
|
|
AppConstants.platform == "win" &&
|
|
UpdateUtils.ABI.match(/x64/)
|
|
) {
|
|
Assert.ok(item, "Widevine L1 supported, found add-on element.");
|
|
} else {
|
|
Assert.ok(
|
|
!item,
|
|
"Widevine L1 not supported, couldn't find add-on element."
|
|
);
|
|
}
|
|
} else if (addon.id == WIDEVINE_L3_ID) {
|
|
if (
|
|
AppConstants.platform == "win" ||
|
|
AppConstants.platform == "macosx" ||
|
|
AppConstants.platform == "linux"
|
|
) {
|
|
Assert.ok(item, "Widevine L3 supported, found add-on element.");
|
|
} else {
|
|
Assert.ok(
|
|
!item,
|
|
"Widevine L3 not supported, couldn't find add-on element."
|
|
);
|
|
}
|
|
} else {
|
|
Assert.ok(item, "Found add-on element.");
|
|
}
|
|
}
|
|
|
|
await closeView(win);
|
|
|
|
for (let addon of gMockAddons) {
|
|
gPrefs.setBoolPref(getKey(GMPPrefs.KEY_PLUGIN_VISIBLE, addon.id), true);
|
|
gPrefs.setBoolPref(
|
|
getKey(GMPPrefs.KEY_PLUGIN_FORCE_SUPPORTED, addon.id),
|
|
true
|
|
);
|
|
}
|
|
});
|