diff options
Diffstat (limited to 'browser/base/content/test/outOfProcess/head.js')
-rw-r--r-- | browser/base/content/test/outOfProcess/head.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/browser/base/content/test/outOfProcess/head.js b/browser/base/content/test/outOfProcess/head.js new file mode 100644 index 0000000000..230e2e2cbc --- /dev/null +++ b/browser/base/content/test/outOfProcess/head.js @@ -0,0 +1,85 @@ +const OOP_BASE_PAGE_URI = + "https://example.com/browser/browser/base/content/test/outOfProcess/file_base.html"; + +// The number of frames and subframes that exist for the basic OOP test. If frames are +// modified within file_base.html, update this value. +const TOTAL_FRAME_COUNT = 8; + +// The frames are assigned different colors based on their process ids. If you add a +// frame you might need to add more colors to this list. +const FRAME_COLORS = ["white", "seashell", "lightcyan", "palegreen"]; + +/** + * Set up a set of child frames for the given browser for testing + * out of process frames. 'OOP_BASE_PAGE_URI' is the base page and subframes + * contain pages from the same or other domains. + * + * @param browser browser containing frame hierarchy to set up + * @param insertHTML HTML or function that returns what to insert into each frame + * @returns array of all browsing contexts in depth-first order + * + * This function adds a browsing context and process id label to each + * child subframe. It also sets the background color of each frame to + * different colors based on the process id. The browser_basic_outofprocess.js + * test verifies these colors to ensure that the frame/process hierarchy + * has been set up as expected. Colors are used to help people visualize + * the process setup. + * + * The insertHTML argument may be either a fixed string of HTML to insert + * into each subframe, or a function that returns the string to insert. The + * function takes one argument, the browsing context being processed. + */ +async function initChildFrames(browser, insertHTML) { + let colors = FRAME_COLORS.slice(); + let colorMap = new Map(); + + let browsingContexts = []; + + async function processBC(bc) { + browsingContexts.push(bc); + + let pid = bc.currentWindowGlobal.osPid; + let ident = "BrowsingContext: " + bc.id + "\nProcess: " + pid; + + let color = colorMap.get(pid); + if (!color) { + if (!colors.length) { + ok(false, "ran out of available colors"); + } + + color = colors.shift(); + colorMap.set(pid, color); + } + + let insertHTMLString = insertHTML; + if (typeof insertHTML == "function") { + insertHTMLString = insertHTML(bc); + } + + await SpecialPowers.spawn( + bc, + [ident, color, insertHTMLString], + (identChild, colorChild, insertHTMLChild) => { + let root = content.document.documentElement; + root.style = "background-color: " + colorChild; + + let pre = content.document.createElement("pre"); + pre.textContent = identChild; + root.insertBefore(pre, root.firstChild); + + if (insertHTMLChild) { + // eslint-disable-next-line no-unsanitized/property + content.document.getElementById("insertPoint").innerHTML = + insertHTMLChild; + } + } + ); + + for (let childBC of bc.children) { + await processBC(childBC); + } + } + await processBC(browser.browsingContext); + + return browsingContexts; +} |