| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/fetch/FetchBlobDataConsumerHandle.h" | 5 #include "modules/fetch/FetchBlobDataConsumerHandle.h" |
| 6 | 6 |
| 7 #include "core/dom/ExecutionContext.h" | 7 #include "core/dom/ExecutionContext.h" |
| 8 #include "core/fetch/ResourceLoaderOptions.h" | 8 #include "core/fetch/ResourceLoaderOptions.h" |
| 9 #include "core/loader/ThreadableLoader.h" | 9 #include "core/loader/ThreadableLoader.h" |
| 10 #include "core/loader/ThreadableLoaderClient.h" | 10 #include "core/loader/ThreadableLoaderClient.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 using ::testing::DoAll; | 44 using ::testing::DoAll; |
| 45 using ::testing::InSequence; | 45 using ::testing::InSequence; |
| 46 using ::testing::Ref; | 46 using ::testing::Ref; |
| 47 using ::testing::Return; | 47 using ::testing::Return; |
| 48 using ::testing::SaveArg; | 48 using ::testing::SaveArg; |
| 49 using ::testing::StrictMock; | 49 using ::testing::StrictMock; |
| 50 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>; | 50 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>; |
| 51 | 51 |
| 52 class MockLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { | 52 class MockLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { |
| 53 public: | 53 public: |
| 54 MOCK_METHOD5(create, PassRefPtr<ThreadableLoader>(ExecutionContext&, Threada
bleLoaderClient*, const ResourceRequest&, const ThreadableLoaderOptions&, const
ResourceLoaderOptions&)); | 54 MOCK_METHOD4(create, PassRefPtr<ThreadableLoader>(ExecutionContext&, Threada
bleLoaderClient*, const ThreadableLoaderOptions&, const ResourceLoaderOptions&))
; |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 class MockThreadableLoader : public ThreadableLoader { | 57 class MockThreadableLoader : public ThreadableLoader { |
| 58 public: | 58 public: |
| 59 static PassRefPtr<MockThreadableLoader> create() { return adoptRef(new Stric
tMock<MockThreadableLoader>); } | 59 static PassRefPtr<MockThreadableLoader> create() { return adoptRef(new Stric
tMock<MockThreadableLoader>); } |
| 60 | 60 |
| 61 MOCK_METHOD1(start, void(const ResourceRequest&)); |
| 61 MOCK_METHOD1(overrideTimeout, void(unsigned long)); | 62 MOCK_METHOD1(overrideTimeout, void(unsigned long)); |
| 62 MOCK_METHOD0(cancel, void()); | 63 MOCK_METHOD0(cancel, void()); |
| 63 | 64 |
| 64 protected: | 65 protected: |
| 65 MockThreadableLoader() = default; | 66 MockThreadableLoader() = default; |
| 66 }; | 67 }; |
| 67 | 68 |
| 68 PassRefPtr<BlobDataHandle> createBlobDataHandle(const char* s) | 69 PassRefPtr<BlobDataHandle> createBlobDataHandle(const char* s) |
| 69 { | 70 { |
| 70 OwnPtr<BlobData> data = BlobData::create(); | 71 OwnPtr<BlobData> data = BlobData::create(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 101 Checkpoint checkpoint; | 102 Checkpoint checkpoint; |
| 102 | 103 |
| 103 ResourceRequest request; | 104 ResourceRequest request; |
| 104 ThreadableLoaderOptions options; | 105 ThreadableLoaderOptions options; |
| 105 ResourceLoaderOptions resourceLoaderOptions; | 106 ResourceLoaderOptions resourceLoaderOptions; |
| 106 | 107 |
| 107 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 108 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 108 | 109 |
| 109 InSequence s; | 110 InSequence s; |
| 110 EXPECT_CALL(checkpoint, Call(1)); | 111 EXPECT_CALL(checkpoint, Call(1)); |
| 111 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll( | 112 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll( |
| 112 SaveArg<2>(&request), | 113 SaveArg<2>(&options), |
| 113 SaveArg<3>(&options), | 114 SaveArg<3>(&resourceLoaderOptions), |
| 114 SaveArg<4>(&resourceLoaderOptions), | |
| 115 Return(loader.get()))); | 115 Return(loader.get()))); |
| 116 EXPECT_CALL(*loader, start(_)).WillOnce(SaveArg<0>(&request)); |
| 116 EXPECT_CALL(checkpoint, Call(2)); | 117 EXPECT_CALL(checkpoint, Call(2)); |
| 117 EXPECT_CALL(*loader, cancel()); | 118 EXPECT_CALL(*loader, cancel()); |
| 118 | 119 |
| 119 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 120 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 120 OwnPtr<WebDataConsumerHandle> handle | 121 OwnPtr<WebDataConsumerHandle> handle |
| 121 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 122 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 122 testing::runPendingTasks(); | 123 testing::runPendingTasks(); |
| 123 | 124 |
| 124 size_t size = 0; | 125 size_t size = 0; |
| 125 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); | 126 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 145 | 146 |
| 146 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenStopped) | 147 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenStopped) |
| 147 { | 148 { |
| 148 auto factory = new StrictMock<MockLoaderFactory>; | 149 auto factory = new StrictMock<MockLoaderFactory>; |
| 149 Checkpoint checkpoint; | 150 Checkpoint checkpoint; |
| 150 | 151 |
| 151 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 152 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 152 | 153 |
| 153 InSequence s; | 154 InSequence s; |
| 154 EXPECT_CALL(checkpoint, Call(1)); | 155 EXPECT_CALL(checkpoint, Call(1)); |
| 155 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(Return(l
oader.get())); | 156 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(Return(load
er.get())); |
| 157 EXPECT_CALL(*loader, start(_)); |
| 156 EXPECT_CALL(checkpoint, Call(2)); | 158 EXPECT_CALL(checkpoint, Call(2)); |
| 157 EXPECT_CALL(*loader, cancel()); | 159 EXPECT_CALL(*loader, cancel()); |
| 158 EXPECT_CALL(checkpoint, Call(3)); | 160 EXPECT_CALL(checkpoint, Call(3)); |
| 159 | 161 |
| 160 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 162 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 161 OwnPtr<WebDataConsumerHandle> handle | 163 OwnPtr<WebDataConsumerHandle> handle |
| 162 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 164 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 163 testing::runPendingTasks(); | 165 testing::runPendingTasks(); |
| 164 | 166 |
| 165 size_t size = 0; | 167 size_t size = 0; |
| 166 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); | 168 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); |
| 167 checkpoint.Call(1); | 169 checkpoint.Call(1); |
| 168 testing::runPendingTasks(); | 170 testing::runPendingTasks(); |
| 169 checkpoint.Call(2); | 171 checkpoint.Call(2); |
| 170 document().stopActiveDOMObjects(); | 172 document().stopActiveDOMObjects(); |
| 171 checkpoint.Call(3); | 173 checkpoint.Call(3); |
| 172 } | 174 } |
| 173 | 175 |
| 174 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenDestinationDetached) | 176 TEST_F(FetchBlobDataConsumerHandleTest, CancelLoaderWhenDestinationDetached) |
| 175 { | 177 { |
| 176 auto factory = new StrictMock<MockLoaderFactory>; | 178 auto factory = new StrictMock<MockLoaderFactory>; |
| 177 Checkpoint checkpoint; | 179 Checkpoint checkpoint; |
| 178 | 180 |
| 179 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 181 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 180 | 182 |
| 181 InSequence s; | 183 InSequence s; |
| 182 EXPECT_CALL(checkpoint, Call(1)); | 184 EXPECT_CALL(checkpoint, Call(1)); |
| 183 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(Return(l
oader.get())); | 185 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(Return(load
er.get())); |
| 186 EXPECT_CALL(*loader, start(_)); |
| 184 EXPECT_CALL(checkpoint, Call(2)); | 187 EXPECT_CALL(checkpoint, Call(2)); |
| 185 EXPECT_CALL(checkpoint, Call(3)); | 188 EXPECT_CALL(checkpoint, Call(3)); |
| 186 EXPECT_CALL(*loader, cancel()); | 189 EXPECT_CALL(*loader, cancel()); |
| 187 EXPECT_CALL(checkpoint, Call(4)); | 190 EXPECT_CALL(checkpoint, Call(4)); |
| 188 | 191 |
| 189 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 192 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 190 OwnPtr<WebDataConsumerHandle> handle | 193 OwnPtr<WebDataConsumerHandle> handle |
| 191 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 194 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 192 OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr)
; | 195 OwnPtr<WebDataConsumerHandle::Reader> reader = handle->obtainReader(nullptr)
; |
| 193 testing::runPendingTasks(); | 196 testing::runPendingTasks(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 207 TEST_F(FetchBlobDataConsumerHandleTest, ReadTest) | 210 TEST_F(FetchBlobDataConsumerHandleTest, ReadTest) |
| 208 { | 211 { |
| 209 auto factory = new StrictMock<MockLoaderFactory>; | 212 auto factory = new StrictMock<MockLoaderFactory>; |
| 210 Checkpoint checkpoint; | 213 Checkpoint checkpoint; |
| 211 | 214 |
| 212 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 215 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 213 ThreadableLoaderClient* client = nullptr; | 216 ThreadableLoaderClient* client = nullptr; |
| 214 | 217 |
| 215 InSequence s; | 218 InSequence s; |
| 216 EXPECT_CALL(checkpoint, Call(1)); | 219 EXPECT_CALL(checkpoint, Call(1)); |
| 217 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 220 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 221 EXPECT_CALL(*loader, start(_)); |
| 218 EXPECT_CALL(checkpoint, Call(2)); | 222 EXPECT_CALL(checkpoint, Call(2)); |
| 219 EXPECT_CALL(*loader, cancel()); | 223 EXPECT_CALL(*loader, cancel()); |
| 220 | 224 |
| 221 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 225 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 222 OwnPtr<WebDataConsumerHandle> handle | 226 OwnPtr<WebDataConsumerHandle> handle |
| 223 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 227 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 224 | 228 |
| 225 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); | 229 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); |
| 226 src->add(Command(Command::Wait)); | 230 src->add(Command(Command::Wait)); |
| 227 src->add(Command(Command::Data, "hello, ")); | 231 src->add(Command(Command::Data, "hello, ")); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 244 TEST_F(FetchBlobDataConsumerHandleTest, TwoPhaseReadTest) | 248 TEST_F(FetchBlobDataConsumerHandleTest, TwoPhaseReadTest) |
| 245 { | 249 { |
| 246 auto factory = new StrictMock<MockLoaderFactory>; | 250 auto factory = new StrictMock<MockLoaderFactory>; |
| 247 Checkpoint checkpoint; | 251 Checkpoint checkpoint; |
| 248 | 252 |
| 249 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 253 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 250 ThreadableLoaderClient* client = nullptr; | 254 ThreadableLoaderClient* client = nullptr; |
| 251 | 255 |
| 252 InSequence s; | 256 InSequence s; |
| 253 EXPECT_CALL(checkpoint, Call(1)); | 257 EXPECT_CALL(checkpoint, Call(1)); |
| 254 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 258 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 259 EXPECT_CALL(*loader, start(_)); |
| 255 EXPECT_CALL(checkpoint, Call(2)); | 260 EXPECT_CALL(checkpoint, Call(2)); |
| 256 EXPECT_CALL(*loader, cancel()); | 261 EXPECT_CALL(*loader, cancel()); |
| 257 | 262 |
| 258 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 263 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 259 OwnPtr<WebDataConsumerHandle> handle | 264 OwnPtr<WebDataConsumerHandle> handle |
| 260 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 265 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 261 | 266 |
| 262 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); | 267 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); |
| 263 src->add(Command(Command::Wait)); | 268 src->add(Command(Command::Wait)); |
| 264 src->add(Command(Command::Data, "hello, ")); | 269 src->add(Command(Command::Data, "hello, ")); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 281 TEST_F(FetchBlobDataConsumerHandleTest, LoadErrorTest) | 286 TEST_F(FetchBlobDataConsumerHandleTest, LoadErrorTest) |
| 282 { | 287 { |
| 283 auto factory = new StrictMock<MockLoaderFactory>; | 288 auto factory = new StrictMock<MockLoaderFactory>; |
| 284 Checkpoint checkpoint; | 289 Checkpoint checkpoint; |
| 285 | 290 |
| 286 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 291 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 287 ThreadableLoaderClient* client = nullptr; | 292 ThreadableLoaderClient* client = nullptr; |
| 288 | 293 |
| 289 InSequence s; | 294 InSequence s; |
| 290 EXPECT_CALL(checkpoint, Call(1)); | 295 EXPECT_CALL(checkpoint, Call(1)); |
| 291 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 296 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 297 EXPECT_CALL(*loader, start(_)); |
| 292 EXPECT_CALL(checkpoint, Call(2)); | 298 EXPECT_CALL(checkpoint, Call(2)); |
| 293 | 299 |
| 294 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 300 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 295 OwnPtr<WebDataConsumerHandle> handle | 301 OwnPtr<WebDataConsumerHandle> handle |
| 296 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 302 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 297 | 303 |
| 298 size_t size = 0; | 304 size_t size = 0; |
| 299 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); | 305 handle->obtainReader(nullptr)->read(nullptr, 0, kNone, &size); |
| 300 checkpoint.Call(1); | 306 checkpoint.Call(1); |
| 301 testing::runPendingTasks(); | 307 testing::runPendingTasks(); |
| 302 checkpoint.Call(2); | 308 checkpoint.Call(2); |
| 303 client->didFail(ResourceError()); | 309 client->didFail(ResourceError()); |
| 304 HandleReaderRunner<HandleReader> runner(handle.release()); | 310 HandleReaderRunner<HandleReader> runner(handle.release()); |
| 305 OwnPtr<HandleReadResult> r = runner.wait(); | 311 OwnPtr<HandleReadResult> r = runner.wait(); |
| 306 EXPECT_EQ(kUnexpectedError, r->result()); | 312 EXPECT_EQ(kUnexpectedError, r->result()); |
| 307 } | 313 } |
| 308 | 314 |
| 309 TEST_F(FetchBlobDataConsumerHandleTest, BodyLoadErrorTest) | 315 TEST_F(FetchBlobDataConsumerHandleTest, BodyLoadErrorTest) |
| 310 { | 316 { |
| 311 auto factory = new StrictMock<MockLoaderFactory>; | 317 auto factory = new StrictMock<MockLoaderFactory>; |
| 312 Checkpoint checkpoint; | 318 Checkpoint checkpoint; |
| 313 | 319 |
| 314 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); | 320 RefPtr<MockThreadableLoader> loader = MockThreadableLoader::create(); |
| 315 ThreadableLoaderClient* client = nullptr; | 321 ThreadableLoaderClient* client = nullptr; |
| 316 | 322 |
| 317 InSequence s; | 323 InSequence s; |
| 318 EXPECT_CALL(checkpoint, Call(1)); | 324 EXPECT_CALL(checkpoint, Call(1)); |
| 319 EXPECT_CALL(*factory, create(Ref(document()), _, _, _, _)).WillOnce(DoAll(Sa
veArg<1>(&client), Return(loader.get()))); | 325 EXPECT_CALL(*factory, create(Ref(document()), _, _, _)).WillOnce(DoAll(SaveA
rg<1>(&client), Return(loader.get()))); |
| 326 EXPECT_CALL(*loader, start(_)); |
| 320 EXPECT_CALL(checkpoint, Call(2)); | 327 EXPECT_CALL(checkpoint, Call(2)); |
| 321 EXPECT_CALL(*loader, cancel()); | 328 EXPECT_CALL(*loader, cancel()); |
| 322 | 329 |
| 323 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); | 330 RefPtr<BlobDataHandle> blobDataHandle = createBlobDataHandle("Once upon a ti
me"); |
| 324 OwnPtr<WebDataConsumerHandle> handle | 331 OwnPtr<WebDataConsumerHandle> handle |
| 325 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); | 332 = FetchBlobDataConsumerHandle::create(&document(), blobDataHandle, facto
ry); |
| 326 | 333 |
| 327 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); | 334 OwnPtr<ReplayingHandle> src = ReplayingHandle::create(); |
| 328 src->add(Command(Command::Wait)); | 335 src->add(Command(Command::Wait)); |
| 329 src->add(Command(Command::Data, "hello, ")); | 336 src->add(Command(Command::Data, "hello, ")); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullpt
r); | 422 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(nullpt
r); |
| 416 | 423 |
| 417 const void* buffer; | 424 const void* buffer; |
| 418 size_t available; | 425 size_t available; |
| 419 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); | 426 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); |
| 420 EXPECT_FALSE(reader->drainAsBlobDataHandle()); | 427 EXPECT_FALSE(reader->drainAsBlobDataHandle()); |
| 421 } | 428 } |
| 422 | 429 |
| 423 } // namespace | 430 } // namespace |
| 424 } // namespace blink | 431 } // namespace blink |
| OLD | NEW |