Chromium Code Reviews| 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/module_system.h" | 5 #include "extensions/renderer/module_system.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 188 | 188 |
| 189 ModuleSystem::NativesEnabledScope::~NativesEnabledScope() { | 189 ModuleSystem::NativesEnabledScope::~NativesEnabledScope() { |
| 190 module_system_->natives_enabled_--; | 190 module_system_->natives_enabled_--; |
| 191 CHECK_GE(module_system_->natives_enabled_, 0); | 191 CHECK_GE(module_system_->natives_enabled_, 0); |
| 192 } | 192 } |
| 193 | 193 |
| 194 void ModuleSystem::HandleException(const v8::TryCatch& try_catch) { | 194 void ModuleSystem::HandleException(const v8::TryCatch& try_catch) { |
| 195 exception_handler_->HandleUncaughtException(try_catch); | 195 exception_handler_->HandleUncaughtException(try_catch); |
| 196 } | 196 } |
| 197 | 197 |
| 198 v8::Local<v8::Value> ModuleSystem::Require(const std::string& module_name) { | 198 v8::MaybeLocal<v8::Object> ModuleSystem::Require( |
| 199 if (module_name.size() >= v8::String::kMaxLength) | 199 const std::string& module_name) { |
| 200 return v8::Undefined(GetIsolate()); | 200 v8::Local<v8::String> v8_module_name; |
| 201 if (!ToV8String(GetIsolate(), module_name, &v8_module_name)) | |
| 202 return v8::MaybeLocal<v8::Object>(); | |
| 201 v8::EscapableHandleScope handle_scope(GetIsolate()); | 203 v8::EscapableHandleScope handle_scope(GetIsolate()); |
| 202 return handle_scope.Escape(RequireForJsInner( | 204 v8::Local<v8::Value> value = RequireForJsInner( |
| 203 ToV8StringUnsafe(GetIsolate(), module_name.c_str()))); | 205 v8_module_name); |
|
not at google - send to devlin
2015/06/24 16:43:03
This should fit on 1 line; run "git cl format" bef
| |
| 206 if (value.IsEmpty() || !value->IsObject()) | |
| 207 return v8::MaybeLocal<v8::Object>(); | |
| 208 return handle_scope.Escape(value.As<v8::Object>()); | |
| 204 } | 209 } |
| 205 | 210 |
| 206 void ModuleSystem::RequireForJs( | 211 void ModuleSystem::RequireForJs( |
| 207 const v8::FunctionCallbackInfo<v8::Value>& args) { | 212 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 208 if (!args[0]->IsString()) { | 213 if (!args[0]->IsString()) { |
| 209 NOTREACHED() << "require() called with a non-string argument"; | 214 NOTREACHED() << "require() called with a non-string argument"; |
| 210 return; | 215 return; |
| 211 } | 216 } |
| 212 v8::Local<v8::String> module_name = args[0].As<v8::String>(); | 217 v8::Local<v8::String> module_name = args[0].As<v8::String>(); |
| 213 args.GetReturnValue().Set(RequireForJsInner(module_name)); | 218 args.GetReturnValue().Set(RequireForJsInner(module_name)); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 return; | 392 return; |
| 388 } | 393 } |
| 389 std::string name = *v8::String::Utf8Value(v8_module_name); | 394 std::string name = *v8::String::Utf8Value(v8_module_name); |
| 390 | 395 |
| 391 // Switch to our v8 context because we need functions created while running | 396 // Switch to our v8 context because we need functions created while running |
| 392 // the require()d module to belong to our context, not the current one. | 397 // the require()d module to belong to our context, not the current one. |
| 393 v8::Context::Scope context_scope(context); | 398 v8::Context::Scope context_scope(context); |
| 394 NativesEnabledScope natives_enabled_scope(module_system); | 399 NativesEnabledScope natives_enabled_scope(module_system); |
| 395 | 400 |
| 396 v8::TryCatch try_catch(info.GetIsolate()); | 401 v8::TryCatch try_catch(info.GetIsolate()); |
| 397 v8::Local<v8::Value> module_value = (module_system->*require_function)(name); | 402 v8::Local<v8::Value> module_value; |
| 398 if (try_catch.HasCaught()) { | 403 if (!(module_system->*require_function)(name).ToLocal(&module_value)) { |
| 399 module_system->HandleException(try_catch); | 404 module_system->HandleException(try_catch); |
| 400 return; | 405 return; |
| 401 } | 406 } |
| 402 if (module_value.IsEmpty() || !module_value->IsObject()) { | |
| 403 // require_function will have already logged this, we don't need to. | |
| 404 return; | |
| 405 } | |
| 406 | 407 |
| 407 v8::Local<v8::Object> module = v8::Local<v8::Object>::Cast(module_value); | 408 v8::Local<v8::Object> module = v8::Local<v8::Object>::Cast(module_value); |
| 408 v8::Local<v8::Value> field_value; | 409 v8::Local<v8::Value> field_value; |
| 409 if (!GetProperty(context, parameters, kModuleField, &field_value)) { | 410 if (!GetProperty(context, parameters, kModuleField, &field_value)) { |
| 410 module_system->HandleException(try_catch); | 411 module_system->HandleException(try_catch); |
| 411 return; | 412 return; |
| 412 } | 413 } |
| 413 v8::Local<v8::String> field; | 414 v8::Local<v8::String> field; |
| 414 if (!field_value->ToString(context).ToLocal(&field)) { | 415 if (!field_value->ToString(context).ToLocal(&field)) { |
| 415 module_system->HandleException(try_catch); | 416 module_system->HandleException(try_catch); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 528 if (!source_map_->Contains(module_name)) | 529 if (!source_map_->Contains(module_name)) |
| 529 return v8::Undefined(GetIsolate()); | 530 return v8::Undefined(GetIsolate()); |
| 530 return handle_scope.Escape( | 531 return handle_scope.Escape( |
| 531 v8::Local<v8::Value>(source_map_->GetSource(GetIsolate(), module_name))); | 532 v8::Local<v8::Value>(source_map_->GetSource(GetIsolate(), module_name))); |
| 532 } | 533 } |
| 533 | 534 |
| 534 void ModuleSystem::RequireNative( | 535 void ModuleSystem::RequireNative( |
| 535 const v8::FunctionCallbackInfo<v8::Value>& args) { | 536 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 536 CHECK_EQ(1, args.Length()); | 537 CHECK_EQ(1, args.Length()); |
| 537 std::string native_name = *v8::String::Utf8Value(args[0]); | 538 std::string native_name = *v8::String::Utf8Value(args[0]); |
| 538 args.GetReturnValue().Set(RequireNativeFromString(native_name)); | 539 v8::Local<v8::Object> object; |
| 540 if (RequireNativeFromString(native_name).ToLocal(&object)) | |
| 541 args.GetReturnValue().Set(object); | |
| 539 } | 542 } |
| 540 | 543 |
| 541 v8::Local<v8::Value> ModuleSystem::RequireNativeFromString( | 544 v8::MaybeLocal<v8::Object> ModuleSystem::RequireNativeFromString( |
| 542 const std::string& native_name) { | 545 const std::string& native_name) { |
| 543 if (natives_enabled_ == 0) { | 546 if (natives_enabled_ == 0) { |
| 544 // HACK: if in test throw exception so that we can test the natives-disabled | 547 // HACK: if in test throw exception so that we can test the natives-disabled |
| 545 // logic; however, under normal circumstances, this is programmer error so | 548 // logic; however, under normal circumstances, this is programmer error so |
| 546 // we could crash. | 549 // we could crash. |
| 547 if (exception_handler_) { | 550 if (exception_handler_) { |
| 548 return GetIsolate()->ThrowException( | 551 GetIsolate()->ThrowException( |
| 549 ToV8StringUnsafe(GetIsolate(), "Natives disabled")); | 552 ToV8StringUnsafe(GetIsolate(), "Natives disabled")); |
| 553 return v8::MaybeLocal<v8::Object>(); | |
| 550 } | 554 } |
| 551 Fatal(context_, "Natives disabled for requireNative(" + native_name + ")"); | 555 Fatal(context_, "Natives disabled for requireNative(" + native_name + ")"); |
| 552 return v8::Undefined(GetIsolate()); | 556 return v8::MaybeLocal<v8::Object>(); |
| 553 } | 557 } |
| 554 | 558 |
| 555 if (overridden_native_handlers_.count(native_name) > 0u) { | 559 if (overridden_native_handlers_.count(native_name) > 0u) { |
| 556 return RequireForJsInner( | 560 v8::Local<v8::Value> value = RequireForJsInner( |
| 557 ToV8StringUnsafe(GetIsolate(), native_name.c_str())); | 561 ToV8StringUnsafe(GetIsolate(), native_name.c_str())); |
| 562 if (value.IsEmpty() || !value->IsObject()) | |
| 563 return v8::MaybeLocal<v8::Object>(); | |
|
not at google - send to devlin
2015/06/24 16:43:03
This should probably be a DCHECK since the code is
| |
| 564 return value.As<v8::Object>(); | |
| 558 } | 565 } |
| 559 | 566 |
| 560 NativeHandlerMap::iterator i = native_handler_map_.find(native_name); | 567 NativeHandlerMap::iterator i = native_handler_map_.find(native_name); |
| 561 if (i == native_handler_map_.end()) { | 568 if (i == native_handler_map_.end()) { |
| 562 Fatal(context_, | 569 Fatal(context_, |
| 563 "Couldn't find native for requireNative(" + native_name + ")"); | 570 "Couldn't find native for requireNative(" + native_name + ")"); |
| 564 return v8::Undefined(GetIsolate()); | 571 return v8::MaybeLocal<v8::Object>(); |
| 565 } | 572 } |
| 566 return i->second->NewInstance(); | 573 return i->second->NewInstance(); |
| 567 } | 574 } |
| 568 | 575 |
| 569 void ModuleSystem::RequireAsync( | 576 void ModuleSystem::RequireAsync( |
| 570 const v8::FunctionCallbackInfo<v8::Value>& args) { | 577 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 571 CHECK_EQ(1, args.Length()); | 578 CHECK_EQ(1, args.Length()); |
| 572 std::string module_name = *v8::String::Utf8Value(args[0]); | 579 std::string module_name = *v8::String::Utf8Value(args[0]); |
| 573 v8::Local<v8::Context> v8_context = context_->v8_context(); | 580 v8::Local<v8::Context> v8_context = context_->v8_context(); |
| 574 v8::Local<v8::Promise::Resolver> resolver( | 581 v8::Local<v8::Promise::Resolver> resolver( |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 738 | 745 |
| 739 void ModuleSystem::ClobberExistingNativeHandler(const std::string& name) { | 746 void ModuleSystem::ClobberExistingNativeHandler(const std::string& name) { |
| 740 NativeHandlerMap::iterator existing_handler = native_handler_map_.find(name); | 747 NativeHandlerMap::iterator existing_handler = native_handler_map_.find(name); |
| 741 if (existing_handler != native_handler_map_.end()) { | 748 if (existing_handler != native_handler_map_.end()) { |
| 742 clobbered_native_handlers_.push_back(existing_handler->second); | 749 clobbered_native_handlers_.push_back(existing_handler->second); |
| 743 native_handler_map_.erase(existing_handler); | 750 native_handler_map_.erase(existing_handler); |
| 744 } | 751 } |
| 745 } | 752 } |
| 746 | 753 |
| 747 } // namespace extensions | 754 } // namespace extensions |
| OLD | NEW |