| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 187 { | 187 { |
| 188 if (foo != expected) | 188 if (foo != expected) |
| 189 throw new Error("Value mismatch"); | 189 throw new Error("Value mismatch"); |
| 190 }; | 190 }; |
| 191 ` | 191 ` |
| 192 ]; | 192 ]; |
| 193 | 193 |
| 194 let template = ` | 194 let template = ` |
| 195 "use strict"; | 195 "use strict"; |
| 196 { | 196 { |
| 197 let globals = {}; | |
|
Manish Jethani
2018/07/31 14:17:08
This is copied and pasted from lib/snippets.js (it
| |
| 198 | |
| 199 for (let name of typeof window != "undefined" ? Object.keys(window) : []) | |
| 200 globals[name] = null; | |
| 201 | |
| 202 for (let name of typeof global != "undefined" ? Object.keys(global) : []) | |
| 203 globals[name] = null; | |
| 204 | |
| 205 if (typeof browser != "undefined") | |
| 206 { | |
| 207 globals.browser = { | |
| 208 runtime: { | |
| 209 getURL: browser.runtime.getURL | |
| 210 } | |
| 211 }; | |
| 212 } | |
| 213 | |
| 214 if (typeof document != "undefined") | |
| 215 { | |
| 216 globals.document = new Proxy(document, { | |
| 217 get(target, property) | |
| 218 { | |
| 219 if (property == "defaultView") | |
| 220 return null; | |
| 221 | |
| 222 let value = target[property]; | |
| 223 if (typeof value == "function") | |
| 224 return value.bind(target); | |
| 225 | |
| 226 return value; | |
| 227 } | |
| 228 }); | |
| 229 } | |
| 230 | |
| 197 const libraries = ${JSON.stringify(libraries)}; | 231 const libraries = ${JSON.stringify(libraries)}; |
| 198 | 232 |
| 199 const script = {{{script}}}; | 233 const script = {{{script}}}; |
| 200 | 234 |
| 201 let imports = Object.create(null); | 235 let imports = Object.create(null); |
| 202 for (let library of libraries) | 236 for (let library of libraries) |
| 203 new Function("exports", library)(imports); | 237 { |
| 238 let func = new Function("exports", ...Object.keys(globals), library); | |
| 239 func(imports, ...Object.keys(globals).map(key => globals[key])); | |
| 240 } | |
| 204 | 241 |
| 205 for (let [name, ...args] of script) | 242 for (let [name, ...args] of script) |
| 206 { | 243 { |
| 207 if (Object.prototype.hasOwnProperty.call(imports, name)) | 244 if (Object.prototype.hasOwnProperty.call(imports, name)) |
| 208 { | 245 { |
| 209 let value = imports[name]; | 246 let value = imports[name]; |
| 210 if (typeof value == "function") | 247 if (typeof value == "function") |
| 211 value(...args); | 248 value(...args); |
| 212 } | 249 } |
| 213 } | 250 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 232 // couple of things to note here: (1) each library has its own variables; | 269 // couple of things to note here: (1) each library has its own variables; |
| 233 // (2) script execution is stateless, i.e. the values are not retained | 270 // (2) script execution is stateless, i.e. the values are not retained |
| 234 // between executions. In the example below, assertFoo does not find 456 but | 271 // between executions. In the example below, assertFoo does not find 456 but |
| 235 // it doesn't find 123 either. It's the initial value 0. | 272 // it doesn't find 123 either. It's the initial value 0. |
| 236 new Function( | 273 new Function( |
| 237 compileScript("setFoo 456; assertFoo 0", [ | 274 compileScript("setFoo 456; assertFoo 0", [ |
| 238 ...libraries, "let foo = 1; exports.setFoo = value => { foo = value; };" | 275 ...libraries, "let foo = 1; exports.setFoo = value => { foo = value; };" |
| 239 ]) | 276 ]) |
| 240 )(); | 277 )(); |
| 241 | 278 |
| 279 // Test sandboxing. | |
|
Manish Jethani
2018/07/31 14:17:08
This is where we test the sandboxing. The process
| |
| 280 test.throws( | |
| 281 new Function( | |
| 282 compileScript("do-evil", [ | |
| 283 // The global process object is shadowed to null so this snippet throws | |
| 284 // an error. | |
| 285 "exports['do-evil'] = function() { process.pid; };" | |
| 286 ]) | |
| 287 ), | |
| 288 TypeError, | |
| 289 "Cannot read property 'pid' of null" | |
| 290 ); | |
| 291 | |
| 242 test.done(); | 292 test.done(); |
| 243 }; | 293 }; |
| OLD | NEW |