Chromium Code Reviews| Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h |
| diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h |
| index f9aa4e058313d306bd499f82d71d7912451c96a3..042c0c5952759096e3b3f266d9f4b99bcb65c646 100644 |
| --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h |
| +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h |
| @@ -11,6 +11,7 @@ |
| #include "base/basictypes.h" |
| #include "base/memory/linked_ptr.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "base/memory/scoped_vector.h" |
| #include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h" |
| #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h" |
| #include "chrome/common/extensions/api/events.h" |
| @@ -32,7 +33,8 @@ class WebRequestConditionAttribute { |
| public: |
| enum Type { |
| CONDITION_RESOURCE_TYPE, |
| - CONDITION_CONTENT_TYPE |
| + CONDITION_CONTENT_TYPE, |
| + CONDITION_REQUEST_HEADERS |
| }; |
| WebRequestConditionAttribute(); |
| @@ -53,7 +55,8 @@ class WebRequestConditionAttribute { |
| virtual int GetStages() const = 0; |
| // Returns whether the condition is fulfilled for this request. |
| - virtual bool IsFulfilled(const WebRequestRule::RequestData& request_data) = 0; |
| + virtual bool IsFulfilled( |
| + const WebRequestRule::RequestData& request_data) const = 0; |
| virtual Type GetType() const = 0; |
| @@ -88,8 +91,8 @@ class WebRequestConditionAttributeResourceType |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| - virtual bool IsFulfilled(const WebRequestRule::RequestData& request_data) |
| - OVERRIDE; |
| + virtual bool IsFulfilled( |
| + const WebRequestRule::RequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| private: |
| @@ -118,8 +121,8 @@ class WebRequestConditionAttributeContentType |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| - virtual bool IsFulfilled(const WebRequestRule::RequestData& request_data) |
| - OVERRIDE; |
| + virtual bool IsFulfilled( |
| + const WebRequestRule::RequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| private: |
| @@ -133,6 +136,86 @@ class WebRequestConditionAttributeContentType |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeContentType); |
| }; |
| +// Condition that performs matches against response headers' names and values. |
| +// In the comments below there is a distinction between when this condition is |
| +// "satisfied" and when it is "fulfilled". See the comments at |tests_| for |
| +// "satisfied" and the comment at |positive_test_| for "fulfilled". |
| +class WebRequestConditionAttributeResponseHeaders |
| + : public WebRequestConditionAttribute { |
| + public: |
| + virtual ~WebRequestConditionAttributeResponseHeaders(); |
| + |
| + static bool IsMatchingType(const std::string& instance_type); |
| + |
| + // Factory method, see WebRequestConditionAttribute::Create. |
| + static scoped_ptr<WebRequestConditionAttribute> Create( |
| + const std::string& name, |
| + const base::Value* value, |
| + std::string* error); |
| + |
| + // Implementation of WebRequestConditionAttribute: |
| + virtual int GetStages() const OVERRIDE; |
| + virtual bool IsFulfilled( |
| + const WebRequestRule::RequestData& request_data) const OVERRIDE; |
| + virtual Type GetType() const OVERRIDE; |
| + |
| + private: |
| + enum MatchType { kPrefix, kSuffix, kEquals, kContains }; |
| + |
| + class MatchTest { |
| + public: |
| + // Takes ownership of |data|, which must not be NULL. |
| + MatchTest(scoped_ptr<const std::string> data, MatchType type); |
|
battre
2012/08/24 16:24:41
Please pass |data| just as a const ref. The cost t
vabr (Chromium)
2012/08/27 12:11:50
Done.
To document this decision:
pros of the scope
|
| + ~MatchTest(); |
| + const std::string& data() const { |
| + return *(data_.get()); |
| + } |
| + // Does |str| pass |*this| MatchTest? |
| + bool Matches(const std::string& str) const; |
| + private: |
| + const scoped_ptr<const std::string> data_; |
| + const MatchType type_; |
| + DISALLOW_COPY_AND_ASSIGN(MatchTest); |
| + }; |
| + |
| + class TestGroup { |
| + public: |
| + TestGroup(ScopedVector<const MatchTest>* name, |
|
battre
2012/08/24 16:24:41
Please add comment, that ownership is taken over.
vabr (Chromium)
2012/08/27 12:11:50
Done.
|
| + ScopedVector<const MatchTest>* value); |
| + ~TestGroup(); |
| + // Does the header |name|: |value| match all tests in this test group? |
| + bool Matches(const std::string& name, const std::string& value) const; |
| + private: |
| + // Tests to be passed by a header's name. |
| + const ScopedVector<const MatchTest> name_; |
| + // Tests to be passed by a header's value. |
| + const ScopedVector<const MatchTest> value_; |
| + DISALLOW_COPY_AND_ASSIGN(TestGroup); |
| + }; |
| + |
| + explicit WebRequestConditionAttributeResponseHeaders(bool positive_test); |
| + |
| + // Gets the tests' description in |tests| and creates the corresponding |
| + // TestGroup. Returns NULL on failure. |
| + static scoped_ptr<const TestGroup> GetTests( |
|
battre
2012/08/24 16:24:41
nit: s/Get/Create/?
vabr (Chromium)
2012/08/27 12:11:50
Done.
|
| + const base::DictionaryValue* tests, |
| + std::string* error); |
| + // Helper to GetTests. Never returns NULL, except for memory failures. |
| + static scoped_ptr<const MatchTest> GetMatchTest(const Value* content, |
| + bool is_name_test, |
| + MatchType match_type); |
|
battre
2012/08/24 16:24:41
nit: s/Get/Create/ (also in line 203)
vabr (Chromium)
2012/08/27 12:11:50
Done.
|
| + |
| + // The condition is satisfied if there is a header and its value such that for |
| + // some |i| the header passes all the tests from |tests_[i]|. |
| + ScopedVector<const TestGroup> tests_; |
| + |
| + // True means that IsFulfilled() reports whether the condition is satisfied. |
| + // False means that it reports whether the condition is NOT satisfied. |
| + bool positive_test_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeResponseHeaders); |
| +}; |
| + |
| } // namespace extensions |
| #endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ |