mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
 * http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const URL = HTTPROOT + "browser_frametree_sample.html";
 | 
						|
const URL_FRAMESET = HTTPROOT + "browser_frametree_sample_frameset.html";
 | 
						|
const URL_IFRAMES = HTTPROOT + "browser_frametree_sample_iframes.html";
 | 
						|
 | 
						|
/**
 | 
						|
 * Check that we correctly enumerate non-dynamic child frames.
 | 
						|
 */
 | 
						|
add_task(async function test_frametree() {
 | 
						|
  // Add an empty tab for a start.
 | 
						|
  let tab = BrowserTestUtils.addTab(gBrowser, URL);
 | 
						|
  let browser = tab.linkedBrowser;
 | 
						|
  await promiseBrowserLoaded(browser);
 | 
						|
 | 
						|
  // The page is a single frame with no children.
 | 
						|
  is(await countNonDynamicFrames(browser), 0, "no child frames");
 | 
						|
 | 
						|
  // Navigate to a frameset.
 | 
						|
  BrowserTestUtils.loadURIString(browser, URL_FRAMESET);
 | 
						|
  await promiseBrowserLoaded(browser);
 | 
						|
 | 
						|
  // The frameset has two frames.
 | 
						|
  is(await countNonDynamicFrames(browser), 2, "two non-dynamic child frames");
 | 
						|
 | 
						|
  // Go back in history.
 | 
						|
  let pageShowPromise = BrowserTestUtils.waitForContentEvent(
 | 
						|
    browser,
 | 
						|
    "pageshow",
 | 
						|
    true
 | 
						|
  );
 | 
						|
  browser.goBack();
 | 
						|
  await pageShowPromise;
 | 
						|
 | 
						|
  // We're at page one again.
 | 
						|
  is(await countNonDynamicFrames(browser), 0, "no child frames");
 | 
						|
 | 
						|
  // Append a dynamic frame.
 | 
						|
  await SpecialPowers.spawn(browser, [URL], async ([url]) => {
 | 
						|
    let frame = content.document.createElement("iframe");
 | 
						|
    frame.setAttribute("src", url);
 | 
						|
    content.document.body.appendChild(frame);
 | 
						|
    await ContentTaskUtils.waitForEvent(frame, "load");
 | 
						|
  });
 | 
						|
 | 
						|
  // The dynamic frame should be ignored.
 | 
						|
  is(
 | 
						|
    await countNonDynamicFrames(browser),
 | 
						|
    0,
 | 
						|
    "we still have a single root frame"
 | 
						|
  );
 | 
						|
 | 
						|
  // Cleanup.
 | 
						|
  BrowserTestUtils.removeTab(tab);
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Check that we correctly enumerate non-dynamic child frames.
 | 
						|
 */
 | 
						|
add_task(async function test_frametree_dynamic() {
 | 
						|
  // Add an empty tab for a start.
 | 
						|
  let tab = BrowserTestUtils.addTab(gBrowser, URL_IFRAMES);
 | 
						|
  let browser = tab.linkedBrowser;
 | 
						|
  await promiseBrowserLoaded(browser);
 | 
						|
 | 
						|
  // The page has two iframes.
 | 
						|
  is(await countNonDynamicFrames(browser), 2, "two non-dynamic child frames");
 | 
						|
  is(await enumerateIndexes(browser), "0,1", "correct indexes 0 and 1");
 | 
						|
 | 
						|
  // Insert a dynamic frame.
 | 
						|
  await SpecialPowers.spawn(browser, [URL], async ([url]) => {
 | 
						|
    let frame = content.document.createElement("iframe");
 | 
						|
    frame.setAttribute("src", url);
 | 
						|
    content.document.body.insertBefore(
 | 
						|
      frame,
 | 
						|
      content.document.getElementsByTagName("iframe")[1]
 | 
						|
    );
 | 
						|
    await ContentTaskUtils.waitForEvent(frame, "load");
 | 
						|
  });
 | 
						|
 | 
						|
  // The page still has two iframes.
 | 
						|
  is(await countNonDynamicFrames(browser), 2, "two non-dynamic child frames");
 | 
						|
  is(await enumerateIndexes(browser), "0,1", "correct indexes 0 and 1");
 | 
						|
 | 
						|
  // Append a dynamic frame.
 | 
						|
  await SpecialPowers.spawn(browser, [URL], async ([url]) => {
 | 
						|
    let frame = content.document.createElement("iframe");
 | 
						|
    frame.setAttribute("src", url);
 | 
						|
    content.document.body.appendChild(frame);
 | 
						|
    await ContentTaskUtils.waitForEvent(frame, "load");
 | 
						|
  });
 | 
						|
 | 
						|
  // The page still has two iframes.
 | 
						|
  is(await countNonDynamicFrames(browser), 2, "two non-dynamic child frames");
 | 
						|
  is(await enumerateIndexes(browser), "0,1", "correct indexes 0 and 1");
 | 
						|
 | 
						|
  // Remopve a non-dynamic iframe.
 | 
						|
  await SpecialPowers.spawn(browser, [URL], async ([url]) => {
 | 
						|
    // Remove the first iframe, which should be a non-dynamic iframe.
 | 
						|
    content.document.body.removeChild(
 | 
						|
      content.document.getElementsByTagName("iframe")[0]
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  is(await countNonDynamicFrames(browser), 1, "one non-dynamic child frame");
 | 
						|
  is(await enumerateIndexes(browser), "1", "correct index 1");
 | 
						|
 | 
						|
  // Cleanup.
 | 
						|
  BrowserTestUtils.removeTab(tab);
 | 
						|
});
 | 
						|
 | 
						|
async function countNonDynamicFrames(browser) {
 | 
						|
  return SpecialPowers.spawn(browser, [], async () => {
 | 
						|
    let count = 0;
 | 
						|
    content.SessionStoreUtils.forEachNonDynamicChildFrame(
 | 
						|
      content,
 | 
						|
      () => count++
 | 
						|
    );
 | 
						|
    return count;
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
async function enumerateIndexes(browser) {
 | 
						|
  return SpecialPowers.spawn(browser, [], async () => {
 | 
						|
    let indexes = [];
 | 
						|
    content.SessionStoreUtils.forEachNonDynamicChildFrame(content, (frame, i) =>
 | 
						|
      indexes.push(i)
 | 
						|
    );
 | 
						|
    return indexes.join(",");
 | 
						|
  });
 | 
						|
}
 |