Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: chrome/browser/extensions/api/web_request/web_request_api_unittest.cc

Issue 407093011: Allow URLRequests from one context to have different NetworkDelegates. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix new tests Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <map> 5 #include <map>
6 #include <queue> 6 #include <queue>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/json/json_reader.h" 12 #include "base/json/json_reader.h"
13 #include "base/json/json_string_value_serializer.h" 13 #include "base/json/json_string_value_serializer.h"
14 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/weak_ptr.h" 15 #include "base/memory/weak_ptr.h"
15 #include "base/message_loop/message_loop.h" 16 #include "base/message_loop/message_loop.h"
16 #include "base/path_service.h" 17 #include "base/path_service.h"
17 #include "base/prefs/pref_member.h" 18 #include "base/prefs/pref_member.h"
18 #include "base/stl_util.h" 19 #include "base/stl_util.h"
19 #include "base/strings/string_piece.h" 20 #include "base/strings/string_piece.h"
20 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
21 #include "base/strings/utf_string_conversions.h" 22 #include "base/strings/utf_string_conversions.h"
22 #include "base/time/time.h" 23 #include "base/time/time.h"
23 #include "chrome/browser/content_settings/cookie_settings.h" 24 #include "chrome/browser/content_settings/cookie_settings.h"
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 ipc_sender_factory.GetWeakPtr()); 232 ipc_sender_factory.GetWeakPtr());
232 233
233 net::URLRequestJobFactoryImpl job_factory; 234 net::URLRequestJobFactoryImpl job_factory;
234 job_factory.SetProtocolHandler( 235 job_factory.SetProtocolHandler(
235 url::kAboutScheme, new chrome_browser_net::AboutProtocolHandler()); 236 url::kAboutScheme, new chrome_browser_net::AboutProtocolHandler());
236 context_->set_job_factory(&job_factory); 237 context_->set_job_factory(&job_factory);
237 238
238 GURL redirect_url("about:redirected"); 239 GURL redirect_url("about:redirected");
239 GURL not_chosen_redirect_url("about:not_chosen"); 240 GURL not_chosen_redirect_url("about:not_chosen");
240 241
241 net::URLRequest request( 242 scoped_ptr<net::URLRequest> request(context_->CreateRequest(
242 GURL("about:blank"), net::DEFAULT_PRIORITY, &delegate_, context_.get()); 243 GURL("about:blank"), net::DEFAULT_PRIORITY, &delegate_, NULL));
243 { 244 {
244 // onBeforeRequest will be dispatched twice initially. The second response - 245 // onBeforeRequest will be dispatched twice initially. The second response -
245 // the redirect - should win, since it has a later |install_time|. The 246 // the redirect - should win, since it has a later |install_time|. The
246 // redirect will dispatch another pair of onBeforeRequest. There, the first 247 // redirect will dispatch another pair of onBeforeRequest. There, the first
247 // response should win (later |install_time|). 248 // response should win (later |install_time|).
248 ExtensionWebRequestEventRouter::EventResponse* response = NULL; 249 ExtensionWebRequestEventRouter::EventResponse* response = NULL;
249 250
250 // Extension1 response. Arrives first, but ignored due to install_time. 251 // Extension1 response. Arrives first, but ignored due to install_time.
251 response = new ExtensionWebRequestEventRouter::EventResponse( 252 response = new ExtensionWebRequestEventRouter::EventResponse(
252 extension1_id, base::Time::FromDoubleT(1)); 253 extension1_id, base::Time::FromDoubleT(1));
253 response->new_url = not_chosen_redirect_url; 254 response->new_url = not_chosen_redirect_url;
254 ipc_sender_.PushTask( 255 ipc_sender_.PushTask(
255 base::Bind(&EventHandledOnIOThread, 256 base::Bind(&EventHandledOnIOThread,
256 &profile_, extension1_id, kEventName, kEventName + "/1", 257 &profile_, extension1_id, kEventName, kEventName + "/1",
257 request.identifier(), response)); 258 request->identifier(), response));
258 259
259 // Extension2 response. Arrives second, and chosen because of install_time. 260 // Extension2 response. Arrives second, and chosen because of install_time.
260 response = new ExtensionWebRequestEventRouter::EventResponse( 261 response = new ExtensionWebRequestEventRouter::EventResponse(
261 extension2_id, base::Time::FromDoubleT(2)); 262 extension2_id, base::Time::FromDoubleT(2));
262 response->new_url = redirect_url; 263 response->new_url = redirect_url;
263 ipc_sender_.PushTask( 264 ipc_sender_.PushTask(
264 base::Bind(&EventHandledOnIOThread, 265 base::Bind(&EventHandledOnIOThread,
265 &profile_, extension2_id, kEventName, kEventName + "/2", 266 &profile_, extension2_id, kEventName, kEventName + "/2",
266 request.identifier(), response)); 267 request->identifier(), response));
267 268
268 // Extension2 response to the redirected URL. Arrives first, and chosen. 269 // Extension2 response to the redirected URL. Arrives first, and chosen.
269 response = new ExtensionWebRequestEventRouter::EventResponse( 270 response = new ExtensionWebRequestEventRouter::EventResponse(
270 extension2_id, base::Time::FromDoubleT(2)); 271 extension2_id, base::Time::FromDoubleT(2));
271 ipc_sender_.PushTask( 272 ipc_sender_.PushTask(
272 base::Bind(&EventHandledOnIOThread, 273 base::Bind(&EventHandledOnIOThread,
273 &profile_, extension2_id, kEventName, kEventName + "/2", 274 &profile_, extension2_id, kEventName, kEventName + "/2",
274 request.identifier(), response)); 275 request->identifier(), response));
275 276
276 // Extension1 response to the redirected URL. Arrives second, and ignored. 277 // Extension1 response to the redirected URL. Arrives second, and ignored.
277 response = new ExtensionWebRequestEventRouter::EventResponse( 278 response = new ExtensionWebRequestEventRouter::EventResponse(
278 extension1_id, base::Time::FromDoubleT(1)); 279 extension1_id, base::Time::FromDoubleT(1));
279 ipc_sender_.PushTask( 280 ipc_sender_.PushTask(
280 base::Bind(&EventHandledOnIOThread, 281 base::Bind(&EventHandledOnIOThread,
281 &profile_, extension1_id, kEventName, kEventName + "/1", 282 &profile_, extension1_id, kEventName, kEventName + "/1",
282 request.identifier(), response)); 283 request->identifier(), response));
283 284
284 request.Start(); 285 request->Start();
285 base::MessageLoop::current()->Run(); 286 base::MessageLoop::current()->Run();
286 287
287 EXPECT_TRUE(!request.is_pending()); 288 EXPECT_TRUE(!request->is_pending());
288 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); 289 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status());
289 EXPECT_EQ(0, request.status().error()); 290 EXPECT_EQ(0, request->status().error());
290 EXPECT_EQ(redirect_url, request.url()); 291 EXPECT_EQ(redirect_url, request->url());
291 EXPECT_EQ(2U, request.url_chain().size()); 292 EXPECT_EQ(2U, request->url_chain().size());
292 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); 293 EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
293 } 294 }
294 295
295 // Now test the same thing but the extensions answer in reverse order. 296 // Now test the same thing but the extensions answer in reverse order.
296 net::URLRequest request2( 297 scoped_ptr<net::URLRequest> request2(context_->CreateRequest(
297 GURL("about:blank"), net::DEFAULT_PRIORITY, &delegate_, context_.get()); 298 GURL("about:blank"), net::DEFAULT_PRIORITY, &delegate_, NULL));
298 { 299 {
299 ExtensionWebRequestEventRouter::EventResponse* response = NULL; 300 ExtensionWebRequestEventRouter::EventResponse* response = NULL;
300 301
301 // Extension2 response. Arrives first, and chosen because of install_time. 302 // Extension2 response. Arrives first, and chosen because of install_time.
302 response = new ExtensionWebRequestEventRouter::EventResponse( 303 response = new ExtensionWebRequestEventRouter::EventResponse(
303 extension2_id, base::Time::FromDoubleT(2)); 304 extension2_id, base::Time::FromDoubleT(2));
304 response->new_url = redirect_url; 305 response->new_url = redirect_url;
305 ipc_sender_.PushTask( 306 ipc_sender_.PushTask(
306 base::Bind(&EventHandledOnIOThread, 307 base::Bind(&EventHandledOnIOThread,
307 &profile_, extension2_id, kEventName, kEventName + "/2", 308 &profile_, extension2_id, kEventName, kEventName + "/2",
308 request2.identifier(), response)); 309 request2->identifier(), response));
309 310
310 // Extension1 response. Arrives second, but ignored due to install_time. 311 // Extension1 response. Arrives second, but ignored due to install_time.
311 response = new ExtensionWebRequestEventRouter::EventResponse( 312 response = new ExtensionWebRequestEventRouter::EventResponse(
312 extension1_id, base::Time::FromDoubleT(1)); 313 extension1_id, base::Time::FromDoubleT(1));
313 response->new_url = not_chosen_redirect_url; 314 response->new_url = not_chosen_redirect_url;
314 ipc_sender_.PushTask( 315 ipc_sender_.PushTask(
315 base::Bind(&EventHandledOnIOThread, 316 base::Bind(&EventHandledOnIOThread,
316 &profile_, extension1_id, kEventName, kEventName + "/1", 317 &profile_, extension1_id, kEventName, kEventName + "/1",
317 request2.identifier(), response)); 318 request2->identifier(), response));
318 319
319 // Extension2 response to the redirected URL. Arrives first, and chosen. 320 // Extension2 response to the redirected URL. Arrives first, and chosen.
320 response = new ExtensionWebRequestEventRouter::EventResponse( 321 response = new ExtensionWebRequestEventRouter::EventResponse(
321 extension2_id, base::Time::FromDoubleT(2)); 322 extension2_id, base::Time::FromDoubleT(2));
322 ipc_sender_.PushTask( 323 ipc_sender_.PushTask(
323 base::Bind(&EventHandledOnIOThread, 324 base::Bind(&EventHandledOnIOThread,
324 &profile_, extension2_id, kEventName, kEventName + "/2", 325 &profile_, extension2_id, kEventName, kEventName + "/2",
325 request2.identifier(), response)); 326 request2->identifier(), response));
326 327
327 // Extension1 response to the redirected URL. Arrives second, and ignored. 328 // Extension1 response to the redirected URL. Arrives second, and ignored.
328 response = new ExtensionWebRequestEventRouter::EventResponse( 329 response = new ExtensionWebRequestEventRouter::EventResponse(
329 extension1_id, base::Time::FromDoubleT(1)); 330 extension1_id, base::Time::FromDoubleT(1));
330 ipc_sender_.PushTask( 331 ipc_sender_.PushTask(
331 base::Bind(&EventHandledOnIOThread, 332 base::Bind(&EventHandledOnIOThread,
332 &profile_, extension1_id, kEventName, kEventName + "/1", 333 &profile_, extension1_id, kEventName, kEventName + "/1",
333 request2.identifier(), response)); 334 request2->identifier(), response));
334 335
335 request2.Start(); 336 request2->Start();
336 base::MessageLoop::current()->Run(); 337 base::MessageLoop::current()->Run();
337 338
338 EXPECT_TRUE(!request2.is_pending()); 339 EXPECT_TRUE(!request2->is_pending());
339 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request2.status().status()); 340 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request2->status().status());
340 EXPECT_EQ(0, request2.status().error()); 341 EXPECT_EQ(0, request2->status().error());
341 EXPECT_EQ(redirect_url, request2.url()); 342 EXPECT_EQ(redirect_url, request2->url());
342 EXPECT_EQ(2U, request2.url_chain().size()); 343 EXPECT_EQ(2U, request2->url_chain().size());
343 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); 344 EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
344 } 345 }
345 346
346 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 347 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
347 &profile_, extension1_id, kEventName + "/1"); 348 &profile_, extension1_id, kEventName + "/1");
348 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 349 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
349 &profile_, extension2_id, kEventName + "/2"); 350 &profile_, extension2_id, kEventName + "/2");
350 } 351 }
351 352
352 // Test that a request is canceled if this is requested by any extension 353 // Test that a request is canceled if this is requested by any extension
353 // regardless whether it is the extension with the highest precedence. 354 // regardless whether it is the extension with the highest precedence.
354 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceCancel) { 355 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceCancel) {
355 std::string extension1_id("1"); 356 std::string extension1_id("1");
356 std::string extension2_id("2"); 357 std::string extension2_id("2");
357 ExtensionWebRequestEventRouter::RequestFilter filter; 358 ExtensionWebRequestEventRouter::RequestFilter filter;
358 const std::string kEventName(web_request::OnBeforeRequest::kEventName); 359 const std::string kEventName(web_request::OnBeforeRequest::kEventName);
359 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); 360 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
360 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 361 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
361 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", 362 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1",
362 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, 363 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
363 ipc_sender_factory.GetWeakPtr()); 364 ipc_sender_factory.GetWeakPtr());
364 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 365 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
365 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", 366 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2",
366 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, 367 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
367 ipc_sender_factory.GetWeakPtr()); 368 ipc_sender_factory.GetWeakPtr());
368 369
369 GURL request_url("about:blank"); 370 GURL request_url("about:blank");
370 net::URLRequest request( 371 scoped_ptr<net::URLRequest> request(context_->CreateRequest(
371 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); 372 request_url, net::DEFAULT_PRIORITY, &delegate_, NULL));
372 373
373 // onBeforeRequest will be dispatched twice. The second response - 374 // onBeforeRequest will be dispatched twice. The second response -
374 // the redirect - would win, since it has a later |install_time|, but 375 // the redirect - would win, since it has a later |install_time|, but
375 // the first response takes precedence because cancel >> redirect. 376 // the first response takes precedence because cancel >> redirect.
376 GURL redirect_url("about:redirected"); 377 GURL redirect_url("about:redirected");
377 ExtensionWebRequestEventRouter::EventResponse* response = NULL; 378 ExtensionWebRequestEventRouter::EventResponse* response = NULL;
378 379
379 // Extension1 response. Arrives first, would be ignored in principle due to 380 // Extension1 response. Arrives first, would be ignored in principle due to
380 // install_time but "cancel" always wins. 381 // install_time but "cancel" always wins.
381 response = new ExtensionWebRequestEventRouter::EventResponse( 382 response = new ExtensionWebRequestEventRouter::EventResponse(
382 extension1_id, base::Time::FromDoubleT(1)); 383 extension1_id, base::Time::FromDoubleT(1));
383 response->cancel = true; 384 response->cancel = true;
384 ipc_sender_.PushTask( 385 ipc_sender_.PushTask(
385 base::Bind(&EventHandledOnIOThread, 386 base::Bind(&EventHandledOnIOThread,
386 &profile_, extension1_id, kEventName, kEventName + "/1", 387 &profile_, extension1_id, kEventName, kEventName + "/1",
387 request.identifier(), response)); 388 request->identifier(), response));
388 389
389 // Extension2 response. Arrives second, but has higher precedence 390 // Extension2 response. Arrives second, but has higher precedence
390 // due to its later install_time. 391 // due to its later install_time.
391 response = new ExtensionWebRequestEventRouter::EventResponse( 392 response = new ExtensionWebRequestEventRouter::EventResponse(
392 extension2_id, base::Time::FromDoubleT(2)); 393 extension2_id, base::Time::FromDoubleT(2));
393 response->new_url = redirect_url; 394 response->new_url = redirect_url;
394 ipc_sender_.PushTask( 395 ipc_sender_.PushTask(
395 base::Bind(&EventHandledOnIOThread, 396 base::Bind(&EventHandledOnIOThread,
396 &profile_, extension2_id, kEventName, kEventName + "/2", 397 &profile_, extension2_id, kEventName, kEventName + "/2",
397 request.identifier(), response)); 398 request->identifier(), response));
398 399
399 request.Start(); 400 request->Start();
400 401
401 base::MessageLoop::current()->Run(); 402 base::MessageLoop::current()->Run();
402 403
403 EXPECT_TRUE(!request.is_pending()); 404 EXPECT_TRUE(!request->is_pending());
404 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); 405 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status());
405 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, request.status().error()); 406 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, request->status().error());
406 EXPECT_EQ(request_url, request.url()); 407 EXPECT_EQ(request_url, request->url());
407 EXPECT_EQ(1U, request.url_chain().size()); 408 EXPECT_EQ(1U, request->url_chain().size());
408 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); 409 EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
409 410
410 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 411 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
411 &profile_, extension1_id, kEventName + "/1"); 412 &profile_, extension1_id, kEventName + "/1");
412 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 413 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
413 &profile_, extension2_id, kEventName + "/2"); 414 &profile_, extension2_id, kEventName + "/2");
414 } 415 }
415 416
416 TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) { 417 TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) {
417 // We subscribe to OnBeforeRequest and OnErrorOccurred. 418 // We subscribe to OnBeforeRequest and OnErrorOccurred.
(...skipping 10 matching lines...) Expand all
428 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); 429 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
429 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 430 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
430 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", 431 &profile_, extension_id, extension_id, kEventName, kEventName + "/1",
431 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, 432 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
432 ipc_sender_factory.GetWeakPtr()); 433 ipc_sender_factory.GetWeakPtr());
433 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 434 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
434 &profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1", 435 &profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1",
435 filter, 0, -1, -1, ipc_sender_factory.GetWeakPtr()); 436 filter, 0, -1, -1, ipc_sender_factory.GetWeakPtr());
436 437
437 GURL request_url("about:blank"); 438 GURL request_url("about:blank");
438 net::URLRequest request( 439 scoped_ptr<net::URLRequest> request(context_->CreateRequest(
439 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); 440 request_url, net::DEFAULT_PRIORITY, &delegate_, NULL));
440 441
441 ExtensionWebRequestEventRouter::EventResponse* response = NULL; 442 ExtensionWebRequestEventRouter::EventResponse* response = NULL;
442 443
443 // Extension response for the OnBeforeRequest handler. This should not be 444 // Extension response for the OnBeforeRequest handler. This should not be
444 // processed because request is canceled before the handler responds. 445 // processed because request is canceled before the handler responds.
445 response = new ExtensionWebRequestEventRouter::EventResponse( 446 response = new ExtensionWebRequestEventRouter::EventResponse(
446 extension_id, base::Time::FromDoubleT(1)); 447 extension_id, base::Time::FromDoubleT(1));
447 GURL redirect_url("about:redirected"); 448 GURL redirect_url("about:redirected");
448 response->new_url = redirect_url; 449 response->new_url = redirect_url;
449 ipc_sender_.PushTask( 450 ipc_sender_.PushTask(
450 base::Bind(&EventHandledOnIOThread, 451 base::Bind(&EventHandledOnIOThread,
451 &profile_, extension_id, kEventName, kEventName + "/1", 452 &profile_, extension_id, kEventName, kEventName + "/1",
452 request.identifier(), response)); 453 request->identifier(), response));
453 454
454 // Extension response for OnErrorOccurred: Terminate the message loop. 455 // Extension response for OnErrorOccurred: Terminate the message loop.
455 ipc_sender_.PushTask( 456 ipc_sender_.PushTask(
456 base::Bind(&base::MessageLoop::PostTask, 457 base::Bind(&base::MessageLoop::PostTask,
457 base::Unretained(base::MessageLoop::current()), 458 base::Unretained(base::MessageLoop::current()),
458 FROM_HERE, base::MessageLoop::QuitClosure())); 459 FROM_HERE, base::MessageLoop::QuitClosure()));
459 460
460 request.Start(); 461 request->Start();
461 // request.Start() will have submitted OnBeforeRequest by the time we cancel. 462 // request->Start() will have submitted OnBeforeRequest by the time we cancel.
462 request.Cancel(); 463 request->Cancel();
463 base::MessageLoop::current()->Run(); 464 base::MessageLoop::current()->Run();
464 465
465 EXPECT_TRUE(!request.is_pending()); 466 EXPECT_TRUE(!request->is_pending());
466 EXPECT_EQ(net::URLRequestStatus::CANCELED, request.status().status()); 467 EXPECT_EQ(net::URLRequestStatus::CANCELED, request->status().status());
467 EXPECT_EQ(net::ERR_ABORTED, request.status().error()); 468 EXPECT_EQ(net::ERR_ABORTED, request->status().error());
468 EXPECT_EQ(request_url, request.url()); 469 EXPECT_EQ(request_url, request->url());
469 EXPECT_EQ(1U, request.url_chain().size()); 470 EXPECT_EQ(1U, request->url_chain().size());
470 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); 471 EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
471 472
472 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 473 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
473 &profile_, extension_id, kEventName + "/1"); 474 &profile_, extension_id, kEventName + "/1");
474 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 475 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
475 &profile_, extension_id, kEventName2 + "/1"); 476 &profile_, extension_id, kEventName2 + "/1");
476 } 477 }
477 478
478 namespace { 479 namespace {
479 480
(...skipping 12 matching lines...) Expand all
492 493
493 } // namespace 494 } // namespace
494 495
495 void ExtensionWebRequestTest::FireURLRequestWithData( 496 void ExtensionWebRequestTest::FireURLRequestWithData(
496 const std::string& method, 497 const std::string& method,
497 const char* content_type, 498 const char* content_type,
498 const std::vector<char>& bytes_1, 499 const std::vector<char>& bytes_1,
499 const std::vector<char>& bytes_2) { 500 const std::vector<char>& bytes_2) {
500 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme. 501 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme.
501 GURL request_url("http://www.example.com"); 502 GURL request_url("http://www.example.com");
502 net::URLRequest request( 503 scoped_ptr<net::URLRequest> request(context_->CreateRequest(
503 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); 504 request_url, net::DEFAULT_PRIORITY, &delegate_, NULL));
504 request.set_method(method); 505 request->set_method(method);
505 if (content_type != NULL) 506 if (content_type != NULL) {
506 request.SetExtraRequestHeaderByName(net::HttpRequestHeaders::kContentType, 507 request->SetExtraRequestHeaderByName(net::HttpRequestHeaders::kContentType,
507 content_type, 508 content_type,
508 true /* overwrite */); 509 true /* overwrite */);
510 }
509 ScopedVector<net::UploadElementReader> element_readers; 511 ScopedVector<net::UploadElementReader> element_readers;
510 element_readers.push_back(new net::UploadBytesElementReader( 512 element_readers.push_back(new net::UploadBytesElementReader(
511 &(bytes_1[0]), bytes_1.size())); 513 &(bytes_1[0]), bytes_1.size()));
512 element_readers.push_back( 514 element_readers.push_back(
513 new net::UploadFileElementReader(base::MessageLoopProxy::current().get(), 515 new net::UploadFileElementReader(base::MessageLoopProxy::current().get(),
514 base::FilePath(), 516 base::FilePath(),
515 0, 517 0,
516 0, 518 0,
517 base::Time())); 519 base::Time()));
518 element_readers.push_back( 520 element_readers.push_back(
519 new net::UploadBytesElementReader(&(bytes_2[0]), bytes_2.size())); 521 new net::UploadBytesElementReader(&(bytes_2[0]), bytes_2.size()));
520 request.set_upload(make_scoped_ptr( 522 request->set_upload(make_scoped_ptr(
521 new net::UploadDataStream(element_readers.Pass(), 0))); 523 new net::UploadDataStream(element_readers.Pass(), 0)));
522 ipc_sender_.PushTask(base::Bind(&base::DoNothing)); 524 ipc_sender_.PushTask(base::Bind(&base::DoNothing));
523 request.Start(); 525 request->Start();
524 } 526 }
525 527
526 TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) { 528 TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
527 // We verify that URLRequest body is accessible to OnBeforeRequest listeners. 529 // We verify that URLRequest body is accessible to OnBeforeRequest listeners.
528 // These testing steps are repeated twice in a row: 530 // These testing steps are repeated twice in a row:
529 // 1. Register an extension requesting "requestBody" in ExtraInfoSpec and 531 // 1. Register an extension requesting "requestBody" in ExtraInfoSpec and
530 // file a POST URLRequest with a multipart-encoded form. See it getting 532 // file a POST URLRequest with a multipart-encoded form. See it getting
531 // parsed. 533 // parsed.
532 // 2. Do the same, but without requesting "requestBody". Nothing should be 534 // 2. Do the same, but without requesting "requestBody". Nothing should be
533 // parsed. 535 // parsed.
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 708
707 // Subscribe to OnBeforeRequest with requestBody requirement. 709 // Subscribe to OnBeforeRequest with requestBody requirement.
708 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 710 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
709 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", 711 &profile_, extension_id, extension_id, kEventName, kEventName + "/1",
710 filter, extra_info_spec, -1, -1, ipc_sender_factory.GetWeakPtr()); 712 filter, extra_info_spec, -1, -1, ipc_sender_factory.GetWeakPtr());
711 713
712 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme. 714 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme.
713 const GURL request_url("http://www.example.com"); 715 const GURL request_url("http://www.example.com");
714 716
715 for (size_t i = 0; i < arraysize(kMethods); ++i) { 717 for (size_t i = 0; i < arraysize(kMethods); ++i) {
716 net::URLRequest request( 718 scoped_ptr<net::URLRequest> request(context_->CreateRequest(
717 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); 719 request_url, net::DEFAULT_PRIORITY, &delegate_, NULL));
718 request.set_method(kMethods[i]); 720 request->set_method(kMethods[i]);
719 ipc_sender_.PushTask(base::Bind(&base::DoNothing)); 721 ipc_sender_.PushTask(base::Bind(&base::DoNothing));
720 request.Start(); 722 request->Start();
721 } 723 }
722 724
723 // We inspect the result in the message list of |ipc_sender_| later. 725 // We inspect the result in the message list of |ipc_sender_| later.
724 base::MessageLoop::current()->RunUntilIdle(); 726 base::MessageLoop::current()->RunUntilIdle();
725 727
726 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( 728 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
727 &profile_, extension_id, kEventName + "/1"); 729 &profile_, extension_id, kEventName + "/1");
728 730
729 TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin(); 731 TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin();
730 for (size_t test = 0; test < arraysize(kMethods); ++test, ++i) { 732 for (size_t test = 0; test < arraysize(kMethods); ++test, ++i) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 ipc_sender_factory.GetWeakPtr()); 828 ipc_sender_factory.GetWeakPtr());
827 829
828 // Install one extension that observes the final headers. 830 // Install one extension that observes the final headers.
829 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 831 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
830 &profile_, extension3_id, extension3_id, keys::kOnSendHeadersEvent, 832 &profile_, extension3_id, extension3_id, keys::kOnSendHeadersEvent,
831 std::string(keys::kOnSendHeadersEvent) + "/3", filter, 833 std::string(keys::kOnSendHeadersEvent) + "/3", filter,
832 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, -1, -1, 834 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, -1, -1,
833 ipc_sender_factory.GetWeakPtr()); 835 ipc_sender_factory.GetWeakPtr());
834 836
835 GURL request_url("http://doesnotexist/does_not_exist.html"); 837 GURL request_url("http://doesnotexist/does_not_exist.html");
836 net::URLRequest request( 838 scoped_ptr<net::URLRequest> request(context_->CreateRequest(
837 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); 839 request_url, net::DEFAULT_PRIORITY, &delegate_, NULL));
838 840
839 // Initialize headers available before extensions are notified of the 841 // Initialize headers available before extensions are notified of the
840 // onBeforeSendHeaders event. 842 // onBeforeSendHeaders event.
841 HeaderModificationTest test = GetParam(); 843 HeaderModificationTest test = GetParam();
842 net::HttpRequestHeaders before_headers; 844 net::HttpRequestHeaders before_headers;
843 for (int i = 0; i < test.before_size; ++i) 845 for (int i = 0; i < test.before_size; ++i)
844 before_headers.SetHeader(test.before[i].name, test.before[i].value); 846 before_headers.SetHeader(test.before[i].name, test.before[i].value);
845 request.SetExtraRequestHeaders(before_headers); 847 request->SetExtraRequestHeaders(before_headers);
846 848
847 // Gather the modifications to the headers for the respective extensions. 849 // Gather the modifications to the headers for the respective extensions.
848 // We assume here that all modifications of one extension are listed 850 // We assume here that all modifications of one extension are listed
849 // in a continuous block of |test.modifications_|. 851 // in a continuous block of |test.modifications_|.
850 ExtensionWebRequestEventRouter::EventResponse* response = NULL; 852 ExtensionWebRequestEventRouter::EventResponse* response = NULL;
851 for (int i = 0; i < test.modification_size; ++i) { 853 for (int i = 0; i < test.modification_size; ++i) {
852 const HeaderModificationTest_Modification& mod = test.modification[i]; 854 const HeaderModificationTest_Modification& mod = test.modification[i];
853 if (response == NULL) { 855 if (response == NULL) {
854 response = new ExtensionWebRequestEventRouter::EventResponse( 856 response = new ExtensionWebRequestEventRouter::EventResponse(
855 mod.extension_id == 1 ? extension1_id : extension2_id, 857 mod.extension_id == 1 ? extension1_id : extension2_id,
856 base::Time::FromDoubleT(mod.extension_id)); 858 base::Time::FromDoubleT(mod.extension_id));
857 response->request_headers.reset(new net::HttpRequestHeaders()); 859 response->request_headers.reset(new net::HttpRequestHeaders());
858 response->request_headers->MergeFrom(request.extra_request_headers()); 860 response->request_headers->MergeFrom(request->extra_request_headers());
859 } 861 }
860 862
861 switch (mod.type) { 863 switch (mod.type) {
862 case HeaderModificationTest_Modification::SET: 864 case HeaderModificationTest_Modification::SET:
863 response->request_headers->SetHeader(mod.key, mod.value); 865 response->request_headers->SetHeader(mod.key, mod.value);
864 break; 866 break;
865 case HeaderModificationTest_Modification::REMOVE: 867 case HeaderModificationTest_Modification::REMOVE:
866 response->request_headers->RemoveHeader(mod.key); 868 response->request_headers->RemoveHeader(mod.key);
867 break; 869 break;
868 } 870 }
869 871
870 // Trigger the result when this is the last modification statement or 872 // Trigger the result when this is the last modification statement or
871 // the block of modifications for the next extension starts. 873 // the block of modifications for the next extension starts.
872 if (i+1 == test.modification_size || 874 if (i+1 == test.modification_size ||
873 mod.extension_id != test.modification[i+1].extension_id) { 875 mod.extension_id != test.modification[i+1].extension_id) {
874 ipc_sender_.PushTask( 876 ipc_sender_.PushTask(
875 base::Bind(&EventHandledOnIOThread, 877 base::Bind(&EventHandledOnIOThread,
876 &profile_, mod.extension_id == 1 ? extension1_id : extension2_id, 878 &profile_, mod.extension_id == 1 ? extension1_id : extension2_id,
877 kEventName, kEventName + (mod.extension_id == 1 ? "/1" : "/2"), 879 kEventName, kEventName + (mod.extension_id == 1 ? "/1" : "/2"),
878 request.identifier(), response)); 880 request->identifier(), response));
879 response = NULL; 881 response = NULL;
880 } 882 }
881 } 883 }
882 884
883 // Don't do anything for the onSendHeaders message. 885 // Don't do anything for the onSendHeaders message.
884 ipc_sender_.PushTask(base::Bind(&base::DoNothing)); 886 ipc_sender_.PushTask(base::Bind(&base::DoNothing));
885 887
886 // Note that we mess up the headers slightly: 888 // Note that we mess up the headers slightly:
887 // request.Start() will first add additional headers (e.g. the User-Agent) 889 // request->Start() will first add additional headers (e.g. the User-Agent)
888 // and then send an event to the extension. When we have prepared our 890 // and then send an event to the extension. When we have prepared our
889 // answers to the onBeforeSendHeaders events above, these headers did not 891 // answers to the onBeforeSendHeaders events above, these headers did not
890 // exists and are therefore not listed in the responses. This makes 892 // exists and are therefore not listed in the responses. This makes
891 // them seem deleted. 893 // them seem deleted.
892 request.Start(); 894 request->Start();
893 base::MessageLoop::current()->Run(); 895 base::MessageLoop::current()->Run();
894 896
895 EXPECT_TRUE(!request.is_pending()); 897 EXPECT_TRUE(!request->is_pending());
896 // This cannot succeed as we send the request to a server that does not exist. 898 // This cannot succeed as we send the request to a server that does not exist.
897 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); 899 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status());
898 EXPECT_EQ(request_url, request.url()); 900 EXPECT_EQ(request_url, request->url());
899 EXPECT_EQ(1U, request.url_chain().size()); 901 EXPECT_EQ(1U, request->url_chain().size());
900 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); 902 EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
901 903
902 // Calculate the expected headers. 904 // Calculate the expected headers.
903 net::HttpRequestHeaders expected_headers; 905 net::HttpRequestHeaders expected_headers;
904 for (int i = 0; i < test.after_size; ++i) { 906 for (int i = 0; i < test.after_size; ++i) {
905 expected_headers.SetHeader(test.after[i].name, 907 expected_headers.SetHeader(test.after[i].name,
906 test.after[i].value); 908 test.after[i].value);
907 } 909 }
908 910
909 // Counter for the number of observed onSendHeaders events. 911 // Counter for the number of observed onSendHeaders events.
(...skipping 1313 matching lines...) Expand 10 before | Expand all | Expand 10 after
2223 EXPECT_TRUE(credentials_set); 2225 EXPECT_TRUE(credentials_set);
2224 EXPECT_FALSE(auth3.Empty()); 2226 EXPECT_FALSE(auth3.Empty());
2225 EXPECT_EQ(username, auth1.username()); 2227 EXPECT_EQ(username, auth1.username());
2226 EXPECT_EQ(password, auth1.password()); 2228 EXPECT_EQ(password, auth1.password());
2227 EXPECT_EQ(1u, warning_set.size()); 2229 EXPECT_EQ(1u, warning_set.size());
2228 EXPECT_TRUE(HasWarning(warning_set, "extid2")); 2230 EXPECT_TRUE(HasWarning(warning_set, "extid2"));
2229 EXPECT_EQ(3u, capturing_net_log.GetSize()); 2231 EXPECT_EQ(3u, capturing_net_log.GetSize());
2230 } 2232 }
2231 2233
2232 } // namespace extensions 2234 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698