diff options
author | abarth@chromium.org <abarth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-18 23:05:12 +0000 |
---|---|---|
committer | abarth@chromium.org <abarth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-18 23:05:12 +0000 |
commit | fd5cf7fd4622292d331b9c1af77fa2335688df2f (patch) | |
tree | e78150b2b80ceac70bc38132695481d63cb0348b /gin | |
parent | 168a15cb1ac0f810c0372f86a02fb564e25d5424 (diff) | |
download | chromium_src-fd5cf7fd4622292d331b9c1af77fa2335688df2f.zip chromium_src-fd5cf7fd4622292d331b9c1af77fa2335688df2f.tar.gz chromium_src-fd5cf7fd4622292d331b9c1af77fa2335688df2f.tar.bz2 |
Implement Mojo message codec in JavaScript
This CL contains an encoder and decoder for the Mojo message IPC format. I've
tested the encoder and decoder against each other, but I haven't yet tested them
against the C++ implementation.
I haven't tried to tune the encoder or decoder for performance. IMHO, we should
work on that after getting correctness.
The C++ code for JSTest.codec is a bit verbose because the C++ code need to
load all the dependencies for codec_unittests.js. A better approach is to teach
the system how to load dependencies from the file system, but I've left that for
a future CL.
BUG=317398
R=aa@chromium.org
Review URL: https://codereview.chromium.org/69843003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235838 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gin')
-rw-r--r-- | gin/modules/module_registry.cc | 2 | ||||
-rw-r--r-- | gin/modules/module_runner_delegate.cc | 18 | ||||
-rw-r--r-- | gin/modules/module_runner_delegate.h | 11 | ||||
-rw-r--r-- | gin/test/file_runner.cc | 13 | ||||
-rw-r--r-- | gin/test/file_runner.h | 3 | ||||
-rw-r--r-- | gin/test/gtest.cc | 6 | ||||
-rw-r--r-- | gin/test/gtest.h | 6 |
7 files changed, 43 insertions, 16 deletions
diff --git a/gin/modules/module_registry.cc b/gin/modules/module_registry.cc index 20ee287..dc0a1ec 100644 --- a/gin/modules/module_registry.cc +++ b/gin/modules/module_registry.cc @@ -96,6 +96,8 @@ std::string GetImplicitModuleName(const std::string& explicit_name) { return explicit_name; std::string implicit_name; Handle<StackTrace> trace = StackTrace::CurrentStackTrace(1); + if (!trace->GetFrameCount()) + return implicit_name; Handle<String> script_name = trace->GetFrame(0)->GetScriptName(); if (!script_name.IsEmpty()) ConvertFromV8(script_name, &implicit_name); diff --git a/gin/modules/module_runner_delegate.cc b/gin/modules/module_runner_delegate.cc index e029a93..50b9f5e 100644 --- a/gin/modules/module_runner_delegate.cc +++ b/gin/modules/module_runner_delegate.cc @@ -15,6 +15,11 @@ ModuleRunnerDelegate::ModuleRunnerDelegate(const base::FilePath& module_base) ModuleRunnerDelegate::~ModuleRunnerDelegate() { } +void ModuleRunnerDelegate::AddBuiltinModule(const std::string& id, + ModuleTemplateGetter templ) { + builtin_modules_[id] = templ; +} + v8::Handle<v8::ObjectTemplate> ModuleRunnerDelegate::GetGlobalTemplate( Runner* runner) { v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(); @@ -22,6 +27,19 @@ v8::Handle<v8::ObjectTemplate> ModuleRunnerDelegate::GetGlobalTemplate( return templ; } +void ModuleRunnerDelegate::DidCreateContext(Runner* runner) { + RunnerDelegate::DidCreateContext(runner); + + v8::Handle<v8::Context> context = runner->context(); + ModuleRegistry* registry = ModuleRegistry::From(context); + + for (BuiltinModuleMap::const_iterator it = builtin_modules_.begin(); + it != builtin_modules_.end(); ++it) { + registry->AddBuiltinModule(runner->isolate(), it->first, + it->second(runner->isolate())); + } +} + void ModuleRunnerDelegate::DidRunScript(Runner* runner, v8::Handle<v8::Script> script) { ModuleRegistry* registry = ModuleRegistry::From(runner->context()); diff --git a/gin/modules/module_runner_delegate.h b/gin/modules/module_runner_delegate.h index f16596e..4d821d2 100644 --- a/gin/modules/module_runner_delegate.h +++ b/gin/modules/module_runner_delegate.h @@ -5,24 +5,35 @@ #ifndef GIN_MODULES_MODULE_RUNNER_DELEGATE_H_ #define GIN_MODULES_MODULE_RUNNER_DELEGATE_H_ +#include <map> + #include "base/compiler_specific.h" #include "gin/modules/file_module_provider.h" #include "gin/runner.h" namespace gin { +typedef v8::Local<v8::ObjectTemplate> (*ModuleTemplateGetter)( + v8::Isolate* isolate); + class ModuleRunnerDelegate : public RunnerDelegate { public: explicit ModuleRunnerDelegate(const base::FilePath& module_base); virtual ~ModuleRunnerDelegate(); + void AddBuiltinModule(const std::string& id, ModuleTemplateGetter templ); + private: + typedef std::map<std::string, ModuleTemplateGetter> BuiltinModuleMap; + // From RunnerDelegate: virtual v8::Handle<v8::ObjectTemplate> GetGlobalTemplate( Runner* runner) OVERRIDE; + virtual void DidCreateContext(Runner* runner) OVERRIDE; virtual void DidRunScript(Runner* runner, v8::Handle<v8::Script> script) OVERRIDE; + BuiltinModuleMap builtin_modules_; FileModuleProvider module_provider_; DISALLOW_COPY_AND_ASSIGN(ModuleRunnerDelegate); diff --git a/gin/test/file_runner.cc b/gin/test/file_runner.cc index a343d64..dd0ca66 100644 --- a/gin/test/file_runner.cc +++ b/gin/test/file_runner.cc @@ -27,28 +27,19 @@ base::FilePath GetModuleBase() { FileRunnerDelegate::FileRunnerDelegate() : ModuleRunnerDelegate(GetModuleBase()) { + AddBuiltinModule(GTest::kModuleName, GTest::GetTemplate); } FileRunnerDelegate::~FileRunnerDelegate() { } -void FileRunnerDelegate::DidCreateContext(Runner* runner) { - ModuleRunnerDelegate::DidCreateContext(runner); - - v8::Handle<v8::Context> context = runner->context(); - ModuleRegistry* registry = ModuleRegistry::From(context); - - registry->AddBuiltinModule(runner->isolate(), "gtest", - GetGTestTemplate(runner->isolate())); -} - void FileRunnerDelegate::UnhandledException(Runner* runner, TryCatch& try_catch) { ModuleRunnerDelegate::UnhandledException(runner, try_catch); EXPECT_FALSE(try_catch.HasCaught()) << try_catch.GetPrettyMessage(); } -void RunTestFromFile(const base::FilePath& path, RunnerDelegate* delegate) { +void RunTestFromFile(const base::FilePath& path, FileRunnerDelegate* delegate) { ASSERT_TRUE(base::PathExists(path)) << path.LossyDisplayName(); std::string source; ASSERT_TRUE(ReadFileToString(path, &source)); diff --git a/gin/test/file_runner.h b/gin/test/file_runner.h index b00e089..c4164f5 100644 --- a/gin/test/file_runner.h +++ b/gin/test/file_runner.h @@ -19,13 +19,12 @@ class FileRunnerDelegate : public ModuleRunnerDelegate { private: // From ModuleRunnerDelegate: - virtual void DidCreateContext(Runner* runner) OVERRIDE; virtual void UnhandledException(Runner* runner, TryCatch& try_catch) OVERRIDE; DISALLOW_COPY_AND_ASSIGN(FileRunnerDelegate); }; -void RunTestFromFile(const base::FilePath& path, RunnerDelegate* delegate); +void RunTestFromFile(const base::FilePath& path, FileRunnerDelegate* delegate); } // namespace gin diff --git a/gin/test/gtest.cc b/gin/test/gtest.cc index 2d77563..d600418 100644 --- a/gin/test/gtest.cc +++ b/gin/test/gtest.cc @@ -54,9 +54,11 @@ void ExpectEqual(const v8::FunctionCallbackInfo<v8::Value>& info) { WrapperInfo g_gtest_wrapper_info = {}; -} +} // namespace + +const char GTest::kModuleName[] = "gtest"; -v8::Local<v8::ObjectTemplate> GetGTestTemplate(v8::Isolate* isolate) { +v8::Local<v8::ObjectTemplate> GTest::GetTemplate(v8::Isolate* isolate) { PerIsolateData* data = PerIsolateData::From(isolate); v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate( &g_gtest_wrapper_info); diff --git a/gin/test/gtest.h b/gin/test/gtest.h index e4ad534..ee19b71 100644 --- a/gin/test/gtest.h +++ b/gin/test/gtest.h @@ -9,7 +9,11 @@ namespace gin { -v8::Local<v8::ObjectTemplate> GetGTestTemplate(v8::Isolate* isolate); +class GTest { + public: + static const char kModuleName[]; + static v8::Local<v8::ObjectTemplate> GetTemplate(v8::Isolate* isolate); +}; } // namespace gin |