test_ext_tabs_executeScript_bad.html (4163B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Tabs executeScript Bad Test</title> 6 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 7 <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script> 8 <script type="text/javascript" src="head.js"></script> 9 <link rel="stylesheet" href="/tests/SimpleTest/test.css"/> 10 </head> 11 <body> 12 13 <script type="text/javascript"> 14 "use strict"; 15 16 function* testHasNoPermission(params) { 17 const contentSetup = params.contentSetup || (() => Promise.resolve()); 18 19 async function background(contentSetup) { 20 browser.test.onMessage.addListener(async msg => { 21 browser.test.assertEq(msg, "execute-script"); 22 23 await browser.test.assertRejects(browser.tabs.executeScript({ 24 file: "script.js", 25 }), /Missing host permission for the tab/); 26 27 browser.test.notifyPass("executeScript"); 28 }); 29 30 await contentSetup(); 31 32 browser.test.sendMessage("ready"); 33 } 34 35 const extension = ExtensionTestUtils.loadExtension({ 36 manifest: params.manifest, 37 38 background: `(${background})(${contentSetup})`, 39 40 files: { 41 "script.js": function() { 42 browser.runtime.sendMessage("first script ran"); 43 }, 44 }, 45 }); 46 47 yield extension.startup(); 48 yield extension.awaitMessage("ready"); 49 50 if (params.setup) { 51 yield params.setup(extension); 52 } 53 54 extension.sendMessage("execute-script"); 55 56 yield extension.awaitFinish("executeScript"); 57 yield extension.unload(); 58 } 59 60 add_task(async function testBadPermissions() { 61 const win = window.open("http://mochi.test:8888/"); 62 63 await new Promise(resolve => setTimeout(resolve, 0)); 64 65 info("Test no special permissions"); 66 await testHasNoPermission({ 67 manifest: {"permissions": []}, 68 }); 69 70 info("Test tabs permissions"); 71 await testHasNoPermission({ 72 manifest: {"permissions": ["tabs"]}, 73 }); 74 75 win.close(); 76 }); 77 78 add_task(async function testBadURL() { 79 async function background() { 80 const promises = [ 81 new Promise(resolve => { 82 browser.tabs.executeScript({ 83 file: "http://example.com/script.js", 84 }, result => { 85 browser.test.assertEq(undefined, result, "Result value"); 86 87 browser.test.assertTrue(browser.runtime.lastError instanceof Error, 88 "runtime.lastError is Error"); 89 90 browser.test.assertTrue(browser.runtime.lastError instanceof Error, 91 "runtime.lastError is Error"); 92 93 browser.test.assertEq( 94 "Files to be injected must be within the extension", 95 browser.runtime.lastError && browser.runtime.lastError.message, 96 "runtime.lastError value"); 97 98 browser.test.assertEq( 99 "Files to be injected must be within the extension", 100 browser.runtime.lastError && browser.runtime.lastError.message, 101 "runtime.lastError value"); 102 103 resolve(); 104 }); 105 }), 106 107 browser.tabs.executeScript({ 108 file: "http://example.com/script.js", 109 }).catch(error => { 110 browser.test.assertTrue(error instanceof Error, "Error is Error"); 111 112 browser.test.assertEq(null, browser.runtime.lastError, 113 "runtime.lastError value"); 114 115 browser.test.assertEq(null, browser.runtime.lastError, 116 "runtime.lastError value"); 117 118 browser.test.assertEq( 119 "Files to be injected must be within the extension", 120 error && error.message, 121 "error value"); 122 }), 123 ]; 124 125 await Promise.all(promises); 126 127 browser.test.notifyPass("executeScript-lastError"); 128 } 129 130 const extension = ExtensionTestUtils.loadExtension({ 131 manifest: { 132 "permissions": ["<all_urls>"], 133 }, 134 135 background, 136 }); 137 138 await extension.startup(); 139 140 await extension.awaitFinish("executeScript-lastError"); 141 142 await extension.unload(); 143 }); 144 145 // TODO bug 1435100: Test that |executeScript| fails if the tab has navigated 146 // to a new page, and no longer matches our expected state. This involves 147 // intentionally trying to trigger a race condition. 148 </script> 149 150 </body> 151 </html>