/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; add_task(async function noEventWhenPageDomainDisabled({ client }) { await runFrameAttachedTest(client, 0, async () => { info("Navigate to a page with nested iframes"); await loadURL(FRAMESET_NESTED_URL); }); }); 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(FRAMESET_NESTED_URL); }); }); add_task(async function noEventWhenNavigatingWithNoFrames({ client }) { const { Page } = client; info("Navigate to a page with iframes"); await loadURL(FRAMESET_NESTED_URL); await Page.enable(); await runFrameAttachedTest(client, 0, async () => { info("Navigate to a page with no iframes"); await loadURL(PAGE_URL); }); }); 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(FRAMESET_MULTI_URL); }); }); 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(FRAMESET_NESTED_URL); }); }); add_task(async function eventWhenAttachingFrame({ client }) { const { Page } = client; await loadURL(FRAMESET_NESTED_URL); await Page.enable(); await runFrameAttachedTest(client, 1, async () => { await SpecialPowers.spawn( gBrowser.selectedBrowser, [PAGE_FRAME_URL], async frameURL => { const frame = content.document.createElement("iframe"); frame.src = frameURL; 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" ); }); }