| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/renderer/safe_builtins.h" | 5 #include "extensions/renderer/safe_builtins.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "extensions/renderer/script_context.h" | 10 #include "extensions/renderer/script_context.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 "\n" | 34 "\n" |
| 35 "// Used in the callback implementation, could potentially be clobbered.\n" | 35 "// Used in the callback implementation, could potentially be clobbered.\n" |
| 36 "function makeCallable(obj, target, isStatic, propertyNames) {\n" | 36 "function makeCallable(obj, target, isStatic, propertyNames) {\n" |
| 37 " propertyNames.forEach(function(propertyName) {\n" | 37 " propertyNames.forEach(function(propertyName) {\n" |
| 38 " var property = obj[propertyName];\n" | 38 " var property = obj[propertyName];\n" |
| 39 " target[propertyName] = function() {\n" | 39 " target[propertyName] = function() {\n" |
| 40 " var recv = obj;\n" | 40 " var recv = obj;\n" |
| 41 " var firstArgIndex = 0;\n" | 41 " var firstArgIndex = 0;\n" |
| 42 " if (!isStatic) {\n" | 42 " if (!isStatic) {\n" |
| 43 " if (arguments.length == 0)\n" | 43 " if (arguments.length == 0)\n" |
| 44 " throw 'There must be at least one argument, the recevier';\n" | 44 " throw 'There must be at least one argument, the receiver';\n" |
| 45 " recv = arguments[0];\n" | 45 " recv = arguments[0];\n" |
| 46 " firstArgIndex = 1;\n" | 46 " firstArgIndex = 1;\n" |
| 47 " }\n" | 47 " }\n" |
| 48 " return Apply(\n" | 48 " return Apply(\n" |
| 49 " property, recv, arguments, firstArgIndex, arguments.length);\n" | 49 " property, recv, arguments, firstArgIndex, arguments.length);\n" |
| 50 " };\n" | 50 " };\n" |
| 51 " });\n" | 51 " });\n" |
| 52 "}\n" | 52 "}\n" |
| 53 "\n" | 53 "\n" |
| 54 "function saveBuiltin(builtin, protoPropertyNames, staticPropertyNames) {\n" | 54 "function saveBuiltin(builtin, protoPropertyNames, staticPropertyNames) {\n" |
| 55 " var safe = function() {\n" | 55 " var safe = function() {\n" |
| 56 " throw 'Safe objects cannot be called nor constructed. ' +\n" | 56 " throw 'Safe objects cannot be called nor constructed. ' +\n" |
| 57 " 'Use $Foo.self() or new $Foo.self() instead.';\n" | 57 " 'Use $Foo.self() or new $Foo.self() instead.';\n" |
| 58 " };\n" | 58 " };\n" |
| 59 " safe.self = builtin;\n" | 59 " safe.self = builtin;\n" |
| 60 " makeCallable(builtin.prototype, safe, false, protoPropertyNames);\n" | 60 " makeCallable(builtin.prototype, safe, false, protoPropertyNames);\n" |
| 61 " if (staticPropertyNames)\n" | 61 " if (staticPropertyNames)\n" |
| 62 " makeCallable(builtin, safe, true, staticPropertyNames);\n" | 62 " makeCallable(builtin, safe, true, staticPropertyNames);\n" |
| 63 " Save(builtin.name, safe);\n" | 63 " Save(builtin.name, safe);\n" |
| 64 "}\n" | 64 "}\n" |
| 65 "\n" | 65 "\n" |
| 66 "// Save only what is needed to make tests that override builtins pass.\n" | 66 "// Save only what is needed by the extension modules.\n" |
| 67 "saveBuiltin(Object,\n" | 67 "saveBuiltin(Object,\n" |
| 68 " ['hasOwnProperty'],\n" | 68 " ['hasOwnProperty'],\n" |
| 69 " ['create', 'defineProperty', 'getOwnPropertyDescriptor',\n" | 69 " ['create', 'defineProperty', 'getOwnPropertyDescriptor',\n" |
| 70 " 'getPrototypeOf', 'keys']);\n" | 70 " 'getPrototypeOf', 'keys']);\n" |
| 71 "saveBuiltin(Function,\n" | 71 "saveBuiltin(Function,\n" |
| 72 " ['apply', 'bind', 'call']);\n" | 72 " ['apply', 'bind', 'call']);\n" |
| 73 "saveBuiltin(Array,\n" | 73 "saveBuiltin(Array,\n" |
| 74 " ['concat', 'forEach', 'indexOf', 'join', 'push', 'slice',\n" | 74 " ['concat', 'forEach', 'indexOf', 'join', 'push', 'slice',\n" |
| 75 " 'splice', 'map', 'filter']);\n" | 75 " 'splice', 'map', 'filter']);\n" |
| 76 "saveBuiltin(String,\n" | 76 "saveBuiltin(String,\n" |
| 77 " ['slice', 'split']);\n" | 77 " ['indexOf', 'slice', 'split']);\n" |
| 78 "saveBuiltin(RegExp,\n" | 78 "saveBuiltin(RegExp,\n" |
| 79 " ['test']);\n" | 79 " ['test']);\n" |
| 80 "saveBuiltin(Error,\n" |
| 81 " [],\n" |
| 82 " ['captureStackTrace']);\n" |
| 80 "\n" | 83 "\n" |
| 81 "// JSON is trickier because extensions can override toJSON in\n" | 84 "// JSON is trickier because extensions can override toJSON in\n" |
| 82 "// incompatible ways, and we need to prevent that.\n" | 85 "// incompatible ways, and we need to prevent that.\n" |
| 83 "var builtinTypes = [\n" | 86 "var builtinTypes = [\n" |
| 84 " Object, Function, Array, String, Boolean, Number, Date, RegExp\n" | 87 " Object, Function, Array, String, Boolean, Number, Date, RegExp\n" |
| 85 "];\n" | 88 "];\n" |
| 86 "var builtinToJSONs = builtinTypes.map(function(t) {\n" | 89 "var builtinToJSONs = builtinTypes.map(function(t) {\n" |
| 87 " return t.toJSON;\n" | 90 " return t.toJSON;\n" |
| 88 "});\n" | 91 "});\n" |
| 89 "var builtinArray = Array;\n" | 92 "var builtinArray = Array;\n" |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 } | 226 } |
| 224 | 227 |
| 225 v8::Local<v8::Object> SafeBuiltins::GetRegExp() const { | 228 v8::Local<v8::Object> SafeBuiltins::GetRegExp() const { |
| 226 return Load("RegExp", context_->v8_context()); | 229 return Load("RegExp", context_->v8_context()); |
| 227 } | 230 } |
| 228 | 231 |
| 229 v8::Local<v8::Object> SafeBuiltins::GetString() const { | 232 v8::Local<v8::Object> SafeBuiltins::GetString() const { |
| 230 return Load("String", context_->v8_context()); | 233 return Load("String", context_->v8_context()); |
| 231 } | 234 } |
| 232 | 235 |
| 236 v8::Local<v8::Object> SafeBuiltins::GetError() const { |
| 237 return Load("Error", context_->v8_context()); |
| 238 } |
| 239 |
| 233 } // namespace extensions | 240 } // namespace extensions |
| OLD | NEW |