summaryrefslogtreecommitdiffstats
path: root/remote/test/browser/page/browser_frameAttached.js
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/browser/page/browser_frameAttached.js')
-rw-r--r--remote/test/browser/page/browser_frameAttached.js147
1 files changed, 147 insertions, 0 deletions
diff --git a/remote/test/browser/page/browser_frameAttached.js b/remote/test/browser/page/browser_frameAttached.js
new file mode 100644
index 0000000000..bb181feadb
--- /dev/null
+++ b/remote/test/browser/page/browser_frameAttached.js
@@ -0,0 +1,147 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const DOC = toDataURL("<div>foo</div>");
+const DOC_IFRAME_MULTI = toDataURL(`
+ <iframe src='data:text/html,foo'></iframe>
+ <iframe src='data:text/html,bar'></iframe>
+`);
+const DOC_IFRAME_NESTED = toDataURL(`
+ <iframe src="${DOC_IFRAME_MULTI}"></iframe>
+`);
+
+add_task(async function noEventWhenPageDomainDisabled({ client }) {
+ await runFrameAttachedTest(client, 0, async () => {
+ info("Navigate to a page with nested iframes");
+ await loadURL(DOC_IFRAME_NESTED);
+ });
+});
+
+add_task(async function noEventAfterPageDomainDisabled({ client }) {
+ const { Page } = client;
+
+ await Page.enable();
+ await Page.disable();
+
+ await runFrameAttachedTest(client, 0, async () => {
+ info("Navigate to a page with nested iframes");
+ await loadURL(DOC_IFRAME_NESTED);
+ });
+});
+
+add_task(async function noEventWhenNavigatingWithNoFrames({ client }) {
+ const { Page } = client;
+
+ info("Navigate to a page with iframes");
+ await loadURL(DOC_IFRAME_NESTED);
+
+ await Page.enable();
+
+ await runFrameAttachedTest(client, 0, async () => {
+ info("Navigate to a page with no iframes");
+ await loadURL(DOC);
+ });
+});
+
+add_task(async function eventWhenNavigatingWithFrames({ client }) {
+ const { Page } = client;
+
+ await Page.enable();
+
+ await runFrameAttachedTest(client, 2, async () => {
+ info("Navigate to a page with iframes");
+ await loadURL(DOC_IFRAME_MULTI);
+ });
+});
+
+add_task(async function eventWhenNavigatingWithNestedFrames({ client }) {
+ const { Page } = client;
+
+ await Page.enable();
+
+ await runFrameAttachedTest(client, 3, async () => {
+ info("Navigate to a page with nested iframes");
+ await loadURL(DOC_IFRAME_NESTED);
+ });
+});
+
+add_task(async function eventWhenAttachingFrame({ client }) {
+ const { Page } = client;
+
+ await Page.enable();
+
+ await runFrameAttachedTest(client, 1, async () => {
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
+ const frame = content.document.createElement("iframe");
+ frame.src = "data:text/html,frame content";
+ const loaded = new Promise(resolve => (frame.onload = resolve));
+ content.document.body.appendChild(frame);
+ await loaded;
+ });
+ });
+});
+
+async function runFrameAttachedTest(client, expectedEventCount, callback) {
+ const { Page } = client;
+
+ const ATTACHED = "Page.frameAttached";
+
+ const history = new RecordEvents(expectedEventCount);
+ history.addRecorder({
+ event: Page.frameAttached,
+ eventName: ATTACHED,
+ messageFn: payload => {
+ return `Received ${ATTACHED} for frame id ${payload.frameId}`;
+ },
+ });
+
+ const framesBefore = await getFlattenedFrameTree(client);
+ await callback();
+ const framesAfter = await getFlattenedFrameTree(client);
+
+ const frameAttachedEvents = await history.record();
+
+ if (expectedEventCount == 0) {
+ is(frameAttachedEvents.length, 0, "Got no frame attached event");
+ return;
+ }
+
+ // check how many frames were attached or detached
+ const count = Math.abs(framesBefore.size - framesAfter.size);
+
+ is(count, expectedEventCount, "Expected amount of frames attached");
+ is(
+ frameAttachedEvents.length,
+ count,
+ "Received the expected amount of frameAttached events"
+ );
+
+ // extract the new or removed frames
+ const framesAll = new Map([...framesBefore, ...framesAfter]);
+ const expectedFrames = new Map(
+ [...framesAll].filter(([key, _value]) => {
+ return !framesBefore.has(key) && framesAfter.has(key);
+ })
+ );
+
+ frameAttachedEvents.forEach(({ payload }) => {
+ const { frameId, parentFrameId } = payload;
+
+ info(`Check frame id ${frameId}`);
+ const expectedFrame = expectedFrames.get(frameId);
+
+ ok(expectedFrame, `Found expected frame with id ${frameId}`);
+ is(
+ frameId,
+ expectedFrame.id,
+ "Got expected frame id for frameAttached event"
+ );
+ is(
+ parentFrameId,
+ expectedFrame.parentId,
+ "Got expected parent frame id for frameAttached event"
+ );
+ });
+}