Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/module_system.h" | 5 #include "chrome/renderer/module_system.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| 11 const char* kLazyObjectSource = "lazy_object_source"; | 11 const char* kModuleSystem = "module_system"; |
| 12 const char* kLazyObjectName = "lazy_object_name"; | 12 const char* kModuleName = "module_name"; |
| 13 const char* kLazyObject = "lazy_object"; | 13 const char* kModuleField = "module_field"; |
| 14 | |
| 15 v8::Handle<v8::Object> EvaluateLazySource(v8::Handle<v8::Object> object) { | |
| 16 v8::HandleScope handle_scope; | |
| 17 v8::Handle<v8::Value> source_value = | |
| 18 object->GetHiddenValue(v8::String::New(kLazyObjectSource)); | |
| 19 CHECK(!source_value.IsEmpty()); | |
| 20 v8::Handle<v8::String> source = v8::Handle<v8::String>::Cast(source_value); | |
| 21 v8::Handle<v8::Value> name = | |
| 22 object->GetHiddenValue(v8::String::New(kLazyObjectName)); | |
| 23 CHECK(!name.IsEmpty()); | |
| 24 CHECK(name->IsString()); | |
| 25 v8::Handle<v8::Script> script = v8::Script::New(source, name); | |
| 26 v8::Handle<v8::Value> result = script->Run(); | |
| 27 CHECK(result->IsObject()); | |
| 28 return handle_scope.Close(v8::Handle<v8::Object>::Cast(result)); | |
| 29 } | |
| 30 | |
| 31 v8::Handle<v8::Value> LazyObjectGetter( | |
| 32 const v8::Local<v8::String> property, | |
| 33 const v8::AccessorInfo& info) { | |
| 34 v8::HandleScope handle_scope; | |
| 35 v8::Handle<v8::Object> object = info.Holder(); | |
| 36 v8::Handle<v8::String> lazy_object_name = v8::String::New(kLazyObject); | |
| 37 v8::Handle<v8::Value> lazy_object_value = | |
| 38 object->GetHiddenValue(lazy_object_name); | |
| 39 CHECK(lazy_object_value.IsEmpty() || lazy_object_value->IsObject()); | |
| 40 v8::Handle<v8::Object> lazy_object = | |
| 41 v8::Handle<v8::Object>::Cast(lazy_object_value); | |
| 42 if (lazy_object.IsEmpty()) { | |
| 43 lazy_object = EvaluateLazySource(object); | |
| 44 object->SetHiddenValue(lazy_object_name, lazy_object); | |
| 45 } | |
| 46 return handle_scope.Close(lazy_object->Get(property)); | |
| 47 } | |
| 48 | 14 |
| 49 } // namespace | 15 } // namespace |
| 50 | 16 |
| 51 ModuleSystem::ModuleSystem(SourceMap* source_map) | 17 ModuleSystem::ModuleSystem(SourceMap* source_map) |
| 52 : source_map_(source_map), | 18 : source_map_(source_map), |
| 53 natives_enabled_(true) { | 19 natives_enabled_(true) { |
| 54 RouteFunction("require", | 20 RouteFunction("require", |
| 55 base::Bind(&ModuleSystem::RequireForJs, base::Unretained(this))); | 21 base::Bind(&ModuleSystem::RequireForJs, base::Unretained(this))); |
| 56 RouteFunction("requireNative", | 22 RouteFunction("requireNative", |
| 57 base::Bind(&ModuleSystem::GetNative, base::Unretained(this))); | 23 base::Bind(&ModuleSystem::GetNative, base::Unretained(this))); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 107 native_handler_map_[name] = | 73 native_handler_map_[name] = |
| 108 linked_ptr<NativeHandler>(native_handler.release()); | 74 linked_ptr<NativeHandler>(native_handler.release()); |
| 109 } | 75 } |
| 110 | 76 |
| 111 void ModuleSystem::RunString(const std::string& code, const std::string& name) { | 77 void ModuleSystem::RunString(const std::string& code, const std::string& name) { |
| 112 v8::HandleScope handle_scope; | 78 v8::HandleScope handle_scope; |
| 113 RunString(v8::String::New(code.c_str()), v8::String::New(name.c_str())); | 79 RunString(v8::String::New(code.c_str()), v8::String::New(name.c_str())); |
| 114 } | 80 } |
| 115 | 81 |
| 116 // static | 82 // static |
| 117 v8::Handle<v8::Object> ModuleSystem::CreateLazyObject( | 83 v8::Handle<v8::Value> ModuleSystem::GetterRouter( |
|
not at google - send to devlin
2012/03/22 00:35:53
RequireLazyField?
koz (OOO until 15th September)
2012/03/22 01:13:01
Yes, or even better - LazyFieldAccessor.
| |
| 118 const std::string& source_name, v8::Handle<v8::String> source) { | 84 v8::Local<v8::String> property, const v8::AccessorInfo& info) { |
| 85 CHECK(!info.Data().IsEmpty()); | |
| 86 CHECK(info.Data()->IsObject()); | |
| 119 v8::HandleScope handle_scope; | 87 v8::HandleScope handle_scope; |
| 120 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | 88 v8::Handle<v8::Object> parameters = v8::Handle<v8::Object>::Cast(info.Data()); |
| 121 object_template->SetNamedPropertyHandler(LazyObjectGetter, NULL); | 89 v8::Handle<v8::Value> module_system_value = |
| 122 v8::Handle<v8::Object> object = object_template->NewInstance(); | 90 parameters->Get(v8::String::New(kModuleSystem)); |
| 123 object->SetHiddenValue(v8::String::New(kLazyObjectSource), source); | 91 ModuleSystem* module_system = static_cast<ModuleSystem*>( |
| 124 object->SetHiddenValue(v8::String::New(kLazyObjectName), | 92 v8::Handle<v8::External>::Cast(module_system_value)->Value()); |
| 125 v8::String::New(source_name.c_str())); | |
| 126 | 93 |
| 127 return handle_scope.Close(object); | 94 v8::Handle<v8::Object> module = module_system->RequireForJsInner( |
| 95 parameters->Get(v8::String::New(kModuleName))->ToString())->ToObject(); | |
| 96 | |
| 97 v8::Handle<v8::String> field = | |
| 98 parameters->Get(v8::String::New(kModuleField))->ToString(); | |
| 99 | |
| 100 return handle_scope.Close(module->Get(field)); | |
| 101 } | |
| 102 | |
| 103 void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object, | |
| 104 const std::string& field, | |
| 105 const std::string& module_name, | |
| 106 const std::string& module_field) { | |
| 107 v8::HandleScope handle_scope; | |
| 108 v8::Handle<v8::Object> parameters = v8::Object::New(); | |
| 109 parameters->Set(v8::String::New(kModuleName), | |
| 110 v8::String::New(module_name.c_str())); | |
| 111 parameters->Set(v8::String::New(kModuleField), | |
| 112 v8::String::New(module_field.c_str())); | |
| 113 parameters->Set(v8::String::New(kModuleSystem), v8::External::New(this)); | |
| 114 | |
| 115 object->SetAccessor(v8::String::New(field.c_str()), | |
| 116 &ModuleSystem::GetterRouter, | |
| 117 NULL, | |
| 118 parameters); | |
| 128 } | 119 } |
| 129 | 120 |
| 130 v8::Handle<v8::Value> ModuleSystem::RunString(v8::Handle<v8::String> code, | 121 v8::Handle<v8::Value> ModuleSystem::RunString(v8::Handle<v8::String> code, |
| 131 v8::Handle<v8::String> name) { | 122 v8::Handle<v8::String> name) { |
| 132 v8::HandleScope handle_scope; | 123 v8::HandleScope handle_scope; |
| 133 return handle_scope.Close(v8::Script::New(code, name)->Run()); | 124 return handle_scope.Close(v8::Script::New(code, name)->Run()); |
| 134 } | 125 } |
| 135 | 126 |
| 136 v8::Handle<v8::Value> ModuleSystem::GetSource( | 127 v8::Handle<v8::Value> ModuleSystem::GetSource( |
| 137 v8::Handle<v8::String> source_name) { | 128 v8::Handle<v8::String> source_name) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 158 v8::Handle<v8::String> left = | 149 v8::Handle<v8::String> left = |
| 159 v8::String::New("(function(require, requireNative, exports) {"); | 150 v8::String::New("(function(require, requireNative, exports) {"); |
| 160 v8::Handle<v8::String> right = v8::String::New("\n})"); | 151 v8::Handle<v8::String> right = v8::String::New("\n})"); |
| 161 return handle_scope.Close( | 152 return handle_scope.Close( |
| 162 v8::String::Concat(left, v8::String::Concat(source, right))); | 153 v8::String::Concat(left, v8::String::Concat(source, right))); |
| 163 } | 154 } |
| 164 | 155 |
| 165 v8::Handle<v8::Value> ModuleSystem::ThrowException(const std::string& message) { | 156 v8::Handle<v8::Value> ModuleSystem::ThrowException(const std::string& message) { |
| 166 return v8::ThrowException(v8::String::New(message.c_str())); | 157 return v8::ThrowException(v8::String::New(message.c_str())); |
| 167 } | 158 } |
| OLD | NEW |