forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			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");
 | |
| });
 | 
