| 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" | |
| 10 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 11 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 12 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 13 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
| 14 #include "content/public/renderer/render_frame.h" | 13 #include "content/public/renderer/render_frame.h" |
| 15 #include "content/public/renderer/render_view.h" | 14 #include "content/public/renderer/render_view.h" |
| 16 #include "extensions/common/extension.h" | 15 #include "extensions/common/extension.h" |
| 17 #include "extensions/common/extensions_client.h" | 16 #include "extensions/common/extensions_client.h" |
| 18 #include "extensions/renderer/console.h" | 17 #include "extensions/renderer/console.h" |
| 19 #include "extensions/renderer/safe_builtins.h" | 18 #include "extensions/renderer/safe_builtins.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 global->SetHiddenValue(v8::String::NewFromUtf8(isolate, kModuleSystem), | 144 global->SetHiddenValue(v8::String::NewFromUtf8(isolate, kModuleSystem), |
| 146 v8::External::New(isolate, this)); | 145 v8::External::New(isolate, this)); |
| 147 | 146 |
| 148 gin::ModuleRegistry::From(context->v8_context())->AddObserver(this); | 147 gin::ModuleRegistry::From(context->v8_context())->AddObserver(this); |
| 149 if (context_->GetRenderFrame()) { | 148 if (context_->GetRenderFrame()) { |
| 150 context_->GetRenderFrame()->EnsureMojoBuiltinsAreAvailable( | 149 context_->GetRenderFrame()->EnsureMojoBuiltinsAreAvailable( |
| 151 context->isolate(), context->v8_context()); | 150 context->isolate(), context->v8_context()); |
| 152 } | 151 } |
| 153 } | 152 } |
| 154 | 153 |
| 155 ModuleSystem::~ModuleSystem() { | 154 ModuleSystem::~ModuleSystem() { Invalidate(); } |
| 156 } | |
| 157 | 155 |
| 158 void ModuleSystem::Invalidate() { | 156 void ModuleSystem::Invalidate() { |
| 157 if (!is_valid()) |
| 158 return; |
| 159 |
| 159 // Clear the module system properties from the global context. It's polite, | 160 // Clear the module system properties from the global context. It's polite, |
| 160 // and we use this as a signal in lazy handlers that we no longer exist. | 161 // and we use this as a signal in lazy handlers that we no longer exist. |
| 161 { | 162 { |
| 162 v8::HandleScope scope(GetIsolate()); | 163 v8::HandleScope scope(GetIsolate()); |
| 163 v8::Handle<v8::Object> global = context()->v8_context()->Global(); | 164 v8::Handle<v8::Object> global = context()->v8_context()->Global(); |
| 164 global->DeleteHiddenValue( | 165 global->DeleteHiddenValue( |
| 165 v8::String::NewFromUtf8(GetIsolate(), kModulesField)); | 166 v8::String::NewFromUtf8(GetIsolate(), kModulesField)); |
| 166 global->DeleteHiddenValue( | 167 global->DeleteHiddenValue( |
| 167 v8::String::NewFromUtf8(GetIsolate(), kModuleSystem)); | 168 v8::String::NewFromUtf8(GetIsolate(), kModuleSystem)); |
| 168 } | 169 } |
| 169 | 170 |
| 170 // Invalidate all active and clobbered NativeHandlers we own. | 171 // Invalidate all of the successfully required handlers we own. |
| 171 for (const auto& handler : native_handler_map_) | 172 for (NativeHandlerMap::iterator it = native_handler_map_.begin(); |
| 172 handler.second->Invalidate(); | 173 it != native_handler_map_.end(); |
| 173 for (const auto& clobbered_handler : clobbered_native_handlers_) | 174 ++it) { |
| 174 clobbered_handler->Invalidate(); | 175 it->second->Invalidate(); |
| 176 } |
| 175 | 177 |
| 176 ObjectBackedNativeHandler::Invalidate(); | 178 ObjectBackedNativeHandler::Invalidate(); |
| 177 } | 179 } |
| 178 | 180 |
| 179 ModuleSystem::NativesEnabledScope::NativesEnabledScope( | 181 ModuleSystem::NativesEnabledScope::NativesEnabledScope( |
| 180 ModuleSystem* module_system) | 182 ModuleSystem* module_system) |
| 181 : module_system_(module_system) { | 183 : module_system_(module_system) { |
| 182 module_system_->natives_enabled_++; | 184 module_system_->natives_enabled_++; |
| 183 } | 185 } |
| 184 | 186 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 result = context_->CallFunction(func, argc, argv); | 294 result = context_->CallFunction(func, argc, argv); |
| 293 if (try_catch.HasCaught()) | 295 if (try_catch.HasCaught()) |
| 294 HandleException(try_catch); | 296 HandleException(try_catch); |
| 295 } | 297 } |
| 296 return handle_scope.Escape(result); | 298 return handle_scope.Escape(result); |
| 297 } | 299 } |
| 298 | 300 |
| 299 void ModuleSystem::RegisterNativeHandler( | 301 void ModuleSystem::RegisterNativeHandler( |
| 300 const std::string& name, | 302 const std::string& name, |
| 301 scoped_ptr<NativeHandler> native_handler) { | 303 scoped_ptr<NativeHandler> native_handler) { |
| 302 ClobberExistingNativeHandler(name); | |
| 303 native_handler_map_[name] = | 304 native_handler_map_[name] = |
| 304 linked_ptr<NativeHandler>(native_handler.release()); | 305 linked_ptr<NativeHandler>(native_handler.release()); |
| 305 } | 306 } |
| 306 | 307 |
| 307 void ModuleSystem::OverrideNativeHandlerForTest(const std::string& name) { | 308 void ModuleSystem::OverrideNativeHandlerForTest(const std::string& name) { |
| 308 ClobberExistingNativeHandler(name); | |
| 309 overridden_native_handlers_.insert(name); | 309 overridden_native_handlers_.insert(name); |
| 310 } | 310 } |
| 311 | 311 |
| 312 void ModuleSystem::RunString(const std::string& code, const std::string& name) { | 312 void ModuleSystem::RunString(const std::string& code, const std::string& name) { |
| 313 v8::HandleScope handle_scope(GetIsolate()); | 313 v8::HandleScope handle_scope(GetIsolate()); |
| 314 RunString(v8::String::NewFromUtf8(GetIsolate(), code.c_str()), | 314 RunString(v8::String::NewFromUtf8(GetIsolate(), code.c_str()), |
| 315 v8::String::NewFromUtf8(GetIsolate(), name.c_str())); | 315 v8::String::NewFromUtf8(GetIsolate(), name.c_str())); |
| 316 } | 316 } |
| 317 | 317 |
| 318 // static | 318 // static |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 scoped_ptr<v8::Global<v8::Promise::Resolver>> resolver, | 678 scoped_ptr<v8::Global<v8::Promise::Resolver>> resolver, |
| 679 v8::Handle<v8::Value> value) { | 679 v8::Handle<v8::Value> value) { |
| 680 if (!is_valid()) | 680 if (!is_valid()) |
| 681 return; | 681 return; |
| 682 v8::HandleScope handle_scope(GetIsolate()); | 682 v8::HandleScope handle_scope(GetIsolate()); |
| 683 v8::Handle<v8::Promise::Resolver> resolver_local( | 683 v8::Handle<v8::Promise::Resolver> resolver_local( |
| 684 v8::Local<v8::Promise::Resolver>::New(GetIsolate(), *resolver)); | 684 v8::Local<v8::Promise::Resolver>::New(GetIsolate(), *resolver)); |
| 685 resolver_local->Resolve(value); | 685 resolver_local->Resolve(value); |
| 686 } | 686 } |
| 687 | 687 |
| 688 void ModuleSystem::ClobberExistingNativeHandler(const std::string& name) { | |
| 689 NativeHandlerMap::iterator existing_handler = native_handler_map_.find(name); | |
| 690 if (existing_handler != native_handler_map_.end()) { | |
| 691 clobbered_native_handlers_.push_back(existing_handler->second); | |
| 692 native_handler_map_.erase(existing_handler); | |
| 693 } | |
| 694 } | |
| 695 | |
| 696 } // namespace extensions | 688 } // namespace extensions |
| OLD | NEW |