OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/browser/loader/intercepting_resource_handler.h" | |
6 | |
7 #include <stdint.h> | |
8 | |
9 #include <memory> | |
10 | |
11 #include "base/files/file_path.h" | |
12 #include "base/location.h" | |
13 #include "base/logging.h" | |
14 #include "base/macros.h" | |
15 #include "base/single_thread_task_runner.h" | |
16 #include "base/threading/thread_task_runner_handle.h" | |
17 #include "content/public/browser/resource_controller.h" | |
18 #include "content/public/browser/resource_request_info.h" | |
19 #include "content/public/common/resource_response.h" | |
20 #include "content/public/common/webplugininfo.h" | |
21 #include "content/public/test/test_browser_thread_bundle.h" | |
22 #include "content/public/test/test_utils.h" | |
23 #include "net/base/net_errors.h" | |
24 #include "net/url_request/url_request_context.h" | |
25 #include "net/url_request/url_request_status.h" | |
26 #include "testing/gtest/include/gtest/gtest.h" | |
27 #include "url/gurl.h" | |
28 | |
29 namespace content { | |
30 | |
31 namespace { | |
32 | |
33 class TestResourceHandler : public ResourceHandler { | |
34 public: | |
35 explicit TestResourceHandler(net::URLRequestStatus* request_status) | |
36 : TestResourceHandler(request_status, true, true, true) {} | |
37 | |
38 TestResourceHandler(net::URLRequestStatus* request_status, | |
39 bool on_response_started, | |
40 bool on_will_read, | |
41 bool on_read_completed) | |
42 : ResourceHandler(nullptr), | |
43 buffer_(new net::IOBuffer(2048)), | |
44 request_status_(request_status), | |
45 on_response_started_(on_response_started), | |
46 on_will_read_(on_will_read), | |
47 on_read_completed_(on_read_completed) { | |
48 memset(buffer_->data(), '\0', 2048); | |
49 } | |
50 | |
51 ~TestResourceHandler() override {} | |
52 | |
53 void SetController(ResourceController* controller) override {} | |
54 | |
55 bool OnRequestRedirected(const net::RedirectInfo& redirect_info, | |
56 ResourceResponse* response, | |
57 bool* defer) override { | |
58 NOTREACHED(); | |
59 return false; | |
60 } | |
61 | |
62 bool OnResponseStarted(ResourceResponse* response, bool* defer) override { | |
63 return on_response_started_; | |
64 } | |
65 | |
66 bool OnWillStart(const GURL& url, bool* defer) override { return false; } | |
67 | |
68 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, | |
69 int* buf_size, | |
70 int min_size) override { | |
71 *buf = buffer_; | |
72 *buf_size = 2048; | |
73 return on_will_read_; | |
74 } | |
75 | |
76 bool OnReadCompleted(int bytes_read, bool* defer) override { | |
mmenke
2016/07/25 17:39:31
Seems like we should also record and check bytes_r
clamy
2016/07/26 16:24:15
Done.
| |
77 DCHECK_LT(bytes_read, 2048); | |
78 return on_read_completed_; | |
79 } | |
80 | |
81 void OnResponseCompleted(const net::URLRequestStatus& status, | |
82 const std::string& security_info, | |
83 bool* defer) override { | |
84 *request_status_ = status; | |
85 } | |
86 | |
87 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); } | |
88 | |
89 scoped_refptr<net::IOBuffer> buffer() { return buffer_; } | |
90 | |
91 private: | |
92 scoped_refptr<net::IOBuffer> buffer_; | |
93 net::URLRequestStatus* request_status_; | |
94 bool on_response_started_; | |
95 bool on_will_read_; | |
96 bool on_read_completed_; | |
97 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler); | |
mmenke
2016/07/25 17:39:31
nit: Blank line before DISALLOW_COPY_AND_ASSIGN.
clamy
2016/07/26 16:24:15
Done.
| |
98 }; | |
99 | |
100 class InterceptingResourceHandlerTest : public testing::Test { | |
101 public: | |
102 InterceptingResourceHandlerTest() {} | |
103 | |
104 private: | |
105 TestBrowserThreadBundle thread_bundle_; | |
106 }; | |
107 | |
108 // Tests that the data received is transmitted to the newly created | |
109 // ResourceHandler. | |
110 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) { | |
111 net::URLRequestContext context; | |
112 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
113 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
114 ResourceRequestInfo::AllocateForTesting(request.get(), | |
115 RESOURCE_TYPE_MAIN_FRAME, | |
116 nullptr, // context | |
117 0, // render_process_id | |
118 0, // render_view_id | |
119 0, // render_frame_id | |
120 true, // is_main_frame | |
121 false, // parent_is_main_frame | |
122 true, // allow_download | |
123 true, // is_async | |
124 false); // is_using_lofi | |
125 | |
126 net::URLRequestStatus old_handler_status; | |
127 std::unique_ptr<ResourceHandler> old_handler( | |
128 new TestResourceHandler(&old_handler_status)); | |
129 scoped_refptr<net::IOBuffer> old_buffer = | |
130 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
131 std::unique_ptr<ResourceHandler> handler( | |
132 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
133 InterceptingResourceHandler* intercepting_handler = | |
134 static_cast<InterceptingResourceHandler*>(handler.get()); | |
135 | |
136 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
137 | |
138 // Simulate the MimeSniffingResourceHandler buffering the data. | |
139 scoped_refptr<net::IOBuffer> read_buffer; | |
140 int buf_size = 0; | |
141 handler->OnWillRead(&read_buffer, &buf_size, -1); | |
142 | |
143 const char kData[] = "The data"; | |
144 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
145 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
146 | |
147 // Simulate the MimeSniffingResourceHandler asking the | |
148 // InterceptingResourceHandler to switch to a new handler. | |
149 net::URLRequestStatus new_handler_status; | |
150 std::unique_ptr<ResourceHandler> new_handler( | |
151 new TestResourceHandler(&new_handler_status)); | |
152 TestResourceHandler* new_test_handler = | |
153 static_cast<TestResourceHandler*>(new_handler.get()); | |
154 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
155 | |
156 // The response is received. The new ResourceHandler should be used handle | |
157 // the download. | |
158 bool defer = false; | |
159 handler->OnResponseStarted(response.get(), &defer); | |
160 EXPECT_FALSE(defer); | |
161 | |
162 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); | |
163 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); | |
164 | |
165 // It should not have received the download data yet. | |
166 EXPECT_FALSE( | |
167 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
168 | |
169 // The read is replayed by the MimeSniffingResourceHandler. The data should | |
170 // have been received by the new handler. | |
171 handler->OnReadCompleted(sizeof(kData), &defer); | |
172 EXPECT_FALSE(defer); | |
173 EXPECT_TRUE( | |
174 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
175 | |
176 // Make sure another read behave as expected. | |
177 memset(new_test_handler->buffer()->data(), '\0', 2048); | |
178 buf_size = 0; | |
179 handler->OnWillRead(&read_buffer, &buf_size, -1); | |
180 CHECK_EQ(read_buffer.get(), new_test_handler->buffer()); | |
181 | |
182 const char kData2[] = "Data 2"; | |
183 EXPECT_FALSE( | |
184 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
185 memcpy(read_buffer->data(), kData2, sizeof(kData2)); | |
186 | |
187 handler->OnReadCompleted(sizeof(kData2), &defer); | |
188 EXPECT_FALSE(defer); | |
189 EXPECT_TRUE( | |
190 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
191 } | |
192 | |
193 // Tests that the data received is transmitted to the newly created | |
194 // ResourceHandler and the payload to the old ResourceHandler. | |
195 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchWithPayload) { | |
196 net::URLRequestContext context; | |
197 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
198 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
199 ResourceRequestInfo::AllocateForTesting(request.get(), | |
200 RESOURCE_TYPE_MAIN_FRAME, | |
201 nullptr, // context | |
202 0, // render_process_id | |
203 0, // render_view_id | |
204 0, // render_frame_id | |
205 true, // is_main_frame | |
206 false, // parent_is_main_frame | |
207 true, // allow_download | |
208 true, // is_async | |
209 false); // is_using_lofi | |
210 | |
211 net::URLRequestStatus old_handler_status; | |
212 std::unique_ptr<ResourceHandler> old_handler( | |
213 new TestResourceHandler(&old_handler_status)); | |
214 scoped_refptr<net::IOBuffer> old_buffer = | |
215 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
216 std::unique_ptr<ResourceHandler> handler( | |
217 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
218 InterceptingResourceHandler* intercepting_handler = | |
219 static_cast<InterceptingResourceHandler*>(handler.get()); | |
220 | |
221 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
222 | |
223 // Simulate the MimeSniffingResourceHandler buffering the data. | |
224 scoped_refptr<net::IOBuffer> read_buffer; | |
225 int buf_size = 0; | |
226 handler->OnWillRead(&read_buffer, &buf_size, -1); | |
227 | |
228 const char kData[] = "The data"; | |
229 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
230 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
231 | |
232 // Simulate the MimeSniffingResourceHandler asking the | |
233 // InterceptingResourceHandler to switch to a new handler. | |
234 const char kPayload[] = "The payload"; | |
235 net::URLRequestStatus new_handler_status; | |
236 std::unique_ptr<ResourceHandler> new_handler( | |
237 new TestResourceHandler(&new_handler_status)); | |
238 TestResourceHandler* new_test_handler = | |
239 static_cast<TestResourceHandler*>(new_handler.get()); | |
240 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload); | |
241 | |
242 // The old handler should not have received the payload yet. | |
243 EXPECT_FALSE(!memcmp(kPayload, old_buffer->data(), sizeof(kPayload))); | |
244 | |
245 // The response is received. The new ResourceHandler should be used to handle | |
246 // the download. | |
247 bool defer = false; | |
248 handler->OnResponseStarted(response.get(), &defer); | |
249 EXPECT_FALSE(defer); | |
250 | |
251 // The old handler should have received the payload. | |
252 EXPECT_TRUE(!memcmp(kPayload, old_buffer->data(), sizeof(kPayload))); | |
253 | |
254 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status.status()); | |
255 EXPECT_EQ(net::OK, old_handler_status.error()); | |
256 | |
257 // It should not have received the download data yet. | |
258 EXPECT_FALSE( | |
259 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
260 | |
261 // The read is replayed by the MimeSniffingResourceHandler. The data should | |
262 // have been received by the new handler. | |
263 handler->OnReadCompleted(sizeof(kData), &defer); | |
264 EXPECT_FALSE(defer); | |
265 EXPECT_TRUE( | |
266 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
267 | |
268 // Make sure another read behave as expected. | |
269 memset(new_test_handler->buffer()->data(), '\0', 2048); | |
270 buf_size = 0; | |
271 handler->OnWillRead(&read_buffer, &buf_size, -1); | |
272 CHECK_EQ(read_buffer.get(), new_test_handler->buffer()); | |
273 | |
274 const char kData2[] = "Data 2"; | |
275 EXPECT_FALSE( | |
276 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
277 memcpy(read_buffer->data(), kData2, sizeof(kData2)); | |
278 | |
279 handler->OnReadCompleted(sizeof(kData2), &defer); | |
280 EXPECT_FALSE(defer); | |
281 EXPECT_TRUE( | |
282 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
283 } | |
284 | |
285 // Tests that the handler behaves properly when it doesn't have to use an | |
286 // alternate next handler. | |
287 TEST_F(InterceptingResourceHandlerTest, NoSwitching) { | |
288 net::URLRequestContext context; | |
289 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
290 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
291 ResourceRequestInfo::AllocateForTesting(request.get(), | |
292 RESOURCE_TYPE_MAIN_FRAME, | |
293 nullptr, // context | |
294 0, // render_process_id | |
295 0, // render_view_id | |
296 0, // render_frame_id | |
297 true, // is_main_frame | |
298 false, // parent_is_main_frame | |
299 true, // allow_download | |
300 true, // is_async | |
301 false); // is_using_lofi | |
302 | |
303 net::URLRequestStatus old_handler_status; | |
304 std::unique_ptr<ResourceHandler> old_handler( | |
305 new TestResourceHandler(&old_handler_status)); | |
306 scoped_refptr<net::IOBuffer> old_buffer = | |
307 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
308 std::unique_ptr<ResourceHandler> handler( | |
309 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
310 | |
311 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
312 | |
313 // Simulate the MimeSniffingResourceHandler buffering the data. | |
314 scoped_refptr<net::IOBuffer> read_buffer; | |
315 int buf_size = 0; | |
316 handler->OnWillRead(&read_buffer, &buf_size, -1); | |
317 | |
318 const char kData[] = "The data"; | |
319 EXPECT_FALSE(!memcmp(kData, old_buffer->data(), sizeof(kData))); | |
320 | |
321 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
322 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
323 | |
324 // The response is received. The new handler should not change. | |
325 bool defer = false; | |
326 handler->OnResponseStarted(response.get(), &defer); | |
327 EXPECT_FALSE(defer); | |
328 | |
329 // The read is replayed by the MimeSniffingResourceHandler. The data should | |
330 // have been received by the old handler. | |
331 handler->OnReadCompleted(sizeof(kData), &defer); | |
332 EXPECT_FALSE(defer); | |
333 EXPECT_TRUE(!memcmp(kData, old_buffer->data(), sizeof(kData))); | |
334 | |
335 // Make sure another read behave as expected. | |
336 memset(old_buffer->data(), '\0', 2048); | |
337 buf_size = 0; | |
338 handler->OnWillRead(&read_buffer, &buf_size, -1); | |
339 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
340 | |
341 const char kData2[] = "Data 2"; | |
342 EXPECT_FALSE(!memcmp(kData2, old_buffer->data(), sizeof(kData2))); | |
343 memcpy(read_buffer->data(), kData2, sizeof(kData2)); | |
344 | |
345 handler->OnReadCompleted(sizeof(kData2), &defer); | |
346 EXPECT_FALSE(defer); | |
347 EXPECT_TRUE(!memcmp(kData2, old_buffer->data(), sizeof(kData2))); | |
348 } | |
349 | |
350 // Tests that the handler behaves properly if the old handler fails will read. | |
351 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) { | |
352 net::URLRequestContext context; | |
353 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
354 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
355 ResourceRequestInfo::AllocateForTesting(request.get(), | |
356 RESOURCE_TYPE_MAIN_FRAME, | |
357 nullptr, // context | |
358 0, // render_process_id | |
359 0, // render_view_id | |
360 0, // render_frame_id | |
361 true, // is_main_frame | |
362 false, // parent_is_main_frame | |
363 true, // allow_download | |
364 true, // is_async | |
365 false); // is_using_lofi | |
366 | |
367 net::URLRequestStatus old_handler_status; | |
368 std::unique_ptr<ResourceHandler> old_handler( | |
369 new TestResourceHandler(&old_handler_status, true, false, true)); | |
370 scoped_refptr<net::IOBuffer> old_buffer = | |
371 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
372 std::unique_ptr<ResourceHandler> handler( | |
373 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
374 | |
375 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
376 | |
377 // Simulate the MimeSniffingResourceHandler buffering the data. The old | |
378 // handler should tell us to fail. | |
379 scoped_refptr<net::IOBuffer> read_buffer; | |
380 int buf_size = 0; | |
381 EXPECT_FALSE(handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
382 } | |
383 | |
384 // Tests that the handler behaves properly if the new handler fails response | |
385 // started. | |
386 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) { | |
387 net::URLRequestContext context; | |
388 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
389 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
390 ResourceRequestInfo::AllocateForTesting(request.get(), | |
391 RESOURCE_TYPE_MAIN_FRAME, | |
392 nullptr, // context | |
393 0, // render_process_id | |
394 0, // render_view_id | |
395 0, // render_frame_id | |
396 true, // is_main_frame | |
397 false, // parent_is_main_frame | |
398 true, // allow_download | |
399 true, // is_async | |
400 false); // is_using_lofi | |
401 | |
402 net::URLRequestStatus old_handler_status; | |
403 std::unique_ptr<ResourceHandler> old_handler( | |
404 new TestResourceHandler(&old_handler_status)); | |
405 scoped_refptr<net::IOBuffer> old_buffer = | |
406 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
407 std::unique_ptr<ResourceHandler> handler( | |
408 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
409 InterceptingResourceHandler* intercepting_handler = | |
410 static_cast<InterceptingResourceHandler*>(handler.get()); | |
411 | |
412 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
413 | |
414 // Simulate the MimeSniffingResourceHandler buffering the data. | |
415 scoped_refptr<net::IOBuffer> read_buffer; | |
416 int buf_size = 0; | |
417 EXPECT_TRUE(handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
418 | |
419 const char kData[] = "The data"; | |
420 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
421 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
422 | |
423 // Simulate the MimeSniffingResourceHandler asking the | |
424 // InterceptingResourceHandler to switch to a new handler. | |
425 net::URLRequestStatus new_handler_status; | |
426 std::unique_ptr<ResourceHandler> new_handler( | |
427 new TestResourceHandler(&new_handler_status, false, true, true)); | |
428 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
429 | |
430 // The response is received. The new ResourceHandler should tell us to fail. | |
431 bool defer = false; | |
432 EXPECT_FALSE(handler->OnResponseStarted(response.get(), &defer)); | |
433 EXPECT_FALSE(defer); | |
434 } | |
435 | |
436 // Tests that the handler behaves properly if the new handler fails will read. | |
437 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) { | |
438 net::URLRequestContext context; | |
439 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
440 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
441 ResourceRequestInfo::AllocateForTesting(request.get(), | |
442 RESOURCE_TYPE_MAIN_FRAME, | |
443 nullptr, // context | |
444 0, // render_process_id | |
445 0, // render_view_id | |
446 0, // render_frame_id | |
447 true, // is_main_frame | |
448 false, // parent_is_main_frame | |
449 true, // allow_download | |
450 true, // is_async | |
451 false); // is_using_lofi | |
452 | |
453 net::URLRequestStatus old_handler_status; | |
454 std::unique_ptr<ResourceHandler> old_handler( | |
455 new TestResourceHandler(&old_handler_status)); | |
456 scoped_refptr<net::IOBuffer> old_buffer = | |
457 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
458 std::unique_ptr<ResourceHandler> handler( | |
459 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
460 InterceptingResourceHandler* intercepting_handler = | |
461 static_cast<InterceptingResourceHandler*>(handler.get()); | |
462 | |
463 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
464 | |
465 // Simulate the MimeSniffingResourceHandler buffering the data. | |
466 scoped_refptr<net::IOBuffer> read_buffer; | |
467 int buf_size = 0; | |
468 EXPECT_TRUE(handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
469 | |
470 const char kData[] = "The data"; | |
471 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
472 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
473 | |
474 // Simulate the MimeSniffingResourceHandler asking the | |
475 // InterceptingResourceHandler to switch to a new handler. | |
476 net::URLRequestStatus new_handler_status; | |
477 std::unique_ptr<ResourceHandler> new_handler( | |
478 new TestResourceHandler(&new_handler_status, true, false, true)); | |
479 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
480 | |
481 // The response is received. The new handler should not have been asked to | |
482 // read yet. | |
483 bool defer = false; | |
484 EXPECT_TRUE(handler->OnResponseStarted(response.get(), &defer)); | |
485 EXPECT_FALSE(defer); | |
486 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); | |
487 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); | |
488 | |
489 // The read is replayed by the MimeSniffingResourceHandler. The new handler | |
490 // should tell us to fail. | |
491 EXPECT_FALSE(handler->OnReadCompleted(sizeof(kData), &defer)); | |
492 EXPECT_FALSE(defer); | |
493 } | |
494 | |
495 // Tests that the handler behaves properly if the new handler fails read | |
496 // completed. | |
497 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) { | |
498 net::URLRequestContext context; | |
499 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
500 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
501 ResourceRequestInfo::AllocateForTesting(request.get(), | |
502 RESOURCE_TYPE_MAIN_FRAME, | |
503 nullptr, // context | |
504 0, // render_process_id | |
505 0, // render_view_id | |
506 0, // render_frame_id | |
507 true, // is_main_frame | |
508 false, // parent_is_main_frame | |
509 true, // allow_download | |
510 true, // is_async | |
511 false); // is_using_lofi | |
512 | |
513 net::URLRequestStatus old_handler_status; | |
514 std::unique_ptr<ResourceHandler> old_handler( | |
515 new TestResourceHandler(&old_handler_status)); | |
516 scoped_refptr<net::IOBuffer> old_buffer = | |
517 static_cast<TestResourceHandler*>(old_handler.get())->buffer(); | |
518 std::unique_ptr<ResourceHandler> handler( | |
519 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
520 InterceptingResourceHandler* intercepting_handler = | |
521 static_cast<InterceptingResourceHandler*>(handler.get()); | |
522 | |
523 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
524 | |
525 // Simulate the MimeSniffingResourceHandler buffering the data. | |
526 scoped_refptr<net::IOBuffer> read_buffer; | |
527 int buf_size = 0; | |
528 EXPECT_TRUE(handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
529 | |
530 const char kData[] = "The data"; | |
531 CHECK_EQ(read_buffer.get(), old_buffer.get()); | |
532 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
533 | |
534 // Simulate the MimeSniffingResourceHandler asking the | |
535 // InterceptingResourceHandler to switch to a new handler. | |
536 net::URLRequestStatus new_handler_status; | |
537 std::unique_ptr<ResourceHandler> new_handler( | |
538 new TestResourceHandler(&new_handler_status, true, true, false)); | |
539 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
540 | |
541 // The response is received. | |
542 bool defer = false; | |
543 EXPECT_TRUE(handler->OnResponseStarted(response.get(), &defer)); | |
544 EXPECT_FALSE(defer); | |
545 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); | |
546 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); | |
547 | |
548 // The read is replayed by the MimeSniffingResourceHandler. The new handler | |
549 // should tell us to fail. | |
550 EXPECT_FALSE(handler->OnReadCompleted(sizeof(kData), &defer)); | |
551 EXPECT_FALSE(defer); | |
552 } | |
553 | |
554 } // namespace | |
555 | |
556 } // namespace content | |
OLD | NEW |