Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
function captureLoadInfo(uri) {
const deferred = Promise.withResolvers();
function getChannel(subject) {
try {
return subject.QueryInterface(Ci.nsIChannel);
} catch {
return null;
}
}
let observer = {
observe(subject) {
const channel = getChannel(subject);
if (channel && channel.URI.spec === uri) {
deferred.resolve(channel.loadInfo);
Services.obs.removeObserver(observer, "http-on-modify-request");
}
},
};
Services.obs.addObserver(observer, "http-on-modify-request");
return deferred.promise;
}
// Verify that for an iframe load, LoadInfo has frameBrowsingContextID set to
// the iframe's actual BrowsingContext ID. See bug 2019517.
add_task(async function test_iframe_frameBrowsingContextID() {
const IFRAME_URL = ROOT + "res_sub_document.html";
await BrowserTestUtils.withNewTab(ROOT + "dummy.html", async browser => {
let loadInfoPromise = captureLoadInfo(IFRAME_URL);
let iframeBCID = await SpecialPowers.spawn(
browser,
[IFRAME_URL],
async iframeURL => {
let iframe = content.document.createElement("iframe");
iframe.src = iframeURL;
await new Promise(resolve => {
iframe.addEventListener("load", resolve, { once: true });
content.document.body.appendChild(iframe);
});
return iframe.browsingContext.id;
}
);
let capturedLoadInfo = await loadInfoPromise;
Assert.ok(capturedLoadInfo, "Should have captured a load info");
Assert.equal(
capturedLoadInfo.frameBrowsingContextID,
iframeBCID,
"frameBrowsingContextID should match the iframe's BC ID"
);
});
});