Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
*/
"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
);
}
});