зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1637641: Add test for the cache mechanism in ResourceWatcher. r=ochameau
Differential Revision: https://phabricator.services.mozilla.com/D77015
This commit is contained in:
Родитель
e9f265f304
Коммит
adc56a6132
|
@ -11,6 +11,7 @@ support-files =
|
||||||
test_service_worker.js
|
test_service_worker.js
|
||||||
test_worker.js
|
test_worker.js
|
||||||
|
|
||||||
|
[browser_resources_client_caching.js]
|
||||||
[browser_resources_console_messages.js]
|
[browser_resources_console_messages.js]
|
||||||
[browser_resources_document_events.js]
|
[browser_resources_document_events.js]
|
||||||
[browser_resources_error_messages.js]
|
[browser_resources_error_messages.js]
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Test the cache mechanism of the ResourceWatcher.
|
||||||
|
|
||||||
|
const {
|
||||||
|
ResourceWatcher,
|
||||||
|
} = require("devtools/shared/resources/resource-watcher");
|
||||||
|
|
||||||
|
const TEST_URI = "data:text/html;charset=utf-8,Cache Test";
|
||||||
|
|
||||||
|
add_task(async function() {
|
||||||
|
info("Test whether multiple listener can get same cached resources");
|
||||||
|
|
||||||
|
const tab = await addTab(TEST_URI);
|
||||||
|
|
||||||
|
const {
|
||||||
|
client,
|
||||||
|
resourceWatcher,
|
||||||
|
targetList,
|
||||||
|
} = await initResourceWatcherAndTarget(tab);
|
||||||
|
|
||||||
|
info("Add messages as existing resources");
|
||||||
|
const messages = ["a", "b", "c"];
|
||||||
|
await logMessages(tab.linkedBrowser, messages);
|
||||||
|
|
||||||
|
info("Register first listener");
|
||||||
|
const cachedResources1 = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources1.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Register second listener");
|
||||||
|
const cachedResources2 = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources2.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assertContents(cachedResources1, messages);
|
||||||
|
assertResources(cachedResources2, cachedResources1);
|
||||||
|
|
||||||
|
await targetList.stopListening();
|
||||||
|
await client.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function() {
|
||||||
|
info(
|
||||||
|
"Test whether the cache is reflecting existing resources and additional resources"
|
||||||
|
);
|
||||||
|
|
||||||
|
const tab = await addTab(TEST_URI);
|
||||||
|
|
||||||
|
const {
|
||||||
|
client,
|
||||||
|
resourceWatcher,
|
||||||
|
targetList,
|
||||||
|
} = await initResourceWatcherAndTarget(tab);
|
||||||
|
|
||||||
|
info("Add messages as existing resources");
|
||||||
|
const existingMessages = ["a", "b", "c"];
|
||||||
|
await logMessages(tab.linkedBrowser, existingMessages);
|
||||||
|
|
||||||
|
info("Register first listener to get all available resources");
|
||||||
|
const availableResources = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => availableResources.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Add messages as additional resources");
|
||||||
|
const additionalMessages = ["d", "e"];
|
||||||
|
await logMessages(tab.linkedBrowser, additionalMessages);
|
||||||
|
|
||||||
|
info("Wait until onAvailable is called expected times");
|
||||||
|
const allMessages = [...existingMessages, ...additionalMessages];
|
||||||
|
await waitUntil(() => availableResources.length === allMessages.length);
|
||||||
|
|
||||||
|
info("Register second listener to get the cached resources");
|
||||||
|
const cachedResources = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assertContents(availableResources, allMessages);
|
||||||
|
assertResources(cachedResources, availableResources);
|
||||||
|
|
||||||
|
await targetList.stopListening();
|
||||||
|
await client.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function() {
|
||||||
|
info("Test whether the cache is cleared when navigation");
|
||||||
|
|
||||||
|
const tab = await addTab(TEST_URI);
|
||||||
|
|
||||||
|
const {
|
||||||
|
client,
|
||||||
|
resourceWatcher,
|
||||||
|
targetList,
|
||||||
|
} = await initResourceWatcherAndTarget(tab);
|
||||||
|
|
||||||
|
info("Add messages as existing resources");
|
||||||
|
const existingMessages = ["a", "b", "c"];
|
||||||
|
await logMessages(tab.linkedBrowser, existingMessages);
|
||||||
|
|
||||||
|
info("Register first listener");
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: () => {},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Reload the page");
|
||||||
|
const onReloaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
|
||||||
|
gBrowser.reloadTab(tab);
|
||||||
|
await onReloaded;
|
||||||
|
|
||||||
|
info("Register second listener");
|
||||||
|
const cachedResources = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
is(cachedResources.length, 0, "The cache in ResourceWatcher is cleared");
|
||||||
|
|
||||||
|
await targetList.stopListening();
|
||||||
|
await client.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function() {
|
||||||
|
info("Test with multiple resource types");
|
||||||
|
|
||||||
|
const tab = await addTab(TEST_URI);
|
||||||
|
|
||||||
|
const {
|
||||||
|
client,
|
||||||
|
resourceWatcher,
|
||||||
|
targetList,
|
||||||
|
} = await initResourceWatcherAndTarget(tab);
|
||||||
|
|
||||||
|
info("Register first listener to get all available resources");
|
||||||
|
const availableResources = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[
|
||||||
|
ResourceWatcher.TYPES.CONSOLE_MESSAGE,
|
||||||
|
ResourceWatcher.TYPES.ERROR_MESSAGE,
|
||||||
|
],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => availableResources.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Add messages as console message");
|
||||||
|
const consoleMessages1 = ["a", "b", "c"];
|
||||||
|
await logMessages(tab.linkedBrowser, consoleMessages1);
|
||||||
|
|
||||||
|
info("Add message as error message");
|
||||||
|
const errorMessages = ["document.doTheImpossible();"];
|
||||||
|
await triggerErrors(tab.linkedBrowser, errorMessages);
|
||||||
|
|
||||||
|
info("Add messages as console message again");
|
||||||
|
const consoleMessages2 = ["d", "e"];
|
||||||
|
await logMessages(tab.linkedBrowser, consoleMessages2);
|
||||||
|
|
||||||
|
info("Wait until the getting all available resources");
|
||||||
|
const totalResourceCount =
|
||||||
|
consoleMessages1.length + errorMessages.length + consoleMessages2.length;
|
||||||
|
await waitUntil(() => {
|
||||||
|
return availableResources.length === totalResourceCount;
|
||||||
|
});
|
||||||
|
|
||||||
|
info("Register listener to get the cached resources");
|
||||||
|
const cachedResources = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[
|
||||||
|
ResourceWatcher.TYPES.CONSOLE_MESSAGE,
|
||||||
|
ResourceWatcher.TYPES.ERROR_MESSAGE,
|
||||||
|
],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources.push(resource),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assertResources(cachedResources, availableResources);
|
||||||
|
|
||||||
|
await targetList.stopListening();
|
||||||
|
await client.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function() {
|
||||||
|
info("Test multiple listeners with/without ignoreExistingResources");
|
||||||
|
await testIgnoreExistingResources(true);
|
||||||
|
await testIgnoreExistingResources(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function testIgnoreExistingResources(isFirstListenerIgnoreExisting) {
|
||||||
|
const tab = await addTab(TEST_URI);
|
||||||
|
|
||||||
|
const {
|
||||||
|
client,
|
||||||
|
resourceWatcher,
|
||||||
|
targetList,
|
||||||
|
} = await initResourceWatcherAndTarget(tab);
|
||||||
|
|
||||||
|
info("Add messages as existing resources");
|
||||||
|
const existingMessages = ["a", "b", "c"];
|
||||||
|
await logMessages(tab.linkedBrowser, existingMessages);
|
||||||
|
|
||||||
|
info("Register first listener");
|
||||||
|
const cachedResources1 = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources1.push(resource),
|
||||||
|
ignoreExistingResources: isFirstListenerIgnoreExisting,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Register second listener");
|
||||||
|
const cachedResources2 = [];
|
||||||
|
await resourceWatcher.watchResources(
|
||||||
|
[ResourceWatcher.TYPES.CONSOLE_MESSAGE],
|
||||||
|
{
|
||||||
|
onAvailable: ({ resource }) => cachedResources2.push(resource),
|
||||||
|
ignoreExistingResources: !isFirstListenerIgnoreExisting,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const cachedResourcesWithFlag = isFirstListenerIgnoreExisting
|
||||||
|
? cachedResources1
|
||||||
|
: cachedResources2;
|
||||||
|
const cachedResourcesWithoutFlag = isFirstListenerIgnoreExisting
|
||||||
|
? cachedResources2
|
||||||
|
: cachedResources1;
|
||||||
|
|
||||||
|
info("Check the existing resources both listeners got");
|
||||||
|
assertContents(cachedResourcesWithFlag, []);
|
||||||
|
assertContents(cachedResourcesWithoutFlag, existingMessages);
|
||||||
|
|
||||||
|
info("Add messages as additional resources");
|
||||||
|
const additionalMessages = ["d", "e"];
|
||||||
|
await logMessages(tab.linkedBrowser, additionalMessages);
|
||||||
|
|
||||||
|
info("Wait until onAvailable is called expected times");
|
||||||
|
await waitUntil(
|
||||||
|
() => cachedResourcesWithFlag.length === additionalMessages.length
|
||||||
|
);
|
||||||
|
const allMessages = [...existingMessages, ...additionalMessages];
|
||||||
|
await waitUntil(
|
||||||
|
() => cachedResourcesWithoutFlag.length === allMessages.length
|
||||||
|
);
|
||||||
|
|
||||||
|
info("Check the resources after adding messages");
|
||||||
|
assertContents(cachedResourcesWithFlag, additionalMessages);
|
||||||
|
assertContents(cachedResourcesWithoutFlag, allMessages);
|
||||||
|
|
||||||
|
await targetList.stopListening();
|
||||||
|
await client.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
function assertContents(resources, expectedMessages) {
|
||||||
|
is(
|
||||||
|
resources.length,
|
||||||
|
expectedMessages.length,
|
||||||
|
"Number of the resources is correct"
|
||||||
|
);
|
||||||
|
|
||||||
|
for (let i = 0; i < expectedMessages.length; i++) {
|
||||||
|
const resource = resources[i];
|
||||||
|
const message = resource.message.arguments[0];
|
||||||
|
const expectedMessage = expectedMessages[i];
|
||||||
|
is(message, expectedMessage, `The ${i}th content is correct`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function assertResources(resources, expectedResources) {
|
||||||
|
is(
|
||||||
|
resources.length,
|
||||||
|
expectedResources.length,
|
||||||
|
"Number of the resources is correct"
|
||||||
|
);
|
||||||
|
|
||||||
|
for (let i = 0; i < resources.length; i++) {
|
||||||
|
const resource = resources[i];
|
||||||
|
const expectedResource = expectedResources[i];
|
||||||
|
ok(resource === expectedResource, `The ${i}th resource is correct`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function logMessages(browser, messages) {
|
||||||
|
return ContentTask.spawn(browser, { messages }, args => {
|
||||||
|
for (const message of args.messages) {
|
||||||
|
content.console.log(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function triggerErrors(browser, errorScripts) {
|
||||||
|
for (const errorScript of errorScripts) {
|
||||||
|
await ContentTask.spawn(browser, errorScript, expr => {
|
||||||
|
const document = content.document;
|
||||||
|
const container = document.createElement("script");
|
||||||
|
document.body.appendChild(container);
|
||||||
|
container.textContent = expr;
|
||||||
|
container.remove();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче