| Index: test/snippets.js | 
| =================================================================== | 
| --- a/test/snippets.js | 
| +++ b/test/snippets.js | 
| @@ -189,23 +189,60 @@ | 
| throw new Error("Value mismatch"); | 
| }; | 
| ` | 
| ]; | 
| let template = ` | 
| "use strict"; | 
| { | 
| + let globals = {}; | 
| 
 
Manish Jethani
2018/07/31 14:17:08
This is copied and pasted from lib/snippets.js (it
 
 | 
| + | 
| + for (let name of typeof window != "undefined" ? Object.keys(window) : []) | 
| + globals[name] = null; | 
| + | 
| + for (let name of typeof global != "undefined" ? Object.keys(global) : []) | 
| + globals[name] = null; | 
| + | 
| + if (typeof browser != "undefined") | 
| + { | 
| + globals.browser = { | 
| + runtime: { | 
| + getURL: browser.runtime.getURL | 
| + } | 
| + }; | 
| + } | 
| + | 
| + if (typeof document != "undefined") | 
| + { | 
| + globals.document = new Proxy(document, { | 
| + get(target, property) | 
| + { | 
| + if (property == "defaultView") | 
| + return null; | 
| + | 
| + let value = target[property]; | 
| + if (typeof value == "function") | 
| + return value.bind(target); | 
| + | 
| + return value; | 
| + } | 
| + }); | 
| + } | 
| + | 
| const libraries = ${JSON.stringify(libraries)}; | 
| const script = {{{script}}}; | 
| let imports = Object.create(null); | 
| for (let library of libraries) | 
| - new Function("exports", library)(imports); | 
| + { | 
| + let func = new Function("exports", ...Object.keys(globals), library); | 
| + func(imports, ...Object.keys(globals).map(key => globals[key])); | 
| + } | 
| for (let [name, ...args] of script) | 
| { | 
| if (Object.prototype.hasOwnProperty.call(imports, name)) | 
| { | 
| let value = imports[name]; | 
| if (typeof value == "function") | 
| value(...args); | 
| @@ -234,10 +271,23 @@ | 
| // between executions. In the example below, assertFoo does not find 456 but | 
| // it doesn't find 123 either. It's the initial value 0. | 
| new Function( | 
| compileScript("setFoo 456; assertFoo 0", [ | 
| ...libraries, "let foo = 1; exports.setFoo = value => { foo = value; };" | 
| ]) | 
| )(); | 
| + // Test sandboxing. | 
| 
 
Manish Jethani
2018/07/31 14:17:08
This is where we test the sandboxing. The process
 
 | 
| + test.throws( | 
| + new Function( | 
| + compileScript("do-evil", [ | 
| + // The global process object is shadowed to null so this snippet throws | 
| + // an error. | 
| + "exports['do-evil'] = function() { process.pid; };" | 
| + ]) | 
| + ), | 
| + TypeError, | 
| + "Cannot read property 'pid' of null" | 
| + ); | 
| + | 
| test.done(); | 
| }; |