| Index: chrome/renderer/module_system.cc
|
| diff --git a/chrome/renderer/module_system.cc b/chrome/renderer/module_system.cc
|
| deleted file mode 100644
|
| index 43a57472620091f3da36bb71fd59e230c160dac6..0000000000000000000000000000000000000000
|
| --- a/chrome/renderer/module_system.cc
|
| +++ /dev/null
|
| @@ -1,267 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/renderer/module_system.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScopedMicrotaskSuppression.h"
|
| -
|
| -namespace {
|
| -
|
| -const char* kModuleSystem = "module_system";
|
| -const char* kModuleName = "module_name";
|
| -const char* kModuleField = "module_field";
|
| -const char* kModulesField = "modules";
|
| -
|
| -} // namespace
|
| -
|
| -ModuleSystem::ModuleSystem(v8::Handle<v8::Context> context,
|
| - SourceMap* source_map)
|
| - : context_(v8::Persistent<v8::Context>::New(context)),
|
| - source_map_(source_map),
|
| - natives_enabled_(0) {
|
| - RouteFunction("require",
|
| - base::Bind(&ModuleSystem::RequireForJs, base::Unretained(this)));
|
| - RouteFunction("requireNative",
|
| - base::Bind(&ModuleSystem::GetNative, base::Unretained(this)));
|
| -
|
| - v8::Handle<v8::Object> global(context_->Global());
|
| - global->SetHiddenValue(v8::String::New(kModulesField), v8::Object::New());
|
| - global->SetHiddenValue(v8::String::New(kModuleSystem),
|
| - v8::External::New(this));
|
| -}
|
| -
|
| -ModuleSystem::~ModuleSystem() {
|
| - v8::HandleScope handle_scope;
|
| - // Deleting this value here prevents future lazy field accesses from
|
| - // referencing ModuleSystem after it has been freed.
|
| - context_->Global()->DeleteHiddenValue(v8::String::New(kModuleSystem));
|
| - context_.Dispose();
|
| -}
|
| -
|
| -ModuleSystem::NativesEnabledScope::NativesEnabledScope(
|
| - ModuleSystem* module_system)
|
| - : module_system_(module_system) {
|
| - module_system_->natives_enabled_++;
|
| -}
|
| -
|
| -ModuleSystem::NativesEnabledScope::~NativesEnabledScope() {
|
| - module_system_->natives_enabled_--;
|
| - CHECK_GE(module_system_->natives_enabled_, 0);
|
| -}
|
| -
|
| -// static
|
| -bool ModuleSystem::IsPresentInCurrentContext() {
|
| - v8::Handle<v8::Object> global(v8::Context::GetCurrent()->Global());
|
| - v8::Handle<v8::Value> module_system =
|
| - global->GetHiddenValue(v8::String::New(kModuleSystem));
|
| - return !module_system.IsEmpty() && !module_system->IsUndefined();
|
| -}
|
| -
|
| -// static
|
| -void ModuleSystem::DumpException(const v8::TryCatch& try_catch) {
|
| - v8::HandleScope handle_scope;
|
| -
|
| - v8::Handle<v8::Message> message(try_catch.Message());
|
| - if (message.IsEmpty()) {
|
| - LOG(ERROR) << "try_catch has no message";
|
| - return;
|
| - }
|
| -
|
| - std::string resource_name = "<unknown resource>";
|
| - if (!message->GetScriptResourceName().IsEmpty()) {
|
| - resource_name =
|
| - *v8::String::Utf8Value(message->GetScriptResourceName()->ToString());
|
| - }
|
| -
|
| - std::string error_message = "<no error message>";
|
| - if (!message->Get().IsEmpty())
|
| - error_message = *v8::String::Utf8Value(message->Get());
|
| -
|
| - std::string stack_trace = "<stack trace unavailable>";
|
| - if (!try_catch.StackTrace().IsEmpty()) {
|
| - v8::String::Utf8Value stack_value(try_catch.StackTrace());
|
| - if (*stack_value)
|
| - stack_trace.assign(*stack_value, stack_value.length());
|
| - else
|
| - stack_trace = "<could not convert stack trace to string>";
|
| - }
|
| -
|
| - LOG(ERROR) << "[" << resource_name << "(" << message->GetLineNumber() << ")] "
|
| - << error_message
|
| - << "{" << stack_trace << "}";
|
| -}
|
| -
|
| -void ModuleSystem::Require(const std::string& module_name) {
|
| - v8::HandleScope handle_scope;
|
| - RequireForJsInner(v8::String::New(module_name.c_str()));
|
| -}
|
| -
|
| -v8::Handle<v8::Value> ModuleSystem::RequireForJs(const v8::Arguments& args) {
|
| - v8::HandleScope handle_scope;
|
| - v8::Handle<v8::String> module_name = args[0]->ToString();
|
| - return handle_scope.Close(RequireForJsInner(module_name));
|
| -}
|
| -
|
| -v8::Handle<v8::Value> ModuleSystem::RequireForJsInner(
|
| - v8::Handle<v8::String> module_name) {
|
| - v8::HandleScope handle_scope;
|
| - v8::Handle<v8::Object> global(v8::Context::GetCurrent()->Global());
|
| - v8::Handle<v8::Object> modules(v8::Handle<v8::Object>::Cast(
|
| - global->GetHiddenValue(v8::String::New(kModulesField))));
|
| - v8::Handle<v8::Value> exports(modules->Get(module_name));
|
| - if (!exports->IsUndefined())
|
| - return handle_scope.Close(exports);
|
| -
|
| - v8::Handle<v8::Value> source(GetSource(module_name));
|
| - if (source->IsUndefined())
|
| - return handle_scope.Close(v8::Undefined());
|
| - v8::Handle<v8::String> wrapped_source(WrapSource(
|
| - v8::Handle<v8::String>::Cast(source)));
|
| - v8::Handle<v8::Function> func =
|
| - v8::Handle<v8::Function>::Cast(RunString(wrapped_source, module_name));
|
| - if (func.IsEmpty()) {
|
| - return ThrowException(std::string(*v8::String::AsciiValue(module_name)) +
|
| - ": Bad source");
|
| - }
|
| -
|
| - exports = v8::Object::New();
|
| - v8::Handle<v8::Object> natives(NewInstance());
|
| - v8::Handle<v8::Value> args[] = {
|
| - natives->Get(v8::String::NewSymbol("require")),
|
| - natives->Get(v8::String::NewSymbol("requireNative")),
|
| - exports,
|
| - };
|
| - {
|
| - WebKit::WebScopedMicrotaskSuppression suppression;
|
| - v8::TryCatch try_catch;
|
| - try_catch.SetCaptureMessage(true);
|
| - func->Call(global, 3, args);
|
| - if (try_catch.HasCaught()) {
|
| - DumpException(try_catch);
|
| - return v8::Undefined();
|
| - }
|
| - }
|
| - modules->Set(module_name, exports);
|
| - return handle_scope.Close(exports);
|
| -}
|
| -
|
| -void ModuleSystem::RegisterNativeHandler(const std::string& name,
|
| - scoped_ptr<NativeHandler> native_handler) {
|
| - native_handler_map_[name] =
|
| - linked_ptr<NativeHandler>(native_handler.release());
|
| -}
|
| -
|
| -void ModuleSystem::OverrideNativeHandler(const std::string& name) {
|
| - overridden_native_handlers_.insert(name);
|
| -}
|
| -
|
| -void ModuleSystem::RunString(const std::string& code, const std::string& name) {
|
| - v8::HandleScope handle_scope;
|
| - RunString(v8::String::New(code.c_str()), v8::String::New(name.c_str()));
|
| -}
|
| -
|
| -// static
|
| -v8::Handle<v8::Value> ModuleSystem::LazyFieldGetter(
|
| - v8::Local<v8::String> property, const v8::AccessorInfo& info) {
|
| - CHECK(!info.Data().IsEmpty());
|
| - CHECK(info.Data()->IsObject());
|
| - v8::HandleScope handle_scope;
|
| - v8::Handle<v8::Object> parameters = v8::Handle<v8::Object>::Cast(info.Data());
|
| - v8::Handle<v8::Object> global(v8::Context::GetCurrent()->Global());
|
| - v8::Handle<v8::Value> module_system_value =
|
| - global->GetHiddenValue(v8::String::New(kModuleSystem));
|
| - if (module_system_value->IsUndefined()) {
|
| - // ModuleSystem has been deleted.
|
| - return v8::Undefined();
|
| - }
|
| - ModuleSystem* module_system = static_cast<ModuleSystem*>(
|
| - v8::Handle<v8::External>::Cast(module_system_value)->Value());
|
| -
|
| - v8::Handle<v8::Object> module;
|
| - {
|
| - NativesEnabledScope scope(module_system);
|
| - module = v8::Handle<v8::Object>::Cast(module_system->RequireForJsInner(
|
| - parameters->Get(v8::String::New(kModuleName))->ToString()));
|
| - }
|
| - if (module.IsEmpty())
|
| - return handle_scope.Close(v8::Handle<v8::Value>());
|
| -
|
| - v8::Handle<v8::String> field =
|
| - parameters->Get(v8::String::New(kModuleField))->ToString();
|
| -
|
| - return handle_scope.Close(module->Get(field));
|
| -}
|
| -
|
| -void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object,
|
| - const std::string& field,
|
| - const std::string& module_name,
|
| - const std::string& module_field) {
|
| - v8::HandleScope handle_scope;
|
| - v8::Handle<v8::Object> parameters = v8::Object::New();
|
| - parameters->Set(v8::String::New(kModuleName),
|
| - v8::String::New(module_name.c_str()));
|
| - parameters->Set(v8::String::New(kModuleField),
|
| - v8::String::New(module_field.c_str()));
|
| -
|
| - object->SetAccessor(v8::String::New(field.c_str()),
|
| - &ModuleSystem::LazyFieldGetter,
|
| - NULL,
|
| - parameters);
|
| -}
|
| -
|
| -v8::Handle<v8::Value> ModuleSystem::RunString(v8::Handle<v8::String> code,
|
| - v8::Handle<v8::String> name) {
|
| - v8::HandleScope handle_scope;
|
| - WebKit::WebScopedMicrotaskSuppression suppression;
|
| - v8::Handle<v8::Value> result;
|
| - v8::TryCatch try_catch;
|
| - try_catch.SetCaptureMessage(true);
|
| - v8::Handle<v8::Script> script(v8::Script::New(code, name));
|
| - if (try_catch.HasCaught()) {
|
| - DumpException(try_catch);
|
| - return handle_scope.Close(result);
|
| - }
|
| -
|
| - result = script->Run();
|
| - if (try_catch.HasCaught())
|
| - DumpException(try_catch);
|
| -
|
| - return handle_scope.Close(result);
|
| -}
|
| -
|
| -v8::Handle<v8::Value> ModuleSystem::GetSource(
|
| - v8::Handle<v8::String> source_name) {
|
| - v8::HandleScope handle_scope;
|
| - std::string module_name = *v8::String::AsciiValue(source_name);
|
| - if (!source_map_->Contains(module_name))
|
| - return v8::Undefined();
|
| - return handle_scope.Close(source_map_->GetSource(module_name));
|
| -}
|
| -
|
| -v8::Handle<v8::Value> ModuleSystem::GetNative(const v8::Arguments& args) {
|
| - CHECK_EQ(1, args.Length());
|
| - if (natives_enabled_ == 0)
|
| - return ThrowException("Natives disabled");
|
| - std::string native_name = *v8::String::AsciiValue(args[0]->ToString());
|
| - if (overridden_native_handlers_.count(native_name) > 0u)
|
| - return RequireForJs(args);
|
| - NativeHandlerMap::iterator i = native_handler_map_.find(native_name);
|
| - if (i == native_handler_map_.end())
|
| - return v8::Undefined();
|
| - return i->second->NewInstance();
|
| -}
|
| -
|
| -v8::Handle<v8::String> ModuleSystem::WrapSource(v8::Handle<v8::String> source) {
|
| - v8::HandleScope handle_scope;
|
| - v8::Handle<v8::String> left =
|
| - v8::String::New("(function(require, requireNative, exports) {");
|
| - v8::Handle<v8::String> right = v8::String::New("\n})");
|
| - return handle_scope.Close(
|
| - v8::String::Concat(left, v8::String::Concat(source, right)));
|
| -}
|
| -
|
| -v8::Handle<v8::Value> ModuleSystem::ThrowException(const std::string& message) {
|
| - return v8::ThrowException(v8::String::New(message.c_str()));
|
| -}
|
|
|