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