OLD | NEW |
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/api_test_base.h" | 5 #include "extensions/renderer/api_test_base.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "extensions/common/extension_urls.h" | 10 #include "extensions/common/extension_urls.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 } | 94 } |
95 | 95 |
96 TestServiceProvider::TestServiceProvider() { | 96 TestServiceProvider::TestServiceProvider() { |
97 } | 97 } |
98 | 98 |
99 ApiTestBase::ApiTestBase() { | 99 ApiTestBase::ApiTestBase() { |
100 } | 100 } |
101 ApiTestBase::~ApiTestBase() { | 101 ApiTestBase::~ApiTestBase() { |
102 } | 102 } |
103 | 103 |
| 104 class KeepAliveCounter::Instance : public mojo::InterfaceImpl<KeepAlive> { |
| 105 public: |
| 106 Instance(KeepAliveCounter* counter); |
| 107 ~Instance() override; |
| 108 |
| 109 private: |
| 110 KeepAliveCounter* counter_; |
| 111 |
| 112 DISALLOW_COPY_AND_ASSIGN(Instance); |
| 113 }; |
| 114 |
| 115 KeepAliveCounter::KeepAliveCounter() : keep_alives_(0), keep_alive_ends_(0) { |
| 116 } |
| 117 |
| 118 void KeepAliveCounter::CreateKeepAlive( |
| 119 mojo::InterfaceRequest<KeepAlive> request) { |
| 120 keep_alives_++; |
| 121 mojo::BindToRequest(new Instance(this), &request); |
| 122 } |
| 123 |
| 124 void KeepAliveCounter::WaitUntilKeepAlivesFinish() { |
| 125 base::RunLoop run_loop; |
| 126 base::MessageLoop::current()->PostTask( |
| 127 FROM_HERE, base::Bind(&KeepAliveCounter::PollKeepAlives, |
| 128 base::Unretained(this), run_loop.QuitClosure())); |
| 129 run_loop.Run(); |
| 130 } |
| 131 |
| 132 void KeepAliveCounter::PollKeepAlives(const base::Closure& quit_closure) { |
| 133 if (keep_alives_ == keep_alive_ends_) { |
| 134 quit_closure.Run(); |
| 135 return; |
| 136 } |
| 137 base::MessageLoop::current()->PostTask( |
| 138 FROM_HERE, base::Bind(&KeepAliveCounter::PollKeepAlives, |
| 139 base::Unretained(this), quit_closure)); |
| 140 } |
| 141 |
| 142 KeepAliveCounter::Instance::Instance(KeepAliveCounter* counter) |
| 143 : counter_(counter) { |
| 144 } |
| 145 |
| 146 KeepAliveCounter::Instance::~Instance() { |
| 147 counter_->keep_alive_ends_++; |
| 148 } |
| 149 |
104 void ApiTestBase::SetUp() { | 150 void ApiTestBase::SetUp() { |
105 ModuleSystemTest::SetUp(); | 151 ModuleSystemTest::SetUp(); |
106 InitializeEnvironment(); | 152 InitializeEnvironment(); |
107 RegisterModules(); | 153 RegisterModules(); |
108 } | 154 } |
109 | 155 |
110 void ApiTestBase::RegisterModules() { | 156 void ApiTestBase::RegisterModules() { |
111 v8_schema_registry_.reset(new V8SchemaRegistry); | 157 v8_schema_registry_.reset(new V8SchemaRegistry); |
112 const std::vector<std::pair<std::string, int> > resources = | 158 const std::vector<std::pair<std::string, int> > resources = |
113 Dispatcher::GetJsResources(); | 159 Dispatcher::GetJsResources(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 ->AddBuiltinModule(env()->isolate(), | 202 ->AddBuiltinModule(env()->isolate(), |
157 mojo::js::Support::kModuleName, | 203 mojo::js::Support::kModuleName, |
158 mojo::js::Support::GetModule(env()->isolate())); | 204 mojo::js::Support::GetModule(env()->isolate())); |
159 gin::Handle<TestServiceProvider> service_provider = | 205 gin::Handle<TestServiceProvider> service_provider = |
160 TestServiceProvider::Create(env()->isolate()); | 206 TestServiceProvider::Create(env()->isolate()); |
161 service_provider_ = service_provider.get(); | 207 service_provider_ = service_provider.get(); |
162 gin::ModuleRegistry::From(env()->context()->v8_context()) | 208 gin::ModuleRegistry::From(env()->context()->v8_context()) |
163 ->AddBuiltinModule(env()->isolate(), | 209 ->AddBuiltinModule(env()->isolate(), |
164 "content/public/renderer/service_provider", | 210 "content/public/renderer/service_provider", |
165 service_provider.ToV8()); | 211 service_provider.ToV8()); |
| 212 service_provider_->AddService( |
| 213 base::Bind(&KeepAliveCounter::CreateKeepAlive, |
| 214 base::Unretained(&keep_alive_counter_))); |
166 } | 215 } |
167 | 216 |
168 void ApiTestBase::InitializeEnvironment() { | 217 void ApiTestBase::InitializeEnvironment() { |
169 gin::Dictionary global(env()->isolate(), | 218 gin::Dictionary global(env()->isolate(), |
170 env()->context()->v8_context()->Global()); | 219 env()->context()->v8_context()->Global()); |
171 gin::Dictionary navigator(gin::Dictionary::CreateEmpty(env()->isolate())); | 220 gin::Dictionary navigator(gin::Dictionary::CreateEmpty(env()->isolate())); |
172 navigator.Set("appVersion", base::StringPiece("")); | 221 navigator.Set("appVersion", base::StringPiece("")); |
173 global.Set("navigator", navigator); | 222 global.Set("navigator", navigator); |
174 gin::Dictionary chrome(gin::Dictionary::CreateEmpty(env()->isolate())); | 223 gin::Dictionary chrome(gin::Dictionary::CreateEmpty(env()->isolate())); |
175 global.Set("chrome", chrome); | 224 global.Set("chrome", chrome); |
(...skipping 14 matching lines...) Expand all Loading... |
190 TestNatives::Create(env()->isolate(), run_loop.QuitClosure()).ToV8()); | 239 TestNatives::Create(env()->isolate(), run_loop.QuitClosure()).ToV8()); |
191 base::MessageLoop::current()->PostTask(FROM_HERE, | 240 base::MessageLoop::current()->PostTask(FROM_HERE, |
192 base::Bind(&ApiTestBase::RunTestInner, | 241 base::Bind(&ApiTestBase::RunTestInner, |
193 base::Unretained(this), | 242 base::Unretained(this), |
194 test_name, | 243 test_name, |
195 run_loop.QuitClosure())); | 244 run_loop.QuitClosure())); |
196 base::MessageLoop::current()->PostTask( | 245 base::MessageLoop::current()->PostTask( |
197 FROM_HERE, | 246 FROM_HERE, |
198 base::Bind(&ApiTestBase::RunPromisesAgain, base::Unretained(this))); | 247 base::Bind(&ApiTestBase::RunPromisesAgain, base::Unretained(this))); |
199 run_loop.Run(); | 248 run_loop.Run(); |
| 249 keep_alive_counter_.WaitUntilKeepAlivesFinish(); |
200 } | 250 } |
201 | 251 |
202 void ApiTestBase::RunTestInner(const std::string& test_name, | 252 void ApiTestBase::RunTestInner(const std::string& test_name, |
203 const base::Closure& quit_closure) { | 253 const base::Closure& quit_closure) { |
204 v8::HandleScope scope(env()->isolate()); | 254 v8::HandleScope scope(env()->isolate()); |
205 ModuleSystem::NativesEnabledScope natives_enabled(env()->module_system()); | 255 ModuleSystem::NativesEnabledScope natives_enabled(env()->module_system()); |
206 v8::Handle<v8::Value> result = | 256 v8::Handle<v8::Value> result = |
207 env()->module_system()->CallModuleMethod("testBody", test_name); | 257 env()->module_system()->CallModuleMethod("testBody", test_name); |
208 if (!result->IsTrue()) { | 258 if (!result->IsTrue()) { |
209 base::MessageLoop::current()->PostTask(FROM_HERE, quit_closure); | 259 base::MessageLoop::current()->PostTask(FROM_HERE, quit_closure); |
210 FAIL() << "Failed to run test \"" << test_name << "\""; | 260 FAIL() << "Failed to run test \"" << test_name << "\""; |
211 } | 261 } |
212 } | 262 } |
213 | 263 |
214 void ApiTestBase::RunPromisesAgain() { | 264 void ApiTestBase::RunPromisesAgain() { |
215 RunResolvedPromises(); | 265 RunResolvedPromises(); |
216 base::MessageLoop::current()->PostTask( | 266 base::MessageLoop::current()->PostTask( |
217 FROM_HERE, | 267 FROM_HERE, |
218 base::Bind(&ApiTestBase::RunPromisesAgain, base::Unretained(this))); | 268 base::Bind(&ApiTestBase::RunPromisesAgain, base::Unretained(this))); |
219 } | 269 } |
220 | 270 |
221 } // namespace extensions | 271 } // namespace extensions |
OLD | NEW |