Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/renderer/extensions/safe_builtins.h" | 5 #include "chrome/renderer/extensions/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 "chrome/renderer/extensions/chrome_v8_context.h" | 10 #include "chrome/renderer/extensions/chrome_v8_context.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 52 " });\n" | 52 " });\n" |
| 53 "}\n" | 53 "}\n" |
| 54 "\n" | 54 "\n" |
| 55 "function getSafeBuiltin(builtin) {\n" | 55 "function getSafeBuiltin(builtin) {\n" |
| 56 " var safe = {};\n" | 56 " var safe = {};\n" |
| 57 " makeCallable(builtin, safe, true);\n" | 57 " makeCallable(builtin, safe, true);\n" |
| 58 " makeCallable(builtin.prototype, safe, false);\n" | 58 " makeCallable(builtin.prototype, safe, false);\n" |
| 59 " return safe;\n" | 59 " return safe;\n" |
| 60 "}\n" | 60 "}\n" |
| 61 "\n" | 61 "\n" |
| 62 "[Array, Function, Object].forEach(function(builtin) {\n" | 62 "[Array, Function, Object, RegExp, String].forEach(function(builtin) {\n" |
| 63 " Save(builtin.name, getSafeBuiltin(builtin));\n" | 63 " Save(builtin.name, getSafeBuiltin(builtin));\n" |
| 64 "});\n" | 64 "});\n" |
| 65 "}());\n"; | 65 "}());\n"; |
| 66 | 66 |
| 67 v8::Local<v8::String> MakeKey(const char* name) { | 67 v8::Local<v8::String> MakeKey(const char* name) { |
| 68 return v8::String::New( | 68 return v8::String::New( |
| 69 base::StringPrintf("%s::%s", kClassName, name).c_str()); | 69 base::StringPrintf("%s::%s", kClassName, name).c_str()); |
| 70 } | 70 } |
| 71 | 71 |
| 72 void SaveImpl(const char* name, | 72 void SaveImpl(const char* name, |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 94 return v8::FunctionTemplate::New(Apply); | 94 return v8::FunctionTemplate::New(Apply); |
| 95 if (name->Equals(v8::String::New("Save"))) | 95 if (name->Equals(v8::String::New("Save"))) |
| 96 return v8::FunctionTemplate::New(Save); | 96 return v8::FunctionTemplate::New(Save); |
| 97 NOTREACHED() << *v8::String::AsciiValue(name); | 97 NOTREACHED() << *v8::String::AsciiValue(name); |
| 98 return v8::Handle<v8::FunctionTemplate>(); | 98 return v8::Handle<v8::FunctionTemplate>(); |
| 99 } | 99 } |
| 100 | 100 |
| 101 static void Apply(const v8::FunctionCallbackInfo<v8::Value>& info) { | 101 static void Apply(const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 102 CHECK(info.Length() == 5 && | 102 CHECK(info.Length() == 5 && |
| 103 info[0]->IsFunction() && // function | 103 info[0]->IsFunction() && // function |
| 104 // info[1]->Object() // recv (will throw error not check) | 104 // info[1]->Object() // recv (will throw error not check) |
|
Jeffrey Yasskin
2013/06/20 23:33:04
Object() isn't correct anymore, so update this com
not at google - send to devlin
2013/06/21 00:01:44
Done.
| |
| 105 info[2]->IsObject() && // args | 105 info[2]->IsObject() && // args |
| 106 info[3]->IsInt32() && // first_arg_index | 106 info[3]->IsInt32() && // first_arg_index |
| 107 info[4]->IsInt32()); // args_length | 107 info[4]->IsInt32()); // args_length |
| 108 if (!info[1]->IsObject()) { | 108 v8::Local<v8::Function> function = info[0].As<v8::Function>(); |
| 109 v8::Local<v8::Object> recv; | |
| 110 if (info[1]->IsObject()) { | |
| 111 recv = info[1]->ToObject(); | |
| 112 } else if (info[1]->IsString()) { | |
| 113 recv = v8::StringObject::New(info[1]->ToString())->ToObject(); | |
|
Jeffrey Yasskin
2013/06/20 23:33:04
Why are you creating a new string here instead of
not at google - send to devlin
2013/06/21 00:01:44
No new string is being created, ToString() is just
| |
| 114 } else { | |
| 109 v8::ThrowException(v8::Exception::TypeError(v8::String::New( | 115 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 110 "The first argument is the receiver and must be an object"))); | 116 "The first argument is the receiver and must be an object"))); |
| 111 return; | 117 return; |
| 112 } | 118 } |
| 113 v8::Local<v8::Function> function = info[0].As<v8::Function>(); | |
| 114 v8::Local<v8::Object> recv = info[1]->ToObject(); | |
| 115 v8::Local<v8::Object> args = info[2]->ToObject(); | 119 v8::Local<v8::Object> args = info[2]->ToObject(); |
| 116 int first_arg_index = static_cast<int>(info[3]->ToInt32()->Value()); | 120 int first_arg_index = static_cast<int>(info[3]->ToInt32()->Value()); |
| 117 int args_length = static_cast<int>(info[4]->ToInt32()->Value()); | 121 int args_length = static_cast<int>(info[4]->ToInt32()->Value()); |
| 118 | 122 |
| 119 int argc = args_length - first_arg_index; | 123 int argc = args_length - first_arg_index; |
| 120 scoped_ptr<v8::Local<v8::Value>[]> argv(new v8::Local<v8::Value>[argc]); | 124 scoped_ptr<v8::Local<v8::Value>[]> argv(new v8::Local<v8::Value>[argc]); |
| 121 for (int i = 0; i < argc; ++i) { | 125 for (int i = 0; i < argc; ++i) { |
| 122 CHECK(args->Has(i + first_arg_index)); | 126 CHECK(args->Has(i + first_arg_index)); |
| 123 argv[i] = args->Get(i + first_arg_index); | 127 argv[i] = args->Get(i + first_arg_index); |
| 124 } | 128 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 154 } | 158 } |
| 155 | 159 |
| 156 v8::Local<v8::Object> SafeBuiltins::GetFunction() const { | 160 v8::Local<v8::Object> SafeBuiltins::GetFunction() const { |
| 157 return Load("Function", context_->v8_context()); | 161 return Load("Function", context_->v8_context()); |
| 158 } | 162 } |
| 159 | 163 |
| 160 v8::Local<v8::Object> SafeBuiltins::GetObjekt() const { | 164 v8::Local<v8::Object> SafeBuiltins::GetObjekt() const { |
| 161 return Load("Object", context_->v8_context()); | 165 return Load("Object", context_->v8_context()); |
| 162 } | 166 } |
| 163 | 167 |
| 168 v8::Local<v8::Object> SafeBuiltins::GetRegExp() const { | |
| 169 return Load("RegExp", context_->v8_context()); | |
| 170 } | |
| 171 | |
| 172 v8::Local<v8::Object> SafeBuiltins::GetString() const { | |
| 173 return Load("String", context_->v8_context()); | |
| 174 } | |
| 175 | |
| 164 } // namespace extensions | 176 } // namespace extensions |
| OLD | NEW |