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

Unified Diff: gin/modules/module_registry.cc

Issue 90203002: [Mojo] Remove static "bootstrap" state in mojo_js (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: CHECK, CHECK, CHECK Created 7 years, 1 month 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 | « gin/modules/module_registry.h ('k') | gin/modules/module_runner_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gin/modules/module_registry.cc
diff --git a/gin/modules/module_registry.cc b/gin/modules/module_registry.cc
index 6eba6f5058b2fd1439c165e9348c32ef4c3884e3..e9340dbecfd98d7652feab64131a4434c556852f 100644
--- a/gin/modules/module_registry.cc
+++ b/gin/modules/module_registry.cc
@@ -135,6 +135,20 @@ void ModuleRegistry::AddPendingModule(Isolate* isolate,
AttemptToLoad(isolate, pending.Pass());
}
+void ModuleRegistry::LoadModule(Isolate* isolate,
+ const std::string& id,
+ LoadModuleCallback callback) {
+ if (available_modules_.find(id) != available_modules_.end()) {
+ // Should we call the callback asynchronously?
+ callback.Run(GetModule(isolate, id));
+ return;
+ }
+ // Should we support multiple callers waiting on the same module?
+ DCHECK(waiting_callbacks_.find(id) == waiting_callbacks_.end());
+ waiting_callbacks_[id] = callback;
+ unsatisfied_dependencies_.insert(id);
+}
+
void ModuleRegistry::RegisterModule(Isolate* isolate,
const std::string& id,
v8::Handle<Value> module) {
@@ -145,6 +159,14 @@ void ModuleRegistry::RegisterModule(Isolate* isolate,
available_modules_.insert(id);
v8::Handle<Object> modules = Local<Object>::New(isolate, modules_);
modules->Set(StringToSymbol(isolate, id), module);
+
+ LoadModuleCallbackMap::iterator it = waiting_callbacks_.find(id);
+ if (it == waiting_callbacks_.end())
+ return;
+ LoadModuleCallback callback = it->second;
+ waiting_callbacks_.erase(it);
+ // Should we call the callback asynchronously?
+ callback.Run(module);
}
void ModuleRegistry::Detach(v8::Handle<Context> context) {
@@ -169,14 +191,10 @@ void ModuleRegistry::Load(Isolate* isolate, scoped_ptr<PendingModule> pending) {
if (!pending->id.empty() && available_modules_.count(pending->id))
return; // We've already loaded this module.
- v8::Handle<Object> modules = Local<Object>::New(isolate, modules_);
uint32_t argc = static_cast<uint32_t>(pending->dependencies.size());
std::vector<v8::Handle<Value> > argv(argc);
- for (uint32_t i = 0; i < argc; ++i) {
- v8::Handle<String> key = StringToSymbol(isolate, pending->dependencies[i]);
- DCHECK(modules->HasOwnProperty(key));
- argv[i] = modules->Get(key);
- }
+ for (uint32_t i = 0; i < argc; ++i)
+ argv[i] = GetModule(isolate, pending->dependencies[i]);
v8::Handle<Value> module = Local<Value>::New(isolate, pending->factory);
@@ -203,6 +221,14 @@ bool ModuleRegistry::AttemptToLoad(Isolate* isolate,
return true;
}
+v8::Handle<v8::Value> ModuleRegistry::GetModule(v8::Isolate* isolate,
+ const std::string& id) {
+ v8::Handle<Object> modules = Local<Object>::New(isolate, modules_);
+ v8::Handle<String> key = StringToSymbol(isolate, id);
+ DCHECK(modules->HasOwnProperty(key));
+ return modules->Get(key);
+}
+
void ModuleRegistry::AttemptToLoadMoreModules(Isolate* isolate) {
bool keep_trying = true;
while (keep_trying) {
« no previous file with comments | « gin/modules/module_registry.h ('k') | gin/modules/module_runner_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698