Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Unified Diff: chrome/renderer/module_system.cc

Issue 10879107: Move ModuleSystem and NativeHandler to extensions/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/module_system.h ('k') | chrome/renderer/module_system_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()));
-}
« no previous file with comments | « chrome/renderer/module_system.h ('k') | chrome/renderer/module_system_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698