mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			291 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
const { XPCShellContentUtils } = ChromeUtils.importESModule(
 | 
						|
  "resource://testing-common/XPCShellContentUtils.sys.mjs"
 | 
						|
);
 | 
						|
 | 
						|
XPCShellContentUtils.init(this);
 | 
						|
 | 
						|
const ACTOR = "AllowJavascript";
 | 
						|
 | 
						|
const HTML = String.raw`<!DOCTYPE html>
 | 
						|
<html lang="en">
 | 
						|
<head>
 | 
						|
  <meta charset="UTF-8">
 | 
						|
  <script type="application/javascript">
 | 
						|
    "use strict";
 | 
						|
    var gFiredOnload = false;
 | 
						|
    var gFiredOnclick = false;
 | 
						|
  </script>
 | 
						|
</head>
 | 
						|
<body onload="gFiredOnload = true;" onclick="gFiredOnclick = true;">
 | 
						|
</body>
 | 
						|
</html>`;
 | 
						|
 | 
						|
const server = XPCShellContentUtils.createHttpServer({
 | 
						|
  hosts: ["example.com", "example.org"],
 | 
						|
});
 | 
						|
 | 
						|
server.registerPathHandler("/", (request, response) => {
 | 
						|
  response.setHeader("Content-Type", "text/html");
 | 
						|
  response.write(HTML);
 | 
						|
});
 | 
						|
 | 
						|
const { AllowJavascriptParent } = ChromeUtils.importESModule(
 | 
						|
  "resource://test/AllowJavascriptParent.sys.mjs"
 | 
						|
);
 | 
						|
 | 
						|
