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 // A test version of a ResourceHandler. |request_status| and | |
36 // |final_bytes_read| will be updated when the response is complete with the | |
37 // final status of the request received by the handler, and the total bytes | |
38 // the handler saw. | |
39 explicit TestResourceHandler(net::URLRequestStatus* request_status, | |
40 size_t* final_bytes_read) | |
41 : TestResourceHandler(request_status, | |
42 final_bytes_read, | |
43 true /* on_response_started_result */, | |
44 true /* on_will_read_result */, | |
45 true /* on_read_completed_result */) {} | |
46 | |
47 // This constructor allows to specify return values for OnResponseStarted, | |
48 // OnWillRead and OnReadCompleted. | |
49 TestResourceHandler(net::URLRequestStatus* request_status, | |
50 size_t* final_bytes_read, | |
51 bool on_response_started_result, | |
52 bool on_will_read_result, | |
53 bool on_read_completed_result) | |
54 : ResourceHandler(nullptr), | |
55 buffer_(new net::IOBuffer(2048)), | |
56 request_status_(request_status), | |
57 final_bytes_read_(final_bytes_read), | |
58 on_response_started_result_(on_response_started_result), | |
59 on_will_read_result_(on_will_read_result), | |
60 on_read_completed_result_(on_read_completed_result), | |
61 bytes_read_(0), | |
62 is_completed_(false) { | |
63 memset(buffer_->data(), '\0', 2048); | |
64 } | |
65 | |
66 ~TestResourceHandler() override {} | |
67 | |
68 void SetController(ResourceController* controller) override {} | |
69 | |
70 bool OnRequestRedirected(const net::RedirectInfo& redirect_info, | |
71 ResourceResponse* response, | |
72 bool* defer) override { | |
73 NOTREACHED(); | |
74 return false; | |
75 } | |
76 | |
77 bool OnResponseStarted(ResourceResponse* response, bool* defer) override { | |
78 EXPECT_FALSE(is_completed_); | |
79 return on_response_started_result_; | |
80 } | |
81 | |
82 bool OnWillStart(const GURL& url, bool* defer) override { | |
83 EXPECT_FALSE(is_completed_); | |
84 return true; | |
85 } | |
86 | |
87 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, | |
88 int* buf_size, | |
89 int min_size) override { | |
90 EXPECT_FALSE(is_completed_); | |
91 *buf = buffer_; | |
92 *buf_size = 2048; | |
93 memset(buffer_->data(), '\0', 2048); | |
94 return on_will_read_result_; | |
95 } | |
96 | |
97 bool OnReadCompleted(int bytes_read, bool* defer) override { | |
98 EXPECT_FALSE(is_completed_); | |
99 EXPECT_LT(bytes_read, 2048); | |
100 bytes_read_ += bytes_read; | |
101 return on_read_completed_result_; | |
102 } | |
103 | |
104 void OnResponseCompleted(const net::URLRequestStatus& status, | |
105 const std::string& security_info, | |
106 bool* defer) override { | |
107 EXPECT_FALSE(is_completed_); | |
108 is_completed_ = true; | |
109 *request_status_ = status; | |
110 *final_bytes_read_ = bytes_read_; | |
111 } | |
112 | |
113 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); } | |
114 | |
115 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; } | |
116 | |
117 size_t bytes_read() const { return bytes_read_; } | |
118 | |
119 private: | |
120 scoped_refptr<net::IOBuffer> buffer_; | |
121 net::URLRequestStatus* request_status_; | |
122 size_t* final_bytes_read_; | |
123 bool on_response_started_result_; | |
124 bool on_will_read_result_; | |
125 bool on_read_completed_result_; | |
126 size_t bytes_read_; | |
127 bool is_completed_; | |
128 | |
129 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler); | |
130 }; | |
131 | |
132 class InterceptingResourceHandlerTest : public testing::Test { | |
133 public: | |
134 InterceptingResourceHandlerTest() {} | |
135 | |
136 private: | |
137 TestBrowserThreadBundle thread_bundle_; | |
138 }; | |
139 | |
140 // Tests that the handler behaves properly when it doesn't have to use an | |
141 // alternate next handler. | |
142 TEST_F(InterceptingResourceHandlerTest, NoSwitching) { | |
143 net::URLRequestContext context; | |
144 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
145 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
146 ResourceRequestInfo::AllocateForTesting(request.get(), | |
147 RESOURCE_TYPE_MAIN_FRAME, | |
148 nullptr, // context | |
149 0, // render_process_id | |
150 0, // render_view_id | |
151 0, // render_frame_id | |
152 true, // is_main_frame | |
153 false, // parent_is_main_frame | |
154 true, // allow_download | |
155 true, // is_async | |
156 false); // is_using_lofi | |
157 | |
158 net::URLRequestStatus old_handler_status; | |
159 size_t old_handler_final_bytes_read = 0; | |
160 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( | |
161 &old_handler_status, &old_handler_final_bytes_read)); | |
162 TestResourceHandler* old_test_handler = old_handler.get(); | |
163 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); | |
164 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
165 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
166 | |
167 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
168 | |
169 // Simulate the MimeSniffingResourceHandler buffering the data. | |
170 scoped_refptr<net::IOBuffer> read_buffer; | |
171 int buf_size = 0; | |
172 bool defer = false; | |
173 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
174 EXPECT_FALSE(defer); | |
175 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
176 | |
177 const char kData[] = "The data"; | |
178 EXPECT_FALSE( | |
179 !memcmp(kData, old_test_handler->buffer()->data(), sizeof(kData))); | |
180 | |
181 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer()); | |
182 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
183 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
184 | |
185 // The response is received. The handler should not change. | |
186 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); | |
187 EXPECT_FALSE(defer); | |
188 | |
189 // The read is replayed by the MimeSniffingResourceHandler. The data should | |
190 // have been received by the old intercepting_handler. | |
191 EXPECT_TRUE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); | |
192 EXPECT_FALSE(defer); | |
193 EXPECT_TRUE( | |
194 !memcmp(kData, old_test_handler->buffer()->data(), sizeof(kData))); | |
195 EXPECT_EQ(sizeof(kData), old_test_handler->bytes_read()); | |
196 | |
197 // Make sure another read behave as expected. | |
198 buf_size = 0; | |
199 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
200 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer()); | |
201 | |
202 const char kData2[] = "Data 2"; | |
203 EXPECT_FALSE( | |
204 !memcmp(kData2, old_test_handler->buffer()->data(), sizeof(kData2))); | |
205 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData2)); | |
206 memcpy(read_buffer->data(), kData2, sizeof(kData2)); | |
207 | |
208 EXPECT_TRUE(intercepting_handler->OnReadCompleted(sizeof(kData2), &defer)); | |
209 EXPECT_FALSE(defer); | |
210 EXPECT_TRUE( | |
211 !memcmp(kData2, old_test_handler->buffer()->data(), sizeof(kData2))); | |
212 EXPECT_EQ(sizeof(kData) + sizeof(kData2), old_test_handler->bytes_read()); | |
213 } | |
214 | |
215 // Tests that the data received is transmitted to the newly created | |
216 // ResourceHandler. | |
217 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) { | |
218 net::URLRequestContext context; | |
219 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
220 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
221 ResourceRequestInfo::AllocateForTesting(request.get(), | |
222 RESOURCE_TYPE_MAIN_FRAME, | |
223 nullptr, // context | |
224 0, // render_process_id | |
225 0, // render_view_id | |
226 0, // render_frame_id | |
227 true, // is_main_frame | |
228 false, // parent_is_main_frame | |
229 true, // allow_download | |
230 true, // is_async | |
231 false); // is_using_lofi | |
232 | |
233 net::URLRequestStatus old_handler_status; | |
234 size_t old_handler_final_bytes_read = 0; | |
235 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( | |
236 &old_handler_status, &old_handler_final_bytes_read)); | |
237 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); | |
238 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
239 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
240 | |
241 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
242 | |
243 // Simulate the MimeSniffingResourceHandler buffering the data. | |
244 scoped_refptr<net::IOBuffer> read_buffer; | |
245 int buf_size = 0; | |
246 bool defer = false; | |
247 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
248 EXPECT_FALSE(defer); | |
249 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
250 | |
251 const char kData[] = "The data"; | |
252 ASSERT_EQ(read_buffer.get(), old_buffer.get()); | |
253 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
254 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
255 | |
256 // Simulate the MimeSniffingResourceHandler asking the | |
257 // InterceptingResourceHandler to switch to a new handler. | |
258 net::URLRequestStatus new_handler_status; | |
259 size_t new_handler_final_bytes_read = 0; | |
260 std::unique_ptr<TestResourceHandler> new_handler_scoped( | |
261 new TestResourceHandler(&new_handler_status, | |
262 &new_handler_final_bytes_read)); | |
263 TestResourceHandler* new_test_handler = new_handler_scoped.get(); | |
264 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), | |
265 std::string()); | |
266 | |
267 // The response is received. The new ResourceHandler should be used handle | |
268 // the download. | |
269 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); | |
270 EXPECT_FALSE(defer); | |
271 | |
272 EXPECT_FALSE(old_handler_status.is_success()); | |
273 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); | |
274 EXPECT_EQ(0ul, old_handler_final_bytes_read); | |
275 | |
276 // It should not have received the download data yet. | |
277 EXPECT_FALSE( | |
278 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
279 EXPECT_EQ(0ul, new_test_handler->bytes_read()); | |
280 | |
281 // The read is replayed by the MimeSniffingResourceHandler. The data should | |
282 // have been received by the new handler. | |
283 EXPECT_TRUE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); | |
284 EXPECT_FALSE(defer); | |
285 EXPECT_EQ(sizeof(kData), new_test_handler->bytes_read()); | |
286 EXPECT_TRUE( | |
287 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
mmenke
2016/09/02 19:22:05
Ok, so let's just switch to comparing strings, for
clamy
2016/09/06 11:50:48
Done.
| |
288 | |
289 // Make sure another read behaves as expected. | |
290 buf_size = 0; | |
291 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
292 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer()); | |
293 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
294 | |
295 const char kData2[] = "Data 2"; | |
296 EXPECT_FALSE( | |
297 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
298 memcpy(read_buffer->data(), kData2, sizeof(kData2)); | |
299 | |
300 EXPECT_TRUE(intercepting_handler->OnReadCompleted(sizeof(kData2), &defer)); | |
301 EXPECT_FALSE(defer); | |
302 EXPECT_TRUE( | |
303 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
304 EXPECT_EQ(sizeof(kData) + sizeof(kData2), new_test_handler->bytes_read()); | |
305 } | |
306 | |
307 // Tests that the data received is transmitted to the newly created | |
308 // ResourceHandler and the specified payload to the old ResourceHandler. | |
309 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchWithPayload) { | |
310 net::URLRequestContext context; | |
311 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
312 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
313 ResourceRequestInfo::AllocateForTesting(request.get(), | |
314 RESOURCE_TYPE_MAIN_FRAME, | |
315 nullptr, // context | |
316 0, // render_process_id | |
317 0, // render_view_id | |
318 0, // render_frame_id | |
319 true, // is_main_frame | |
320 false, // parent_is_main_frame | |
321 true, // allow_download | |
322 true, // is_async | |
323 false); // is_using_lofi | |
324 | |
325 net::URLRequestStatus old_handler_status; | |
326 size_t old_handler_final_bytes_read = 0; | |
327 std::unique_ptr<TestResourceHandler> old_handler_scoped( | |
328 new TestResourceHandler(&old_handler_status, | |
329 &old_handler_final_bytes_read)); | |
330 TestResourceHandler* old_handler = old_handler_scoped.get(); | |
331 scoped_refptr<net::IOBuffer> old_buffer = old_handler->buffer(); | |
332 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
333 new InterceptingResourceHandler(std::move(old_handler_scoped), | |
334 request.get())); | |
335 | |
336 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
337 | |
338 // Simulate the MimeSniffingResourceHandler buffering the data. | |
339 scoped_refptr<net::IOBuffer> read_buffer; | |
340 int buf_size = 0; | |
341 bool defer = false; | |
342 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
343 EXPECT_FALSE(defer); | |
344 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
345 | |
346 const char kData[] = "The data"; | |
347 ASSERT_EQ(read_buffer.get(), old_buffer.get()); | |
348 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
349 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
350 | |
351 // Simulate the MimeSniffingResourceHandler asking the | |
352 // InterceptingResourceHandler to switch to a new handler. | |
353 const std::string kPayload = "The payload"; | |
354 net::URLRequestStatus new_handler_status; | |
355 size_t new_handler_final_bytes_read = 0; | |
356 std::unique_ptr<TestResourceHandler> new_handler_scoped( | |
357 new TestResourceHandler(&new_handler_status, | |
358 &new_handler_final_bytes_read)); | |
359 TestResourceHandler* new_test_handler = new_handler_scoped.get(); | |
360 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), kPayload); | |
361 | |
362 // The old handler should not have received the payload yet. | |
363 ASSERT_FALSE(old_handler->bytes_read()); | |
364 EXPECT_FALSE(!memcmp(kPayload.c_str(), old_buffer->data(), kPayload.size())); | |
365 | |
366 // The response is received. The new ResourceHandler should be used to handle | |
367 // the download. | |
368 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); | |
369 EXPECT_FALSE(defer); | |
370 | |
371 // The old handler should have received the payload. | |
372 ASSERT_TRUE(old_handler_final_bytes_read == kPayload.size()); | |
373 EXPECT_TRUE(!memcmp(kPayload.c_str(), old_buffer->data(), kPayload.size())); | |
374 | |
375 EXPECT_TRUE(old_handler_status.is_success()); | |
376 EXPECT_EQ(net::OK, old_handler_status.error()); | |
377 | |
378 // It should not have received the download data yet. | |
379 EXPECT_FALSE( | |
380 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
381 | |
382 // The read is replayed by the MimeSniffingResourceHandler. The data should | |
383 // have been received by the new handler. | |
384 EXPECT_TRUE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); | |
385 EXPECT_FALSE(defer); | |
386 EXPECT_TRUE( | |
387 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData))); | |
388 EXPECT_EQ(sizeof(kData), new_test_handler->bytes_read()); | |
389 | |
390 // Make sure another read behave as expected. | |
391 buf_size = 0; | |
392 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
393 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer()); | |
394 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
395 | |
396 const char kData2[] = "Data 2"; | |
397 EXPECT_FALSE( | |
398 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
399 memcpy(read_buffer->data(), kData2, sizeof(kData2)); | |
400 | |
401 EXPECT_TRUE(intercepting_handler->OnReadCompleted(sizeof(kData2), &defer)); | |
402 EXPECT_FALSE(defer); | |
403 EXPECT_TRUE( | |
404 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2))); | |
405 EXPECT_EQ(sizeof(kData) + sizeof(kData2), new_test_handler->bytes_read()); | |
406 } | |
407 | |
408 // Tests that the handler behaves properly if the old handler fails will read. | |
409 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) { | |
410 net::URLRequestContext context; | |
411 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
412 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
413 ResourceRequestInfo::AllocateForTesting(request.get(), | |
414 RESOURCE_TYPE_MAIN_FRAME, | |
415 nullptr, // context | |
416 0, // render_process_id | |
417 0, // render_view_id | |
418 0, // render_frame_id | |
419 true, // is_main_frame | |
420 false, // parent_is_main_frame | |
421 true, // allow_download | |
422 true, // is_async | |
423 false); // is_using_lofi | |
424 | |
425 net::URLRequestStatus old_handler_status; | |
426 size_t old_handler_final_bytes_read = 0; | |
427 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( | |
428 &old_handler_status, &old_handler_final_bytes_read, | |
429 true, // on_response_started | |
430 false, // on_will_read | |
431 true)); // on_read_completed | |
432 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); | |
433 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
434 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
435 | |
436 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
437 | |
438 // Simulate the MimeSniffingResourceHandler buffering the data. The old | |
439 // handler should tell the caller to fail. | |
440 scoped_refptr<net::IOBuffer> read_buffer; | |
441 int buf_size = 0; | |
442 bool defer = false; | |
443 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
444 EXPECT_FALSE(defer); | |
445 EXPECT_FALSE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
446 } | |
447 | |
448 // Tests that the handler behaves properly if the new handler fails response | |
449 // started. | |
450 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) { | |
451 net::URLRequestContext context; | |
452 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
453 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
454 ResourceRequestInfo::AllocateForTesting(request.get(), | |
455 RESOURCE_TYPE_MAIN_FRAME, | |
456 nullptr, // context | |
457 0, // render_process_id | |
458 0, // render_view_id | |
459 0, // render_frame_id | |
460 true, // is_main_frame | |
461 false, // parent_is_main_frame | |
462 true, // allow_download | |
463 true, // is_async | |
464 false); // is_using_lofi | |
465 | |
466 net::URLRequestStatus old_handler_status; | |
467 size_t old_handler_final_bytes_read = 0; | |
468 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( | |
469 &old_handler_status, &old_handler_final_bytes_read)); | |
470 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); | |
471 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
472 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
473 | |
474 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
475 | |
476 // Simulate the MimeSniffingResourceHandler buffering the data. | |
477 scoped_refptr<net::IOBuffer> read_buffer; | |
478 int buf_size = 0; | |
479 bool defer = false; | |
480 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
481 EXPECT_FALSE(defer); | |
482 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
483 | |
484 const char kData[] = "The data"; | |
485 ASSERT_EQ(read_buffer.get(), old_buffer.get()); | |
486 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
487 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
488 | |
489 // Simulate the MimeSniffingResourceHandler asking the | |
490 // InterceptingResourceHandler to switch to a new handler. | |
491 net::URLRequestStatus new_handler_status; | |
492 size_t new_handler_final_bytes_read = 0; | |
493 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( | |
494 &new_handler_status, &new_handler_final_bytes_read, | |
495 false, // on_response_started | |
496 true, // on_will_read | |
497 true)); // on_read_completed | |
498 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
499 | |
500 // The response is received. The new ResourceHandler should tell us to fail. | |
501 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer)); | |
502 EXPECT_FALSE(defer); | |
503 } | |
504 | |
505 // Tests that the handler behaves properly if the new handler fails will read. | |
506 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) { | |
507 net::URLRequestContext context; | |
508 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
509 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
510 ResourceRequestInfo::AllocateForTesting(request.get(), | |
511 RESOURCE_TYPE_MAIN_FRAME, | |
512 nullptr, // context | |
513 0, // render_process_id | |
514 0, // render_view_id | |
515 0, // render_frame_id | |
516 true, // is_main_frame | |
517 false, // parent_is_main_frame | |
518 true, // allow_download | |
519 true, // is_async | |
520 false); // is_using_lofi | |
521 | |
522 net::URLRequestStatus old_handler_status; | |
523 size_t old_handler_final_bytes_read = 0; | |
524 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( | |
525 &old_handler_status, &old_handler_final_bytes_read)); | |
526 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); | |
527 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
528 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
529 | |
530 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
531 | |
532 // Simulate the MimeSniffingResourceHandler buffering the data. | |
533 scoped_refptr<net::IOBuffer> read_buffer; | |
534 int buf_size = 0; | |
535 bool defer = false; | |
536 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
537 EXPECT_FALSE(defer); | |
538 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
539 | |
540 const char kData[] = "The data"; | |
541 ASSERT_EQ(read_buffer.get(), old_buffer.get()); | |
542 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
543 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
544 | |
545 // Simulate the MimeSniffingResourceHandler asking the | |
546 // InterceptingResourceHandler to switch to a new handler. | |
547 net::URLRequestStatus new_handler_status; | |
548 size_t new_handler_final_bytes_read = 0; | |
549 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( | |
550 &new_handler_status, &new_handler_final_bytes_read, | |
551 true, // on_response_started | |
552 false, // on_will_read | |
553 true)); // on_read_completed | |
554 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
555 | |
556 // The response is received. The new handler should not have been asked to | |
557 // read yet. | |
558 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); | |
559 EXPECT_FALSE(defer); | |
560 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); | |
561 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); | |
562 | |
563 // The read is replayed by the MimeSniffingResourceHandler. The new | |
564 // handler should tell the caller to fail. | |
565 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); | |
566 EXPECT_FALSE(defer); | |
567 } | |
568 | |
569 // Tests that the handler behaves properly if the new handler fails read | |
570 // completed. | |
571 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) { | |
572 net::URLRequestContext context; | |
573 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | |
574 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | |
575 ResourceRequestInfo::AllocateForTesting(request.get(), | |
576 RESOURCE_TYPE_MAIN_FRAME, | |
577 nullptr, // context | |
578 0, // render_process_id | |
579 0, // render_view_id | |
580 0, // render_frame_id | |
581 true, // is_main_frame | |
582 false, // parent_is_main_frame | |
583 true, // allow_download | |
584 true, // is_async | |
585 false); // is_using_lofi | |
586 | |
587 net::URLRequestStatus old_handler_status; | |
588 size_t old_handler_final_bytes_read = 0; | |
589 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( | |
590 &old_handler_status, &old_handler_final_bytes_read)); | |
591 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); | |
592 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( | |
593 new InterceptingResourceHandler(std::move(old_handler), request.get())); | |
594 | |
595 scoped_refptr<ResourceResponse> response(new ResourceResponse); | |
596 | |
597 // Simulate the MimeSniffingResourceHandler buffering the data. | |
598 scoped_refptr<net::IOBuffer> read_buffer; | |
599 int buf_size = 0; | |
600 bool defer = false; | |
601 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); | |
602 EXPECT_FALSE(defer); | |
603 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); | |
604 | |
605 const char kData[] = "The data"; | |
606 ASSERT_EQ(read_buffer.get(), old_buffer.get()); | |
607 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); | |
608 memcpy(read_buffer->data(), kData, sizeof(kData)); | |
609 | |
610 // Simulate the MimeSniffingResourceHandler asking the | |
611 // InterceptingResourceHandler to switch to a new handler. | |
612 net::URLRequestStatus new_handler_status; | |
613 size_t new_handler_final_bytes_read = 0; | |
614 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( | |
615 &new_handler_status, &new_handler_final_bytes_read, | |
616 true, // on_response_started | |
617 true, // on_will_read | |
618 false)); // on_read_completed | |
619 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); | |
620 | |
621 // The response is received. | |
622 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); | |
623 EXPECT_FALSE(defer); | |
624 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); | |
625 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); | |
626 | |
627 // The read is replayed by the MimeSniffingResourceHandler. The new handler | |
628 // should tell the caller to fail. | |
629 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); | |
630 EXPECT_FALSE(defer); | |
631 } | |
632 | |
633 } // namespace | |
634 | |
635 } // namespace content | |
OLD | NEW |