| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/extensions/extension_webrequest_api.h" | 5 #include "chrome/browser/extensions/extension_webrequest_api.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 return Singleton<ExtensionWebRequestEventRouter>::get(); | 329 return Singleton<ExtensionWebRequestEventRouter>::get(); |
| 330 } | 330 } |
| 331 | 331 |
| 332 ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() { | 332 ExtensionWebRequestEventRouter::ExtensionWebRequestEventRouter() { |
| 333 } | 333 } |
| 334 | 334 |
| 335 ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() { | 335 ExtensionWebRequestEventRouter::~ExtensionWebRequestEventRouter() { |
| 336 } | 336 } |
| 337 | 337 |
| 338 int ExtensionWebRequestEventRouter::OnBeforeRequest( | 338 int ExtensionWebRequestEventRouter::OnBeforeRequest( |
| 339 ProfileId profile_id, | 339 void* profile, |
| 340 ExtensionInfoMap* extension_info_map, | 340 ExtensionInfoMap* extension_info_map, |
| 341 net::URLRequest* request, | 341 net::URLRequest* request, |
| 342 net::CompletionCallback* callback, | 342 net::CompletionCallback* callback, |
| 343 GURL* new_url) { | 343 GURL* new_url) { |
| 344 // TODO(jochen): Figure out what to do with events from the system context. | 344 // TODO(jochen): Figure out what to do with events from the system context. |
| 345 if (profile_id == Profile::kInvalidProfileId) | 345 if (!profile) |
| 346 return net::OK; | 346 return net::OK; |
| 347 | 347 |
| 348 if (!HasWebRequestScheme(request->url())) | 348 if (!HasWebRequestScheme(request->url())) |
| 349 return net::OK; | 349 return net::OK; |
| 350 | 350 |
| 351 // If this is an HTTP request, keep track of it. HTTP-specific events only | 351 // If this is an HTTP request, keep track of it. HTTP-specific events only |
| 352 // have the request ID, so we'll need to look up the URLRequest from that. | 352 // have the request ID, so we'll need to look up the URLRequest from that. |
| 353 // We need to do this even if no extension subscribes to OnBeforeRequest to | 353 // We need to do this even if no extension subscribes to OnBeforeRequest to |
| 354 // guarantee that |http_requests_| is populated if an extension subscribes | 354 // guarantee that |http_requests_| is populated if an extension subscribes |
| 355 // to OnBeforeSendHeaders or OnRequestSent. | 355 // to OnBeforeSendHeaders or OnRequestSent. |
| 356 if (request->url().SchemeIs(chrome::kHttpScheme) || | 356 if (request->url().SchemeIs(chrome::kHttpScheme) || |
| 357 request->url().SchemeIs(chrome::kHttpsScheme)) { | 357 request->url().SchemeIs(chrome::kHttpsScheme)) { |
| 358 http_requests_[request->identifier()] = request; | 358 http_requests_[request->identifier()] = request; |
| 359 } | 359 } |
| 360 | 360 |
| 361 int tab_id = -1; | 361 int tab_id = -1; |
| 362 int window_id = -1; | 362 int window_id = -1; |
| 363 ResourceType::Type resource_type = ResourceType::LAST_TYPE; | 363 ResourceType::Type resource_type = ResourceType::LAST_TYPE; |
| 364 ExtractRequestInfo(request, &tab_id, &window_id, &resource_type); | 364 ExtractRequestInfo(request, &tab_id, &window_id, &resource_type); |
| 365 | 365 |
| 366 int extra_info_spec = 0; | 366 int extra_info_spec = 0; |
| 367 std::vector<const EventListener*> listeners = | 367 std::vector<const EventListener*> listeners = |
| 368 GetMatchingListeners(profile_id, extension_info_map, | 368 GetMatchingListeners(profile, extension_info_map, keys::kOnBeforeRequest, |
| 369 keys::kOnBeforeRequest, request->url(), | 369 request->url(), tab_id, window_id, resource_type, |
| 370 tab_id, window_id, resource_type, &extra_info_spec); | 370 &extra_info_spec); |
| 371 if (listeners.empty()) | 371 if (listeners.empty()) |
| 372 return net::OK; | 372 return net::OK; |
| 373 | 373 |
| 374 if (GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) | 374 if (GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) |
| 375 return net::OK; | 375 return net::OK; |
| 376 | 376 |
| 377 ListValue args; | 377 ListValue args; |
| 378 DictionaryValue* dict = new DictionaryValue(); | 378 DictionaryValue* dict = new DictionaryValue(); |
| 379 dict->SetString(keys::kRequestIdKey, | 379 dict->SetString(keys::kRequestIdKey, |
| 380 base::Uint64ToString(request->identifier())); | 380 base::Uint64ToString(request->identifier())); |
| 381 dict->SetString(keys::kUrlKey, request->url().spec()); | 381 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 382 dict->SetString(keys::kMethodKey, request->method()); | 382 dict->SetString(keys::kMethodKey, request->method()); |
| 383 dict->SetInteger(keys::kTabIdKey, tab_id); | 383 dict->SetInteger(keys::kTabIdKey, tab_id); |
| 384 dict->SetString(keys::kTypeKey, ResourceTypeToString(resource_type)); | 384 dict->SetString(keys::kTypeKey, ResourceTypeToString(resource_type)); |
| 385 dict->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); | 385 dict->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); |
| 386 args.Append(dict); | 386 args.Append(dict); |
| 387 | 387 |
| 388 if (DispatchEvent(profile_id, request, listeners, args)) { | 388 if (DispatchEvent(profile, request, listeners, args)) { |
| 389 blocked_requests_[request->identifier()].event = kOnBeforeRequest; | 389 blocked_requests_[request->identifier()].event = kOnBeforeRequest; |
| 390 blocked_requests_[request->identifier()].callback = callback; | 390 blocked_requests_[request->identifier()].callback = callback; |
| 391 blocked_requests_[request->identifier()].new_url = new_url; | 391 blocked_requests_[request->identifier()].new_url = new_url; |
| 392 return net::ERR_IO_PENDING; | 392 return net::ERR_IO_PENDING; |
| 393 } | 393 } |
| 394 return net::OK; | 394 return net::OK; |
| 395 } | 395 } |
| 396 | 396 |
| 397 int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( | 397 int ExtensionWebRequestEventRouter::OnBeforeSendHeaders( |
| 398 ProfileId profile_id, | 398 void* profile, |
| 399 ExtensionInfoMap* extension_info_map, | 399 ExtensionInfoMap* extension_info_map, |
| 400 net::URLRequest* request, | 400 net::URLRequest* request, |
| 401 net::CompletionCallback* callback, | 401 net::CompletionCallback* callback, |
| 402 net::HttpRequestHeaders* headers) { | 402 net::HttpRequestHeaders* headers) { |
| 403 // TODO(jochen): Figure out what to do with events from the system context. | 403 // TODO(jochen): Figure out what to do with events from the system context. |
| 404 if (profile_id == Profile::kInvalidProfileId) | 404 if (!profile) |
| 405 return net::OK; | 405 return net::OK; |
| 406 | 406 |
| 407 if (!HasWebRequestScheme(request->url())) | 407 if (!HasWebRequestScheme(request->url())) |
| 408 return net::OK; | 408 return net::OK; |
| 409 | 409 |
| 410 if (GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) | 410 if (GetAndSetSignaled(request->identifier(), kOnBeforeSendHeaders)) |
| 411 return net::OK; | 411 return net::OK; |
| 412 | 412 |
| 413 int extra_info_spec = 0; | 413 int extra_info_spec = 0; |
| 414 std::vector<const EventListener*> listeners = | 414 std::vector<const EventListener*> listeners = |
| 415 GetMatchingListeners(profile_id, extension_info_map, | 415 GetMatchingListeners(profile, extension_info_map, |
| 416 keys::kOnBeforeSendHeaders, request, | 416 keys::kOnBeforeSendHeaders, request, |
| 417 &extra_info_spec); | 417 &extra_info_spec); |
| 418 if (listeners.empty()) | 418 if (listeners.empty()) |
| 419 return net::OK; | 419 return net::OK; |
| 420 | 420 |
| 421 ListValue args; | 421 ListValue args; |
| 422 DictionaryValue* dict = new DictionaryValue(); | 422 DictionaryValue* dict = new DictionaryValue(); |
| 423 dict->SetString(keys::kRequestIdKey, | 423 dict->SetString(keys::kRequestIdKey, |
| 424 base::Uint64ToString(request->identifier())); | 424 base::Uint64ToString(request->identifier())); |
| 425 dict->SetString(keys::kUrlKey, request->url().spec()); | 425 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 426 dict->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); | 426 dict->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); |
| 427 | 427 |
| 428 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) | 428 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) |
| 429 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(headers)); | 429 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(headers)); |
| 430 // TODO(battre): implement request line. | 430 // TODO(battre): implement request line. |
| 431 | 431 |
| 432 args.Append(dict); | 432 args.Append(dict); |
| 433 | 433 |
| 434 if (DispatchEvent(profile_id, request, listeners, args)) { | 434 if (DispatchEvent(profile, request, listeners, args)) { |
| 435 blocked_requests_[request->identifier()].event = kOnBeforeSendHeaders; | 435 blocked_requests_[request->identifier()].event = kOnBeforeSendHeaders; |
| 436 blocked_requests_[request->identifier()].callback = callback; | 436 blocked_requests_[request->identifier()].callback = callback; |
| 437 blocked_requests_[request->identifier()].request_headers = headers; | 437 blocked_requests_[request->identifier()].request_headers = headers; |
| 438 return net::ERR_IO_PENDING; | 438 return net::ERR_IO_PENDING; |
| 439 } | 439 } |
| 440 return net::OK; | 440 return net::OK; |
| 441 } | 441 } |
| 442 | 442 |
| 443 void ExtensionWebRequestEventRouter::OnRequestSent( | 443 void ExtensionWebRequestEventRouter::OnRequestSent( |
| 444 ProfileId profile_id, | 444 void* profile, |
| 445 ExtensionInfoMap* extension_info_map, | 445 ExtensionInfoMap* extension_info_map, |
| 446 uint64 request_id, | 446 uint64 request_id, |
| 447 const net::HostPortPair& socket_address, | 447 const net::HostPortPair& socket_address, |
| 448 const net::HttpRequestHeaders& headers) { | 448 const net::HttpRequestHeaders& headers) { |
| 449 if (profile_id == Profile::kInvalidProfileId) | 449 if (!profile) |
| 450 return; | 450 return; |
| 451 | 451 |
| 452 base::Time time(base::Time::Now()); | 452 base::Time time(base::Time::Now()); |
| 453 | 453 |
| 454 HttpRequestMap::iterator iter = http_requests_.find(request_id); | 454 HttpRequestMap::iterator iter = http_requests_.find(request_id); |
| 455 if (iter == http_requests_.end()) | 455 if (iter == http_requests_.end()) |
| 456 return; | 456 return; |
| 457 | 457 |
| 458 net::URLRequest* request = iter->second; | 458 net::URLRequest* request = iter->second; |
| 459 | 459 |
| 460 if (!HasWebRequestScheme(request->url())) | 460 if (!HasWebRequestScheme(request->url())) |
| 461 return; | 461 return; |
| 462 | 462 |
| 463 if (GetAndSetSignaled(request->identifier(), kOnRequestSent)) | 463 if (GetAndSetSignaled(request->identifier(), kOnRequestSent)) |
| 464 return; | 464 return; |
| 465 | 465 |
| 466 ClearSignaled(request->identifier(), kOnBeforeRedirect); | 466 ClearSignaled(request->identifier(), kOnBeforeRedirect); |
| 467 | 467 |
| 468 int extra_info_spec = 0; | 468 int extra_info_spec = 0; |
| 469 std::vector<const EventListener*> listeners = | 469 std::vector<const EventListener*> listeners = |
| 470 GetMatchingListeners(profile_id, extension_info_map, | 470 GetMatchingListeners(profile, extension_info_map, |
| 471 keys::kOnRequestSent, request, &extra_info_spec); | 471 keys::kOnRequestSent, request, &extra_info_spec); |
| 472 if (listeners.empty()) | 472 if (listeners.empty()) |
| 473 return; | 473 return; |
| 474 | 474 |
| 475 ListValue args; | 475 ListValue args; |
| 476 DictionaryValue* dict = new DictionaryValue(); | 476 DictionaryValue* dict = new DictionaryValue(); |
| 477 dict->SetString(keys::kRequestIdKey, | 477 dict->SetString(keys::kRequestIdKey, |
| 478 base::Uint64ToString(request->identifier())); | 478 base::Uint64ToString(request->identifier())); |
| 479 dict->SetString(keys::kUrlKey, request->url().spec()); | 479 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 480 dict->SetString(keys::kIpKey, socket_address.host()); | 480 dict->SetString(keys::kIpKey, socket_address.host()); |
| 481 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); | 481 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); |
| 482 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) | 482 if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) |
| 483 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(&headers)); | 483 dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(&headers)); |
| 484 // TODO(battre): support "request line". | 484 // TODO(battre): support "request line". |
| 485 args.Append(dict); | 485 args.Append(dict); |
| 486 | 486 |
| 487 DispatchEvent(profile_id, request, listeners, args); | 487 DispatchEvent(profile, request, listeners, args); |
| 488 } | 488 } |
| 489 | 489 |
| 490 void ExtensionWebRequestEventRouter::OnBeforeRedirect( | 490 void ExtensionWebRequestEventRouter::OnBeforeRedirect( |
| 491 ProfileId profile_id, | 491 void* profile, |
| 492 ExtensionInfoMap* extension_info_map, | 492 ExtensionInfoMap* extension_info_map, |
| 493 net::URLRequest* request, | 493 net::URLRequest* request, |
| 494 const GURL& new_location) { | 494 const GURL& new_location) { |
| 495 if (profile_id == Profile::kInvalidProfileId) | 495 if (!profile) |
| 496 return; | 496 return; |
| 497 | 497 |
| 498 if (!HasWebRequestScheme(request->url())) | 498 if (!HasWebRequestScheme(request->url())) |
| 499 return; | 499 return; |
| 500 | 500 |
| 501 base::Time time(base::Time::Now()); | 501 base::Time time(base::Time::Now()); |
| 502 | 502 |
| 503 if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect)) | 503 if (GetAndSetSignaled(request->identifier(), kOnBeforeRedirect)) |
| 504 return; | 504 return; |
| 505 | 505 |
| 506 ClearSignaled(request->identifier(), kOnBeforeRequest); | 506 ClearSignaled(request->identifier(), kOnBeforeRequest); |
| 507 ClearSignaled(request->identifier(), kOnBeforeSendHeaders); | 507 ClearSignaled(request->identifier(), kOnBeforeSendHeaders); |
| 508 ClearSignaled(request->identifier(), kOnRequestSent); | 508 ClearSignaled(request->identifier(), kOnRequestSent); |
| 509 | 509 |
| 510 int extra_info_spec = 0; | 510 int extra_info_spec = 0; |
| 511 std::vector<const EventListener*> listeners = | 511 std::vector<const EventListener*> listeners = |
| 512 GetMatchingListeners(profile_id, extension_info_map, | 512 GetMatchingListeners(profile, extension_info_map, |
| 513 keys::kOnBeforeRedirect, request, &extra_info_spec); | 513 keys::kOnBeforeRedirect, request, &extra_info_spec); |
| 514 if (listeners.empty()) | 514 if (listeners.empty()) |
| 515 return; | 515 return; |
| 516 | 516 |
| 517 int http_status_code = request->GetResponseCode(); | 517 int http_status_code = request->GetResponseCode(); |
| 518 | 518 |
| 519 ListValue args; | 519 ListValue args; |
| 520 DictionaryValue* dict = new DictionaryValue(); | 520 DictionaryValue* dict = new DictionaryValue(); |
| 521 dict->SetString(keys::kRequestIdKey, | 521 dict->SetString(keys::kRequestIdKey, |
| 522 base::Uint64ToString(request->identifier())); | 522 base::Uint64ToString(request->identifier())); |
| 523 dict->SetString(keys::kUrlKey, request->url().spec()); | 523 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 524 dict->SetString(keys::kRedirectUrlKey, new_location.spec()); | 524 dict->SetString(keys::kRedirectUrlKey, new_location.spec()); |
| 525 dict->SetInteger(keys::kStatusCodeKey, http_status_code); | 525 dict->SetInteger(keys::kStatusCodeKey, http_status_code); |
| 526 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); | 526 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); |
| 527 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { | 527 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { |
| 528 dict->Set(keys::kResponseHeadersKey, | 528 dict->Set(keys::kResponseHeadersKey, |
| 529 GetResponseHeadersList(request->response_headers())); | 529 GetResponseHeadersList(request->response_headers())); |
| 530 } | 530 } |
| 531 if (extra_info_spec & ExtraInfoSpec::STATUS_LINE) | 531 if (extra_info_spec & ExtraInfoSpec::STATUS_LINE) |
| 532 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); | 532 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); |
| 533 args.Append(dict); | 533 args.Append(dict); |
| 534 | 534 |
| 535 DispatchEvent(profile_id, request, listeners, args); | 535 DispatchEvent(profile, request, listeners, args); |
| 536 } | 536 } |
| 537 | 537 |
| 538 void ExtensionWebRequestEventRouter::OnResponseStarted( | 538 void ExtensionWebRequestEventRouter::OnResponseStarted( |
| 539 ProfileId profile_id, | 539 void* profile, |
| 540 ExtensionInfoMap* extension_info_map, | 540 ExtensionInfoMap* extension_info_map, |
| 541 net::URLRequest* request) { | 541 net::URLRequest* request) { |
| 542 if (profile_id == Profile::kInvalidProfileId) | 542 if (!profile) |
| 543 return; | 543 return; |
| 544 | 544 |
| 545 if (!HasWebRequestScheme(request->url())) | 545 if (!HasWebRequestScheme(request->url())) |
| 546 return; | 546 return; |
| 547 | 547 |
| 548 // OnResponseStarted is even triggered, when the request was cancelled. | 548 // OnResponseStarted is even triggered, when the request was cancelled. |
| 549 if (request->status().status() != net::URLRequestStatus::SUCCESS) | 549 if (request->status().status() != net::URLRequestStatus::SUCCESS) |
| 550 return; | 550 return; |
| 551 | 551 |
| 552 base::Time time(base::Time::Now()); | 552 base::Time time(base::Time::Now()); |
| 553 | 553 |
| 554 int extra_info_spec = 0; | 554 int extra_info_spec = 0; |
| 555 std::vector<const EventListener*> listeners = | 555 std::vector<const EventListener*> listeners = |
| 556 GetMatchingListeners(profile_id, extension_info_map, | 556 GetMatchingListeners(profile, extension_info_map, |
| 557 keys::kOnResponseStarted, request, &extra_info_spec); | 557 keys::kOnResponseStarted, request, &extra_info_spec); |
| 558 if (listeners.empty()) | 558 if (listeners.empty()) |
| 559 return; | 559 return; |
| 560 | 560 |
| 561 // UrlRequestFileJobs do not send headers, so we simulate their behavior. | 561 // UrlRequestFileJobs do not send headers, so we simulate their behavior. |
| 562 int response_code = 200; | 562 int response_code = 200; |
| 563 if (request->response_headers()) | 563 if (request->response_headers()) |
| 564 response_code = request->response_headers()->response_code(); | 564 response_code = request->response_headers()->response_code(); |
| 565 | 565 |
| 566 ListValue args; | 566 ListValue args; |
| 567 DictionaryValue* dict = new DictionaryValue(); | 567 DictionaryValue* dict = new DictionaryValue(); |
| 568 dict->SetString(keys::kRequestIdKey, | 568 dict->SetString(keys::kRequestIdKey, |
| 569 base::Uint64ToString(request->identifier())); | 569 base::Uint64ToString(request->identifier())); |
| 570 dict->SetString(keys::kUrlKey, request->url().spec()); | 570 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 571 dict->SetInteger(keys::kStatusCodeKey, response_code); | 571 dict->SetInteger(keys::kStatusCodeKey, response_code); |
| 572 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); | 572 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); |
| 573 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { | 573 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { |
| 574 dict->Set(keys::kResponseHeadersKey, | 574 dict->Set(keys::kResponseHeadersKey, |
| 575 GetResponseHeadersList(request->response_headers())); | 575 GetResponseHeadersList(request->response_headers())); |
| 576 } | 576 } |
| 577 if (extra_info_spec & ExtraInfoSpec::STATUS_LINE) | 577 if (extra_info_spec & ExtraInfoSpec::STATUS_LINE) |
| 578 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); | 578 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); |
| 579 args.Append(dict); | 579 args.Append(dict); |
| 580 | 580 |
| 581 DispatchEvent(profile_id, request, listeners, args); | 581 DispatchEvent(profile, request, listeners, args); |
| 582 } | 582 } |
| 583 | 583 |
| 584 void ExtensionWebRequestEventRouter::OnCompleted( | 584 void ExtensionWebRequestEventRouter::OnCompleted( |
| 585 ProfileId profile_id, | 585 void* profile, |
| 586 ExtensionInfoMap* extension_info_map, | 586 ExtensionInfoMap* extension_info_map, |
| 587 net::URLRequest* request) { | 587 net::URLRequest* request) { |
| 588 if (profile_id == Profile::kInvalidProfileId) | 588 if (!profile) |
| 589 return; | 589 return; |
| 590 | 590 |
| 591 if (!HasWebRequestScheme(request->url())) | 591 if (!HasWebRequestScheme(request->url())) |
| 592 return; | 592 return; |
| 593 | 593 |
| 594 DCHECK(request->status().status() == net::URLRequestStatus::SUCCESS); | 594 DCHECK(request->status().status() == net::URLRequestStatus::SUCCESS); |
| 595 | 595 |
| 596 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); | 596 DCHECK(!GetAndSetSignaled(request->identifier(), kOnCompleted)); |
| 597 | 597 |
| 598 base::Time time(base::Time::Now()); | 598 base::Time time(base::Time::Now()); |
| 599 | 599 |
| 600 int extra_info_spec = 0; | 600 int extra_info_spec = 0; |
| 601 std::vector<const EventListener*> listeners = | 601 std::vector<const EventListener*> listeners = |
| 602 GetMatchingListeners(profile_id, extension_info_map, | 602 GetMatchingListeners(profile, extension_info_map, |
| 603 keys::kOnCompleted, request, &extra_info_spec); | 603 keys::kOnCompleted, request, &extra_info_spec); |
| 604 if (listeners.empty()) | 604 if (listeners.empty()) |
| 605 return; | 605 return; |
| 606 | 606 |
| 607 // UrlRequestFileJobs do not send headers, so we simulate their behavior. | 607 // UrlRequestFileJobs do not send headers, so we simulate their behavior. |
| 608 int response_code = 200; | 608 int response_code = 200; |
| 609 if (request->response_headers()) | 609 if (request->response_headers()) |
| 610 response_code = request->response_headers()->response_code(); | 610 response_code = request->response_headers()->response_code(); |
| 611 | 611 |
| 612 ListValue args; | 612 ListValue args; |
| 613 DictionaryValue* dict = new DictionaryValue(); | 613 DictionaryValue* dict = new DictionaryValue(); |
| 614 dict->SetString(keys::kRequestIdKey, | 614 dict->SetString(keys::kRequestIdKey, |
| 615 base::Uint64ToString(request->identifier())); | 615 base::Uint64ToString(request->identifier())); |
| 616 dict->SetString(keys::kUrlKey, request->url().spec()); | 616 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 617 dict->SetInteger(keys::kStatusCodeKey, response_code); | 617 dict->SetInteger(keys::kStatusCodeKey, response_code); |
| 618 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); | 618 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); |
| 619 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { | 619 if (extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS) { |
| 620 dict->Set(keys::kResponseHeadersKey, | 620 dict->Set(keys::kResponseHeadersKey, |
| 621 GetResponseHeadersList(request->response_headers())); | 621 GetResponseHeadersList(request->response_headers())); |
| 622 } | 622 } |
| 623 if (extra_info_spec & ExtraInfoSpec::STATUS_LINE) | 623 if (extra_info_spec & ExtraInfoSpec::STATUS_LINE) |
| 624 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); | 624 dict->Set(keys::kStatusLineKey, GetStatusLine(request->response_headers())); |
| 625 args.Append(dict); | 625 args.Append(dict); |
| 626 | 626 |
| 627 DispatchEvent(profile_id, request, listeners, args); | 627 DispatchEvent(profile, request, listeners, args); |
| 628 } | 628 } |
| 629 | 629 |
| 630 void ExtensionWebRequestEventRouter::OnErrorOccurred( | 630 void ExtensionWebRequestEventRouter::OnErrorOccurred( |
| 631 ProfileId profile_id, | 631 void* profile, |
| 632 ExtensionInfoMap* extension_info_map, | 632 ExtensionInfoMap* extension_info_map, |
| 633 net::URLRequest* request) { | 633 net::URLRequest* request) { |
| 634 if (profile_id == Profile::kInvalidProfileId) | 634 if (!profile) |
| 635 return; | 635 return; |
| 636 | 636 |
| 637 if (!HasWebRequestScheme(request->url())) | 637 if (!HasWebRequestScheme(request->url())) |
| 638 return; | 638 return; |
| 639 | 639 |
| 640 DCHECK(request->status().status() == net::URLRequestStatus::FAILED); | 640 DCHECK(request->status().status() == net::URLRequestStatus::FAILED); |
| 641 | 641 |
| 642 DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred)); | 642 DCHECK(!GetAndSetSignaled(request->identifier(), kOnErrorOccurred)); |
| 643 | 643 |
| 644 base::Time time(base::Time::Now()); | 644 base::Time time(base::Time::Now()); |
| 645 | 645 |
| 646 int extra_info_spec = 0; | 646 int extra_info_spec = 0; |
| 647 std::vector<const EventListener*> listeners = | 647 std::vector<const EventListener*> listeners = |
| 648 GetMatchingListeners(profile_id, extension_info_map, | 648 GetMatchingListeners(profile, extension_info_map, |
| 649 keys::kOnErrorOccurred, request, &extra_info_spec); | 649 keys::kOnErrorOccurred, request, &extra_info_spec); |
| 650 if (listeners.empty()) | 650 if (listeners.empty()) |
| 651 return; | 651 return; |
| 652 | 652 |
| 653 ListValue args; | 653 ListValue args; |
| 654 DictionaryValue* dict = new DictionaryValue(); | 654 DictionaryValue* dict = new DictionaryValue(); |
| 655 dict->SetString(keys::kRequestIdKey, | 655 dict->SetString(keys::kRequestIdKey, |
| 656 base::Uint64ToString(request->identifier())); | 656 base::Uint64ToString(request->identifier())); |
| 657 dict->SetString(keys::kUrlKey, request->url().spec()); | 657 dict->SetString(keys::kUrlKey, request->url().spec()); |
| 658 dict->SetString(keys::kErrorKey, | 658 dict->SetString(keys::kErrorKey, |
| 659 net::ErrorToString(request->status().os_error())); | 659 net::ErrorToString(request->status().os_error())); |
| 660 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); | 660 dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000); |
| 661 args.Append(dict); | 661 args.Append(dict); |
| 662 | 662 |
| 663 DispatchEvent(profile_id, request, listeners, args); | 663 DispatchEvent(profile, request, listeners, args); |
| 664 } | 664 } |
| 665 | 665 |
| 666 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( | 666 void ExtensionWebRequestEventRouter::OnURLRequestDestroyed( |
| 667 ProfileId profile_id, net::URLRequest* request) { | 667 void* profile, net::URLRequest* request) { |
| 668 blocked_requests_.erase(request->identifier()); | 668 blocked_requests_.erase(request->identifier()); |
| 669 signaled_requests_.erase(request->identifier()); | 669 signaled_requests_.erase(request->identifier()); |
| 670 http_requests_.erase(request->identifier()); | 670 http_requests_.erase(request->identifier()); |
| 671 } | 671 } |
| 672 | 672 |
| 673 void ExtensionWebRequestEventRouter::OnHttpTransactionDestroyed( | 673 void ExtensionWebRequestEventRouter::OnHttpTransactionDestroyed( |
| 674 ProfileId profile_id, uint64 request_id) { | 674 void* profile, uint64 request_id) { |
| 675 if (blocked_requests_.find(request_id) != blocked_requests_.end() && | 675 if (blocked_requests_.find(request_id) != blocked_requests_.end() && |
| 676 blocked_requests_[request_id].event == kOnBeforeSendHeaders) { | 676 blocked_requests_[request_id].event == kOnBeforeSendHeaders) { |
| 677 // Ensure we don't call into the deleted HttpTransaction. | 677 // Ensure we don't call into the deleted HttpTransaction. |
| 678 blocked_requests_[request_id].callback = NULL; | 678 blocked_requests_[request_id].callback = NULL; |
| 679 blocked_requests_[request_id].request_headers = NULL; | 679 blocked_requests_[request_id].request_headers = NULL; |
| 680 } | 680 } |
| 681 } | 681 } |
| 682 | 682 |
| 683 bool ExtensionWebRequestEventRouter::DispatchEvent( | 683 bool ExtensionWebRequestEventRouter::DispatchEvent( |
| 684 ProfileId profile_id, | 684 void* profile, |
| 685 net::URLRequest* request, | 685 net::URLRequest* request, |
| 686 const std::vector<const EventListener*>& listeners, | 686 const std::vector<const EventListener*>& listeners, |
| 687 const ListValue& args) { | 687 const ListValue& args) { |
| 688 std::string json_args; | 688 std::string json_args; |
| 689 | 689 |
| 690 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) | 690 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) |
| 691 // pairs into a single message sent to a list of sub_event_names. | 691 // pairs into a single message sent to a list of sub_event_names. |
| 692 int num_handlers_blocking = 0; | 692 int num_handlers_blocking = 0; |
| 693 for (std::vector<const EventListener*>::const_iterator it = listeners.begin(); | 693 for (std::vector<const EventListener*>::const_iterator it = listeners.begin(); |
| 694 it != listeners.end(); ++it) { | 694 it != listeners.end(); ++it) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 721 num_handlers_blocking; | 721 num_handlers_blocking; |
| 722 blocked_requests_[request->identifier()].blocking_time = base::Time::Now(); | 722 blocked_requests_[request->identifier()].blocking_time = base::Time::Now(); |
| 723 | 723 |
| 724 return true; | 724 return true; |
| 725 } | 725 } |
| 726 | 726 |
| 727 return false; | 727 return false; |
| 728 } | 728 } |
| 729 | 729 |
| 730 void ExtensionWebRequestEventRouter::OnEventHandled( | 730 void ExtensionWebRequestEventRouter::OnEventHandled( |
| 731 ProfileId profile_id, | 731 void* profile, |
| 732 const std::string& extension_id, | 732 const std::string& extension_id, |
| 733 const std::string& event_name, | 733 const std::string& event_name, |
| 734 const std::string& sub_event_name, | 734 const std::string& sub_event_name, |
| 735 uint64 request_id, | 735 uint64 request_id, |
| 736 EventResponse* response) { | 736 EventResponse* response) { |
| 737 EventListener listener; | 737 EventListener listener; |
| 738 listener.extension_id = extension_id; | 738 listener.extension_id = extension_id; |
| 739 listener.sub_event_name = sub_event_name; | 739 listener.sub_event_name = sub_event_name; |
| 740 | 740 |
| 741 // The listener may have been removed (e.g. due to the process going away) | 741 // The listener may have been removed (e.g. due to the process going away) |
| 742 // before we got here. | 742 // before we got here. |
| 743 std::set<EventListener>::iterator found = | 743 std::set<EventListener>::iterator found = |
| 744 listeners_[profile_id][event_name].find(listener); | 744 listeners_[profile][event_name].find(listener); |
| 745 if (found != listeners_[profile_id][event_name].end()) | 745 if (found != listeners_[profile][event_name].end()) |
| 746 found->blocked_requests.erase(request_id); | 746 found->blocked_requests.erase(request_id); |
| 747 | 747 |
| 748 DecrementBlockCount(request_id, response); | 748 DecrementBlockCount(request_id, response); |
| 749 } | 749 } |
| 750 | 750 |
| 751 void ExtensionWebRequestEventRouter::AddEventListener( | 751 void ExtensionWebRequestEventRouter::AddEventListener( |
| 752 ProfileId profile_id, | 752 void* profile, |
| 753 const std::string& extension_id, | 753 const std::string& extension_id, |
| 754 const std::string& event_name, | 754 const std::string& event_name, |
| 755 const std::string& sub_event_name, | 755 const std::string& sub_event_name, |
| 756 const RequestFilter& filter, | 756 const RequestFilter& filter, |
| 757 int extra_info_spec, | 757 int extra_info_spec, |
| 758 base::WeakPtr<IPC::Message::Sender> ipc_sender) { | 758 base::WeakPtr<IPC::Message::Sender> ipc_sender) { |
| 759 if (!IsWebRequestEvent(event_name)) | 759 if (!IsWebRequestEvent(event_name)) |
| 760 return; | 760 return; |
| 761 | 761 |
| 762 EventListener listener; | 762 EventListener listener; |
| 763 listener.extension_id = extension_id; | 763 listener.extension_id = extension_id; |
| 764 listener.sub_event_name = sub_event_name; | 764 listener.sub_event_name = sub_event_name; |
| 765 listener.filter = filter; | 765 listener.filter = filter; |
| 766 listener.extra_info_spec = extra_info_spec; | 766 listener.extra_info_spec = extra_info_spec; |
| 767 listener.ipc_sender = ipc_sender; | 767 listener.ipc_sender = ipc_sender; |
| 768 | 768 |
| 769 CHECK_EQ(listeners_[profile_id][event_name].count(listener), 0u) << | 769 CHECK_EQ(listeners_[profile][event_name].count(listener), 0u) << |
| 770 "extension=" << extension_id << " event=" << event_name; | 770 "extension=" << extension_id << " event=" << event_name; |
| 771 listeners_[profile_id][event_name].insert(listener); | 771 listeners_[profile][event_name].insert(listener); |
| 772 } | 772 } |
| 773 | 773 |
| 774 void ExtensionWebRequestEventRouter::RemoveEventListener( | 774 void ExtensionWebRequestEventRouter::RemoveEventListener( |
| 775 ProfileId profile_id, | 775 void* profile, |
| 776 const std::string& extension_id, | 776 const std::string& extension_id, |
| 777 const std::string& sub_event_name) { | 777 const std::string& sub_event_name) { |
| 778 size_t slash_sep = sub_event_name.find('/'); | 778 size_t slash_sep = sub_event_name.find('/'); |
| 779 std::string event_name = sub_event_name.substr(0, slash_sep); | 779 std::string event_name = sub_event_name.substr(0, slash_sep); |
| 780 | 780 |
| 781 if (!IsWebRequestEvent(event_name)) | 781 if (!IsWebRequestEvent(event_name)) |
| 782 return; | 782 return; |
| 783 | 783 |
| 784 EventListener listener; | 784 EventListener listener; |
| 785 listener.extension_id = extension_id; | 785 listener.extension_id = extension_id; |
| 786 listener.sub_event_name = sub_event_name; | 786 listener.sub_event_name = sub_event_name; |
| 787 | 787 |
| 788 // It's possible for AddEventListener to fail asynchronously. In that case, | 788 // It's possible for AddEventListener to fail asynchronously. In that case, |
| 789 // the renderer believes the listener exists, while the browser does not. | 789 // the renderer believes the listener exists, while the browser does not. |
| 790 // Ignore a RemoveEventListener in that case. | 790 // Ignore a RemoveEventListener in that case. |
| 791 std::set<EventListener>::iterator found = | 791 std::set<EventListener>::iterator found = |
| 792 listeners_[profile_id][event_name].find(listener); | 792 listeners_[profile][event_name].find(listener); |
| 793 if (found == listeners_[profile_id][event_name].end()) | 793 if (found == listeners_[profile][event_name].end()) |
| 794 return; | 794 return; |
| 795 | 795 |
| 796 CHECK_EQ(listeners_[profile_id][event_name].count(listener), 1u) << | 796 CHECK_EQ(listeners_[profile][event_name].count(listener), 1u) << |
| 797 "extension=" << extension_id << " event=" << event_name; | 797 "extension=" << extension_id << " event=" << event_name; |
| 798 | 798 |
| 799 // Unblock any request that this event listener may have been blocking. | 799 // Unblock any request that this event listener may have been blocking. |
| 800 for (std::set<uint64>::iterator it = found->blocked_requests.begin(); | 800 for (std::set<uint64>::iterator it = found->blocked_requests.begin(); |
| 801 it != found->blocked_requests.end(); ++it) { | 801 it != found->blocked_requests.end(); ++it) { |
| 802 DecrementBlockCount(*it, NULL); | 802 DecrementBlockCount(*it, NULL); |
| 803 } | 803 } |
| 804 | 804 |
| 805 listeners_[profile_id][event_name].erase(listener); | 805 listeners_[profile][event_name].erase(listener); |
| 806 } | 806 } |
| 807 | 807 |
| 808 void ExtensionWebRequestEventRouter::OnOTRProfileCreated( | 808 void ExtensionWebRequestEventRouter::OnOTRProfileCreated( |
| 809 ProfileId original_profile_id, ProfileId otr_profile_id) { | 809 void* original_profile, void* otr_profile) { |
| 810 cross_profile_map_[original_profile_id] = otr_profile_id; | 810 cross_profile_map_[original_profile] = otr_profile; |
| 811 cross_profile_map_[otr_profile_id] = original_profile_id; | 811 cross_profile_map_[otr_profile] = original_profile; |
| 812 } | 812 } |
| 813 | 813 |
| 814 void ExtensionWebRequestEventRouter::OnOTRProfileDestroyed( | 814 void ExtensionWebRequestEventRouter::OnOTRProfileDestroyed( |
| 815 ProfileId original_profile_id, ProfileId otr_profile_id) { | 815 void* original_profile, void* otr_profile) { |
| 816 cross_profile_map_.erase(otr_profile_id); | 816 cross_profile_map_.erase(otr_profile); |
| 817 cross_profile_map_.erase(original_profile_id); | 817 cross_profile_map_.erase(original_profile); |
| 818 } | 818 } |
| 819 | 819 |
| 820 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl( | 820 void ExtensionWebRequestEventRouter::GetMatchingListenersImpl( |
| 821 ProfileId profile_id, | 821 void* profile, |
| 822 ExtensionInfoMap* extension_info_map, | 822 ExtensionInfoMap* extension_info_map, |
| 823 bool crosses_incognito, | 823 bool crosses_incognito, |
| 824 const std::string& event_name, | 824 const std::string& event_name, |
| 825 const GURL& url, | 825 const GURL& url, |
| 826 int tab_id, | 826 int tab_id, |
| 827 int window_id, | 827 int window_id, |
| 828 ResourceType::Type resource_type, | 828 ResourceType::Type resource_type, |
| 829 int* extra_info_spec, | 829 int* extra_info_spec, |
| 830 std::vector<const ExtensionWebRequestEventRouter::EventListener*>* | 830 std::vector<const ExtensionWebRequestEventRouter::EventListener*>* |
| 831 matching_listeners) { | 831 matching_listeners) { |
| 832 std::set<EventListener>& listeners = listeners_[profile_id][event_name]; | 832 std::set<EventListener>& listeners = listeners_[profile][event_name]; |
| 833 for (std::set<EventListener>::iterator it = listeners.begin(); | 833 for (std::set<EventListener>::iterator it = listeners.begin(); |
| 834 it != listeners.end(); ++it) { | 834 it != listeners.end(); ++it) { |
| 835 if (!it->ipc_sender.get()) { | 835 if (!it->ipc_sender.get()) { |
| 836 // The IPC sender has been deleted. This listener will be removed soon | 836 // The IPC sender has been deleted. This listener will be removed soon |
| 837 // via a call to RemoveEventListener. For now, just skip it. | 837 // via a call to RemoveEventListener. For now, just skip it. |
| 838 continue; | 838 continue; |
| 839 } | 839 } |
| 840 | 840 |
| 841 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) | 841 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) |
| 842 continue; | 842 continue; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 860 continue; | 860 continue; |
| 861 } | 861 } |
| 862 | 862 |
| 863 matching_listeners->push_back(&(*it)); | 863 matching_listeners->push_back(&(*it)); |
| 864 *extra_info_spec |= it->extra_info_spec; | 864 *extra_info_spec |= it->extra_info_spec; |
| 865 } | 865 } |
| 866 } | 866 } |
| 867 | 867 |
| 868 std::vector<const ExtensionWebRequestEventRouter::EventListener*> | 868 std::vector<const ExtensionWebRequestEventRouter::EventListener*> |
| 869 ExtensionWebRequestEventRouter::GetMatchingListeners( | 869 ExtensionWebRequestEventRouter::GetMatchingListeners( |
| 870 ProfileId profile_id, | 870 void* profile, |
| 871 ExtensionInfoMap* extension_info_map, | 871 ExtensionInfoMap* extension_info_map, |
| 872 const std::string& event_name, | 872 const std::string& event_name, |
| 873 const GURL& url, | 873 const GURL& url, |
| 874 int tab_id, | 874 int tab_id, |
| 875 int window_id, | 875 int window_id, |
| 876 ResourceType::Type resource_type, | 876 ResourceType::Type resource_type, |
| 877 int* extra_info_spec) { | 877 int* extra_info_spec) { |
| 878 // TODO(mpcomplete): handle profile_id == invalid (should collect all | 878 // TODO(mpcomplete): handle profile == NULL (should collect all listeners). |
| 879 // listeners). | |
| 880 *extra_info_spec = 0; | 879 *extra_info_spec = 0; |
| 881 | 880 |
| 882 std::vector<const ExtensionWebRequestEventRouter::EventListener*> | 881 std::vector<const ExtensionWebRequestEventRouter::EventListener*> |
| 883 matching_listeners; | 882 matching_listeners; |
| 884 | 883 |
| 885 GetMatchingListenersImpl( | 884 GetMatchingListenersImpl( |
| 886 profile_id, extension_info_map, false, event_name, url, | 885 profile, extension_info_map, false, event_name, url, |
| 887 tab_id, window_id, resource_type, extra_info_spec, &matching_listeners); | 886 tab_id, window_id, resource_type, extra_info_spec, &matching_listeners); |
| 888 CrossProfileMap::const_iterator cross_profile_id = | 887 CrossProfileMap::const_iterator cross_profile = |
| 889 cross_profile_map_.find(profile_id); | 888 cross_profile_map_.find(profile); |
| 890 if (cross_profile_id != cross_profile_map_.end()) { | 889 if (cross_profile != cross_profile_map_.end()) { |
| 891 GetMatchingListenersImpl( | 890 GetMatchingListenersImpl( |
| 892 cross_profile_id->second, extension_info_map, true, event_name, url, | 891 cross_profile->second, extension_info_map, true, event_name, url, |
| 893 tab_id, window_id, resource_type, extra_info_spec, &matching_listeners); | 892 tab_id, window_id, resource_type, extra_info_spec, &matching_listeners); |
| 894 } | 893 } |
| 895 | 894 |
| 896 return matching_listeners; | 895 return matching_listeners; |
| 897 } | 896 } |
| 898 | 897 |
| 899 std::vector<const ExtensionWebRequestEventRouter::EventListener*> | 898 std::vector<const ExtensionWebRequestEventRouter::EventListener*> |
| 900 ExtensionWebRequestEventRouter::GetMatchingListeners( | 899 ExtensionWebRequestEventRouter::GetMatchingListeners( |
| 901 ProfileId profile_id, | 900 void* profile, |
| 902 ExtensionInfoMap* extension_info_map, | 901 ExtensionInfoMap* extension_info_map, |
| 903 const std::string& event_name, | 902 const std::string& event_name, |
| 904 net::URLRequest* request, | 903 net::URLRequest* request, |
| 905 int* extra_info_spec) { | 904 int* extra_info_spec) { |
| 906 int tab_id = -1; | 905 int tab_id = -1; |
| 907 int window_id = -1; | 906 int window_id = -1; |
| 908 ResourceType::Type resource_type = ResourceType::LAST_TYPE; | 907 ResourceType::Type resource_type = ResourceType::LAST_TYPE; |
| 909 ExtractRequestInfo(request, &tab_id, &window_id, &resource_type); | 908 ExtractRequestInfo(request, &tab_id, &window_id, &resource_type); |
| 910 | 909 |
| 911 return GetMatchingListeners( | 910 return GetMatchingListeners( |
| 912 profile_id, extension_info_map, event_name, request->url(), | 911 profile, extension_info_map, event_name, request->url(), |
| 913 tab_id, window_id, resource_type, extra_info_spec); | 912 tab_id, window_id, resource_type, extra_info_spec); |
| 914 } | 913 } |
| 915 | 914 |
| 916 void ExtensionWebRequestEventRouter::DecrementBlockCount( | 915 void ExtensionWebRequestEventRouter::DecrementBlockCount( |
| 917 uint64 request_id, | 916 uint64 request_id, |
| 918 EventResponse* response) { | 917 EventResponse* response) { |
| 919 scoped_ptr<EventResponse> response_scoped(response); | 918 scoped_ptr<EventResponse> response_scoped(response); |
| 920 | 919 |
| 921 // It's possible that this request was deleted, or cancelled by a previous | 920 // It's possible that this request was deleted, or cancelled by a previous |
| 922 // event handler. If so, ignore this response. | 921 // event handler. If so, ignore this response. |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 *value, &extra_info_spec)); | 1027 *value, &extra_info_spec)); |
| 1029 } | 1028 } |
| 1030 | 1029 |
| 1031 std::string event_name; | 1030 std::string event_name; |
| 1032 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); | 1031 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); |
| 1033 | 1032 |
| 1034 std::string sub_event_name; | 1033 std::string sub_event_name; |
| 1035 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); | 1034 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); |
| 1036 | 1035 |
| 1037 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 1036 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 1038 profile_id(), extension_id(), event_name, sub_event_name, filter, | 1037 profile(), extension_id(), event_name, sub_event_name, filter, |
| 1039 extra_info_spec, ipc_sender_weak()); | 1038 extra_info_spec, ipc_sender_weak()); |
| 1040 | 1039 |
| 1041 return true; | 1040 return true; |
| 1042 } | 1041 } |
| 1043 | 1042 |
| 1044 bool WebRequestEventHandled::RunImpl() { | 1043 bool WebRequestEventHandled::RunImpl() { |
| 1045 std::string event_name; | 1044 std::string event_name; |
| 1046 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | 1045 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
| 1047 | 1046 |
| 1048 std::string sub_event_name; | 1047 std::string sub_event_name; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 header_value->GetString(keys::kHeaderNameKey, &name)); | 1104 header_value->GetString(keys::kHeaderNameKey, &name)); |
| 1106 EXTENSION_FUNCTION_VALIDATE( | 1105 EXTENSION_FUNCTION_VALIDATE( |
| 1107 header_value->GetString(keys::kHeaderValueKey, &value)); | 1106 header_value->GetString(keys::kHeaderValueKey, &value)); |
| 1108 | 1107 |
| 1109 response->request_headers->SetHeader(name, value); | 1108 response->request_headers->SetHeader(name, value); |
| 1110 } | 1109 } |
| 1111 } | 1110 } |
| 1112 } | 1111 } |
| 1113 | 1112 |
| 1114 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 1113 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 1115 profile_id(), extension_id(), event_name, sub_event_name, request_id, | 1114 profile(), extension_id(), event_name, sub_event_name, request_id, |
| 1116 response.release()); | 1115 response.release()); |
| 1117 | 1116 |
| 1118 return true; | 1117 return true; |
| 1119 } | 1118 } |
| OLD | NEW |