| 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 "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 WebRequestConditionAttribute::Create( | 82 WebRequestConditionAttribute::Create( |
| 83 keys::kResourceTypeKey, &resource_types, &error); | 83 keys::kResourceTypeKey, &resource_types, &error); |
| 84 EXPECT_EQ("", error); | 84 EXPECT_EQ("", error); |
| 85 ASSERT_TRUE(attribute.get()); | 85 ASSERT_TRUE(attribute.get()); |
| 86 | 86 |
| 87 net::TestURLRequestContext context; | 87 net::TestURLRequestContext context; |
| 88 net::TestURLRequest url_request_ok( | 88 net::TestURLRequest url_request_ok( |
| 89 GURL("http://www.example.com"), NULL, &context); | 89 GURL("http://www.example.com"), NULL, &context); |
| 90 content::ResourceRequestInfo::AllocateForTesting(&url_request_ok, | 90 content::ResourceRequestInfo::AllocateForTesting(&url_request_ok, |
| 91 ResourceType::MAIN_FRAME, NULL, -1, -1); | 91 ResourceType::MAIN_FRAME, NULL, -1, -1); |
| 92 EXPECT_TRUE(attribute->IsFulfilled( | 92 EXPECT_TRUE(attribute->IsFulfilled(WebRequestData(&url_request_ok, |
| 93 DeclarativeWebRequestData(&url_request_ok, ON_BEFORE_REQUEST))); | 93 ON_BEFORE_REQUEST))); |
| 94 | 94 |
| 95 net::TestURLRequest url_request_fail( | 95 net::TestURLRequest url_request_fail( |
| 96 GURL("http://www.example.com"), NULL, &context); | 96 GURL("http://www.example.com"), NULL, &context); |
| 97 content::ResourceRequestInfo::AllocateForTesting(&url_request_ok, | 97 content::ResourceRequestInfo::AllocateForTesting(&url_request_ok, |
| 98 ResourceType::SUB_FRAME, NULL, -1, -1); | 98 ResourceType::SUB_FRAME, NULL, -1, -1); |
| 99 EXPECT_FALSE(attribute->IsFulfilled( | 99 EXPECT_FALSE(attribute->IsFulfilled(WebRequestData(&url_request_fail, |
| 100 DeclarativeWebRequestData(&url_request_fail, ON_BEFORE_REQUEST))); | 100 ON_BEFORE_REQUEST))); |
| 101 } | 101 } |
| 102 | 102 |
| 103 TEST(WebRequestConditionAttributeTest, ContentType) { | 103 TEST(WebRequestConditionAttributeTest, ContentType) { |
| 104 // Necessary for TestURLRequest. | 104 // Necessary for TestURLRequest. |
| 105 MessageLoop message_loop(MessageLoop::TYPE_IO); | 105 MessageLoop message_loop(MessageLoop::TYPE_IO); |
| 106 | 106 |
| 107 std::string error; | 107 std::string error; |
| 108 scoped_ptr<WebRequestConditionAttribute> result; | 108 scoped_ptr<WebRequestConditionAttribute> result; |
| 109 | 109 |
| 110 net::TestServer test_server( | 110 net::TestServer test_server( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 122 MessageLoop::current()->Run(); | 122 MessageLoop::current()->Run(); |
| 123 | 123 |
| 124 ListValue content_types; | 124 ListValue content_types; |
| 125 content_types.Append(Value::CreateStringValue("text/plain")); | 125 content_types.Append(Value::CreateStringValue("text/plain")); |
| 126 scoped_ptr<WebRequestConditionAttribute> attribute_include = | 126 scoped_ptr<WebRequestConditionAttribute> attribute_include = |
| 127 WebRequestConditionAttribute::Create( | 127 WebRequestConditionAttribute::Create( |
| 128 keys::kContentTypeKey, &content_types, &error); | 128 keys::kContentTypeKey, &content_types, &error); |
| 129 EXPECT_EQ("", error); | 129 EXPECT_EQ("", error); |
| 130 ASSERT_TRUE(attribute_include.get()); | 130 ASSERT_TRUE(attribute_include.get()); |
| 131 EXPECT_FALSE(attribute_include->IsFulfilled( | 131 EXPECT_FALSE(attribute_include->IsFulfilled( |
| 132 DeclarativeWebRequestData(&url_request, ON_BEFORE_REQUEST, | 132 WebRequestData(&url_request, ON_BEFORE_REQUEST, |
| 133 url_request.response_headers()))); | 133 url_request.response_headers()))); |
| 134 EXPECT_TRUE(attribute_include->IsFulfilled( | 134 EXPECT_TRUE(attribute_include->IsFulfilled( |
| 135 DeclarativeWebRequestData(&url_request, ON_HEADERS_RECEIVED, | 135 WebRequestData(&url_request, ON_HEADERS_RECEIVED, |
| 136 url_request.response_headers()))); | 136 url_request.response_headers()))); |
| 137 | 137 |
| 138 scoped_ptr<WebRequestConditionAttribute> attribute_exclude = | 138 scoped_ptr<WebRequestConditionAttribute> attribute_exclude = |
| 139 WebRequestConditionAttribute::Create( | 139 WebRequestConditionAttribute::Create( |
| 140 keys::kExcludeContentTypeKey, &content_types, &error); | 140 keys::kExcludeContentTypeKey, &content_types, &error); |
| 141 EXPECT_EQ("", error); | 141 EXPECT_EQ("", error); |
| 142 ASSERT_TRUE(attribute_exclude.get()); | 142 ASSERT_TRUE(attribute_exclude.get()); |
| 143 EXPECT_FALSE(attribute_exclude->IsFulfilled( | 143 EXPECT_FALSE(attribute_exclude->IsFulfilled( |
| 144 DeclarativeWebRequestData(&url_request, ON_HEADERS_RECEIVED, | 144 WebRequestData(&url_request, ON_HEADERS_RECEIVED, |
| 145 url_request.response_headers()))); | 145 url_request.response_headers()))); |
| 146 | 146 |
| 147 content_types.Clear(); | 147 content_types.Clear(); |
| 148 content_types.Append(Value::CreateStringValue("something/invalid")); | 148 content_types.Append(Value::CreateStringValue("something/invalid")); |
| 149 scoped_ptr<WebRequestConditionAttribute> attribute_unincluded = | 149 scoped_ptr<WebRequestConditionAttribute> attribute_unincluded = |
| 150 WebRequestConditionAttribute::Create( | 150 WebRequestConditionAttribute::Create( |
| 151 keys::kContentTypeKey, &content_types, &error); | 151 keys::kContentTypeKey, &content_types, &error); |
| 152 EXPECT_EQ("", error); | 152 EXPECT_EQ("", error); |
| 153 ASSERT_TRUE(attribute_unincluded.get()); | 153 ASSERT_TRUE(attribute_unincluded.get()); |
| 154 EXPECT_FALSE(attribute_unincluded->IsFulfilled( | 154 EXPECT_FALSE(attribute_unincluded->IsFulfilled( |
| 155 DeclarativeWebRequestData(&url_request, ON_HEADERS_RECEIVED, | 155 WebRequestData(&url_request, ON_HEADERS_RECEIVED, |
| 156 url_request.response_headers()))); | 156 url_request.response_headers()))); |
| 157 | 157 |
| 158 scoped_ptr<WebRequestConditionAttribute> attribute_unexcluded = | 158 scoped_ptr<WebRequestConditionAttribute> attribute_unexcluded = |
| 159 WebRequestConditionAttribute::Create( | 159 WebRequestConditionAttribute::Create( |
| 160 keys::kExcludeContentTypeKey, &content_types, &error); | 160 keys::kExcludeContentTypeKey, &content_types, &error); |
| 161 EXPECT_EQ("", error); | 161 EXPECT_EQ("", error); |
| 162 ASSERT_TRUE(attribute_unexcluded.get()); | 162 ASSERT_TRUE(attribute_unexcluded.get()); |
| 163 EXPECT_TRUE(attribute_unexcluded->IsFulfilled( | 163 EXPECT_TRUE(attribute_unexcluded->IsFulfilled( |
| 164 DeclarativeWebRequestData(&url_request, ON_HEADERS_RECEIVED, | 164 WebRequestData(&url_request, ON_HEADERS_RECEIVED, |
| 165 url_request.response_headers()))); | 165 url_request.response_headers()))); |
| 166 } | 166 } |
| 167 | 167 |
| 168 // Testing WebRequestConditionAttributeThirdParty. | 168 // Testing WebRequestConditionAttributeThirdParty. |
| 169 TEST(WebRequestConditionAttributeTest, ThirdParty) { | 169 TEST(WebRequestConditionAttributeTest, ThirdParty) { |
| 170 // Necessary for TestURLRequest. | 170 // Necessary for TestURLRequest. |
| 171 MessageLoop message_loop(MessageLoop::TYPE_IO); | 171 MessageLoop message_loop(MessageLoop::TYPE_IO); |
| 172 | 172 |
| 173 std::string error; | 173 std::string error; |
| 174 const FundamentalValue value_true(true); | 174 const FundamentalValue value_true(true); |
| 175 // This attribute matches only third party requests. | 175 // This attribute matches only third party requests. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 193 const GURL url_b("http://b.com"); | 193 const GURL url_b("http://b.com"); |
| 194 net::TestURLRequestContext context; | 194 net::TestURLRequestContext context; |
| 195 net::TestDelegate delegate; | 195 net::TestDelegate delegate; |
| 196 net::TestURLRequest url_request(url_a, &delegate, &context); | 196 net::TestURLRequest url_request(url_a, &delegate, &context); |
| 197 | 197 |
| 198 for (unsigned int i = 1; i <= kLastActiveStage; i <<= 1) { | 198 for (unsigned int i = 1; i <= kLastActiveStage; i <<= 1) { |
| 199 if (!(kActiveStages & i)) | 199 if (!(kActiveStages & i)) |
| 200 continue; | 200 continue; |
| 201 const RequestStage stage = static_cast<RequestStage>(i); | 201 const RequestStage stage = static_cast<RequestStage>(i); |
| 202 url_request.set_first_party_for_cookies(url_empty); | 202 url_request.set_first_party_for_cookies(url_empty); |
| 203 EXPECT_FALSE(third_party_attribute->IsFulfilled(DeclarativeWebRequestData( | 203 EXPECT_FALSE(third_party_attribute->IsFulfilled(WebRequestData(&url_request, |
| 204 &url_request, stage))); | 204 stage))); |
| 205 EXPECT_TRUE(first_party_attribute->IsFulfilled(DeclarativeWebRequestData( | 205 EXPECT_TRUE(first_party_attribute->IsFulfilled(WebRequestData(&url_request, |
| 206 &url_request, stage))); | 206 stage))); |
| 207 | 207 |
| 208 url_request.set_first_party_for_cookies(url_b); | 208 url_request.set_first_party_for_cookies(url_b); |
| 209 EXPECT_TRUE(third_party_attribute->IsFulfilled(DeclarativeWebRequestData( | 209 EXPECT_TRUE(third_party_attribute->IsFulfilled(WebRequestData(&url_request, |
| 210 &url_request, stage))); | 210 stage))); |
| 211 EXPECT_FALSE(first_party_attribute->IsFulfilled(DeclarativeWebRequestData( | 211 EXPECT_FALSE(first_party_attribute->IsFulfilled(WebRequestData(&url_request, |
| 212 &url_request, stage))); | 212 stage))); |
| 213 | 213 |
| 214 url_request.set_first_party_for_cookies(url_a); | 214 url_request.set_first_party_for_cookies(url_a); |
| 215 EXPECT_FALSE(third_party_attribute->IsFulfilled(DeclarativeWebRequestData( | 215 EXPECT_FALSE(third_party_attribute->IsFulfilled(WebRequestData(&url_request, |
| 216 &url_request, stage))); | 216 stage))); |
| 217 EXPECT_TRUE(first_party_attribute->IsFulfilled(DeclarativeWebRequestData( | 217 EXPECT_TRUE(first_party_attribute->IsFulfilled(WebRequestData(&url_request, |
| 218 &url_request, stage))); | 218 stage))); |
| 219 } | 219 } |
| 220 } | 220 } |
| 221 | 221 |
| 222 // Testing WebRequestConditionAttributeStages. This iterates over all stages, | 222 // Testing WebRequestConditionAttributeStages. This iterates over all stages, |
| 223 // and tests a couple of "stage" attributes -- one created with an empty set of | 223 // and tests a couple of "stage" attributes -- one created with an empty set of |
| 224 // applicable stages, one for each stage applicable for that stage, and one | 224 // applicable stages, one for each stage applicable for that stage, and one |
| 225 // applicable in all stages. | 225 // applicable in all stages. |
| 226 TEST(WebRequestConditionAttributeTest, Stages) { | 226 TEST(WebRequestConditionAttributeTest, Stages) { |
| 227 // Necessary for TestURLRequest. | 227 // Necessary for TestURLRequest. |
| 228 MessageLoop message_loop(MessageLoop::TYPE_IO); | 228 MessageLoop message_loop(MessageLoop::TYPE_IO); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 EXPECT_EQ("", error); | 276 EXPECT_EQ("", error); |
| 277 ASSERT_TRUE(one_stage_attributes.back() != NULL); | 277 ASSERT_TRUE(one_stage_attributes.back() != NULL); |
| 278 } | 278 } |
| 279 | 279 |
| 280 const GURL url_empty; | 280 const GURL url_empty; |
| 281 net::TestURLRequestContext context; | 281 net::TestURLRequestContext context; |
| 282 net::TestDelegate delegate; | 282 net::TestDelegate delegate; |
| 283 net::TestURLRequest url_request(url_empty, &delegate, &context); | 283 net::TestURLRequest url_request(url_empty, &delegate, &context); |
| 284 | 284 |
| 285 for (size_t i = 0; i < arraysize(active_stages); ++i) { | 285 for (size_t i = 0; i < arraysize(active_stages); ++i) { |
| 286 EXPECT_FALSE(empty_attribute->IsFulfilled(DeclarativeWebRequestData( | 286 EXPECT_FALSE(empty_attribute->IsFulfilled( |
| 287 &url_request, active_stages[i].first))); | 287 WebRequestData(&url_request, active_stages[i].first))); |
| 288 | 288 |
| 289 for (size_t j = 0; j < one_stage_attributes.size(); ++j) { | 289 for (size_t j = 0; j < one_stage_attributes.size(); ++j) { |
| 290 EXPECT_EQ( | 290 EXPECT_EQ(i == j, |
| 291 i == j, | 291 one_stage_attributes[j]->IsFulfilled( |
| 292 one_stage_attributes[j]->IsFulfilled(DeclarativeWebRequestData( | 292 WebRequestData(&url_request, active_stages[i].first))); |
| 293 &url_request, active_stages[i].first))); | |
| 294 } | 293 } |
| 295 | 294 |
| 296 EXPECT_TRUE(attribute_with_all->IsFulfilled(DeclarativeWebRequestData( | 295 EXPECT_TRUE(attribute_with_all->IsFulfilled( |
| 297 &url_request, active_stages[i].first))); | 296 WebRequestData(&url_request, active_stages[i].first))); |
| 298 } | 297 } |
| 299 } | 298 } |
| 300 | 299 |
| 301 namespace { | 300 namespace { |
| 302 | 301 |
| 303 // Builds a vector of vectors of string pointers from an array of strings. | 302 // Builds a vector of vectors of string pointers from an array of strings. |
| 304 // |array| is in fact a sequence of arrays. The array |sizes| captures the sizes | 303 // |array| is in fact a sequence of arrays. The array |sizes| captures the sizes |
| 305 // of all parts of |array|, and |size| is the length of |sizes| itself. | 304 // of all parts of |array|, and |size| is the length of |sizes| itself. |
| 306 // Example (this is pseudo-code, not C++): | 305 // Example (this is pseudo-code, not C++): |
| 307 // array = { "a", "b", "c", "d", "e", "f" } | 306 // array = { "a", "b", "c", "d", "e", "f" } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 ASSERT_TRUE(temp.get()); | 378 ASSERT_TRUE(temp.get()); |
| 380 contains_headers.Append(temp.release()); | 379 contains_headers.Append(temp.release()); |
| 381 } | 380 } |
| 382 | 381 |
| 383 std::string error; | 382 std::string error; |
| 384 scoped_ptr<WebRequestConditionAttribute> attribute = | 383 scoped_ptr<WebRequestConditionAttribute> attribute = |
| 385 WebRequestConditionAttribute::Create(key, &contains_headers, &error); | 384 WebRequestConditionAttribute::Create(key, &contains_headers, &error); |
| 386 ASSERT_EQ("", error); | 385 ASSERT_EQ("", error); |
| 387 ASSERT_TRUE(attribute.get()); | 386 ASSERT_TRUE(attribute.get()); |
| 388 | 387 |
| 389 *result = attribute->IsFulfilled(DeclarativeWebRequestData( | 388 *result = attribute->IsFulfilled(WebRequestData( |
| 390 url_request, stage, url_request->response_headers())); | 389 url_request, stage, url_request->response_headers())); |
| 391 } | 390 } |
| 392 | 391 |
| 393 } // namespace | 392 } // namespace |
| 394 | 393 |
| 395 // Here we test WebRequestConditionAttributeRequestHeaders for matching | 394 // Here we test WebRequestConditionAttributeRequestHeaders for matching |
| 396 // correctly against request headers. This test is not as extensive as | 395 // correctly against request headers. This test is not as extensive as |
| 397 // "ResponseHeaders" (below), because the header-matching code is shared | 396 // "ResponseHeaders" (below), because the header-matching code is shared |
| 398 // by both types of condition attributes, so it is enough to test it once. | 397 // by both types of condition attributes, so it is enough to test it once. |
| 399 TEST(WebRequestConditionAttributeTest, RequestHeaders) { | 398 TEST(WebRequestConditionAttributeTest, RequestHeaders) { |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 keys::kValueEqualsKey, "valueB" | 649 keys::kValueEqualsKey, "valueB" |
| 651 }; | 650 }; |
| 652 const size_t kExistingSize[] = { arraysize(kExisting) }; | 651 const size_t kExistingSize[] = { arraysize(kExisting) }; |
| 653 GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); | 652 GetArrayAsVector(kExisting, kExistingSize, 1u, &tests); |
| 654 MatchAndCheck( | 653 MatchAndCheck( |
| 655 tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); | 654 tests, keys::kExcludeResponseHeadersKey, stage, &url_request, &result); |
| 656 EXPECT_FALSE(result); | 655 EXPECT_FALSE(result); |
| 657 } | 656 } |
| 658 | 657 |
| 659 } // namespace extensions | 658 } // namespace extensions |
| OLD | NEW |