async function assertScriptsAllowed(bc, expectAllowed, desc) {
 | 
						|
  let actor = bc.currentWindowGlobal.getActor(ACTOR);
 | 
						|
  let allowed = await actor.sendQuery("CheckScriptsAllowed");
 | 
						|
  equal(
 | 
						|
    allowed,
 | 
						|
    expectAllowed,
 | 
						|
    `Scripts should be ${expectAllowed ? "" : "dis"}allowed for ${desc}`
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
async function assertLoadFired(bc, expectFired, desc) {
 | 
						|
  let actor = bc.currentWindowGlobal.getActor(ACTOR);
 | 
						|
  let fired = await actor.sendQuery("CheckFiredLoadEvent");
 | 
						|
  equal(
 | 
						|
    fired,
 | 
						|
    expectFired,
 | 
						|
    `Should ${expectFired ? "" : "not "}have fired load for ${desc}`
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
function createSubframe(bc, url) {
 | 
						|
  let actor = bc.currentWindowGlobal.getActor(ACTOR);
 | 
						|
  return actor.sendQuery("CreateIframe", { url });
 | 
						|
}
 | 
						|
 | 
						|
add_task(async function () {
 | 
						|
  Services.prefs.setBoolPref("dom.security.https_first", false);
 | 
						|
  ChromeUtils.registerWindowActor(ACTOR, {
 | 
						|
    allFrames: true,
 | 
						|
    child: {
 | 
						|
      esModuleURI: "resource://test/AllowJavascriptChild.sys.mjs",
 | 
						|
      events: { load: { capture: true } },
 | 
						|
    },
 | 
						|
    parent: {
 | 
						|
      esModuleURI: "resource://test/AllowJavascriptParent.sys.mjs",
 | 
						|
    },
 | 
						|
  });
 | 
						|
 | 
						|
  let page = await XPCShellContentUtils.loadContentPage("http://example.com/", {
 | 
						|
    remote: true,
 | 
						|
    remoteSubframes: true,
 | 
						|
  });
 | 
						|
 | 
						|
  let bc = page.browsingContext;
 | 
						|
 | 
						|
  {
 | 
						|
    let oopFrame1 = await createSubframe(bc, "http://example.org/");
 | 
						|
    let inprocFrame1 = await createSubframe(bc, "http://example.com/");
 | 
						|
 | 
						|
    let oopFrame1OopSub = await createSubframe(
 | 
						|
      oopFrame1,
 | 
						|
      "http://example.com/"
 | 
						|
    );
 | 
						|
    let inprocFrame1OopSub = await createSubframe(
 | 
						|
      inprocFrame1,
 | 
						|
      "http://example.org/"
 | 
						|
    );
 | 
						|
 | 
						|
    equal(
 | 
						|
      oopFrame1.allowJavascript,
 | 
						|
      true,
 | 
						|
      "OOP BC should inherit allowJavascript from parent"
 | 
						|
    );
 | 
						|
    equal(
 | 
						|
      inprocFrame1.allowJavascript,
 | 
						|
      true,
 | 
						|
      "In-process BC should inherit allowJavascript from parent"
 | 
						|
    );
 | 
						|
    equal(
 | 
						|
      oopFrame1OopSub.allowJavascript,
 | 
						|
      true,
 | 
						|
      "OOP BC child should inherit allowJavascript from parent"
 | 
						|
    );
 | 
						|
    equal(
 | 
						|
      inprocFrame1OopSub.allowJavascript,
 | 
						|
      true,
 | 
						|
      "In-process child BC should inherit allowJavascript from parent"
 | 
						|
    );
 | 
						|
 | 
						|
    await assertLoadFired(bc, true, "top BC");
 | 
						|
    await assertScriptsAllowed(bc, true, "top BC");
 | 
						|
 | 
						|
    await assertLoadFired(oopFrame1, true, "OOP frame 1");
 | 
						|
    await assertScriptsAllowed(oopFrame1, true, "OOP frame 1");
 | 
						|
 | 
						|
    await assertLoadFired(inprocFrame1, true, "In-process frame 1");
 | 
						|
    await assertScriptsAllowed(inprocFrame1, true, "In-process frame 1");
 | 
						|
 | 
						|
    await assertLoadFired(oopFrame1OopSub, true, "OOP frame 1 subframe");
 | 
						|
    await assertScriptsAllowed(oopFrame1OopSub, true, "OOP frame 1 subframe");
 | 
						|
 | 
						|
    await assertLoadFired(
 | 
						|
      inprocFrame1OopSub,
 | 
						|
      true,
 | 
						|
      "In-process frame 1 subframe"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame1OopSub,
 | 
						|
      true,
 | 
						|
      "In-process frame 1 subframe"
 | 
						|
    );
 | 
						|
 | 
						|
    bc.allowJavascript = false;
 | 
						|
    await assertScriptsAllowed(bc, false, "top BC with scripts disallowed");
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      oopFrame1,
 | 
						|
      false,
 | 
						|
      "OOP frame 1 with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame1,
 | 
						|
      false,
 | 
						|
      "In-process frame 1 with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      oopFrame1OopSub,
 | 
						|
      false,
 | 
						|
      "OOP frame 1 subframe with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame1OopSub,
 | 
						|
      false,
 | 
						|
      "In-process frame 1 subframe with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
 | 
						|
    let oopFrame2 = await createSubframe(bc, "http://example.org/");
 | 
						|
    let inprocFrame2 = await createSubframe(bc, "http://example.com/");
 | 
						|
 | 
						|
    equal(
 | 
						|
      oopFrame2.allowJavascript,
 | 
						|
      false,
 | 
						|
      "OOP BC 2 should inherit allowJavascript from parent"
 | 
						|
    );
 | 
						|
    equal(
 | 
						|
      inprocFrame2.allowJavascript,
 | 
						|
      false,
 | 
						|
      "In-process BC 2 should inherit allowJavascript from parent"
 | 
						|
    );
 | 
						|
 | 
						|
    await assertLoadFired(
 | 
						|
      oopFrame2,
 | 
						|
      undefined,
 | 
						|
      "OOP frame 2 with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      oopFrame2,
 | 
						|
      false,
 | 
						|
      "OOP frame 2 with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertLoadFired(
 | 
						|
      inprocFrame2,
 | 
						|
      undefined,
 | 
						|
      "In-process frame 2 with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame2,
 | 
						|
      false,
 | 
						|
      "In-process frame 2 with top BC with scripts disallowed"
 | 
						|
    );
 | 
						|
 | 
						|
    bc.allowJavascript = true;
 | 
						|
    await assertScriptsAllowed(bc, true, "top BC");
 | 
						|
 | 
						|
    await assertScriptsAllowed(oopFrame1, true, "OOP frame 1");
 | 
						|
    await assertScriptsAllowed(inprocFrame1, true, "In-process frame 1");
 | 
						|
    await assertScriptsAllowed(oopFrame1OopSub, true, "OOP frame 1 subframe");
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame1OopSub,
 | 
						|
      true,
 | 
						|
      "In-process frame 1 subframe"
 | 
						|
    );
 | 
						|
 | 
						|
    await assertScriptsAllowed(oopFrame2, false, "OOP frame 2");
 | 
						|
    await assertScriptsAllowed(inprocFrame2, false, "In-process frame 2");
 | 
						|
 | 
						|
    oopFrame1.currentWindowGlobal.allowJavascript = false;
 | 
						|
    inprocFrame1.currentWindowGlobal.allowJavascript = false;
 | 
						|
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      oopFrame1,
 | 
						|
      false,
 | 
						|
      "OOP frame 1 with second level WC scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame1,
 | 
						|
      false,
 | 
						|
      "In-process frame 1 with second level WC scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      oopFrame1OopSub,
 | 
						|
      false,
 | 
						|
      "OOP frame 1 subframe second level WC scripts disallowed"
 | 
						|
    );
 | 
						|
    await assertScriptsAllowed(
 | 
						|
      inprocFrame1OopSub,
 | 
						|
      false,
 | 
						|
      "In-process frame 1 subframe with second level WC scripts disallowed"
 | 
						|
    );
 | 
						|
 | 
						|
    oopFrame1.reload(0);
 | 
						|
    inprocFrame1.reload(0);
 | 
						|
    await Promise.all([
 | 
						|
      AllowJavascriptParent.promiseLoad(oopFrame1),
 | 
						|
      AllowJavascriptParent.promiseLoad(inprocFrame1),
 | 
						|
    ]);
 | 
						|
 | 
						|
    equal(
 | 
						|
      oopFrame1.currentWindowGlobal.allowJavascript,
 | 
						|
      true,
 | 
						|
      "WindowContext.allowJavascript does not persist after navigation for OOP frame 1"
 | 
						|
    );
 | 
						|
    equal(
 | 
						|
      inprocFrame1.currentWindowGlobal.allowJavascript,
 | 
						|
      true,
 | 
						|
      "WindowContext.allowJavascript does not persist after navigation for in-process frame 1"
 | 
						|
    );
 | 
						|
 | 
						|
    await assertScriptsAllowed(oopFrame1, true, "OOP frame 1");
 | 
						|
    await assertScriptsAllowed(inprocFrame1, true, "In-process frame 1");
 | 
						|
  }
 | 
						|
 | 
						|
  bc.allowJavascript = false;
 | 
						|
 | 
						|
  bc.reload(0);
 | 
						|
  await AllowJavascriptParent.promiseLoad(bc);
 | 
						|
 | 
						|
  await assertLoadFired(
 | 
						|
    bc,
 | 
						|
    undefined,
 | 
						|
    "top BC with scripts disabled after reload"
 | 
						|
  );
 | 
						|
  await assertScriptsAllowed(
 | 
						|
    bc,
 | 
						|
    false,
 | 
						|
    "top BC with scripts disabled after reload"
 | 
						|
  );
 | 
						|
 | 
						|
  await page.loadURL("http://example.org/?other");
 | 
						|
  bc = page.browsingContext;
 | 
						|
 | 
						|
  await assertLoadFired(
 | 
						|
    bc,
 | 
						|
    undefined,
 | 
						|
    "top BC with scripts disabled after navigation"
 | 
						|
  );
 | 
						|
  await assertScriptsAllowed(
 | 
						|
    bc,
 | 
						|
    false,
 | 
						|
    "top BC with scripts disabled after navigation"
 | 
						|
  );
 | 
						|
 | 
						|
  await page.close();
 | 
						|
  Services.prefs.clearUserPref("dom.security.https_first");
 | 
						|
});
 |