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..58f7993fdc3ec1e2b83ca83bef275b14c4c4e7a6 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h |
@@ -32,7 +32,8 @@ class WebRequestConditionAttribute { |
public: |
enum Type { |
CONDITION_RESOURCE_TYPE, |
- CONDITION_CONTENT_TYPE |
+ CONDITION_CONTENT_TYPE, |
+ CONDITION_CONTAINS_HEADERS |
battre
2012/08/23 12:32:11
We need support for request and response headers.
vabr (Chromium)
2012/08/24 14:48:59
Done. I don't think a condition attribute for requ
|
}; |
WebRequestConditionAttribute(); |
@@ -133,6 +134,75 @@ 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 PushMatchTests |
+// and |tests_| for "satisfied" and the comment at |positive_test_| for |
+// "fulfilled". |
+class WebRequestConditionAttributeContainsHeaders |
battre
2012/08/23 12:32:11
I would suggest to rename this to WebRequestCondit
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ : public WebRequestConditionAttribute { |
+ public: |
+ virtual ~WebRequestConditionAttributeContainsHeaders(); |
+ |
+ 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) |
+ OVERRIDE; |
+ virtual Type GetType() const OVERRIDE; |
+ |
+ private: |
+ enum MatchType { kPrefix, kSuffix, kEqual, kContains }; |
battre
2012/08/23 12:32:11
kEquals to match the parameter of the attribute
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ class MatchTest { |
+ public: |
+ explicit MatchTest(MatchType type) : type_(type) {} |
+ std::string& data() { |
+ return data_; |
battre
2012/08/23 12:32:11
I'd prefer if you moved this to the constructor, e
vabr (Chromium)
2012/08/24 14:48:59
Done. And retaining the number of copy operations
|
+ } |
+ // Does |str| pass |*this| MatchTest? |
+ bool Matches(const std::string& str); |
battre
2012/08/23 12:32:11
nit: const
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ private: |
+ std::string data_; |
+ MatchType type_; |
battre
2012/08/23 12:32:11
nit: DISALLOW_COPY_AND_ASSIGN due to non-trivial d
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ }; |
+ struct TestGroup { |
+ TestGroup(); |
+ ~TestGroup(); |
+ // Tests to be passed by a header's name. |
+ std::vector<MatchTest> name; |
battre
2012/08/23 12:32:11
This should become a ScopedVector if you add the D
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ // Tests to be passed by a header's value. |
+ std::vector<MatchTest> value; |
battre
2012/08/23 12:32:11
nit: DISALLOW_COPY_AND_ASSIGN due to non-trivial d
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ }; |
+ |
+ explicit WebRequestConditionAttributeContainsHeaders(bool positive_test); |
+ |
+ // Pushes another group of tests on our tests stack |tests_|. The whole |
+ // condition is satisfied if there is a group of tests pushed by some call to |
+ // PushMatchTests, and a header with a value which satisfies all of the tests |
+ // from that group. |
+ bool PushMatchTests(const base::DictionaryValue* tests, std::string* error); |
battre
2012/08/23 12:32:11
How about s/Push/Append/ to match the ListValue no
vabr (Chromium)
2012/08/24 14:48:59
I ended up with GetTests and GetMatchTest, because
|
+ // Helper to PushMatchTests. |
+ void PushOneMatchTest( |
+ const Value* content, bool is_name_test, MatchType match_type); |
+ |
+ // 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]|. |
+ std::vector< TestGroup > tests_; |
battre
2012/08/23 12:32:11
nit: no spaces
battre
2012/08/23 12:32:11
This should become a ScopedVector if you add the D
vabr (Chromium)
2012/08/24 14:48:59
Done.
vabr (Chromium)
2012/08/24 14:48:59
Done.
|
+ |
+ // 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(WebRequestConditionAttributeContainsHeaders); |
+}; |
+ |
} // namespace extensions |
#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ |