summaryrefslogtreecommitdiffstats
path: root/devtools/shared/resources/tests/browser_resources_document_events.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/resources/tests/browser_resources_document_events.js')
-rw-r--r--devtools/shared/resources/tests/browser_resources_document_events.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/devtools/shared/resources/tests/browser_resources_document_events.js b/devtools/shared/resources/tests/browser_resources_document_events.js
new file mode 100644
index 0000000000..bf6a66ed40
--- /dev/null
+++ b/devtools/shared/resources/tests/browser_resources_document_events.js
@@ -0,0 +1,143 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test the ResourceWatcher API around DOCUMENT_EVENT
+
+const { TargetList } = require("devtools/shared/resources/target-list");
+const {
+ ResourceWatcher,
+} = require("devtools/shared/resources/resource-watcher");
+
+add_task(async function() {
+ await testDocumentEventResources();
+ await testDocumentEventResourcesWithIgnoreExistingResources();
+});
+
+async function testDocumentEventResources() {
+ info("Test ResourceWatcher for DOCUMENT_EVENT");
+
+ // Open a test tab
+ const tab = await addTab("data:text/html,Document Events");
+
+ // Create a TargetList for the test tab
+ const client = await createLocalClient();
+ const descriptor = await client.mainRoot.getTab({ tab });
+ const target = await descriptor.getTarget();
+ const targetList = new TargetList(client.mainRoot, target);
+ await targetList.startListening();
+
+ // Activate ResourceWatcher
+ const listener = new ResourceListener();
+ const resourceWatcher = new ResourceWatcher(targetList);
+
+ info(
+ "Check whether the document events are fired correctly even when the document was already loaded"
+ );
+ const onLoadingAtInit = listener.once("dom-loading");
+ const onInteractiveAtInit = listener.once("dom-interactive");
+ const onCompleteAtInit = listener.once("dom-complete");
+ await resourceWatcher.watchResources([ResourceWatcher.TYPES.DOCUMENT_EVENT], {
+ onAvailable: parameters => listener.dispatch(parameters),
+ });
+ await assertPromises(onLoadingAtInit, onInteractiveAtInit, onCompleteAtInit);
+ ok(
+ true,
+ "Document events are fired even when the document was already loaded"
+ );
+
+ info("Check whether the document events are fired correctly when reloading");
+ const onLoadingAtReloaded = listener.once("dom-loading");
+ const onInteractiveAtReloaded = listener.once("dom-interactive");
+ const onCompleteAtReloaded = listener.once("dom-complete");
+ gBrowser.reloadTab(tab);
+ await assertPromises(
+ onLoadingAtReloaded,
+ onInteractiveAtReloaded,
+ onCompleteAtReloaded
+ );
+ ok(true, "Document events are fired after reloading");
+
+ await targetList.destroy();
+ await client.close();
+}
+
+async function testDocumentEventResourcesWithIgnoreExistingResources() {
+ info("Test ignoreExistingResources option for DOCUMENT_EVENT");
+
+ const tab = await addTab("data:text/html,Document Events");
+
+ const { client, resourceWatcher, targetList } = await initResourceWatcher(
+ tab
+ );
+
+ info("Check whether the existing document events will not be fired");
+ const documentEvents = [];
+ await resourceWatcher.watchResources([ResourceWatcher.TYPES.DOCUMENT_EVENT], {
+ onAvailable: resources => documentEvents.push(...resources),
+ ignoreExistingResources: true,
+ });
+ is(documentEvents.length, 0, "Existing document events are not fired");
+
+ info("Check whether the future document events are fired");
+ gBrowser.reloadTab(tab);
+ info("Wait for dom-loading, dom-interactive and dom-complete events");
+ await waitUntil(() => documentEvents.length === 3);
+ assertEvents(...documentEvents);
+
+ await targetList.destroy();
+ await client.close();
+}
+
+async function assertPromises(onLoading, onInteractive, onComplete) {
+ const loadingEvent = await onLoading;
+ const interactiveEvent = await onInteractive;
+ const completeEvent = await onComplete;
+ assertEvents(loadingEvent, interactiveEvent, completeEvent);
+}
+
+function assertEvents(loadingEvent, interactiveEvent, completeEvent) {
+ is(
+ typeof loadingEvent.time,
+ "number",
+ "Type of time attribute for loading event is correct"
+ );
+ is(
+ typeof interactiveEvent.time,
+ "number",
+ "Type of time attribute for interactive event is correct"
+ );
+ is(
+ typeof completeEvent.time,
+ "number",
+ "Type of time attribute for complete event is correct"
+ );
+
+ ok(
+ loadingEvent.time < interactiveEvent.time,
+ "Timestamp for interactive event is greater than loading event"
+ );
+ ok(
+ interactiveEvent.time < completeEvent.time,
+ "Timestamp for complete event is greater than interactive event"
+ );
+}
+
+class ResourceListener {
+ _listeners = new Map();
+
+ dispatch(resources) {
+ for (const resource of resources) {
+ const resolve = this._listeners.get(resource.name);
+ if (resolve) {
+ resolve(resource);
+ this._listeners.delete(resource.name);
+ }
+ }
+ }
+
+ once(resourceName) {
+ return new Promise(r => this._listeners.set(resourceName, r));
+ }
+}