diff options
author | vabr@chromium.org <vabr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-16 10:48:47 +0000 |
---|---|---|
committer | vabr@chromium.org <vabr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-16 10:48:47 +0000 |
commit | 401ab8d7316610100a08d429ac5ee3be036fa80b (patch) | |
tree | 61625226db0755316df1d49f0a30e1772d913232 /chrome/browser/extensions | |
parent | f07c43122d2bbd806b129a31f7808bb6a8784fbc (diff) | |
download | chromium_src-401ab8d7316610100a08d429ac5ee3be036fa80b.zip chromium_src-401ab8d7316610100a08d429ac5ee3be036fa80b.tar.gz chromium_src-401ab8d7316610100a08d429ac5ee3be036fa80b.tar.bz2 |
Adding condition attributes for request headers to Declarative WebRequest
TEST=Install the extension "declarative_request_headers_match.crx" attached to BUG 143662. If this feature is working correctly it should cancel every navigation.
BUG=143662, 112155
TBR=yoz@chromium.org
Review URL: https://chromiumcodereview.appspot.com/11038031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@162119 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
5 files changed, 240 insertions, 32 deletions
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc index 554bc5f..84c2b66 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc @@ -54,6 +54,8 @@ bool WebRequestConditionAttribute::IsKnownType( return WebRequestConditionAttributeResourceType::IsMatchingType(instance_type) || WebRequestConditionAttributeContentType::IsMatchingType(instance_type) || + WebRequestConditionAttributeRequestHeaders::IsMatchingType( + instance_type) || WebRequestConditionAttributeResponseHeaders::IsMatchingType( instance_type) || WebRequestConditionAttributeThirdParty::IsMatchingType(instance_type); @@ -70,6 +72,10 @@ WebRequestConditionAttribute::Create( return WebRequestConditionAttributeResourceType::Create(name, value, error); } else if (WebRequestConditionAttributeContentType::IsMatchingType(name)) { return WebRequestConditionAttributeContentType::Create(name, value, error); + } else if (WebRequestConditionAttributeRequestHeaders::IsMatchingType( + name)) { + return WebRequestConditionAttributeRequestHeaders::Create( + name, value, error); } else if (WebRequestConditionAttributeResponseHeaders::IsMatchingType( name)) { return WebRequestConditionAttributeResponseHeaders::Create( @@ -490,14 +496,103 @@ bool HeaderMatcher::HeaderMatchTest::Matches(const std::string& name, } // +// WebRequestConditionAttributeRequestHeaders +// + +WebRequestConditionAttributeRequestHeaders:: +WebRequestConditionAttributeRequestHeaders( + scoped_ptr<const HeaderMatcher> header_matcher, + bool positive) + : header_matcher_(header_matcher.Pass()), + positive_(positive) {} + +WebRequestConditionAttributeRequestHeaders:: +~WebRequestConditionAttributeRequestHeaders() {} + +// static +bool WebRequestConditionAttributeRequestHeaders::IsMatchingType( + const std::string& instance_type) { + return instance_type == keys::kRequestHeadersKey || + instance_type == keys::kExcludeRequestHeadersKey; +} + +namespace { + +scoped_ptr<const HeaderMatcher> PrepareHeaderMatcher( + const std::string& name, + const base::Value* value, + std::string* error) { + const ListValue* value_as_list = NULL; + if (!value->GetAsList(&value_as_list)) { + *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); + return scoped_ptr<const HeaderMatcher>(NULL); + } + + scoped_ptr<const HeaderMatcher> header_matcher( + HeaderMatcher::Create(value_as_list)); + if (header_matcher.get() == NULL) + *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); + return header_matcher.Pass(); +} + +} // namespace + +// static +scoped_ptr<WebRequestConditionAttribute> +WebRequestConditionAttributeRequestHeaders::Create( + const std::string& name, + const base::Value* value, + std::string* error) { + DCHECK(IsMatchingType(name)); + + scoped_ptr<const HeaderMatcher> header_matcher( + PrepareHeaderMatcher(name, value, error)); + if (header_matcher.get() == NULL) + return scoped_ptr<WebRequestConditionAttribute>(NULL); + + return scoped_ptr<WebRequestConditionAttribute>( + new WebRequestConditionAttributeRequestHeaders( + header_matcher.Pass(), name == keys::kRequestHeadersKey)); +} + +int WebRequestConditionAttributeRequestHeaders::GetStages() const { + // Currently we only allow matching against headers in the before-send-headers + // stage. The headers are accessible in other stages as well, but before + // allowing to match against them in further stages, we should consider + // caching the match result. + return ON_BEFORE_SEND_HEADERS; +} + +bool WebRequestConditionAttributeRequestHeaders::IsFulfilled( + const WebRequestRule::RequestData& request_data) const { + if (!(request_data.stage & GetStages())) + return false; + + const net::HttpRequestHeaders& headers = + request_data.request->extra_request_headers(); + + bool passed = false; // Did some header pass TestNameValue? + net::HttpRequestHeaders::Iterator it(headers); + while (!passed && it.GetNext()) + passed |= header_matcher_->TestNameValue(it.name(), it.value()); + + return (positive_ ? passed : !passed); +} + +WebRequestConditionAttribute::Type +WebRequestConditionAttributeRequestHeaders::GetType() const { + return CONDITION_REQUEST_HEADERS; +} + +// // WebRequestConditionAttributeResponseHeaders // WebRequestConditionAttributeResponseHeaders:: WebRequestConditionAttributeResponseHeaders( - scoped_ptr<const HeaderMatcher>* header_matcher, + scoped_ptr<const HeaderMatcher> header_matcher, bool positive) - : header_matcher_(header_matcher->Pass()), + : header_matcher_(header_matcher.Pass()), positive_(positive) {} WebRequestConditionAttributeResponseHeaders:: @@ -518,23 +613,14 @@ WebRequestConditionAttributeResponseHeaders::Create( std::string* error) { DCHECK(IsMatchingType(name)); - const ListValue* value_as_list = NULL; - if (!value->GetAsList(&value_as_list)) { - *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); - return scoped_ptr<WebRequestConditionAttribute>(NULL); - } - scoped_ptr<const HeaderMatcher> header_matcher( - HeaderMatcher::Create(value_as_list)); - if (header_matcher.get() == NULL) { - *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, name); + PrepareHeaderMatcher(name, value, error)); + if (header_matcher.get() == NULL) return scoped_ptr<WebRequestConditionAttribute>(NULL); - } - const bool positive = name == keys::kResponseHeadersKey; return scoped_ptr<WebRequestConditionAttribute>( new WebRequestConditionAttributeResponseHeaders( - &header_matcher, positive)); + header_matcher.Pass(), name == keys::kResponseHeadersKey)); } int WebRequestConditionAttributeResponseHeaders::GetStages() const { 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 00f5eed..bde449c 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h @@ -37,7 +37,8 @@ class WebRequestConditionAttribute { CONDITION_RESOURCE_TYPE, CONDITION_CONTENT_TYPE, CONDITION_RESPONSE_HEADERS, - CONDITION_THIRD_PARTY + CONDITION_THIRD_PARTY, + CONDITION_REQUEST_HEADERS }; WebRequestConditionAttribute(); @@ -139,6 +140,40 @@ class WebRequestConditionAttributeContentType DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeContentType); }; +// Condition attribute for matching against request headers. Uses HeaderMatcher +// to handle the actual tests, in connection with a boolean positiveness +// flag. If that flag is set to true, then IsFulfilled() returns true iff +// |header_matcher_| matches at least one header. Otherwise IsFulfilled() +// returns true iff the |header_matcher_| matches no header. +class WebRequestConditionAttributeRequestHeaders + : public WebRequestConditionAttribute { + public: + virtual ~WebRequestConditionAttributeRequestHeaders(); + + 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: + WebRequestConditionAttributeRequestHeaders( + scoped_ptr<const HeaderMatcher> header_matcher, bool positive); + + const scoped_ptr<const HeaderMatcher> header_matcher_; + const bool positive_; + + DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeRequestHeaders); +}; + // Condition attribute for matching against response headers. Uses HeaderMatcher // to handle the actual tests, in connection with a boolean positiveness // flag. If that flag is set to true, then IsFulfilled() returns true iff @@ -165,7 +200,7 @@ class WebRequestConditionAttributeResponseHeaders private: WebRequestConditionAttributeResponseHeaders( - scoped_ptr<const HeaderMatcher>* header_matcher, bool positive); + scoped_ptr<const HeaderMatcher> header_matcher, bool positive); const scoped_ptr<const HeaderMatcher> header_matcher_; const bool positive_; diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc index 56e7005..6366b9e 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc @@ -298,6 +298,7 @@ scoped_ptr<DictionaryValue> GetDictionaryFromArray( // doesNotContainHeaders. void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests, const std::string& key, + RequestStage stage, net::URLRequest* url_request, bool* result) { ListValue contains_headers; @@ -314,16 +315,94 @@ void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests, ASSERT_TRUE(attribute.get() != NULL); *result = attribute->IsFulfilled(WebRequestRule::RequestData( - url_request, ON_HEADERS_RECEIVED, url_request->response_headers())); + url_request, stage, url_request->response_headers())); } } // namespace +// Here we test WebRequestConditionAttributeRequestHeaders for matching +// correctly against request headers. This test is not as extensive as +// "ResponseHeaders" (below), because the header-matching code is shared +// by both types of condition attributes, so it is enough to test it once. +TEST(WebRequestConditionAttributeTest, RequestHeaders) { + // Necessary for TestURLRequest. + MessageLoop message_loop(MessageLoop::TYPE_IO); + + TestURLRequestContext context; + TestDelegate delegate; + TestURLRequest url_request(GURL("http://example.com"), // Dummy URL. + &delegate, &context); + url_request.SetExtraRequestHeaderByName( + "Custom-header", "custom/value", true /* overwrite */); + url_request.Start(); + MessageLoop::current()->Run(); + + std::vector<std::vector<const std::string*> > tests; + bool result = false; + + const RequestStage stage = ON_BEFORE_SEND_HEADERS; + + // First set of test data -- passing conjunction. + const std::string kPassingCondition[] = { + keys::kNameContainsKey, "CuStOm", // Header names are case insensitive. + keys::kNameEqualsKey, "custom-header", + keys::kValueSuffixKey, "alue", + keys::kValuePrefixKey, "custom/value" + }; + const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; + GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); + // Positive filter, passing (conjunction of tests). + MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); + EXPECT_TRUE(result); + // Negative filter, failing (conjunction of tests). + MatchAndCheck( + tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); + EXPECT_FALSE(result); + + // Second set of test data -- failing disjunction. + const std::string kFailCondition[] = { + keys::kNameSuffixKey, "Custom", // Test 1. + keys::kNameEqualsKey, "ustom-valu", // Test 2. + keys::kValuePrefixKey, "custom ", // Test 3. + keys::kValueContainsKey, " value" // Test 4. + }; + const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; + GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); + // Positive filter, failing (disjunction of tests). + MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); + EXPECT_FALSE(result); + // Negative filter, passing (disjunction of tests). + MatchAndCheck( + tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); + EXPECT_TRUE(result); + + // Third set of test data, corner case -- empty disjunction. + GetArrayAsVector(NULL, NULL, 0u, &tests); + // Positive filter, failing (no test to pass). + MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); + EXPECT_FALSE(result); + // Negative filter, passing (no test to fail). + MatchAndCheck( + tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); + EXPECT_TRUE(result); + + // Fourth set of test data, corner case -- empty conjunction. + const size_t kEmptyConjunctionSizes[] = { 0u }; + GetArrayAsVector(NULL, kEmptyConjunctionSizes, 1u, &tests); + // Positive filter, passing (trivial test). + MatchAndCheck(tests, keys::kRequestHeadersKey, stage, &url_request, &result); + EXPECT_TRUE(result); + // Negative filter, failing. + MatchAndCheck( + tests, keys::kExcludeRequestHeadersKey, stage, &url_request, &result); + EXPECT_FALSE(result); +} + // Here we test WebRequestConditionAttributeResponseHeaders for: // 1. Correct implementation of prefix/suffix/contains/equals matching. // 2. Performing logical disjunction (||) between multiple specifications. // 3. Negating the match in case of 'doesNotContainHeaders'. -TEST(WebRequestConditionAttributeTest, Headers) { +TEST(WebRequestConditionAttributeTest, ResponseHeaders) { // Necessary for TestURLRequest. MessageLoop message_loop(MessageLoop::TYPE_IO); @@ -352,6 +431,8 @@ TEST(WebRequestConditionAttributeTest, Headers) { std::vector< std::vector<const std::string*> > tests; bool result; + const RequestStage stage = ON_HEADERS_RECEIVED; + // 1.a. -- All these tests should pass. const std::string kPassingCondition[] = { keys::kNamePrefixKey, "Custom", @@ -361,7 +442,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kPassingConditionSizes[] = { arraysize(kPassingCondition) }; GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 1.b. -- None of the following tests in the discjunction should pass. @@ -373,7 +454,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u }; GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_FALSE(result); // 1.c. -- This should fail (mixing name and value from different headers) @@ -383,7 +464,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kMixingConditionSizes[] = { arraysize(kMixingCondition) }; GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_FALSE(result); // 1.d. -- Test handling multiple values for one header (both should pass). @@ -393,7 +474,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kMoreValues1Sizes[] = { arraysize(kMoreValues1) }; GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); const std::string kMoreValues2[] = { keys::kNameEqualsKey, "Custom-header-b", @@ -401,7 +482,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kMoreValues2Sizes[] = { arraysize(kMoreValues2) }; GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 1.e. -- This should fail as conjunction but pass as disjunction. @@ -412,12 +493,12 @@ TEST(WebRequestConditionAttributeTest, Headers) { // First disjunction, no conflict. const size_t kNoConflictSizes[] = { 2u, 2u }; GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // Then conjunction, conflict. const size_t kConflictSizes[] = { arraysize(kConflict) }; GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_FALSE(result); // 1.f. -- This should pass, checking for correct treatment of ',' in values. @@ -427,7 +508,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kCommaSizes[] = { arraysize(kComma) }; GetArrayAsVector(kComma, kCommaSizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 1.g. -- This should pass, empty values are values as well. @@ -437,7 +518,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kEmptySizes[] = { arraysize(kEmpty) }; GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 1.h. -- Values are case-sensitive, this should fail. @@ -453,7 +534,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction. GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_FALSE(result); // 1.i. -- Names are case-insensitive, this should pass. @@ -465,7 +546,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kUppercaseSizes[] = { arraysize(kUppercase) }; // Conjunction. GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 2.a. -- This should pass as disjunction, because one of the tests passes. @@ -477,7 +558,7 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u }; GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests); - MatchAndCheck(tests, keys::kResponseHeadersKey, &url_request, &result); + MatchAndCheck(tests, keys::kResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 3.a. -- This should pass. @@ -487,7 +568,8 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kNonExistentSizes[] = { arraysize(kNonExistent) }; GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests); - MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, &url_request, &result); + MatchAndCheck( + tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); EXPECT_TRUE(result); // 3.b. -- This should fail. @@ -497,7 +579,8 @@ TEST(WebRequestConditionAttributeTest, Headers) { }; const size_t kExistingSize[] = { arraysize(kExisting) }; GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); - MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, &url_request, &result); + MatchAndCheck( + tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); EXPECT_FALSE(result); } diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.cc index c1560f0..2f2850c 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.cc +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.cc @@ -18,6 +18,7 @@ const char kContentTypeKey[] = "contentType"; const char kDirectionKey[] = "direction"; const char kDomainKey[] = "domain"; const char kExcludeContentTypeKey[] = "excludeContentType"; +const char kExcludeRequestHeadersKey[] = "excludeRequestHeaders"; const char kExcludeResponseHeadersKey[] = "excludeResponseHeaders"; const char kExpiresKey[] = "expires"; const char kFilterKey[] ="filter"; @@ -34,6 +35,7 @@ const char kNamePrefixKey[] = "namePrefix"; const char kNameSuffixKey[] = "nameSuffix"; const char kPathKey[] = "path"; const char kRedirectUrlKey[] = "redirectUrl"; +const char kRequestHeadersKey[] = "requestHeaders"; const char kResourceTypeKey[] = "resourceType"; const char kResponseHeadersKey[] = "responseHeaders"; const char kSecureKey[] = "secure"; diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h b/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h index 1bc0ef6..364a651 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h @@ -21,6 +21,7 @@ extern const char kContentTypeKey[]; extern const char kDirectionKey[]; extern const char kDomainKey[]; extern const char kExcludeContentTypeKey[]; +extern const char kExcludeRequestHeadersKey[]; extern const char kExcludeResponseHeadersKey[]; extern const char kExpiresKey[]; extern const char kFilterKey[]; @@ -37,6 +38,7 @@ extern const char kNamePrefixKey[]; extern const char kNameSuffixKey[]; extern const char kPathKey[]; extern const char kRedirectUrlKey[]; +extern const char kRequestHeadersKey[]; extern const char kResourceTypeKey[]; extern const char kResponseHeadersKey[]; extern const char kSecureKey[]; |