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

Side by Side Diff: extensions/renderer/module_system.cc

Issue 862793003: Expose requireAsync method and make it more robust (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Unit tests. Created 5 years, 11 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 unified diff | Download patch
OLDNEW
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/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 if (modules_value.IsEmpty() || modules_value->IsUndefined()) { 220 if (modules_value.IsEmpty() || modules_value->IsUndefined()) {
221 Warn(GetIsolate(), "Extension view no longer exists"); 221 Warn(GetIsolate(), "Extension view no longer exists");
222 return v8::Undefined(GetIsolate()); 222 return v8::Undefined(GetIsolate());
223 } 223 }
224 224
225 v8::Handle<v8::Object> modules(v8::Handle<v8::Object>::Cast(modules_value)); 225 v8::Handle<v8::Object> modules(v8::Handle<v8::Object>::Cast(modules_value));
226 v8::Local<v8::Value> exports(modules->Get(module_name)); 226 v8::Local<v8::Value> exports(modules->Get(module_name));
227 if (!exports->IsUndefined()) 227 if (!exports->IsUndefined())
228 return handle_scope.Escape(exports); 228 return handle_scope.Escape(exports);
229 229
230 exports = LoadModule(*v8::String::Utf8Value(module_name)); 230 std::string module_name_str = *v8::String::Utf8Value(module_name);
231
232 v8::Handle<v8::Value> source(GetSource(module_name_str));
233 if (source.IsEmpty() || source->IsUndefined()) {
234 Fatal(context_, "No source for require(" + module_name_str + ")");
235 return v8::Undefined(GetIsolate());
236 }
237
238 exports = LoadModule(module_name_str, source);
231 modules->Set(module_name, exports); 239 modules->Set(module_name, exports);
232 return handle_scope.Escape(exports); 240 return handle_scope.Escape(exports);
233 } 241 }
234 242
235 v8::Local<v8::Value> ModuleSystem::CallModuleMethod( 243 v8::Local<v8::Value> ModuleSystem::CallModuleMethod(
236 const std::string& module_name, 244 const std::string& module_name,
237 const std::string& method_name) { 245 const std::string& method_name) {
238 v8::EscapableHandleScope handle_scope(GetIsolate()); 246 v8::EscapableHandleScope handle_scope(GetIsolate());
239 v8::Handle<v8::Value> no_args; 247 v8::Handle<v8::Value> no_args;
240 return handle_scope.Escape( 248 return handle_scope.Escape(
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 scoped_ptr<v8::UniquePersistent<v8::Promise::Resolver> > persistent_resolver( 539 scoped_ptr<v8::UniquePersistent<v8::Promise::Resolver> > persistent_resolver(
532 new v8::UniquePersistent<v8::Promise::Resolver>(GetIsolate(), resolver)); 540 new v8::UniquePersistent<v8::Promise::Resolver>(GetIsolate(), resolver));
533 gin::ModuleRegistry* module_registry = 541 gin::ModuleRegistry* module_registry =
534 gin::ModuleRegistry::From(context_->v8_context()); 542 gin::ModuleRegistry::From(context_->v8_context());
535 if (!module_registry) { 543 if (!module_registry) {
536 Warn(GetIsolate(), "Extension view no longer exists"); 544 Warn(GetIsolate(), "Extension view no longer exists");
537 resolver->Reject(v8::Exception::Error(v8::String::NewFromUtf8( 545 resolver->Reject(v8::Exception::Error(v8::String::NewFromUtf8(
538 GetIsolate(), "Extension view no longer exists"))); 546 GetIsolate(), "Extension view no longer exists")));
539 return; 547 return;
540 } 548 }
549
550 v8::Handle<v8::Value> source(GetSource(module_name));
551 if ((source.IsEmpty() || source->IsUndefined()) &&
Sam McNally 2015/01/22 07:42:11 I'm not a fan of this. It introduces ordering depe
552 !ContainsKey(module_registry->available_modules(), module_name)) {
553 std::string error_text = "No source for require(" + module_name + ")";
554 Fatal(context_, error_text);
555 resolver->Reject(v8::Exception::Error(
556 v8::String::NewFromUtf8(GetIsolate(), error_text.c_str())));
557 return;
558 }
559
541 module_registry->LoadModule(GetIsolate(), 560 module_registry->LoadModule(GetIsolate(),
542 module_name, 561 module_name,
543 base::Bind(&ModuleSystem::OnModuleLoaded, 562 base::Bind(&ModuleSystem::OnModuleLoaded,
544 weak_factory_.GetWeakPtr(), 563 weak_factory_.GetWeakPtr(),
545 base::Passed(&persistent_resolver))); 564 base::Passed(&persistent_resolver)));
546 if (module_registry->available_modules().count(module_name) == 0) 565 if (module_registry->available_modules().count(module_name) == 0)
547 LoadModule(module_name); 566 LoadModule(module_name, source);
548 } 567 }
549 568
550 v8::Handle<v8::String> ModuleSystem::WrapSource(v8::Handle<v8::String> source) { 569 v8::Handle<v8::String> ModuleSystem::WrapSource(v8::Handle<v8::String> source) {
551 v8::EscapableHandleScope handle_scope(GetIsolate()); 570 v8::EscapableHandleScope handle_scope(GetIsolate());
552 // Keep in order with the arguments in RequireForJsInner. 571 // Keep in order with the arguments in RequireForJsInner.
553 v8::Handle<v8::String> left = v8::String::NewFromUtf8( 572 v8::Handle<v8::String> left = v8::String::NewFromUtf8(
554 GetIsolate(), 573 GetIsolate(),
555 "(function(define, require, requireNative, requireAsync, exports, " 574 "(function(define, require, requireNative, requireAsync, exports, "
556 "console, privates," 575 "console, privates,"
557 "$Array, $Function, $JSON, $Object, $RegExp, $String, $Error) {" 576 "$Array, $Function, $JSON, $Object, $RegExp, $String, $Error) {"
(...skipping 23 matching lines...) Expand all
581 if (privates.IsEmpty()) { 600 if (privates.IsEmpty()) {
582 GetIsolate()->ThrowException( 601 GetIsolate()->ThrowException(
583 v8::String::NewFromUtf8(GetIsolate(), "Failed to create privates")); 602 v8::String::NewFromUtf8(GetIsolate(), "Failed to create privates"));
584 return; 603 return;
585 } 604 }
586 obj->SetHiddenValue(privates_key, privates); 605 obj->SetHiddenValue(privates_key, privates);
587 } 606 }
588 args.GetReturnValue().Set(privates); 607 args.GetReturnValue().Set(privates);
589 } 608 }
590 609
591 v8::Handle<v8::Value> ModuleSystem::LoadModule(const std::string& module_name) { 610 v8::Handle<v8::Value> ModuleSystem::LoadModule(
611 const std::string& module_name,
612 v8::Handle<v8::Value> module_source) {
592 v8::EscapableHandleScope handle_scope(GetIsolate()); 613 v8::EscapableHandleScope handle_scope(GetIsolate());
593 v8::Context::Scope context_scope(context()->v8_context()); 614 v8::Context::Scope context_scope(context()->v8_context());
594 615
595 v8::Handle<v8::Value> source(GetSource(module_name));
596 if (source.IsEmpty() || source->IsUndefined()) {
597 Fatal(context_, "No source for require(" + module_name + ")");
598 return v8::Undefined(GetIsolate());
599 }
600 v8::Handle<v8::String> wrapped_source( 616 v8::Handle<v8::String> wrapped_source(
601 WrapSource(v8::Handle<v8::String>::Cast(source))); 617 WrapSource(v8::Handle<v8::String>::Cast(module_source)));
602 // Modules are wrapped in (function(){...}) so they always return functions. 618 // Modules are wrapped in (function(){...}) so they always return functions.
603 v8::Handle<v8::Value> func_as_value = 619 v8::Handle<v8::Value> func_as_value =
604 RunString(wrapped_source, 620 RunString(wrapped_source,
605 v8::String::NewFromUtf8(GetIsolate(), module_name.c_str())); 621 v8::String::NewFromUtf8(GetIsolate(), module_name.c_str()));
606 if (func_as_value.IsEmpty() || func_as_value->IsUndefined()) { 622 if (func_as_value.IsEmpty() || func_as_value->IsUndefined()) {
607 Fatal(context_, "Bad source for require(" + module_name + ")"); 623 Fatal(context_, "Bad source for require(" + module_name + ")");
608 return v8::Undefined(GetIsolate()); 624 return v8::Undefined(GetIsolate());
609 } 625 }
610 626
611 v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(func_as_value); 627 v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(func_as_value);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 gin::ModuleRegistry* registry = 678 gin::ModuleRegistry* registry =
663 gin::ModuleRegistry::From(context_->v8_context()); 679 gin::ModuleRegistry::From(context_->v8_context());
664 DCHECK(registry); 680 DCHECK(registry);
665 for (const auto& dependency : dependencies) { 681 for (const auto& dependency : dependencies) {
666 // If a dependency is not available, and either the module or this 682 // If a dependency is not available, and either the module or this
667 // dependency is managed by ModuleSystem, attempt to load it. Other 683 // dependency is managed by ModuleSystem, attempt to load it. Other
668 // gin::ModuleRegistry users (WebUI and users of the mojoPrivate API) are 684 // gin::ModuleRegistry users (WebUI and users of the mojoPrivate API) are
669 // responsible for loading their module dependencies when required. 685 // responsible for loading their module dependencies when required.
670 if (registry->available_modules().count(dependency) == 0 && 686 if (registry->available_modules().count(dependency) == 0 &&
671 (module_system_managed || source_map_->Contains(dependency))) { 687 (module_system_managed || source_map_->Contains(dependency))) {
672 LoadModule(dependency); 688 LoadModule(dependency, GetSource(dependency));
673 } 689 }
674 } 690 }
675 registry->AttemptToLoadMoreModules(GetIsolate()); 691 registry->AttemptToLoadMoreModules(GetIsolate());
676 } 692 }
677 693
678 void ModuleSystem::OnModuleLoaded( 694 void ModuleSystem::OnModuleLoaded(
679 scoped_ptr<v8::UniquePersistent<v8::Promise::Resolver> > resolver, 695 scoped_ptr<v8::UniquePersistent<v8::Promise::Resolver> > resolver,
680 v8::Handle<v8::Value> value) { 696 v8::Handle<v8::Value> value) {
681 if (!is_valid()) 697 if (!is_valid()) {
698 LOG(ERROR) << "!is_valid";
682 return; 699 return;
700 }
683 v8::HandleScope handle_scope(GetIsolate()); 701 v8::HandleScope handle_scope(GetIsolate());
684 v8::Handle<v8::Promise::Resolver> resolver_local( 702 v8::Handle<v8::Promise::Resolver> resolver_local(
685 v8::Local<v8::Promise::Resolver>::New(GetIsolate(), *resolver)); 703 v8::Local<v8::Promise::Resolver>::New(GetIsolate(), *resolver));
686 resolver_local->Resolve(value); 704 resolver_local->Resolve(value);
687 } 705 }
688 706
689 } // namespace extensions 707 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/module_system.h ('k') | extensions/renderer/resources/mojo_private_custom_bindings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698