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