15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/renderer/api_test_base.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector> 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/run_loop.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/extension_urls.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/renderer/dispatcher.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/renderer/process_info_native_handler.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/converter.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/dictionary.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/bindings/js/core.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/bindings/js/handle.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/bindings/js/support.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/bindings/interface_request.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/system/core.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions { 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Natives for the implementation of the unit test version of chrome.test. Calls 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the provided |quit_closure| when either notifyPass or notifyFail is called. 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestNatives : public gin::Wrappable<TestNatives> { 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static gin::Handle<TestNatives> Create(v8::Isolate* isolate, 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& quit_closure) { 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return gin::CreateHandle(isolate, new TestNatives(quit_closure)); 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder( 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8::Isolate* isolate) OVERRIDE { 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Wrappable<TestNatives>::GetObjectTemplateBuilder(isolate) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .SetMethod("Log", &TestNatives::Log) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .SetMethod("NotifyPass", &TestNatives::NotifyPass) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .SetMethod("NotifyFail", &TestNatives::NotifyFail); 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Log(const std::string& value) { logs_ += value + "\n"; } 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void NotifyPass() { FinishTesting(); } 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void NotifyFail(const std::string& message) { 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FinishTesting(); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FAIL() << logs_ << message; 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void FinishTesting() { 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, quit_closure_); 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static gin::WrapperInfo kWrapperInfo; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit TestNatives(const base::Closure& quit_closure) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : quit_closure_(quit_closure) {} 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure quit_closure_; 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string logs_; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gin::WrapperInfo TestNatives::kWrapperInfo = {gin::kEmbedderNativeGin}; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gin::WrapperInfo TestServiceProvider::kWrapperInfo = {gin::kEmbedderNativeGin}; 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gin::Handle<TestServiceProvider> TestServiceProvider::Create( 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8::Isolate* isolate) { 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return gin::CreateHandle(isolate, new TestServiceProvider()); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TestServiceProvider::~TestServiceProvider() { 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gin::ObjectTemplateBuilder TestServiceProvider::GetObjectTemplateBuilder( 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8::Isolate* isolate) { 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Wrappable<TestServiceProvider>::GetObjectTemplateBuilder(isolate) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .SetMethod("connectToService", &TestServiceProvider::ConnectToService); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)mojo::Handle TestServiceProvider::ConnectToService( 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& service_name) { 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, service_factories_.count(service_name)) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) << "Unregistered service " << service_name << " requested."; 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::MessagePipe pipe; 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::map<std::string, 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Callback<void(mojo::ScopedMessagePipeHandle)> >::iterator it = 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_factories_.find(service_name); 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (it != service_factories_.end()) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) it->second.Run(pipe.handle0.Pass()); 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return pipe.handle1.release(); 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TestServiceProvider::TestServiceProvider() { 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ApiTestBase::ApiTestBase() { 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ApiTestBase::~ApiTestBase() { 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ApiTestBase::SetUp() { 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ModuleSystemTest::SetUp(); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeEnvironment(); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RegisterModules(); 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ApiTestBase::RegisterModules() { 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8_schema_registry_.reset(new V8SchemaRegistry); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<std::pair<std::string, int> > resources = 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Dispatcher::GetJsResources(); 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (std::vector<std::pair<std::string, int> >::const_iterator resource = 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) resources.begin(); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) resource != resources.end(); 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ++resource) { 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (resource->first != "test_environment_specific_bindings") 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->RegisterModule(resource->first, resource->second); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Dispatcher::RegisterNativeHandlers(env()->module_system(), 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->context(), 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL, 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL, 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8_schema_registry_.get()); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->module_system()->RegisterNativeHandler( 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "process", 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<NativeHandler>(new ProcessInfoNativeHandler( 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->context(), 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->context()->GetExtensionID(), 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->context()->GetContextTypeDescription(), 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false, 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2, 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false))); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->RegisterTestFile("test_environment_specific_bindings", 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "unit_test_environment_specific_bindings.js"); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->OverrideNativeHandler("activityLogger", 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.LogAPICall = function() {};"); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->OverrideNativeHandler( 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "apiDefinitions", 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.GetExtensionAPIDefinitionsForTest = function() { return [] };"); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->OverrideNativeHandler( 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "event_natives", 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.AttachEvent = function() {};" 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.DetachEvent = function() {};" 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.AttachFilteredEvent = function() {};" 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.AttachFilteredEvent = function() {};" 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "exports.MatchAgainstEventFilter = function() { return [] };"); 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::ModuleRegistry::From(env()->context()->v8_context()) 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ->AddBuiltinModule(env()->isolate(), 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::js::Core::kModuleName, 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::js::Core::GetModule(env()->isolate())); 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::ModuleRegistry::From(env()->context()->v8_context()) 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ->AddBuiltinModule(env()->isolate(), 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::js::Support::kModuleName, 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::js::Support::GetModule(env()->isolate())); 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::Handle<TestServiceProvider> service_provider = 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestServiceProvider::Create(env()->isolate()); 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_provider_ = service_provider.get(); 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::ModuleRegistry::From(env()->context()->v8_context()) 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ->AddBuiltinModule(env()->isolate(), 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "content/public/renderer/service_provider", 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_provider.ToV8()); 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ApiTestBase::InitializeEnvironment() { 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::Dictionary global(env()->isolate(), 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->context()->v8_context()->Global()); 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::Dictionary navigator(gin::Dictionary::CreateEmpty(env()->isolate())); 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) navigator.Set("appVersion", base::StringPiece("")); 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) global.Set("navigator", navigator); 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::Dictionary chrome(gin::Dictionary::CreateEmpty(env()->isolate())); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) global.Set("chrome", chrome); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::Dictionary extension(gin::Dictionary::CreateEmpty(env()->isolate())); 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chrome.Set("extension", extension); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::Dictionary runtime(gin::Dictionary::CreateEmpty(env()->isolate())); 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chrome.Set("runtime", runtime); 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ApiTestBase::RunTest(const std::string& file_name, 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& test_name) { 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->RegisterTestFile("testBody", file_name); 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNoAssertionsMade(); 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop run_loop; 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gin::ModuleRegistry::From(env()->context()->v8_context())->AddBuiltinModule( 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->isolate(), 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "testNatives", 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestNatives::Create(env()->isolate(), run_loop.QuitClosure()).ToV8()); 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&ApiTestBase::RunTestInner, 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) test_name, 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.QuitClosure())); 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&ApiTestBase::RunPromisesAgain, base::Unretained(this))); 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.Run(); 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ApiTestBase::RunTestInner(const std::string& test_name, 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& quit_closure) { 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8::HandleScope scope(env()->isolate()); 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled(env()->module_system()); 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8::Handle<v8::Value> result = 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env()->module_system()->CallModuleMethod("testBody", test_name); 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!result->IsTrue()) { 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, quit_closure); 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FAIL() << "Failed to run test \"" << test_name << "\""; 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ApiTestBase::RunPromisesAgain() { 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunResolvedPromises(); 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&ApiTestBase::RunPromisesAgain, base::Unretained(this))); 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace extensions 222