Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion_attribute.h" | 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion_attribute.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 WebRequestConditionAttribute::WebRequestConditionAttribute() {} | 44 WebRequestConditionAttribute::WebRequestConditionAttribute() {} |
| 45 | 45 |
| 46 WebRequestConditionAttribute::~WebRequestConditionAttribute() {} | 46 WebRequestConditionAttribute::~WebRequestConditionAttribute() {} |
| 47 | 47 |
| 48 // static | 48 // static |
| 49 bool WebRequestConditionAttribute::IsKnownType( | 49 bool WebRequestConditionAttribute::IsKnownType( |
| 50 const std::string& instance_type) { | 50 const std::string& instance_type) { |
| 51 return | 51 return |
| 52 WebRequestConditionAttributeResourceType::IsMatchingType(instance_type) || | 52 WebRequestConditionAttributeResourceType::IsMatchingType(instance_type) || |
| 53 WebRequestConditionAttributeContentType::IsMatchingType(instance_type) || | 53 WebRequestConditionAttributeContentType::IsMatchingType(instance_type) || |
| 54 WebRequestConditionAttributeRequestHeaders::IsMatchingType( | |
| 55 instance_type) || | |
| 54 WebRequestConditionAttributeResponseHeaders::IsMatchingType( | 56 WebRequestConditionAttributeResponseHeaders::IsMatchingType( |
| 55 instance_type); | 57 instance_type); |
| 56 } | 58 } |
| 57 | 59 |
| 58 // static | 60 // static |
| 59 scoped_ptr<WebRequestConditionAttribute> | 61 scoped_ptr<WebRequestConditionAttribute> |
| 60 WebRequestConditionAttribute::Create( | 62 WebRequestConditionAttribute::Create( |
| 61 const std::string& name, | 63 const std::string& name, |
| 62 const base::Value* value, | 64 const base::Value* value, |
| 63 std::string* error) { | 65 std::string* error) { |
| 64 CHECK(value != NULL && error != NULL); | 66 CHECK(value != NULL && error != NULL); |
| 65 if (WebRequestConditionAttributeResourceType::IsMatchingType(name)) { | 67 if (WebRequestConditionAttributeResourceType::IsMatchingType(name)) { |
| 66 return WebRequestConditionAttributeResourceType::Create(name, value, error); | 68 return WebRequestConditionAttributeResourceType::Create(name, value, error); |
| 67 } else if (WebRequestConditionAttributeContentType::IsMatchingType(name)) { | 69 } else if (WebRequestConditionAttributeContentType::IsMatchingType(name)) { |
| 68 return WebRequestConditionAttributeContentType::Create(name, value, error); | 70 return WebRequestConditionAttributeContentType::Create(name, value, error); |
| 71 } else if (WebRequestConditionAttributeRequestHeaders::IsMatchingType( | |
| 72 name)) { | |
| 73 return WebRequestConditionAttributeRequestHeaders::Create( | |
| 74 name, value, error); | |
| 69 } else if (WebRequestConditionAttributeResponseHeaders::IsMatchingType( | 75 } else if (WebRequestConditionAttributeResponseHeaders::IsMatchingType( |
| 70 name)) { | 76 name)) { |
| 71 return WebRequestConditionAttributeResponseHeaders::Create( | 77 return WebRequestConditionAttributeResponseHeaders::Create( |
| 72 name, value, error); | 78 name, value, error); |
| 73 } | 79 } |
| 74 | 80 |
| 75 *error = ExtensionErrorUtils::FormatErrorMessage(kUnknownConditionAttribute, | 81 *error = ExtensionErrorUtils::FormatErrorMessage(kUnknownConditionAttribute, |
| 76 name); | 82 name); |
| 77 return scoped_ptr<WebRequestConditionAttribute>(NULL); | 83 return scoped_ptr<WebRequestConditionAttribute>(NULL); |
| 78 } | 84 } |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 477 | 483 |
| 478 for (size_t i = 0; i < value_match_.size(); ++i) { | 484 for (size_t i = 0; i < value_match_.size(); ++i) { |
| 479 if (!value_match_[i]->Matches(value)) | 485 if (!value_match_[i]->Matches(value)) |
| 480 return false; | 486 return false; |
| 481 } | 487 } |
| 482 | 488 |
| 483 return true; | 489 return true; |
| 484 } | 490 } |
| 485 | 491 |
| 486 // | 492 // |
| 493 // WebRequestConditionAttributeRequestHeaders | |
| 494 // | |
| 495 | |
| 496 WebRequestConditionAttributeRequestHeaders:: | |
| 497 WebRequestConditionAttributeRequestHeaders( | |
| 498 scoped_ptr<const HeaderMatcher> header_matcher, | |
| 499 bool positive) | |
| 500 : header_matcher_(header_matcher.Pass()), | |
| 501 positive_(positive) {} | |
| 502 | |
| 503 WebRequestConditionAttributeRequestHeaders:: | |
| 504 ~WebRequestConditionAttributeRequestHeaders() {} | |
| 505 | |
| 506 // static | |
| 507 bool WebRequestConditionAttributeRequestHeaders::IsMatchingType( | |
| 508 const std::string& instance_type) { | |
| 509 return instance_type == keys::kRequestHeadersKey || | |
| 510 instance_type == keys::kExcludeRequestHeadersKey; | |
| 511 } | |
| 512 | |
| 513 namespace { | |
| 514 | |
| 515 scoped_ptr<const HeaderMatcher> PrepareHeaderMatcher( | |
| 516 const std::string& name, | |
| 517 const base::Value* value, | |
| 518 std::string* error) { | |
| 519 const ListValue* value_as_list = NULL; | |
| 520 if (!value->GetAsList(&value_as_list)) { | |
| 521 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); | |
| 522 return scoped_ptr<const HeaderMatcher>(NULL); | |
| 523 } | |
| 524 | |
| 525 scoped_ptr<const HeaderMatcher> header_matcher( | |
| 526 HeaderMatcher::Create(value_as_list)); | |
| 527 if (header_matcher.get() == NULL) | |
| 528 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); | |
| 529 return header_matcher.Pass(); | |
| 530 } | |
| 531 | |
| 532 } // namespace | |
| 533 | |
| 534 // static | |
| 535 scoped_ptr<WebRequestConditionAttribute> | |
| 536 WebRequestConditionAttributeRequestHeaders::Create( | |
| 537 const std::string& name, | |
| 538 const base::Value* value, | |
| 539 std::string* error) { | |
| 540 DCHECK(IsMatchingType(name)); | |
| 541 | |
| 542 scoped_ptr<const HeaderMatcher> header_matcher( | |
| 543 PrepareHeaderMatcher(name, value, error)); | |
| 544 if (header_matcher.get() == NULL) | |
| 545 return scoped_ptr<WebRequestConditionAttribute>(NULL); | |
| 546 | |
| 547 return scoped_ptr<WebRequestConditionAttribute>( | |
| 548 new WebRequestConditionAttributeRequestHeaders( | |
| 549 header_matcher.Pass(), name == keys::kRequestHeadersKey)); | |
| 550 } | |
| 551 | |
| 552 int WebRequestConditionAttributeRequestHeaders::GetStages() const { | |
| 553 // Currently we only allow matching against headers in the before-send-headers | |
| 554 // stage. The headers are accessible in other stages as well, but before | |
| 555 // allowing to match against them in further stages, we should consider | |
| 556 // caching the match result. | |
| 557 return ON_BEFORE_SEND_HEADERS; | |
| 558 } | |
| 559 | |
| 560 bool WebRequestConditionAttributeRequestHeaders::IsFulfilled( | |
| 561 const WebRequestRule::RequestData& request_data) const { | |
| 562 if (!(request_data.stage & GetStages())) | |
| 563 return false; | |
| 564 | |
| 565 const net::HttpRequestHeaders* headers = | |
| 566 &(request_data.request->extra_request_headers()); | |
| 567 | |
| 568 bool passed = false; // Did some header pass TestNameValue? | |
| 569 net::HttpRequestHeaders::Iterator it(*headers); | |
|
battre
2012/10/15 07:12:21
nit, you could store a const ref in line 565 so th
vabr (Chromium)
2012/10/15 11:59:10
Done.
| |
| 570 while (!passed && it.GetNext()) { | |
| 571 passed |= header_matcher_->TestNameValue(it.name(), it.value()); | |
| 572 } | |
|
battre
2012/10/15 07:12:21
nit: you may delete the {} here.
vabr (Chromium)
2012/10/15 11:59:10
Done.
| |
| 573 | |
| 574 return (positive_ ? passed : !passed); | |
| 575 } | |
| 576 | |
| 577 WebRequestConditionAttribute::Type | |
| 578 WebRequestConditionAttributeRequestHeaders::GetType() const { | |
| 579 return CONDITION_REQUEST_HEADERS; | |
| 580 } | |
| 581 | |
| 582 // | |
| 487 // WebRequestConditionAttributeResponseHeaders | 583 // WebRequestConditionAttributeResponseHeaders |
| 488 // | 584 // |
| 489 | 585 |
| 490 WebRequestConditionAttributeResponseHeaders:: | 586 WebRequestConditionAttributeResponseHeaders:: |
| 491 WebRequestConditionAttributeResponseHeaders( | 587 WebRequestConditionAttributeResponseHeaders( |
| 492 scoped_ptr<const HeaderMatcher>* header_matcher, | 588 scoped_ptr<const HeaderMatcher> header_matcher, |
| 493 bool positive) | 589 bool positive) |
| 494 : header_matcher_(header_matcher->Pass()), | 590 : header_matcher_(header_matcher.Pass()), |
| 495 positive_(positive) {} | 591 positive_(positive) {} |
| 496 | 592 |
| 497 WebRequestConditionAttributeResponseHeaders:: | 593 WebRequestConditionAttributeResponseHeaders:: |
| 498 ~WebRequestConditionAttributeResponseHeaders() {} | 594 ~WebRequestConditionAttributeResponseHeaders() {} |
| 499 | 595 |
| 500 // static | 596 // static |
| 501 bool WebRequestConditionAttributeResponseHeaders::IsMatchingType( | 597 bool WebRequestConditionAttributeResponseHeaders::IsMatchingType( |
| 502 const std::string& instance_type) { | 598 const std::string& instance_type) { |
| 503 return instance_type == keys::kResponseHeadersKey || | 599 return instance_type == keys::kResponseHeadersKey || |
| 504 instance_type == keys::kExcludeResponseHeadersKey; | 600 instance_type == keys::kExcludeResponseHeadersKey; |
| 505 } | 601 } |
| 506 | 602 |
| 507 // static | 603 // static |
| 508 scoped_ptr<WebRequestConditionAttribute> | 604 scoped_ptr<WebRequestConditionAttribute> |
| 509 WebRequestConditionAttributeResponseHeaders::Create( | 605 WebRequestConditionAttributeResponseHeaders::Create( |
| 510 const std::string& name, | 606 const std::string& name, |
| 511 const base::Value* value, | 607 const base::Value* value, |
| 512 std::string* error) { | 608 std::string* error) { |
| 513 DCHECK(IsMatchingType(name)); | 609 DCHECK(IsMatchingType(name)); |
| 514 | 610 |
| 515 const ListValue* value_as_list = NULL; | 611 scoped_ptr<const HeaderMatcher> header_matcher( |
| 516 if (!value->GetAsList(&value_as_list)) { | 612 PrepareHeaderMatcher(name, value, error)); |
| 517 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); | 613 if (header_matcher.get() == NULL) |
| 518 return scoped_ptr<WebRequestConditionAttribute>(NULL); | 614 return scoped_ptr<WebRequestConditionAttribute>(NULL); |
| 519 } | |
| 520 | 615 |
| 521 scoped_ptr<const HeaderMatcher> header_matcher( | |
| 522 HeaderMatcher::Create(value_as_list)); | |
| 523 if (header_matcher.get() == NULL) { | |
| 524 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); | |
| 525 return scoped_ptr<WebRequestConditionAttribute>(NULL); | |
| 526 } | |
| 527 | |
| 528 const bool positive = name == keys::kResponseHeadersKey; | |
| 529 return scoped_ptr<WebRequestConditionAttribute>( | 616 return scoped_ptr<WebRequestConditionAttribute>( |
| 530 new WebRequestConditionAttributeResponseHeaders( | 617 new WebRequestConditionAttributeResponseHeaders( |
| 531 &header_matcher, positive)); | 618 header_matcher.Pass(), name == keys::kResponseHeadersKey)); |
| 532 } | 619 } |
| 533 | 620 |
| 534 int WebRequestConditionAttributeResponseHeaders::GetStages() const { | 621 int WebRequestConditionAttributeResponseHeaders::GetStages() const { |
| 535 return ON_HEADERS_RECEIVED; | 622 return ON_HEADERS_RECEIVED; |
| 536 } | 623 } |
| 537 | 624 |
| 538 bool WebRequestConditionAttributeResponseHeaders::IsFulfilled( | 625 bool WebRequestConditionAttributeResponseHeaders::IsFulfilled( |
| 539 const WebRequestRule::RequestData& request_data) const { | 626 const WebRequestRule::RequestData& request_data) const { |
| 540 if (!(request_data.stage & GetStages())) | 627 if (!(request_data.stage & GetStages())) |
| 541 return false; | 628 return false; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 558 | 645 |
| 559 return (positive_ ? passed : !passed); | 646 return (positive_ ? passed : !passed); |
| 560 } | 647 } |
| 561 | 648 |
| 562 WebRequestConditionAttribute::Type | 649 WebRequestConditionAttribute::Type |
| 563 WebRequestConditionAttributeResponseHeaders::GetType() const { | 650 WebRequestConditionAttributeResponseHeaders::GetType() const { |
| 564 return CONDITION_RESPONSE_HEADERS; | 651 return CONDITION_RESPONSE_HEADERS; |
| 565 } | 652 } |
| 566 | 653 |
| 567 } // namespace extensions | 654 } // namespace extensions |
| OLD | NEW |