Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/loader/ThreadableLoader.h" | 5 #include "core/loader/ThreadableLoader.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include "core/dom/TaskRunnerHelper.h" | 8 #include "core/dom/TaskRunnerHelper.h" |
| 9 #include "core/loader/DocumentThreadableLoader.h" | 9 #include "core/loader/DocumentThreadableLoader.h" |
| 10 #include "core/loader/ThreadableLoaderClient.h" | 10 #include "core/loader/ThreadableLoaderClient.h" |
| 11 #include "core/loader/ThreadableLoadingContext.h" | 11 #include "core/loader/ThreadableLoadingContext.h" |
| 12 #include "core/loader/WorkerThreadableLoader.h" | 12 #include "core/loader/WorkerThreadableLoader.h" |
| 13 #include "core/testing/DummyPageHolder.h" | 13 #include "core/testing/DummyPageHolder.h" |
| 14 #include "core/workers/WorkerLoaderProxy.h" | |
| 15 #include "core/workers/WorkerReportingProxy.h" | 14 #include "core/workers/WorkerReportingProxy.h" |
| 16 #include "core/workers/WorkerThreadTestHelper.h" | 15 #include "core/workers/WorkerThreadTestHelper.h" |
| 17 #include "platform/WaitableEvent.h" | 16 #include "platform/WaitableEvent.h" |
| 18 #include "platform/geometry/IntSize.h" | 17 #include "platform/geometry/IntSize.h" |
| 19 #include "platform/loader/fetch/MemoryCache.h" | 18 #include "platform/loader/fetch/MemoryCache.h" |
| 20 #include "platform/loader/fetch/ResourceError.h" | 19 #include "platform/loader/fetch/ResourceError.h" |
| 21 #include "platform/loader/fetch/ResourceLoaderOptions.h" | 20 #include "platform/loader/fetch/ResourceLoaderOptions.h" |
| 22 #include "platform/loader/fetch/ResourceRequest.h" | 21 #include "platform/loader/fetch/ResourceRequest.h" |
| 23 #include "platform/loader/fetch/ResourceResponse.h" | 22 #include "platform/loader/fetch/ResourceResponse.h" |
| 24 #include "platform/loader/fetch/ResourceTimingInfo.h" | 23 #include "platform/loader/fetch/ResourceTimingInfo.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 } | 162 } |
| 164 | 163 |
| 165 private: | 164 private: |
| 166 Document& GetDocument() { return dummy_page_holder_->GetDocument(); } | 165 Document& GetDocument() { return dummy_page_holder_->GetDocument(); } |
| 167 | 166 |
| 168 std::unique_ptr<DummyPageHolder> dummy_page_holder_; | 167 std::unique_ptr<DummyPageHolder> dummy_page_holder_; |
| 169 Checkpoint checkpoint_; | 168 Checkpoint checkpoint_; |
| 170 Persistent<DocumentThreadableLoader> loader_; | 169 Persistent<DocumentThreadableLoader> loader_; |
| 171 }; | 170 }; |
| 172 | 171 |
| 173 class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, | 172 class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper { |
| 174 public WorkerLoaderProxyProvider { | |
| 175 public: | 173 public: |
| 176 WorkerThreadableLoaderTestHelper() | 174 WorkerThreadableLoaderTestHelper() |
| 177 : dummy_page_holder_(DummyPageHolder::Create(IntSize(1, 1))) {} | 175 : dummy_page_holder_(DummyPageHolder::Create(IntSize(1, 1))) {} |
| 178 | 176 |
| 179 void CreateLoader( | 177 void CreateLoader( |
| 180 ThreadableLoaderClient* client, | 178 ThreadableLoaderClient* client, |
| 181 CrossOriginRequestPolicy cross_origin_request_policy) override { | 179 CrossOriginRequestPolicy cross_origin_request_policy) override { |
| 182 std::unique_ptr<WaitableEvent> completion_event = | 180 std::unique_ptr<WaitableEvent> completion_event = |
| 183 WTF::MakeUnique<WaitableEvent>(); | 181 WTF::MakeUnique<WaitableEvent>(); |
| 184 worker_loading_task_runner_->PostTask( | 182 worker_loading_task_runner_->PostTask( |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 237 CrossThreadUnretained(this), | 235 CrossThreadUnretained(this), |
| 238 CrossThreadUnretained(completion_event.get()), n)); | 236 CrossThreadUnretained(completion_event.get()), n)); |
| 239 completion_event->Wait(); | 237 completion_event->Wait(); |
| 240 } | 238 } |
| 241 | 239 |
| 242 void OnSetUp() override { | 240 void OnSetUp() override { |
| 243 reporting_proxy_ = WTF::MakeUnique<WorkerReportingProxy>(); | 241 reporting_proxy_ = WTF::MakeUnique<WorkerReportingProxy>(); |
| 244 security_origin_ = GetDocument().GetSecurityOrigin(); | 242 security_origin_ = GetDocument().GetSecurityOrigin(); |
| 245 parent_frame_task_runners_ = | 243 parent_frame_task_runners_ = |
| 246 ParentFrameTaskRunners::Create(&dummy_page_holder_->GetFrame()); | 244 ParentFrameTaskRunners::Create(&dummy_page_holder_->GetFrame()); |
| 247 worker_thread_ = | 245 worker_thread_ = WTF::WrapUnique(new WorkerThreadForTest( |
| 248 WTF::WrapUnique(new WorkerThreadForTest(this, *reporting_proxy_)); | 246 ThreadableLoadingContext::Create(GetDocument()), *reporting_proxy_)); |
|
kinuko
2017/04/24 09:30:16
nit: makeunique (while you're there)
nhiroki
2017/05/29 04:20:24
Done.
| |
| 249 loading_context_ = ThreadableLoadingContext::Create(GetDocument()); | |
| 250 | 247 |
| 251 worker_thread_->StartWithSourceCode(security_origin_.Get(), | 248 worker_thread_->StartWithSourceCode(security_origin_.Get(), |
| 252 "//fake source code", | 249 "//fake source code", |
| 253 parent_frame_task_runners_.Get()); | 250 parent_frame_task_runners_.Get()); |
| 254 worker_thread_->WaitForInit(); | 251 worker_thread_->WaitForInit(); |
| 255 worker_loading_task_runner_ = | 252 worker_loading_task_runner_ = |
| 256 TaskRunnerHelper::Get(TaskType::kUnspecedLoading, worker_thread_.get()); | 253 TaskRunnerHelper::Get(TaskType::kUnspecedLoading, worker_thread_.get()); |
| 257 } | 254 } |
| 258 | 255 |
| 259 void OnServeRequests() override { testing::RunPendingTasks(); } | 256 void OnServeRequests() override { testing::RunPendingTasks(); } |
| 260 | 257 |
| 261 void OnTearDown() override { | 258 void OnTearDown() override { |
| 262 worker_loading_task_runner_->PostTask( | 259 worker_loading_task_runner_->PostTask( |
| 263 BLINK_FROM_HERE, | 260 BLINK_FROM_HERE, |
| 264 CrossThreadBind(&WorkerThreadableLoaderTestHelper::ClearLoader, | 261 CrossThreadBind(&WorkerThreadableLoaderTestHelper::ClearLoader, |
| 265 CrossThreadUnretained(this))); | 262 CrossThreadUnretained(this))); |
| 266 WaitableEvent event; | 263 WaitableEvent event; |
| 267 worker_loading_task_runner_->PostTask( | 264 worker_loading_task_runner_->PostTask( |
| 268 BLINK_FROM_HERE, | 265 BLINK_FROM_HERE, |
| 269 CrossThreadBind(&WaitableEvent::Signal, CrossThreadUnretained(&event))); | 266 CrossThreadBind(&WaitableEvent::Signal, CrossThreadUnretained(&event))); |
| 270 event.Wait(); | 267 event.Wait(); |
| 271 worker_thread_->TerminateAndWait(); | 268 worker_thread_->TerminateAndWait(); |
| 272 | 269 |
| 273 // Needed to clean up the things on the main thread side and | 270 // Needed to clean up the things on the main thread side and |
| 274 // avoid Resource leaks. | 271 // avoid Resource leaks. |
| 275 testing::RunPendingTasks(); | 272 testing::RunPendingTasks(); |
| 276 | |
| 277 worker_thread_->GetWorkerLoaderProxy()->DetachProvider(this); | |
| 278 } | 273 } |
| 279 | 274 |
| 280 private: | 275 private: |
| 281 Document& GetDocument() { return dummy_page_holder_->GetDocument(); } | 276 Document& GetDocument() { return dummy_page_holder_->GetDocument(); } |
| 282 | 277 |
| 283 void WorkerCreateLoader( | 278 void WorkerCreateLoader( |
| 284 ThreadableLoaderClient* client, | 279 ThreadableLoaderClient* client, |
| 285 WaitableEvent* event, | 280 WaitableEvent* event, |
| 286 CrossOriginRequestPolicy cross_origin_request_policy) { | 281 CrossOriginRequestPolicy cross_origin_request_policy) { |
| 287 DCHECK(worker_thread_); | 282 DCHECK(worker_thread_); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 314 event->Signal(); | 309 event->Signal(); |
| 315 } | 310 } |
| 316 | 311 |
| 317 void WorkerCallCheckpoint(WaitableEvent* event, int n) { | 312 void WorkerCallCheckpoint(WaitableEvent* event, int n) { |
| 318 DCHECK(worker_thread_); | 313 DCHECK(worker_thread_); |
| 319 DCHECK(worker_thread_->IsCurrentThread()); | 314 DCHECK(worker_thread_->IsCurrentThread()); |
| 320 checkpoint_.Call(n); | 315 checkpoint_.Call(n); |
| 321 event->Signal(); | 316 event->Signal(); |
| 322 } | 317 } |
| 323 | 318 |
| 324 // WorkerLoaderProxyProvider methods. | |
| 325 ThreadableLoadingContext* GetThreadableLoadingContext() override { | |
| 326 return loading_context_.Get(); | |
| 327 } | |
| 328 | |
| 329 RefPtr<SecurityOrigin> security_origin_; | 319 RefPtr<SecurityOrigin> security_origin_; |
| 330 std::unique_ptr<WorkerReportingProxy> reporting_proxy_; | 320 std::unique_ptr<WorkerReportingProxy> reporting_proxy_; |
| 331 std::unique_ptr<WorkerThreadForTest> worker_thread_; | 321 std::unique_ptr<WorkerThreadForTest> worker_thread_; |
| 332 | 322 |
| 333 std::unique_ptr<DummyPageHolder> dummy_page_holder_; | 323 std::unique_ptr<DummyPageHolder> dummy_page_holder_; |
| 334 // Accessed cross-thread when worker thread posts tasks to the parent. | 324 // Accessed cross-thread when worker thread posts tasks to the parent. |
| 335 CrossThreadPersistent<ParentFrameTaskRunners> parent_frame_task_runners_; | 325 CrossThreadPersistent<ParentFrameTaskRunners> parent_frame_task_runners_; |
| 336 RefPtr<WebTaskRunner> worker_loading_task_runner_; | 326 RefPtr<WebTaskRunner> worker_loading_task_runner_; |
| 337 Checkpoint checkpoint_; | 327 Checkpoint checkpoint_; |
| 338 // |m_loader| must be touched only from the worker thread only. | 328 // |m_loader| must be touched only from the worker thread only. |
| 339 CrossThreadPersistent<ThreadableLoader> loader_; | 329 CrossThreadPersistent<ThreadableLoader> loader_; |
| 340 | |
| 341 Persistent<ThreadableLoadingContext> loading_context_; | |
| 342 }; | 330 }; |
| 343 | 331 |
| 344 class ThreadableLoaderTest | 332 class ThreadableLoaderTest |
| 345 : public ::testing::TestWithParam<ThreadableLoaderToTest> { | 333 : public ::testing::TestWithParam<ThreadableLoaderToTest> { |
| 346 public: | 334 public: |
| 347 ThreadableLoaderTest() { | 335 ThreadableLoaderTest() { |
| 348 switch (GetParam()) { | 336 switch (GetParam()) { |
| 349 case kDocumentThreadableLoaderTest: | 337 case kDocumentThreadableLoaderTest: |
| 350 helper_ = WTF::WrapUnique(new DocumentThreadableLoaderTestHelper); | 338 helper_ = WTF::WrapUnique(new DocumentThreadableLoaderTestHelper); |
| 351 break; | 339 break; |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 869 // test is not saying that didFailAccessControlCheck should be dispatched | 857 // test is not saying that didFailAccessControlCheck should be dispatched |
| 870 // synchronously, but is saying that even when a response is served | 858 // synchronously, but is saying that even when a response is served |
| 871 // synchronously it should not lead to a crash. | 859 // synchronously it should not lead to a crash. |
| 872 StartLoader(KURL(KURL(), "about:blank")); | 860 StartLoader(KURL(KURL(), "about:blank")); |
| 873 CallCheckpoint(2); | 861 CallCheckpoint(2); |
| 874 } | 862 } |
| 875 | 863 |
| 876 } // namespace | 864 } // namespace |
| 877 | 865 |
| 878 } // namespace blink | 866 } // namespace blink |
| OLD | NEW |