<!DOCTYPE HTML> <html> <head> <title>Test for SpecialPowers extension</title> <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> </head> <body onload="starttest();"> <pre id="test"> <script class="testbody" type="text/javascript"> const ALLOW_ACTION = SpecialPowers.Ci.nsIPermissionManager.ALLOW_ACTION; const DENY_ACTION = SpecialPowers.Ci.nsIPermissionManager.DENY_ACTION; const UNKNOWN_ACTION = SpecialPowers.Ci.nsIPermissionManager.UNKNOWN_ACTION; const PROMPT_ACTION = SpecialPowers.Ci.nsIPermissionManager.PROMPT_ACTION; const ACCESS_SESSION = SpecialPowers.Ci.nsICookiePermission.ACCESS_SESSION; const ACCESS_ALLOW_FIRST_PARTY_ONLY = SpecialPowers.Ci.nsICookiePermission.ACCESS_ALLOW_FIRST_PARTY_ONLY; const ACCESS_LIMIT_THIRD_PARTY = SpecialPowers.Ci.nsICookiePermission.ACCESS_LIMIT_THIRD_PARTY; const EXPIRE_TIME = SpecialPowers.Ci.nsIPermissionManager.EXPIRE_TIME; // expire Setting: // start expire time point // ----|------------------------|----------- // <------------------------> // PERIOD var start; // PR_Now() that called in nsPermissionManager to get the system time // is sometimes 100ms~600s more than Date.now() on Android 4.3 API11. // Thus, the PERIOD should be larger than 600ms in this test. const PERIOD = 900; var gScript = SpecialPowers.loadChromeScript(SimpleTest.getTestFileURL('specialPowers_framescript.js')); SimpleTest.requestFlakyTimeout("untriaged"); function starttest(){ SpecialPowers.addPermission("pPROMPT", PROMPT_ACTION, document); SpecialPowers.addPermission("pALLOW", ALLOW_ACTION, document); SpecialPowers.addPermission("pDENY", DENY_ACTION, document); SpecialPowers.addPermission("pREMOVE", ALLOW_ACTION, document); SpecialPowers.addPermission("pSESSION", ACCESS_SESSION, document); SpecialPowers.addPermission("pFIRSTPARTY", ACCESS_ALLOW_FIRST_PARTY_ONLY, document); SpecialPowers.addPermission("pTHIRDPARTY", ACCESS_LIMIT_THIRD_PARTY, document); setTimeout(test1, 0); } SimpleTest.waitForExplicitFinish(); function test1() { if (!SpecialPowers.testPermission('pALLOW', ALLOW_ACTION, document)) { dump('/**** allow not set ****/\n'); setTimeout(test1, 0); } else if (!SpecialPowers.testPermission('pDENY', DENY_ACTION, document)) { dump('/**** deny not set ****/\n'); setTimeout(test1, 0); } else if (!SpecialPowers.testPermission('pPROMPT', PROMPT_ACTION, document)) { dump('/**** prompt not set ****/\n'); setTimeout(test1, 0); } else if (!SpecialPowers.testPermission('pREMOVE', ALLOW_ACTION, document)) { dump('/**** remove not set ****/\n'); setTimeout(test1, 0); } else if (!SpecialPowers.testPermission('pSESSION', ACCESS_SESSION, document)) { dump('/**** ACCESS_SESSION not set ****/\n'); setTimeout(test1, 0); } else if (!SpecialPowers.testPermission('pFIRSTPARTY', ACCESS_ALLOW_FIRST_PARTY_ONLY, document)) { dump('/**** ACCESS_ALLOW_FIRST_PARTY_ONLY not set ****/\n'); setTimeout(test1, 0); } else if (!SpecialPowers.testPermission('pTHIRDPARTY', ACCESS_LIMIT_THIRD_PARTY, document)) { dump('/**** ACCESS_LIMIT_THIRD_PARTY not set ****/\n'); setTimeout(test1, 0); } else { test2(); } } function test2() { ok(SpecialPowers.testPermission('pUNKNOWN', UNKNOWN_ACTION, document), 'pUNKNOWN value should have UNKOWN permission'); SpecialPowers.pushPermissions([{'type': 'pUNKNOWN', 'allow': true, 'context': document}, {'type': 'pALLOW', 'allow': false, 'context': document}, {'type': 'pDENY', 'allow': true, 'context': document}, {'type': 'pPROMPT', 'allow': true, 'context': document}, {'type': 'pSESSION', 'allow': true, 'context': document}, {'type': 'pFIRSTPARTY', 'allow': true, 'context': document}, {'type': 'pTHIRDPARTY', 'allow': true, 'context': document}, {'type': 'pREMOVE', 'remove': true, 'context': document}], test3); } function test3() { ok(SpecialPowers.testPermission('pUNKNOWN', ALLOW_ACTION, document), 'pUNKNOWN value should have ALLOW permission'); ok(SpecialPowers.testPermission('pPROMPT', ALLOW_ACTION, document), 'pPROMPT value should have ALLOW permission'); ok(SpecialPowers.testPermission('pALLOW', DENY_ACTION, document), 'pALLOW should have DENY permission'); ok(SpecialPowers.testPermission('pDENY', ALLOW_ACTION, document), 'pDENY should have ALLOW permission'); ok(SpecialPowers.testPermission('pREMOVE', UNKNOWN_ACTION, document), 'pREMOVE should have REMOVE permission'); ok(SpecialPowers.testPermission('pSESSION', ALLOW_ACTION, document), 'pSESSION should have ALLOW permission'); ok(SpecialPowers.testPermission('pFIRSTPARTY', ALLOW_ACTION, document), 'pFIRSTPARTY should have ALLOW permission'); ok(SpecialPowers.testPermission('pTHIRDPARTY', ALLOW_ACTION, document), 'pTHIRDPARTY should have ALLOW permission'); // only pPROMPT (last one) is different, the other stuff is just to see if it doesn't cause test failures SpecialPowers.pushPermissions([{'type': 'pUNKNOWN', 'allow': true, 'context': document}, {'type': 'pALLOW', 'allow': false, 'context': document}, {'type': 'pDENY', 'allow': true, 'context': document}, {'type': 'pPROMPT', 'allow': false, 'context': document}, {'type': 'pREMOVE', 'remove': true, 'context': document}], test3b); } function test3b() { ok(SpecialPowers.testPermission('pPROMPT', DENY_ACTION, document), 'pPROMPT value should have DENY permission'); SpecialPowers.pushPermissions([{'type': 'pUNKNOWN', 'allow': DENY_ACTION, 'context': document}, {'type': 'pALLOW', 'allow': PROMPT_ACTION, 'context': document}, {'type': 'pDENY', 'allow': PROMPT_ACTION, 'context': document}, {'type': 'pPROMPT', 'allow': ALLOW_ACTION, 'context': document}], test4); } function test4() { ok(SpecialPowers.testPermission('pUNKNOWN', DENY_ACTION, document), 'pUNKNOWN value should have DENY permission'); ok(SpecialPowers.testPermission('pPROMPT', ALLOW_ACTION, document), 'pPROMPT value should have ALLOW permission'); ok(SpecialPowers.testPermission('pALLOW', PROMPT_ACTION, document), 'pALLOW should have PROMPT permission'); ok(SpecialPowers.testPermission('pDENY', PROMPT_ACTION, document), 'pDENY should have PROMPT permission'); //this should reset all the permissions to before all the pushPermissions calls SpecialPowers.flushPermissions(test5); } function test5() { ok(SpecialPowers.testPermission('pUNKNOWN', UNKNOWN_ACTION, document), 'pUNKNOWN should have UNKNOWN permission'); ok(SpecialPowers.testPermission('pALLOW', ALLOW_ACTION, document), 'pALLOW should have ALLOW permission'); ok(SpecialPowers.testPermission('pDENY', DENY_ACTION, document), 'pDENY should have DENY permission'); ok(SpecialPowers.testPermission('pPROMPT', PROMPT_ACTION, document), 'pPROMPT should have PROMPT permission'); ok(SpecialPowers.testPermission('pREMOVE', ALLOW_ACTION, document), 'pREMOVE should have ALLOW permission'); ok(SpecialPowers.testPermission('pSESSION', ACCESS_SESSION, document), 'pSESSION should have ACCESS_SESSION permission'); ok(SpecialPowers.testPermission('pFIRSTPARTY', ACCESS_ALLOW_FIRST_PARTY_ONLY, document), 'pFIRSTPARTY should have ACCESS_ALLOW_FIRST_PARTY_ONLY permission'); ok(SpecialPowers.testPermission('pTHIRDPARTY', ACCESS_LIMIT_THIRD_PARTY, document), 'pTHIRDPARTY should have ACCESS_LIMIT_THIRD_PARTY permission'); SpecialPowers.removePermission("pPROMPT", document); SpecialPowers.removePermission("pALLOW", document); SpecialPowers.removePermission("pDENY", document); SpecialPowers.removePermission("pREMOVE", document); SpecialPowers.removePermission("pSESSION", document); SpecialPowers.removePermission("pFIRSTPARTY", document); SpecialPowers.removePermission("pTHIRDPARTY", document); setTimeout(test6, 0); } function test6() { if (!SpecialPowers.testPermission('pALLOW', UNKNOWN_ACTION, document)) { dump('/**** allow still set ****/\n'); setTimeout(test6, 0); } else if (!SpecialPowers.testPermission('pDENY', UNKNOWN_ACTION, document)) { dump('/**** deny still set ****/\n'); setTimeout(test6, 0); } else if (!SpecialPowers.testPermission('pPROMPT', UNKNOWN_ACTION, document)) { dump('/**** prompt still set ****/\n'); setTimeout(test6, 0); } else if (!SpecialPowers.testPermission('pREMOVE', UNKNOWN_ACTION, document)) { dump('/**** remove still set ****/\n'); setTimeout(test6, 0); } else if (!SpecialPowers.testPermission('pSESSION', UNKNOWN_ACTION, document)) { dump('/**** pSESSION still set ****/\n'); setTimeout(test6, 0); } else if (!SpecialPowers.testPermission('pFIRSTPARTY', UNKNOWN_ACTION, document)) { dump('/**** pFIRSTPARTY still set ****/\n'); setTimeout(test6, 0); } else if (!SpecialPowers.testPermission('pTHIRDPARTY', UNKNOWN_ACTION, document)) { dump('/**** pTHIRDPARTY still set ****/\n'); setTimeout(test6, 0); } else { test7(); } } function test7() { afterPermissionChanged('pEXPIRE', 'deleted', test8); afterPermissionChanged('pEXPIRE', 'added', permissionPollingCheck); start = Number(Date.now()); SpecialPowers.addPermission('pEXPIRE', true, document, EXPIRE_TIME, (start + PERIOD + getPlatformInfo().timeCompensation)); } function test8() { afterPermissionChanged('pEXPIRE', 'deleted', SimpleTest.finish); afterPermissionChanged('pEXPIRE', 'added', permissionPollingCheck); start = Number(Date.now()); SpecialPowers.pushPermissions([ { 'type': 'pEXPIRE', 'allow': true, 'expireType': EXPIRE_TIME, 'expireTime': (start + PERIOD + getPlatformInfo().timeCompensation), 'context': document }], function() { info("Wait for permission-changed signal!"); } ); } function afterPermissionChanged(type, op, callback) { // handle the message from specialPowers_framescript.js gScript.addMessageListener('perm-changed', function onChange(msg) { if (msg.type == type && msg.op == op) { gScript.removeMessageListener('perm-changed', onChange); callback(); } }); } function permissionPollingCheck() { var now = Number(Date.now()); if (now < (start + PERIOD)) { if (SpecialPowers.testPermission('pEXPIRE', ALLOW_ACTION, document)) { // To make sure that permission will be expired in next round, // the next permissionPollingCheck calling will be fired 100ms later after // permission is out-of-period. setTimeout(permissionPollingCheck, PERIOD + 100); return; } errorHandler('unexpired permission should be allowed!'); } // The permission is already expired! if (SpecialPowers.testPermission('pEXPIRE', ALLOW_ACTION, document)) { errorHandler('expired permission should be removed!'); } } function getPlatformInfo() { var version = SpecialPowers.Services.sysinfo.getProperty('version'); version = parseFloat(version); // PR_Now() that called in nsPermissionManager to get the system time and // Date.now() are out of sync on win32 platform(XP/win7). The PR_Now() is // 15~20ms less than Date.now(). Unfortunately, this time skew can't be // avoided, so it needs to add a time buffer to compensate. // Version 5.1 is win XP, 6.1 is win7 if (navigator.platform.startsWith('Win32') && (version <= 6.1)) { return { platform: "Win32", timeCompensation: -100 }; } return { platform: "NoMatter", timeCompensation: 0 }; } function errorHandler(msg) { ok(false, msg); SimpleTest.finish(); } </script> </pre> </body> </html>