| 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 "core/dom/CrossThreadTask.h" | 7 #include "core/dom/CrossThreadTask.h" |
| 8 #include "core/fetch/MemoryCache.h" | 8 #include "core/fetch/MemoryCache.h" |
| 9 #include "core/fetch/ResourceLoaderOptions.h" | 9 #include "core/fetch/ResourceLoaderOptions.h" |
| 10 #include "core/loader/DocumentThreadableLoader.h" | 10 #include "core/loader/DocumentThreadableLoader.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "platform/testing/UnitTestHelpers.h" | 23 #include "platform/testing/UnitTestHelpers.h" |
| 24 #include "platform/weborigin/KURL.h" | 24 #include "platform/weborigin/KURL.h" |
| 25 #include "platform/weborigin/SecurityOrigin.h" | 25 #include "platform/weborigin/SecurityOrigin.h" |
| 26 #include "public/platform/Platform.h" | 26 #include "public/platform/Platform.h" |
| 27 #include "public/platform/WebURLLoadTiming.h" | 27 #include "public/platform/WebURLLoadTiming.h" |
| 28 #include "public/platform/WebURLLoaderMockFactory.h" | 28 #include "public/platform/WebURLLoaderMockFactory.h" |
| 29 #include "public/platform/WebURLResponse.h" | 29 #include "public/platform/WebURLResponse.h" |
| 30 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
| 31 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 32 #include "wtf/Assertions.h" | 32 #include "wtf/Assertions.h" |
| 33 #include "wtf/OwnPtr.h" | 33 #include "wtf/PtrUtil.h" |
| 34 #include "wtf/PassOwnPtr.h" | |
| 35 #include "wtf/RefPtr.h" | 34 #include "wtf/RefPtr.h" |
| 35 #include <memory> |
| 36 | 36 |
| 37 namespace blink { | 37 namespace blink { |
| 38 | 38 |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 using ::testing::_; | 41 using ::testing::_; |
| 42 using ::testing::InSequence; | 42 using ::testing::InSequence; |
| 43 using ::testing::InvokeWithoutArgs; | 43 using ::testing::InvokeWithoutArgs; |
| 44 using ::testing::StrEq; | 44 using ::testing::StrEq; |
| 45 using ::testing::Truly; | 45 using ::testing::Truly; |
| 46 using Checkpoint = ::testing::StrictMock<::testing::MockFunction<void(int)>>; | 46 using Checkpoint = ::testing::StrictMock<::testing::MockFunction<void(int)>>; |
| 47 | 47 |
| 48 class MockThreadableLoaderClient : public ThreadableLoaderClient { | 48 class MockThreadableLoaderClient : public ThreadableLoaderClient { |
| 49 public: | 49 public: |
| 50 static PassOwnPtr<MockThreadableLoaderClient> create() | 50 static std::unique_ptr<MockThreadableLoaderClient> create() |
| 51 { | 51 { |
| 52 return adoptPtr(new ::testing::StrictMock<MockThreadableLoaderClient>); | 52 return wrapUnique(new ::testing::StrictMock<MockThreadableLoaderClient>)
; |
| 53 } | 53 } |
| 54 MOCK_METHOD2(didSendData, void(unsigned long long, unsigned long long)); | 54 MOCK_METHOD2(didSendData, void(unsigned long long, unsigned long long)); |
| 55 MOCK_METHOD3(didReceiveResponseMock, void(unsigned long, const ResourceRespo
nse&, WebDataConsumerHandle*)); | 55 MOCK_METHOD3(didReceiveResponseMock, void(unsigned long, const ResourceRespo
nse&, WebDataConsumerHandle*)); |
| 56 void didReceiveResponse(unsigned long identifier, const ResourceResponse& re
sponse, PassOwnPtr<WebDataConsumerHandle> handle) | 56 void didReceiveResponse(unsigned long identifier, const ResourceResponse& re
sponse, std::unique_ptr<WebDataConsumerHandle> handle) |
| 57 { | 57 { |
| 58 didReceiveResponseMock(identifier, response, handle.get()); | 58 didReceiveResponseMock(identifier, response, handle.get()); |
| 59 } | 59 } |
| 60 MOCK_METHOD2(didReceiveData, void(const char*, unsigned)); | 60 MOCK_METHOD2(didReceiveData, void(const char*, unsigned)); |
| 61 MOCK_METHOD2(didReceiveCachedMetadata, void(const char*, int)); | 61 MOCK_METHOD2(didReceiveCachedMetadata, void(const char*, int)); |
| 62 MOCK_METHOD2(didFinishLoading, void(unsigned long, double)); | 62 MOCK_METHOD2(didFinishLoading, void(unsigned long, double)); |
| 63 MOCK_METHOD1(didFail, void(const ResourceError&)); | 63 MOCK_METHOD1(didFail, void(const ResourceError&)); |
| 64 MOCK_METHOD1(didFailAccessControlCheck, void(const ResourceError&)); | 64 MOCK_METHOD1(didFailAccessControlCheck, void(const ResourceError&)); |
| 65 MOCK_METHOD0(didFailRedirectCheck, void()); | 65 MOCK_METHOD0(didFailRedirectCheck, void()); |
| 66 MOCK_METHOD1(didReceiveResourceTiming, void(const ResourceTimingInfo&)); | 66 MOCK_METHOD1(didReceiveResourceTiming, void(const ResourceTimingInfo&)); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 } | 139 } |
| 140 | 140 |
| 141 void onTearDown() override | 141 void onTearDown() override |
| 142 { | 142 { |
| 143 m_loader.reset(); | 143 m_loader.reset(); |
| 144 } | 144 } |
| 145 | 145 |
| 146 private: | 146 private: |
| 147 Document& document() { return m_dummyPageHolder->document(); } | 147 Document& document() { return m_dummyPageHolder->document(); } |
| 148 | 148 |
| 149 OwnPtr<DummyPageHolder> m_dummyPageHolder; | 149 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
| 150 Checkpoint m_checkpoint; | 150 Checkpoint m_checkpoint; |
| 151 OwnPtr<DocumentThreadableLoader> m_loader; | 151 std::unique_ptr<DocumentThreadableLoader> m_loader; |
| 152 }; | 152 }; |
| 153 | 153 |
| 154 class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, publ
ic WorkerLoaderProxyProvider { | 154 class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, publ
ic WorkerLoaderProxyProvider { |
| 155 public: | 155 public: |
| 156 WorkerThreadableLoaderTestHelper() | 156 WorkerThreadableLoaderTestHelper() |
| 157 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1))) | 157 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1))) |
| 158 { | 158 { |
| 159 } | 159 } |
| 160 | 160 |
| 161 void createLoader(ThreadableLoaderClient* client, CrossOriginRequestPolicy c
rossOriginRequestPolicy) override | 161 void createLoader(ThreadableLoaderClient* client, CrossOriginRequestPolicy c
rossOriginRequestPolicy) override |
| 162 { | 162 { |
| 163 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); | 163 std::unique_ptr<WaitableEvent> completionEvent = wrapUnique(new Waitable
Event()); |
| 164 postTaskToWorkerGlobalScope(createCrossThreadTask( | 164 postTaskToWorkerGlobalScope(createCrossThreadTask( |
| 165 &WorkerThreadableLoaderTestHelper::workerCreateLoader, | 165 &WorkerThreadableLoaderTestHelper::workerCreateLoader, |
| 166 AllowCrossThreadAccess(this), | 166 AllowCrossThreadAccess(this), |
| 167 AllowCrossThreadAccess(client), | 167 AllowCrossThreadAccess(client), |
| 168 AllowCrossThreadAccess(completionEvent.get()), | 168 AllowCrossThreadAccess(completionEvent.get()), |
| 169 crossOriginRequestPolicy)); | 169 crossOriginRequestPolicy)); |
| 170 completionEvent->wait(); | 170 completionEvent->wait(); |
| 171 } | 171 } |
| 172 | 172 |
| 173 void startLoader(const ResourceRequest& request) override | 173 void startLoader(const ResourceRequest& request) override |
| 174 { | 174 { |
| 175 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); | 175 std::unique_ptr<WaitableEvent> completionEvent = wrapUnique(new Waitable
Event()); |
| 176 postTaskToWorkerGlobalScope(createCrossThreadTask( | 176 postTaskToWorkerGlobalScope(createCrossThreadTask( |
| 177 &WorkerThreadableLoaderTestHelper::workerStartLoader, | 177 &WorkerThreadableLoaderTestHelper::workerStartLoader, |
| 178 AllowCrossThreadAccess(this), | 178 AllowCrossThreadAccess(this), |
| 179 AllowCrossThreadAccess(completionEvent.get()), | 179 AllowCrossThreadAccess(completionEvent.get()), |
| 180 request)); | 180 request)); |
| 181 completionEvent->wait(); | 181 completionEvent->wait(); |
| 182 } | 182 } |
| 183 | 183 |
| 184 // Must be called on the worker thread. | 184 // Must be called on the worker thread. |
| 185 void cancelLoader() override | 185 void cancelLoader() override |
| (...skipping 13 matching lines...) Expand all Loading... |
| 199 | 199 |
| 200 Checkpoint& checkpoint() override | 200 Checkpoint& checkpoint() override |
| 201 { | 201 { |
| 202 return m_checkpoint; | 202 return m_checkpoint; |
| 203 } | 203 } |
| 204 | 204 |
| 205 void callCheckpoint(int n) override | 205 void callCheckpoint(int n) override |
| 206 { | 206 { |
| 207 testing::runPendingTasks(); | 207 testing::runPendingTasks(); |
| 208 | 208 |
| 209 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); | 209 std::unique_ptr<WaitableEvent> completionEvent = wrapUnique(new Waitable
Event()); |
| 210 postTaskToWorkerGlobalScope(createCrossThreadTask( | 210 postTaskToWorkerGlobalScope(createCrossThreadTask( |
| 211 &WorkerThreadableLoaderTestHelper::workerCallCheckpoint, | 211 &WorkerThreadableLoaderTestHelper::workerCallCheckpoint, |
| 212 AllowCrossThreadAccess(this), | 212 AllowCrossThreadAccess(this), |
| 213 AllowCrossThreadAccess(completionEvent.get()), | 213 AllowCrossThreadAccess(completionEvent.get()), |
| 214 n)); | 214 n)); |
| 215 completionEvent->wait(); | 215 completionEvent->wait(); |
| 216 } | 216 } |
| 217 | 217 |
| 218 void onSetUp() override | 218 void onSetUp() override |
| 219 { | 219 { |
| 220 m_mockWorkerReportingProxy = adoptPtr(new MockWorkerReportingProxy()); | 220 m_mockWorkerReportingProxy = wrapUnique(new MockWorkerReportingProxy()); |
| 221 m_securityOrigin = document().getSecurityOrigin(); | 221 m_securityOrigin = document().getSecurityOrigin(); |
| 222 m_workerThread = adoptPtr(new WorkerThreadForTest( | 222 m_workerThread = wrapUnique(new WorkerThreadForTest( |
| 223 this, | 223 this, |
| 224 *m_mockWorkerReportingProxy)); | 224 *m_mockWorkerReportingProxy)); |
| 225 | 225 |
| 226 expectWorkerLifetimeReportingCalls(); | 226 expectWorkerLifetimeReportingCalls(); |
| 227 m_workerThread->startWithSourceCode(m_securityOrigin.get(), "//fake sour
ce code"); | 227 m_workerThread->startWithSourceCode(m_securityOrigin.get(), "//fake sour
ce code"); |
| 228 m_workerThread->waitForInit(); | 228 m_workerThread->waitForInit(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 void onServeRequests() override | 231 void onServeRequests() override |
| 232 { | 232 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 // ThreadableLoader::create() determines whether it should create | 269 // ThreadableLoader::create() determines whether it should create |
| 270 // a DocumentThreadableLoader or WorkerThreadableLoader based on | 270 // a DocumentThreadableLoader or WorkerThreadableLoader based on |
| 271 // isWorkerGlobalScope(). | 271 // isWorkerGlobalScope(). |
| 272 ASSERT(m_workerThread->workerGlobalScope()->isWorkerGlobalScope()); | 272 ASSERT(m_workerThread->workerGlobalScope()->isWorkerGlobalScope()); |
| 273 | 273 |
| 274 m_loader = ThreadableLoader::create(*m_workerThread->workerGlobalScope()
, client, options, resourceLoaderOptions); | 274 m_loader = ThreadableLoader::create(*m_workerThread->workerGlobalScope()
, client, options, resourceLoaderOptions); |
| 275 ASSERT(m_loader); | 275 ASSERT(m_loader); |
| 276 event->signal(); | 276 event->signal(); |
| 277 } | 277 } |
| 278 | 278 |
| 279 void workerStartLoader(WaitableEvent* event, PassOwnPtr<CrossThreadResourceR
equestData> requestData) | 279 void workerStartLoader(WaitableEvent* event, std::unique_ptr<CrossThreadReso
urceRequestData> requestData) |
| 280 { | 280 { |
| 281 ASSERT(m_workerThread); | 281 ASSERT(m_workerThread); |
| 282 ASSERT(m_workerThread->isCurrentThread()); | 282 ASSERT(m_workerThread->isCurrentThread()); |
| 283 | 283 |
| 284 ResourceRequest request(requestData.get()); | 284 ResourceRequest request(requestData.get()); |
| 285 m_loader->start(request); | 285 m_loader->start(request); |
| 286 event->signal(); | 286 event->signal(); |
| 287 } | 287 } |
| 288 | 288 |
| 289 void workerCallCheckpoint(WaitableEvent* event, int n) | 289 void workerCallCheckpoint(WaitableEvent* event, int n) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 303 } | 303 } |
| 304 | 304 |
| 305 bool postTaskToWorkerGlobalScope(std::unique_ptr<ExecutionContextTask> task)
override | 305 bool postTaskToWorkerGlobalScope(std::unique_ptr<ExecutionContextTask> task)
override |
| 306 { | 306 { |
| 307 ASSERT(m_workerThread); | 307 ASSERT(m_workerThread); |
| 308 m_workerThread->postTask(BLINK_FROM_HERE, std::move(task)); | 308 m_workerThread->postTask(BLINK_FROM_HERE, std::move(task)); |
| 309 return true; | 309 return true; |
| 310 } | 310 } |
| 311 | 311 |
| 312 RefPtr<SecurityOrigin> m_securityOrigin; | 312 RefPtr<SecurityOrigin> m_securityOrigin; |
| 313 OwnPtr<MockWorkerReportingProxy> m_mockWorkerReportingProxy; | 313 std::unique_ptr<MockWorkerReportingProxy> m_mockWorkerReportingProxy; |
| 314 OwnPtr<WorkerThreadForTest> m_workerThread; | 314 std::unique_ptr<WorkerThreadForTest> m_workerThread; |
| 315 | 315 |
| 316 OwnPtr<DummyPageHolder> m_dummyPageHolder; | 316 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
| 317 Checkpoint m_checkpoint; | 317 Checkpoint m_checkpoint; |
| 318 // |m_loader| must be touched only from the worker thread only. | 318 // |m_loader| must be touched only from the worker thread only. |
| 319 OwnPtr<ThreadableLoader> m_loader; | 319 std::unique_ptr<ThreadableLoader> m_loader; |
| 320 }; | 320 }; |
| 321 | 321 |
| 322 class ThreadableLoaderTest : public ::testing::TestWithParam<ThreadableLoaderToT
est> { | 322 class ThreadableLoaderTest : public ::testing::TestWithParam<ThreadableLoaderToT
est> { |
| 323 public: | 323 public: |
| 324 ThreadableLoaderTest() | 324 ThreadableLoaderTest() |
| 325 { | 325 { |
| 326 switch (GetParam()) { | 326 switch (GetParam()) { |
| 327 case DocumentThreadableLoaderTest: | 327 case DocumentThreadableLoaderTest: |
| 328 m_helper = adoptPtr(new DocumentThreadableLoaderTestHelper); | 328 m_helper = wrapUnique(new DocumentThreadableLoaderTestHelper); |
| 329 break; | 329 break; |
| 330 case WorkerThreadableLoaderTest: | 330 case WorkerThreadableLoaderTest: |
| 331 m_helper = adoptPtr(new WorkerThreadableLoaderTestHelper); | 331 m_helper = wrapUnique(new WorkerThreadableLoaderTestHelper); |
| 332 break; | 332 break; |
| 333 } | 333 } |
| 334 } | 334 } |
| 335 | 335 |
| 336 void startLoader(const KURL& url) | 336 void startLoader(const KURL& url) |
| 337 { | 337 { |
| 338 ResourceRequest request(url); | 338 ResourceRequest request(url); |
| 339 request.setRequestContext(WebURLRequest::RequestContextObject); | 339 request.setRequestContext(WebURLRequest::RequestContextObject); |
| 340 m_helper->startLoader(request); | 340 m_helper->startLoader(request); |
| 341 } | 341 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 response.initialize(); | 417 response.initialize(); |
| 418 response.setURL(url); | 418 response.setURL(url); |
| 419 response.setHTTPStatusCode(301); | 419 response.setHTTPStatusCode(301); |
| 420 response.setLoadTiming(timing); | 420 response.setLoadTiming(timing); |
| 421 response.addHTTPHeaderField("Location", redirectLoopURL().getString()); | 421 response.addHTTPHeaderField("Location", redirectLoopURL().getString()); |
| 422 response.addHTTPHeaderField("Access-Control-Allow-Origin", "null"); | 422 response.addHTTPHeaderField("Access-Control-Allow-Origin", "null"); |
| 423 | 423 |
| 424 URLTestHelpers::registerMockedURLLoadWithCustomResponse(url, "fox-null-t
erminated.html", "", response); | 424 URLTestHelpers::registerMockedURLLoadWithCustomResponse(url, "fox-null-t
erminated.html", "", response); |
| 425 } | 425 } |
| 426 | 426 |
| 427 OwnPtr<MockThreadableLoaderClient> m_client; | 427 std::unique_ptr<MockThreadableLoaderClient> m_client; |
| 428 OwnPtr<ThreadableLoaderTestHelper> m_helper; | 428 std::unique_ptr<ThreadableLoaderTestHelper> m_helper; |
| 429 }; | 429 }; |
| 430 | 430 |
| 431 INSTANTIATE_TEST_CASE_P(Document, | 431 INSTANTIATE_TEST_CASE_P(Document, |
| 432 ThreadableLoaderTest, | 432 ThreadableLoaderTest, |
| 433 ::testing::Values(DocumentThreadableLoaderTest)); | 433 ::testing::Values(DocumentThreadableLoaderTest)); |
| 434 | 434 |
| 435 INSTANTIATE_TEST_CASE_P(Worker, | 435 INSTANTIATE_TEST_CASE_P(Worker, |
| 436 ThreadableLoaderTest, | 436 ThreadableLoaderTest, |
| 437 ::testing::Values(WorkerThreadableLoaderTest)); | 437 ::testing::Values(WorkerThreadableLoaderTest)); |
| 438 | 438 |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 EXPECT_CALL(*client(), didFailRedirectCheck()).WillOnce(InvokeWithoutArgs(th
is, &ThreadableLoaderTest::clearLoader)); | 833 EXPECT_CALL(*client(), didFailRedirectCheck()).WillOnce(InvokeWithoutArgs(th
is, &ThreadableLoaderTest::clearLoader)); |
| 834 | 834 |
| 835 startLoader(redirectLoopURL()); | 835 startLoader(redirectLoopURL()); |
| 836 callCheckpoint(2); | 836 callCheckpoint(2); |
| 837 serveRequests(); | 837 serveRequests(); |
| 838 } | 838 } |
| 839 | 839 |
| 840 } // namespace | 840 } // namespace |
| 841 | 841 |
| 842 } // namespace blink | 842 } // namespace blink |
| OLD | NEW |