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/PtrUtil.h" | 33 #include "wtf/OwnPtr.h" |
| 34 #include "wtf/PassOwnPtr.h" |
34 #include "wtf/RefPtr.h" | 35 #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 std::unique_ptr<MockThreadableLoaderClient> create() | 50 static PassOwnPtr<MockThreadableLoaderClient> create() |
51 { | 51 { |
52 return wrapUnique(new ::testing::StrictMock<MockThreadableLoaderClient>)
; | 52 return adoptPtr(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, std::unique_ptr<WebDataConsumerHandle> handle) | 56 void didReceiveResponse(unsigned long identifier, const ResourceResponse& re
sponse, PassOwnPtr<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 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; | 149 OwnPtr<DummyPageHolder> m_dummyPageHolder; |
150 Checkpoint m_checkpoint; | 150 Checkpoint m_checkpoint; |
151 std::unique_ptr<DocumentThreadableLoader> m_loader; | 151 OwnPtr<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 std::unique_ptr<WaitableEvent> completionEvent = wrapUnique(new Waitable
Event()); | 163 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); |
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 std::unique_ptr<WaitableEvent> completionEvent = wrapUnique(new Waitable
Event()); | 175 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); |
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 std::unique_ptr<WaitableEvent> completionEvent = wrapUnique(new Waitable
Event()); | 209 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); |
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 = wrapUnique(new MockWorkerReportingProxy()); | 220 m_mockWorkerReportingProxy = adoptPtr(new MockWorkerReportingProxy()); |
221 m_securityOrigin = document().getSecurityOrigin(); | 221 m_securityOrigin = document().getSecurityOrigin(); |
222 m_workerThread = wrapUnique(new WorkerThreadForTest( | 222 m_workerThread = adoptPtr(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, std::unique_ptr<CrossThreadReso
urceRequestData> requestData) | 279 void workerStartLoader(WaitableEvent* event, PassOwnPtr<CrossThreadResourceR
equestData> 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 std::unique_ptr<MockWorkerReportingProxy> m_mockWorkerReportingProxy; | 313 OwnPtr<MockWorkerReportingProxy> m_mockWorkerReportingProxy; |
314 std::unique_ptr<WorkerThreadForTest> m_workerThread; | 314 OwnPtr<WorkerThreadForTest> m_workerThread; |
315 | 315 |
316 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; | 316 OwnPtr<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 std::unique_ptr<ThreadableLoader> m_loader; | 319 OwnPtr<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 = wrapUnique(new DocumentThreadableLoaderTestHelper); | 328 m_helper = adoptPtr(new DocumentThreadableLoaderTestHelper); |
329 break; | 329 break; |
330 case WorkerThreadableLoaderTest: | 330 case WorkerThreadableLoaderTest: |
331 m_helper = wrapUnique(new WorkerThreadableLoaderTestHelper); | 331 m_helper = adoptPtr(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 std::unique_ptr<MockThreadableLoaderClient> m_client; | 427 OwnPtr<MockThreadableLoaderClient> m_client; |
428 std::unique_ptr<ThreadableLoaderTestHelper> m_helper; | 428 OwnPtr<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 |