| 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 <map> | 5 #include <map> |
| 6 #include <queue> | 6 #include <queue> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| 11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
| 12 #include "base/json/json_reader.h" | 12 #include "base/json/json_reader.h" |
| 13 #include "base/json/json_string_value_serializer.h" | 13 #include "base/json/json_string_value_serializer.h" |
| 14 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
| 15 #include "base/message_loop.h" | 15 #include "base/message_loop.h" |
| 16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
| 17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
| 18 #include "base/string_piece.h" | 18 #include "base/string_piece.h" |
| 19 #include "base/stringprintf.h" | 19 #include "base/stringprintf.h" |
| 20 #include "base/time.h" | 20 #include "base/time.h" |
| 21 #include "base/utf_string_conversions.h" | 21 #include "base/utf_string_conversions.h" |
| 22 #include "chrome/browser/api/prefs/pref_member.h" | 22 #include "chrome/browser/api/prefs/pref_member.h" |
| 23 #include "chrome/browser/content_settings/cookie_settings.h" | 23 #include "chrome/browser/content_settings/cookie_settings.h" |
| 24 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" | 24 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" |
| 25 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 25 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| 26 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" | 26 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" |
| 27 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" | 27 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
| 28 #include "chrome/browser/extensions/event_router_forwarder.h" | 28 #include "chrome/browser/extensions/event_router_forwarder.h" |
| 29 #include "chrome/browser/extensions/extension_warning_set.h" |
| 29 #include "chrome/browser/net/chrome_network_delegate.h" | 30 #include "chrome/browser/net/chrome_network_delegate.h" |
| 30 #include "chrome/common/extensions/extension_messages.h" | 31 #include "chrome/common/extensions/extension_messages.h" |
| 31 #include "chrome/common/extensions/features/feature.h" | 32 #include "chrome/common/extensions/features/feature.h" |
| 32 #include "chrome/common/pref_names.h" | 33 #include "chrome/common/pref_names.h" |
| 33 #include "chrome/test/base/testing_browser_process.h" | 34 #include "chrome/test/base/testing_browser_process.h" |
| 34 #include "chrome/test/base/testing_pref_service.h" | 35 #include "chrome/test/base/testing_pref_service.h" |
| 35 #include "chrome/test/base/testing_profile.h" | 36 #include "chrome/test/base/testing_profile.h" |
| 36 #include "content/public/test/test_browser_thread.h" | 37 #include "content/public/test/test_browser_thread.h" |
| 37 #include "net/base/auth.h" | 38 #include "net/base/auth.h" |
| 38 #include "net/base/capturing_net_log.h" | 39 #include "net/base/capturing_net_log.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 64 using helpers::EventResponseDeltas; | 65 using helpers::EventResponseDeltas; |
| 65 using helpers::InDecreasingExtensionInstallationTimeOrder; | 66 using helpers::InDecreasingExtensionInstallationTimeOrder; |
| 66 using helpers::MergeCancelOfResponses; | 67 using helpers::MergeCancelOfResponses; |
| 67 using helpers::MergeOnBeforeRequestResponses; | 68 using helpers::MergeOnBeforeRequestResponses; |
| 68 using helpers::RequestCookieModification; | 69 using helpers::RequestCookieModification; |
| 69 using helpers::ResponseCookieModification; | 70 using helpers::ResponseCookieModification; |
| 70 using helpers::ResponseHeader; | 71 using helpers::ResponseHeader; |
| 71 using helpers::ResponseHeaders; | 72 using helpers::ResponseHeaders; |
| 72 using helpers::StringToCharList; | 73 using helpers::StringToCharList; |
| 73 | 74 |
| 75 namespace extensions { |
| 76 |
| 74 namespace { | 77 namespace { |
| 75 static void EventHandledOnIOThread( | 78 static void EventHandledOnIOThread( |
| 76 void* profile, | 79 void* profile, |
| 77 const std::string& extension_id, | 80 const std::string& extension_id, |
| 78 const std::string& event_name, | 81 const std::string& event_name, |
| 79 const std::string& sub_event_name, | 82 const std::string& sub_event_name, |
| 80 uint64 request_id, | 83 uint64 request_id, |
| 81 ExtensionWebRequestEventRouter::EventResponse* response) { | 84 ExtensionWebRequestEventRouter::EventResponse* response) { |
| 82 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 85 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 83 profile, extension_id, event_name, sub_event_name, request_id, | 86 profile, extension_id, event_name, sub_event_name, request_id, |
| 84 response); | 87 response); |
| 85 } | 88 } |
| 86 | 89 |
| 87 // Searches |key| in |collection| by iterating over its elements and returns | 90 // Searches |key| in |collection| by iterating over its elements and returns |
| 88 // true if found. | 91 // true if found. |
| 89 template <typename Collection, typename Key> | 92 template <typename Collection, typename Key> |
| 90 bool Contains(const Collection& collection, const Key& key) { | 93 bool Contains(const Collection& collection, const Key& key) { |
| 91 return std::find(collection.begin(), collection.end(), key) != | 94 return std::find(collection.begin(), collection.end(), key) != |
| 92 collection.end(); | 95 collection.end(); |
| 93 } | 96 } |
| 94 | 97 |
| 98 // Returns whether |warnings| contains an extension for |extension_id|. |
| 99 bool HasWarning(const ExtensionWarningSet& warnings, |
| 100 const std::string& extension_id) { |
| 101 for (ExtensionWarningSet::const_iterator i = warnings.begin(); |
| 102 i != warnings.end(); ++i) { |
| 103 if (i->extension_id() == extension_id) |
| 104 return true; |
| 105 } |
| 106 return false; |
| 107 } |
| 108 |
| 95 // Parses the JSON data attached to the |message| and tries to return it. | 109 // Parses the JSON data attached to the |message| and tries to return it. |
| 96 // |param| must outlive |out|. Returns NULL on failure. | 110 // |param| must outlive |out|. Returns NULL on failure. |
| 97 void GetPartOfMessageArguments(IPC::Message* message, | 111 void GetPartOfMessageArguments(IPC::Message* message, |
| 98 const DictionaryValue** out, | 112 const DictionaryValue** out, |
| 99 ExtensionMsg_MessageInvoke::Param* param) { | 113 ExtensionMsg_MessageInvoke::Param* param) { |
| 100 ASSERT_EQ(ExtensionMsg_MessageInvoke::ID, message->type()); | 114 ASSERT_EQ(ExtensionMsg_MessageInvoke::ID, message->type()); |
| 101 ASSERT_TRUE(ExtensionMsg_MessageInvoke::Read(message, param)); | 115 ASSERT_TRUE(ExtensionMsg_MessageInvoke::Read(message, param)); |
| 102 ASSERT_GE(param->c.GetSize(), 2u); | 116 ASSERT_GE(param->c.GetSize(), 2u); |
| 103 const Value* value = NULL; | 117 const Value* value = NULL; |
| 104 ASSERT_TRUE(param->c.Get(1, &value)); | 118 ASSERT_TRUE(param->c.Get(1, &value)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 }; | 164 }; |
| 151 | 165 |
| 152 class ExtensionWebRequestTest : public testing::Test { | 166 class ExtensionWebRequestTest : public testing::Test { |
| 153 public: | 167 public: |
| 154 ExtensionWebRequestTest() | 168 ExtensionWebRequestTest() |
| 155 : ui_thread_(content::BrowserThread::UI, &message_loop_), | 169 : ui_thread_(content::BrowserThread::UI, &message_loop_), |
| 156 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 170 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
| 157 | 171 |
| 158 protected: | 172 protected: |
| 159 virtual void SetUp() OVERRIDE { | 173 virtual void SetUp() OVERRIDE { |
| 160 event_router_ = new extensions::EventRouterForwarder(); | 174 event_router_ = new EventRouterForwarder(); |
| 161 enable_referrers_.Init( | 175 enable_referrers_.Init( |
| 162 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 176 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
| 163 network_delegate_.reset(new ChromeNetworkDelegate( | 177 network_delegate_.reset(new ChromeNetworkDelegate( |
| 164 event_router_.get(), NULL, NULL, NULL, &profile_, | 178 event_router_.get(), NULL, NULL, NULL, &profile_, |
| 165 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, | 179 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, |
| 166 NULL, NULL)); | 180 NULL, NULL)); |
| 167 context_.reset(new TestURLRequestContext(true)); | 181 context_.reset(new TestURLRequestContext(true)); |
| 168 context_->set_network_delegate(network_delegate_.get()); | 182 context_->set_network_delegate(network_delegate_.get()); |
| 169 context_->Init(); | 183 context_->Init(); |
| 170 } | 184 } |
| 171 | 185 |
| 172 // Fires a URLRequest with the specified |method|, |content_type| and three | 186 // Fires a URLRequest with the specified |method|, |content_type| and three |
| 173 // elements of upload data: bytes_1, a dummy empty file, bytes_2. | 187 // elements of upload data: bytes_1, a dummy empty file, bytes_2. |
| 174 void FireURLRequestWithData(const std::string& method, | 188 void FireURLRequestWithData(const std::string& method, |
| 175 const char* content_type, | 189 const char* content_type, |
| 176 const std::vector<char>& bytes_1, | 190 const std::vector<char>& bytes_1, |
| 177 const std::vector<char>& bytes_2); | 191 const std::vector<char>& bytes_2); |
| 178 | 192 |
| 179 MessageLoopForIO message_loop_; | 193 MessageLoopForIO message_loop_; |
| 180 content::TestBrowserThread ui_thread_; | 194 content::TestBrowserThread ui_thread_; |
| 181 content::TestBrowserThread io_thread_; | 195 content::TestBrowserThread io_thread_; |
| 182 TestingProfile profile_; | 196 TestingProfile profile_; |
| 183 TestDelegate delegate_; | 197 TestDelegate delegate_; |
| 184 BooleanPrefMember enable_referrers_; | 198 BooleanPrefMember enable_referrers_; |
| 185 TestIPCSender ipc_sender_; | 199 TestIPCSender ipc_sender_; |
| 186 scoped_refptr<extensions::EventRouterForwarder> event_router_; | 200 scoped_refptr<EventRouterForwarder> event_router_; |
| 187 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 201 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
| 188 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 202 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
| 189 scoped_ptr<TestURLRequestContext> context_; | 203 scoped_ptr<TestURLRequestContext> context_; |
| 190 }; | 204 }; |
| 191 | 205 |
| 192 // Tests that we handle disagreements among extensions about responses to | 206 // Tests that we handle disagreements among extensions about responses to |
| 193 // blocking events (redirection) by choosing the response from the | 207 // blocking events (redirection) by choosing the response from the |
| 194 // most-recently-installed extension. | 208 // most-recently-installed extension. |
| 195 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { | 209 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { |
| 196 std::string extension1_id("1"); | 210 std::string extension1_id("1"); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 | 708 |
| 695 class ExtensionWebRequestHeaderModificationTest : | 709 class ExtensionWebRequestHeaderModificationTest : |
| 696 public testing::TestWithParam<HeaderModificationTest> { | 710 public testing::TestWithParam<HeaderModificationTest> { |
| 697 public: | 711 public: |
| 698 ExtensionWebRequestHeaderModificationTest() | 712 ExtensionWebRequestHeaderModificationTest() |
| 699 : ui_thread_(content::BrowserThread::UI, &message_loop_), | 713 : ui_thread_(content::BrowserThread::UI, &message_loop_), |
| 700 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 714 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
| 701 | 715 |
| 702 protected: | 716 protected: |
| 703 virtual void SetUp() { | 717 virtual void SetUp() { |
| 704 event_router_ = new extensions::EventRouterForwarder(); | 718 event_router_ = new EventRouterForwarder(); |
| 705 enable_referrers_.Init( | 719 enable_referrers_.Init( |
| 706 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 720 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
| 707 network_delegate_.reset(new ChromeNetworkDelegate( | 721 network_delegate_.reset(new ChromeNetworkDelegate( |
| 708 event_router_.get(), NULL, NULL, NULL, &profile_, | 722 event_router_.get(), NULL, NULL, NULL, &profile_, |
| 709 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, | 723 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, |
| 710 NULL, NULL)); | 724 NULL, NULL)); |
| 711 context_.reset(new TestURLRequestContext(true)); | 725 context_.reset(new TestURLRequestContext(true)); |
| 712 host_resolver_.reset(new net::MockHostResolver()); | 726 host_resolver_.reset(new net::MockHostResolver()); |
| 713 host_resolver_->rules()->AddSimulatedFailure("doesnotexist"); | 727 host_resolver_->rules()->AddSimulatedFailure("doesnotexist"); |
| 714 context_->set_host_resolver(host_resolver_.get()); | 728 context_->set_host_resolver(host_resolver_.get()); |
| 715 context_->set_network_delegate(network_delegate_.get()); | 729 context_->set_network_delegate(network_delegate_.get()); |
| 716 context_->Init(); | 730 context_->Init(); |
| 717 } | 731 } |
| 718 | 732 |
| 719 MessageLoopForIO message_loop_; | 733 MessageLoopForIO message_loop_; |
| 720 content::TestBrowserThread ui_thread_; | 734 content::TestBrowserThread ui_thread_; |
| 721 content::TestBrowserThread io_thread_; | 735 content::TestBrowserThread io_thread_; |
| 722 TestingProfile profile_; | 736 TestingProfile profile_; |
| 723 TestDelegate delegate_; | 737 TestDelegate delegate_; |
| 724 BooleanPrefMember enable_referrers_; | 738 BooleanPrefMember enable_referrers_; |
| 725 TestIPCSender ipc_sender_; | 739 TestIPCSender ipc_sender_; |
| 726 scoped_refptr<extensions::EventRouterForwarder> event_router_; | 740 scoped_refptr<EventRouterForwarder> event_router_; |
| 727 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 741 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
| 728 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 742 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
| 729 scoped_ptr<net::MockHostResolver> host_resolver_; | 743 scoped_ptr<net::MockHostResolver> host_resolver_; |
| 730 scoped_ptr<TestURLRequestContext> context_; | 744 scoped_ptr<TestURLRequestContext> context_; |
| 731 }; | 745 }; |
| 732 | 746 |
| 733 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { | 747 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { |
| 734 std::string extension1_id("1"); | 748 std::string extension1_id("1"); |
| 735 std::string extension2_id("2"); | 749 std::string extension2_id("2"); |
| 736 std::string extension3_id("3"); | 750 std::string extension3_id("3"); |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 EXPECT_TRUE(delta->cancel); | 1228 EXPECT_TRUE(delta->cancel); |
| 1215 EXPECT_EQ(2u, delta->added_response_headers.size()); | 1229 EXPECT_EQ(2u, delta->added_response_headers.size()); |
| 1216 EXPECT_TRUE(Contains(delta->added_response_headers, | 1230 EXPECT_TRUE(Contains(delta->added_response_headers, |
| 1217 ResponseHeader("Key2", "Value1"))); | 1231 ResponseHeader("Key2", "Value1"))); |
| 1218 EXPECT_TRUE(Contains(delta->added_response_headers, | 1232 EXPECT_TRUE(Contains(delta->added_response_headers, |
| 1219 ResponseHeader("Key4", "Value4"))); | 1233 ResponseHeader("Key4", "Value4"))); |
| 1220 EXPECT_EQ(2u, delta->deleted_response_headers.size()); | 1234 EXPECT_EQ(2u, delta->deleted_response_headers.size()); |
| 1221 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 1235 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
| 1222 ResponseHeader("Key2", "Value2, Bar"))); | 1236 ResponseHeader("Key2", "Value2, Bar"))); |
| 1223 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 1237 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
| 1224 ResponseHeader("Key3", "Value3"))); | 1238 ResponseHeader("Key3", "Value3"))); |
| 1225 } | 1239 } |
| 1226 | 1240 |
| 1227 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { | 1241 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { |
| 1228 const bool cancel = true; | 1242 const bool cancel = true; |
| 1229 | 1243 |
| 1230 string16 username = ASCIIToUTF16("foo"); | 1244 string16 username = ASCIIToUTF16("foo"); |
| 1231 string16 password = ASCIIToUTF16("bar"); | 1245 string16 password = ASCIIToUTF16("bar"); |
| 1232 scoped_ptr<net::AuthCredentials> credentials( | 1246 scoped_ptr<net::AuthCredentials> credentials( |
| 1233 new net::AuthCredentials(username, password)); | 1247 new net::AuthCredentials(username, password)); |
| 1234 | 1248 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1265 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1279 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1266 MergeCancelOfResponses(deltas, &canceled, &net_log); | 1280 MergeCancelOfResponses(deltas, &canceled, &net_log); |
| 1267 EXPECT_TRUE(canceled); | 1281 EXPECT_TRUE(canceled); |
| 1268 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1282 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1269 } | 1283 } |
| 1270 | 1284 |
| 1271 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) { | 1285 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) { |
| 1272 EventResponseDeltas deltas; | 1286 EventResponseDeltas deltas; |
| 1273 net::CapturingBoundNetLog capturing_net_log; | 1287 net::CapturingBoundNetLog capturing_net_log; |
| 1274 net::BoundNetLog net_log = capturing_net_log.bound(); | 1288 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1275 std::set<std::string> conflicting_extensions; | 1289 ExtensionWarningSet warning_set; |
| 1276 GURL effective_new_url; | 1290 GURL effective_new_url; |
| 1277 | 1291 |
| 1278 // No redirect | 1292 // No redirect |
| 1279 linked_ptr<EventResponseDelta> d0( | 1293 linked_ptr<EventResponseDelta> d0( |
| 1280 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); | 1294 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); |
| 1281 deltas.push_back(d0); | 1295 deltas.push_back(d0); |
| 1282 MergeOnBeforeRequestResponses( | 1296 MergeOnBeforeRequestResponses( |
| 1283 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1297 deltas, &effective_new_url, &warning_set, &net_log); |
| 1284 EXPECT_TRUE(effective_new_url.is_empty()); | 1298 EXPECT_TRUE(effective_new_url.is_empty()); |
| 1285 | 1299 |
| 1286 // Single redirect. | 1300 // Single redirect. |
| 1287 GURL new_url_1("http://foo.com"); | 1301 GURL new_url_1("http://foo.com"); |
| 1288 linked_ptr<EventResponseDelta> d1( | 1302 linked_ptr<EventResponseDelta> d1( |
| 1289 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); | 1303 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); |
| 1290 d1->new_url = GURL(new_url_1); | 1304 d1->new_url = GURL(new_url_1); |
| 1291 deltas.push_back(d1); | 1305 deltas.push_back(d1); |
| 1292 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1306 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1293 capturing_net_log.Clear(); | 1307 capturing_net_log.Clear(); |
| 1294 MergeOnBeforeRequestResponses( | 1308 MergeOnBeforeRequestResponses( |
| 1295 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1309 deltas, &effective_new_url, &warning_set, &net_log); |
| 1296 EXPECT_EQ(new_url_1, effective_new_url); | 1310 EXPECT_EQ(new_url_1, effective_new_url); |
| 1297 EXPECT_TRUE(conflicting_extensions.empty()); | 1311 EXPECT_TRUE(warning_set.empty()); |
| 1298 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1312 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1299 | 1313 |
| 1300 // Ignored redirect (due to precedence). | 1314 // Ignored redirect (due to precedence). |
| 1301 GURL new_url_2("http://bar.com"); | 1315 GURL new_url_2("http://bar.com"); |
| 1302 linked_ptr<EventResponseDelta> d2( | 1316 linked_ptr<EventResponseDelta> d2( |
| 1303 new EventResponseDelta("extid2", base::Time::FromInternalValue(500))); | 1317 new EventResponseDelta("extid2", base::Time::FromInternalValue(500))); |
| 1304 d2->new_url = GURL(new_url_2); | 1318 d2->new_url = GURL(new_url_2); |
| 1305 deltas.push_back(d2); | 1319 deltas.push_back(d2); |
| 1306 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1320 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1321 warning_set.clear(); |
| 1307 capturing_net_log.Clear(); | 1322 capturing_net_log.Clear(); |
| 1308 MergeOnBeforeRequestResponses( | 1323 MergeOnBeforeRequestResponses( |
| 1309 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1324 deltas, &effective_new_url, &warning_set, &net_log); |
| 1310 EXPECT_EQ(new_url_1, effective_new_url); | 1325 EXPECT_EQ(new_url_1, effective_new_url); |
| 1311 EXPECT_EQ(1u, conflicting_extensions.size()); | 1326 EXPECT_EQ(1u, warning_set.size()); |
| 1312 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1327 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1313 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1328 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1314 | 1329 |
| 1315 // Overriding redirect. | 1330 // Overriding redirect. |
| 1316 GURL new_url_3("http://baz.com"); | 1331 GURL new_url_3("http://baz.com"); |
| 1317 linked_ptr<EventResponseDelta> d3( | 1332 linked_ptr<EventResponseDelta> d3( |
| 1318 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500))); | 1333 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500))); |
| 1319 d3->new_url = GURL(new_url_3); | 1334 d3->new_url = GURL(new_url_3); |
| 1320 deltas.push_back(d3); | 1335 deltas.push_back(d3); |
| 1321 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1336 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1322 conflicting_extensions.clear(); | 1337 warning_set.clear(); |
| 1323 capturing_net_log.Clear(); | 1338 capturing_net_log.Clear(); |
| 1324 MergeOnBeforeRequestResponses( | 1339 MergeOnBeforeRequestResponses( |
| 1325 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1340 deltas, &effective_new_url, &warning_set, &net_log); |
| 1326 EXPECT_EQ(new_url_3, effective_new_url); | 1341 EXPECT_EQ(new_url_3, effective_new_url); |
| 1327 EXPECT_EQ(2u, conflicting_extensions.size()); | 1342 EXPECT_EQ(2u, warning_set.size()); |
| 1328 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1")); | 1343 EXPECT_TRUE(HasWarning(warning_set, "extid1")); |
| 1329 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1344 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1330 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1345 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1331 | 1346 |
| 1332 // Check that identical redirects don't cause a conflict. | 1347 // Check that identical redirects don't cause a conflict. |
| 1333 linked_ptr<EventResponseDelta> d4( | 1348 linked_ptr<EventResponseDelta> d4( |
| 1334 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000))); | 1349 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000))); |
| 1335 d4->new_url = GURL(new_url_3); | 1350 d4->new_url = GURL(new_url_3); |
| 1336 deltas.push_back(d4); | 1351 deltas.push_back(d4); |
| 1337 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1352 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1338 conflicting_extensions.clear(); | 1353 warning_set.clear(); |
| 1339 capturing_net_log.Clear(); | 1354 capturing_net_log.Clear(); |
| 1340 MergeOnBeforeRequestResponses( | 1355 MergeOnBeforeRequestResponses( |
| 1341 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1356 deltas, &effective_new_url, &warning_set, &net_log); |
| 1342 EXPECT_EQ(new_url_3, effective_new_url); | 1357 EXPECT_EQ(new_url_3, effective_new_url); |
| 1343 EXPECT_EQ(2u, conflicting_extensions.size()); | 1358 EXPECT_EQ(2u, warning_set.size()); |
| 1344 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1")); | 1359 EXPECT_TRUE(HasWarning(warning_set, "extid1")); |
| 1345 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1360 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1346 EXPECT_EQ(4u, capturing_net_log.GetSize()); | 1361 EXPECT_EQ(4u, capturing_net_log.GetSize()); |
| 1347 } | 1362 } |
| 1348 | 1363 |
| 1349 // This tests that we can redirect to data:// urls, which is considered | 1364 // This tests that we can redirect to data:// urls, which is considered |
| 1350 // a kind of cancelling requests. | 1365 // a kind of cancelling requests. |
| 1351 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses2) { | 1366 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses2) { |
| 1352 EventResponseDeltas deltas; | 1367 EventResponseDeltas deltas; |
| 1353 net::CapturingBoundNetLog capturing_net_log; | 1368 net::CapturingBoundNetLog capturing_net_log; |
| 1354 net::BoundNetLog net_log = capturing_net_log.bound(); | 1369 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1355 std::set<std::string> conflicting_extensions; | 1370 ExtensionWarningSet warning_set; |
| 1356 GURL effective_new_url; | 1371 GURL effective_new_url; |
| 1357 | 1372 |
| 1358 // Single redirect. | 1373 // Single redirect. |
| 1359 GURL new_url_0("http://foo.com"); | 1374 GURL new_url_0("http://foo.com"); |
| 1360 linked_ptr<EventResponseDelta> d0( | 1375 linked_ptr<EventResponseDelta> d0( |
| 1361 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); | 1376 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); |
| 1362 d0->new_url = GURL(new_url_0); | 1377 d0->new_url = GURL(new_url_0); |
| 1363 deltas.push_back(d0); | 1378 deltas.push_back(d0); |
| 1364 MergeOnBeforeRequestResponses( | 1379 MergeOnBeforeRequestResponses( |
| 1365 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1380 deltas, &effective_new_url, &warning_set, &net_log); |
| 1366 EXPECT_EQ(new_url_0, effective_new_url); | 1381 EXPECT_EQ(new_url_0, effective_new_url); |
| 1367 | 1382 |
| 1368 // Cancel request by redirecting to a data:// URL. This shall override | 1383 // Cancel request by redirecting to a data:// URL. This shall override |
| 1369 // the other redirect but not cause any conflict warnings. | 1384 // the other redirect but not cause any conflict warnings. |
| 1370 GURL new_url_1("data://foo"); | 1385 GURL new_url_1("data://foo"); |
| 1371 linked_ptr<EventResponseDelta> d1( | 1386 linked_ptr<EventResponseDelta> d1( |
| 1372 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); | 1387 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); |
| 1373 d1->new_url = GURL(new_url_1); | 1388 d1->new_url = GURL(new_url_1); |
| 1374 deltas.push_back(d1); | 1389 deltas.push_back(d1); |
| 1375 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1390 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1391 warning_set.clear(); |
| 1376 capturing_net_log.Clear(); | 1392 capturing_net_log.Clear(); |
| 1377 MergeOnBeforeRequestResponses( | 1393 MergeOnBeforeRequestResponses( |
| 1378 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1394 deltas, &effective_new_url, &warning_set, &net_log); |
| 1379 EXPECT_EQ(new_url_1, effective_new_url); | 1395 EXPECT_EQ(new_url_1, effective_new_url); |
| 1380 EXPECT_TRUE(conflicting_extensions.empty()); | 1396 EXPECT_TRUE(warning_set.empty()); |
| 1381 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1397 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1382 | 1398 |
| 1383 // Cancel request by redirecting to the same data:// URL. This shall | 1399 // Cancel request by redirecting to the same data:// URL. This shall |
| 1384 // not create any conflicts as it is in line with d1. | 1400 // not create any conflicts as it is in line with d1. |
| 1385 GURL new_url_2("data://foo"); | 1401 GURL new_url_2("data://foo"); |
| 1386 linked_ptr<EventResponseDelta> d2( | 1402 linked_ptr<EventResponseDelta> d2( |
| 1387 new EventResponseDelta("extid2", base::Time::FromInternalValue(1000))); | 1403 new EventResponseDelta("extid2", base::Time::FromInternalValue(1000))); |
| 1388 d2->new_url = GURL(new_url_2); | 1404 d2->new_url = GURL(new_url_2); |
| 1389 deltas.push_back(d2); | 1405 deltas.push_back(d2); |
| 1390 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1406 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1407 warning_set.clear(); |
| 1391 capturing_net_log.Clear(); | 1408 capturing_net_log.Clear(); |
| 1392 MergeOnBeforeRequestResponses( | 1409 MergeOnBeforeRequestResponses( |
| 1393 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1410 deltas, &effective_new_url, &warning_set, &net_log); |
| 1394 EXPECT_EQ(new_url_1, effective_new_url); | 1411 EXPECT_EQ(new_url_1, effective_new_url); |
| 1395 EXPECT_TRUE(conflicting_extensions.empty()); | 1412 EXPECT_TRUE(warning_set.empty()); |
| 1396 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1413 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1397 | 1414 |
| 1398 // Cancel redirect by redirecting to a different data:// URL. This needs | 1415 // Cancel redirect by redirecting to a different data:// URL. This needs |
| 1399 // to create a conflict. | 1416 // to create a conflict. |
| 1400 GURL new_url_3("data://something_totally_different"); | 1417 GURL new_url_3("data://something_totally_different"); |
| 1401 linked_ptr<EventResponseDelta> d3( | 1418 linked_ptr<EventResponseDelta> d3( |
| 1402 new EventResponseDelta("extid3", base::Time::FromInternalValue(500))); | 1419 new EventResponseDelta("extid3", base::Time::FromInternalValue(500))); |
| 1403 d3->new_url = GURL(new_url_3); | 1420 d3->new_url = GURL(new_url_3); |
| 1404 deltas.push_back(d3); | 1421 deltas.push_back(d3); |
| 1405 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1422 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1423 warning_set.clear(); |
| 1406 capturing_net_log.Clear(); | 1424 capturing_net_log.Clear(); |
| 1407 MergeOnBeforeRequestResponses( | 1425 MergeOnBeforeRequestResponses( |
| 1408 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1426 deltas, &effective_new_url, &warning_set, &net_log); |
| 1409 EXPECT_EQ(new_url_1, effective_new_url); | 1427 EXPECT_EQ(new_url_1, effective_new_url); |
| 1410 EXPECT_EQ(1u, conflicting_extensions.size()); | 1428 EXPECT_EQ(1u, warning_set.size()); |
| 1411 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid3")); | 1429 EXPECT_TRUE(HasWarning(warning_set, "extid3")); |
| 1412 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1430 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1413 } | 1431 } |
| 1414 | 1432 |
| 1415 // This tests that we can redirect to about:blank, which is considered | 1433 // This tests that we can redirect to about:blank, which is considered |
| 1416 // a kind of cancelling requests. | 1434 // a kind of cancelling requests. |
| 1417 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses3) { | 1435 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses3) { |
| 1418 EventResponseDeltas deltas; | 1436 EventResponseDeltas deltas; |
| 1419 net::CapturingBoundNetLog capturing_net_log; | 1437 net::CapturingBoundNetLog capturing_net_log; |
| 1420 net::BoundNetLog net_log = capturing_net_log.bound(); | 1438 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1421 std::set<std::string> conflicting_extensions; | 1439 ExtensionWarningSet warning_set; |
| 1422 GURL effective_new_url; | 1440 GURL effective_new_url; |
| 1423 | 1441 |
| 1424 // Single redirect. | 1442 // Single redirect. |
| 1425 GURL new_url_0("http://foo.com"); | 1443 GURL new_url_0("http://foo.com"); |
| 1426 linked_ptr<EventResponseDelta> d0( | 1444 linked_ptr<EventResponseDelta> d0( |
| 1427 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); | 1445 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); |
| 1428 d0->new_url = GURL(new_url_0); | 1446 d0->new_url = GURL(new_url_0); |
| 1429 deltas.push_back(d0); | 1447 deltas.push_back(d0); |
| 1430 MergeOnBeforeRequestResponses( | 1448 MergeOnBeforeRequestResponses( |
| 1431 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1449 deltas, &effective_new_url, &warning_set, &net_log); |
| 1432 EXPECT_EQ(new_url_0, effective_new_url); | 1450 EXPECT_EQ(new_url_0, effective_new_url); |
| 1433 | 1451 |
| 1434 // Cancel request by redirecting to about:blank. This shall override | 1452 // Cancel request by redirecting to about:blank. This shall override |
| 1435 // the other redirect but not cause any conflict warnings. | 1453 // the other redirect but not cause any conflict warnings. |
| 1436 GURL new_url_1("about:blank"); | 1454 GURL new_url_1("about:blank"); |
| 1437 linked_ptr<EventResponseDelta> d1( | 1455 linked_ptr<EventResponseDelta> d1( |
| 1438 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); | 1456 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); |
| 1439 d1->new_url = GURL(new_url_1); | 1457 d1->new_url = GURL(new_url_1); |
| 1440 deltas.push_back(d1); | 1458 deltas.push_back(d1); |
| 1441 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1459 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1460 warning_set.clear(); |
| 1442 capturing_net_log.Clear(); | 1461 capturing_net_log.Clear(); |
| 1443 MergeOnBeforeRequestResponses( | 1462 MergeOnBeforeRequestResponses( |
| 1444 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1463 deltas, &effective_new_url, &warning_set, &net_log); |
| 1445 EXPECT_EQ(new_url_1, effective_new_url); | 1464 EXPECT_EQ(new_url_1, effective_new_url); |
| 1446 EXPECT_TRUE(conflicting_extensions.empty()); | 1465 EXPECT_TRUE(warning_set.empty()); |
| 1447 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1466 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1448 } | 1467 } |
| 1449 | 1468 |
| 1450 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { | 1469 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { |
| 1451 net::HttpRequestHeaders base_headers; | 1470 net::HttpRequestHeaders base_headers; |
| 1452 base_headers.AddHeaderFromString("key1: value 1"); | 1471 base_headers.AddHeaderFromString("key1: value 1"); |
| 1453 base_headers.AddHeaderFromString("key2: value 2"); | 1472 base_headers.AddHeaderFromString("key2: value 2"); |
| 1454 net::CapturingBoundNetLog capturing_net_log; | 1473 net::CapturingBoundNetLog capturing_net_log; |
| 1455 net::BoundNetLog net_log = capturing_net_log.bound(); | 1474 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1456 std::set<std::string> conflicting_extensions; | 1475 ExtensionWarningSet warning_set; |
| 1457 std::string header_value; | 1476 std::string header_value; |
| 1458 EventResponseDeltas deltas; | 1477 EventResponseDeltas deltas; |
| 1459 | 1478 |
| 1460 // Check that we can handle not changing the headers. | 1479 // Check that we can handle not changing the headers. |
| 1461 linked_ptr<EventResponseDelta> d0( | 1480 linked_ptr<EventResponseDelta> d0( |
| 1462 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); | 1481 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); |
| 1463 deltas.push_back(d0); | 1482 deltas.push_back(d0); |
| 1464 net::HttpRequestHeaders headers0; | 1483 net::HttpRequestHeaders headers0; |
| 1465 headers0.MergeFrom(base_headers); | 1484 headers0.MergeFrom(base_headers); |
| 1466 MergeOnBeforeSendHeadersResponses( | 1485 MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log); |
| 1467 deltas, &headers0, &conflicting_extensions, &net_log); | |
| 1468 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); | 1486 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); |
| 1469 EXPECT_EQ("value 1", header_value); | 1487 EXPECT_EQ("value 1", header_value); |
| 1470 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); | 1488 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); |
| 1471 EXPECT_EQ("value 2", header_value); | 1489 EXPECT_EQ("value 2", header_value); |
| 1472 EXPECT_EQ(0u, conflicting_extensions.size()); | 1490 EXPECT_EQ(0u, warning_set.size()); |
| 1473 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1491 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1474 | 1492 |
| 1475 // Delete, modify and add a header. | 1493 // Delete, modify and add a header. |
| 1476 linked_ptr<EventResponseDelta> d1( | 1494 linked_ptr<EventResponseDelta> d1( |
| 1477 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1495 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1478 d1->deleted_request_headers.push_back("key1"); | 1496 d1->deleted_request_headers.push_back("key1"); |
| 1479 d1->modified_request_headers.AddHeaderFromString("key2: value 3"); | 1497 d1->modified_request_headers.AddHeaderFromString("key2: value 3"); |
| 1480 d1->modified_request_headers.AddHeaderFromString("key3: value 3"); | 1498 d1->modified_request_headers.AddHeaderFromString("key3: value 3"); |
| 1481 deltas.push_back(d1); | 1499 deltas.push_back(d1); |
| 1482 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1500 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1501 warning_set.clear(); |
| 1502 capturing_net_log.Clear(); |
| 1483 net::HttpRequestHeaders headers1; | 1503 net::HttpRequestHeaders headers1; |
| 1484 headers1.MergeFrom(base_headers); | 1504 headers1.MergeFrom(base_headers); |
| 1485 MergeOnBeforeSendHeadersResponses( | 1505 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); |
| 1486 deltas, &headers1, &conflicting_extensions, &net_log); | |
| 1487 EXPECT_FALSE(headers1.HasHeader("key1")); | 1506 EXPECT_FALSE(headers1.HasHeader("key1")); |
| 1488 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); | 1507 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); |
| 1489 EXPECT_EQ("value 3", header_value); | 1508 EXPECT_EQ("value 3", header_value); |
| 1490 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); | 1509 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); |
| 1491 EXPECT_EQ("value 3", header_value); | 1510 EXPECT_EQ("value 3", header_value); |
| 1492 EXPECT_EQ(0u, conflicting_extensions.size()); | 1511 EXPECT_EQ(0u, warning_set.size()); |
| 1493 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1512 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1494 | 1513 |
| 1495 // Check that conflicts are atomic, i.e. if one header modification | 1514 // Check that conflicts are atomic, i.e. if one header modification |
| 1496 // collides all other conflicts of the same extension are declined as well. | 1515 // collides all other conflicts of the same extension are declined as well. |
| 1497 linked_ptr<EventResponseDelta> d2( | 1516 linked_ptr<EventResponseDelta> d2( |
| 1498 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1517 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1499 // This one conflicts: | 1518 // This one conflicts: |
| 1500 d2->modified_request_headers.AddHeaderFromString("key3: value 0"); | 1519 d2->modified_request_headers.AddHeaderFromString("key3: value 0"); |
| 1501 d2->modified_request_headers.AddHeaderFromString("key4: value 4"); | 1520 d2->modified_request_headers.AddHeaderFromString("key4: value 4"); |
| 1502 deltas.push_back(d2); | 1521 deltas.push_back(d2); |
| 1503 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1522 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1504 conflicting_extensions.clear(); | 1523 warning_set.clear(); |
| 1505 capturing_net_log.Clear(); | 1524 capturing_net_log.Clear(); |
| 1506 net::HttpRequestHeaders headers2; | 1525 net::HttpRequestHeaders headers2; |
| 1507 headers2.MergeFrom(base_headers); | 1526 headers2.MergeFrom(base_headers); |
| 1508 MergeOnBeforeSendHeadersResponses( | 1527 MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log); |
| 1509 deltas, &headers2, &conflicting_extensions, &net_log); | |
| 1510 EXPECT_FALSE(headers2.HasHeader("key1")); | 1528 EXPECT_FALSE(headers2.HasHeader("key1")); |
| 1511 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); | 1529 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); |
| 1512 EXPECT_EQ("value 3", header_value); | 1530 EXPECT_EQ("value 3", header_value); |
| 1513 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); | 1531 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); |
| 1514 EXPECT_EQ("value 3", header_value); | 1532 EXPECT_EQ("value 3", header_value); |
| 1515 EXPECT_FALSE(headers2.HasHeader("key4")); | 1533 EXPECT_FALSE(headers2.HasHeader("key4")); |
| 1516 EXPECT_EQ(1u, conflicting_extensions.size()); | 1534 EXPECT_EQ(1u, warning_set.size()); |
| 1517 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1535 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1518 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1536 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1519 | 1537 |
| 1520 // Check that identical modifications don't conflict and operations | 1538 // Check that identical modifications don't conflict and operations |
| 1521 // can be merged. | 1539 // can be merged. |
| 1522 linked_ptr<EventResponseDelta> d3( | 1540 linked_ptr<EventResponseDelta> d3( |
| 1523 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 1541 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 1524 d3->deleted_request_headers.push_back("key1"); | 1542 d3->deleted_request_headers.push_back("key1"); |
| 1525 d3->modified_request_headers.AddHeaderFromString("key2: value 3"); | 1543 d3->modified_request_headers.AddHeaderFromString("key2: value 3"); |
| 1526 d3->modified_request_headers.AddHeaderFromString("key5: value 5"); | 1544 d3->modified_request_headers.AddHeaderFromString("key5: value 5"); |
| 1527 deltas.push_back(d3); | 1545 deltas.push_back(d3); |
| 1528 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1546 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1529 conflicting_extensions.clear(); | 1547 warning_set.clear(); |
| 1530 capturing_net_log.Clear(); | 1548 capturing_net_log.Clear(); |
| 1531 net::HttpRequestHeaders headers3; | 1549 net::HttpRequestHeaders headers3; |
| 1532 headers3.MergeFrom(base_headers); | 1550 headers3.MergeFrom(base_headers); |
| 1533 MergeOnBeforeSendHeadersResponses( | 1551 MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log); |
| 1534 deltas, &headers3, &conflicting_extensions, &net_log); | |
| 1535 EXPECT_FALSE(headers3.HasHeader("key1")); | 1552 EXPECT_FALSE(headers3.HasHeader("key1")); |
| 1536 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); | 1553 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); |
| 1537 EXPECT_EQ("value 3", header_value); | 1554 EXPECT_EQ("value 3", header_value); |
| 1538 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); | 1555 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); |
| 1539 EXPECT_EQ("value 3", header_value); | 1556 EXPECT_EQ("value 3", header_value); |
| 1540 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); | 1557 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); |
| 1541 EXPECT_EQ("value 5", header_value); | 1558 EXPECT_EQ("value 5", header_value); |
| 1542 EXPECT_EQ(1u, conflicting_extensions.size()); | 1559 EXPECT_EQ(1u, warning_set.size()); |
| 1543 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1560 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1544 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1561 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1545 } | 1562 } |
| 1546 | 1563 |
| 1547 TEST(ExtensionWebRequestHelpersTest, | 1564 TEST(ExtensionWebRequestHelpersTest, |
| 1548 TestMergeOnBeforeSendHeadersResponses_Cookies) { | 1565 TestMergeOnBeforeSendHeadersResponses_Cookies) { |
| 1549 net::HttpRequestHeaders base_headers; | 1566 net::HttpRequestHeaders base_headers; |
| 1550 base_headers.AddHeaderFromString( | 1567 base_headers.AddHeaderFromString( |
| 1551 "Cookie: name=value; name2=value2; name3=value3"); | 1568 "Cookie: name=value; name2=value2; name3=value3"); |
| 1552 net::CapturingBoundNetLog capturing_net_log; | 1569 net::CapturingBoundNetLog capturing_net_log; |
| 1553 net::BoundNetLog net_log = capturing_net_log.bound(); | 1570 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1554 std::set<std::string> conflicting_extensions; | 1571 ExtensionWarningSet warning_set; |
| 1555 std::string header_value; | 1572 std::string header_value; |
| 1556 EventResponseDeltas deltas; | 1573 EventResponseDeltas deltas; |
| 1557 | 1574 |
| 1558 linked_ptr<RequestCookieModification> add_cookie = | 1575 linked_ptr<RequestCookieModification> add_cookie = |
| 1559 make_linked_ptr(new RequestCookieModification); | 1576 make_linked_ptr(new RequestCookieModification); |
| 1560 add_cookie->type = helpers::ADD; | 1577 add_cookie->type = helpers::ADD; |
| 1561 add_cookie->modification.reset(new helpers::RequestCookie); | 1578 add_cookie->modification.reset(new helpers::RequestCookie); |
| 1562 add_cookie->modification->name.reset(new std::string("name4")); | 1579 add_cookie->modification->name.reset(new std::string("name4")); |
| 1563 add_cookie->modification->value.reset(new std::string("\"value 4\"")); | 1580 add_cookie->modification->value.reset(new std::string("\"value 4\"")); |
| 1564 | 1581 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1589 | 1606 |
| 1590 for (size_t i = 0; i < arraysize(operations); ++i) { | 1607 for (size_t i = 0; i < arraysize(operations); ++i) { |
| 1591 linked_ptr<EventResponseDelta> delta( | 1608 linked_ptr<EventResponseDelta> delta( |
| 1592 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1609 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1593 delta->request_cookie_modifications.push_back(operations[i]); | 1610 delta->request_cookie_modifications.push_back(operations[i]); |
| 1594 deltas.push_back(delta); | 1611 deltas.push_back(delta); |
| 1595 } | 1612 } |
| 1596 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1613 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1597 net::HttpRequestHeaders headers1; | 1614 net::HttpRequestHeaders headers1; |
| 1598 headers1.MergeFrom(base_headers); | 1615 headers1.MergeFrom(base_headers); |
| 1599 MergeOnBeforeSendHeadersResponses( | 1616 warning_set.clear(); |
| 1600 deltas, &headers1, &conflicting_extensions, &net_log); | 1617 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); |
| 1601 EXPECT_TRUE(headers1.HasHeader("Cookie")); | 1618 EXPECT_TRUE(headers1.HasHeader("Cookie")); |
| 1602 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); | 1619 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); |
| 1603 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); | 1620 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); |
| 1604 EXPECT_EQ(0u, conflicting_extensions.size()); | 1621 EXPECT_EQ(0u, warning_set.size()); |
| 1605 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1622 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1606 } | 1623 } |
| 1607 | 1624 |
| 1608 namespace { | 1625 namespace { |
| 1609 | 1626 |
| 1610 std::string GetCookieExpirationDate(int delta_secs) { | 1627 std::string GetCookieExpirationDate(int delta_secs) { |
| 1611 const char* const kWeekDays[] = { | 1628 const char* const kWeekDays[] = { |
| 1612 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" | 1629 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" |
| 1613 }; | 1630 }; |
| 1614 const char* const kMonthNames[] = { | 1631 const char* const kMonthNames[] = { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1628 exploded_time.minute, | 1645 exploded_time.minute, |
| 1629 exploded_time.second); | 1646 exploded_time.second); |
| 1630 } | 1647 } |
| 1631 | 1648 |
| 1632 } // namespace | 1649 } // namespace |
| 1633 | 1650 |
| 1634 TEST(ExtensionWebRequestHelpersTest, | 1651 TEST(ExtensionWebRequestHelpersTest, |
| 1635 TestMergeCookiesInOnHeadersReceivedResponses) { | 1652 TestMergeCookiesInOnHeadersReceivedResponses) { |
| 1636 net::CapturingBoundNetLog capturing_net_log; | 1653 net::CapturingBoundNetLog capturing_net_log; |
| 1637 net::BoundNetLog net_log = capturing_net_log.bound(); | 1654 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1638 std::set<std::string> conflicting_extensions; | 1655 ExtensionWarningSet warning_set; |
| 1639 std::string header_value; | 1656 std::string header_value; |
| 1640 EventResponseDeltas deltas; | 1657 EventResponseDeltas deltas; |
| 1641 | 1658 |
| 1642 std::string cookie_expiration = GetCookieExpirationDate(1200); | 1659 std::string cookie_expiration = GetCookieExpirationDate(1200); |
| 1643 std::string base_headers_string = | 1660 std::string base_headers_string = |
| 1644 "HTTP/1.0 200 OK\r\n" | 1661 "HTTP/1.0 200 OK\r\n" |
| 1645 "Foo: Bar\r\n" | 1662 "Foo: Bar\r\n" |
| 1646 "Set-Cookie: name=value; DOMAIN=google.com; Secure\r\n" | 1663 "Set-Cookie: name=value; DOMAIN=google.com; Secure\r\n" |
| 1647 "Set-Cookie: name2=value2\r\n" | 1664 "Set-Cookie: name2=value2\r\n" |
| 1648 "Set-Cookie: name3=value3\r\n" | 1665 "Set-Cookie: name3=value3\r\n" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1663 new net::HttpResponseHeaders( | 1680 new net::HttpResponseHeaders( |
| 1664 net::HttpUtil::AssembleRawHeaders( | 1681 net::HttpUtil::AssembleRawHeaders( |
| 1665 base_headers_string.c_str(), base_headers_string.size()))); | 1682 base_headers_string.c_str(), base_headers_string.size()))); |
| 1666 | 1683 |
| 1667 // Check that we can handle if not touching the response headers. | 1684 // Check that we can handle if not touching the response headers. |
| 1668 linked_ptr<EventResponseDelta> d0( | 1685 linked_ptr<EventResponseDelta> d0( |
| 1669 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1686 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1670 deltas.push_back(d0); | 1687 deltas.push_back(d0); |
| 1671 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1688 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1672 MergeCookiesInOnHeadersReceivedResponses( | 1689 MergeCookiesInOnHeadersReceivedResponses( |
| 1673 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, | 1690 deltas, base_headers.get(), &new_headers0, &warning_set, &net_log); |
| 1674 &net_log); | |
| 1675 EXPECT_FALSE(new_headers0.get()); | 1691 EXPECT_FALSE(new_headers0.get()); |
| 1676 EXPECT_EQ(0u, conflicting_extensions.size()); | 1692 EXPECT_EQ(0u, warning_set.size()); |
| 1677 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1693 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1678 | 1694 |
| 1679 linked_ptr<ResponseCookieModification> add_cookie = | 1695 linked_ptr<ResponseCookieModification> add_cookie = |
| 1680 make_linked_ptr(new ResponseCookieModification); | 1696 make_linked_ptr(new ResponseCookieModification); |
| 1681 add_cookie->type = helpers::ADD; | 1697 add_cookie->type = helpers::ADD; |
| 1682 add_cookie->modification.reset(new helpers::ResponseCookie); | 1698 add_cookie->modification.reset(new helpers::ResponseCookie); |
| 1683 add_cookie->modification->name.reset(new std::string("name4")); | 1699 add_cookie->modification->name.reset(new std::string("name4")); |
| 1684 add_cookie->modification->value.reset(new std::string("\"value4\"")); | 1700 add_cookie->modification->value.reset(new std::string("\"value4\"")); |
| 1685 | 1701 |
| 1686 linked_ptr<ResponseCookieModification> edit_cookie = | 1702 linked_ptr<ResponseCookieModification> edit_cookie = |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1831 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1847 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1832 delta->response_cookie_modifications.push_back(operations[i]); | 1848 delta->response_cookie_modifications.push_back(operations[i]); |
| 1833 deltas.push_back(delta); | 1849 deltas.push_back(delta); |
| 1834 } | 1850 } |
| 1835 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1851 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1836 scoped_refptr<net::HttpResponseHeaders> headers1( | 1852 scoped_refptr<net::HttpResponseHeaders> headers1( |
| 1837 new net::HttpResponseHeaders( | 1853 new net::HttpResponseHeaders( |
| 1838 net::HttpUtil::AssembleRawHeaders( | 1854 net::HttpUtil::AssembleRawHeaders( |
| 1839 base_headers_string.c_str(), base_headers_string.size()))); | 1855 base_headers_string.c_str(), base_headers_string.size()))); |
| 1840 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1856 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1857 warning_set.clear(); |
| 1841 MergeCookiesInOnHeadersReceivedResponses( | 1858 MergeCookiesInOnHeadersReceivedResponses( |
| 1842 deltas, headers1.get(), &new_headers1, &conflicting_extensions, &net_log); | 1859 deltas, headers1.get(), &new_headers1, &warning_set, &net_log); |
| 1843 | 1860 |
| 1844 EXPECT_TRUE(new_headers1->HasHeader("Foo")); | 1861 EXPECT_TRUE(new_headers1->HasHeader("Foo")); |
| 1845 void* iter = NULL; | 1862 void* iter = NULL; |
| 1846 std::string cookie_string; | 1863 std::string cookie_string; |
| 1847 std::set<std::string> expected_cookies; | 1864 std::set<std::string> expected_cookies; |
| 1848 expected_cookies.insert("name=value; domain=google.com; secure"); | 1865 expected_cookies.insert("name=value; domain=google.com; secure"); |
| 1849 expected_cookies.insert("name2=value2; secure"); | 1866 expected_cookies.insert("name2=value2; secure"); |
| 1850 expected_cookies.insert("name4=\"value4\"; secure"); | 1867 expected_cookies.insert("name4=\"value4\"; secure"); |
| 1851 expected_cookies.insert( | 1868 expected_cookies.insert( |
| 1852 "lBound1=greater_1; expires=" + cookie_expiration + "; secure"); | 1869 "lBound1=greater_1; expires=" + cookie_expiration + "; secure"); |
| 1853 expected_cookies.insert("lBound2=greater_2; max-age=1200; secure"); | 1870 expected_cookies.insert("lBound2=greater_2; max-age=1200; secure"); |
| 1854 expected_cookies.insert("lBound3=equal_2; max-age=2000; secure"); | 1871 expected_cookies.insert("lBound3=equal_2; max-age=2000; secure"); |
| 1855 expected_cookies.insert( | 1872 expected_cookies.insert( |
| 1856 "uBound1=smaller_1; expires=" + cookie_expiration + "; secure"); | 1873 "uBound1=smaller_1; expires=" + cookie_expiration + "; secure"); |
| 1857 expected_cookies.insert("uBound2=smaller_2; max-age=1200; secure"); | 1874 expected_cookies.insert("uBound2=smaller_2; max-age=1200; secure"); |
| 1858 expected_cookies.insert("uBound3=equal_4; max-age=2000; secure"); | 1875 expected_cookies.insert("uBound3=equal_4; max-age=2000; secure"); |
| 1859 expected_cookies.insert("uBound4=value11; max-age=2500; secure"); | 1876 expected_cookies.insert("uBound4=value11; max-age=2500; secure"); |
| 1860 expected_cookies.insert( | 1877 expected_cookies.insert( |
| 1861 "uBound5=value12; max-age=600; expires=" + cookie_expiration+ "; secure"); | 1878 "uBound5=value12; max-age=600; expires=" + cookie_expiration+ "; secure"); |
| 1862 std::set<std::string> actual_cookies; | 1879 std::set<std::string> actual_cookies; |
| 1863 while (new_headers1->EnumerateHeader(&iter, "Set-Cookie", &cookie_string)) | 1880 while (new_headers1->EnumerateHeader(&iter, "Set-Cookie", &cookie_string)) |
| 1864 actual_cookies.insert(cookie_string); | 1881 actual_cookies.insert(cookie_string); |
| 1865 EXPECT_EQ(expected_cookies, actual_cookies); | 1882 EXPECT_EQ(expected_cookies, actual_cookies); |
| 1866 EXPECT_EQ(0u, conflicting_extensions.size()); | 1883 EXPECT_EQ(0u, warning_set.size()); |
| 1867 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1884 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1868 } | 1885 } |
| 1869 | 1886 |
| 1870 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { | 1887 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { |
| 1871 net::CapturingBoundNetLog capturing_net_log; | 1888 net::CapturingBoundNetLog capturing_net_log; |
| 1872 net::BoundNetLog net_log = capturing_net_log.bound(); | 1889 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1873 std::set<std::string> conflicting_extensions; | 1890 ExtensionWarningSet warning_set; |
| 1874 std::string header_value; | 1891 std::string header_value; |
| 1875 EventResponseDeltas deltas; | 1892 EventResponseDeltas deltas; |
| 1876 | 1893 |
| 1877 char base_headers_string[] = | 1894 char base_headers_string[] = |
| 1878 "HTTP/1.0 200 OK\r\n" | 1895 "HTTP/1.0 200 OK\r\n" |
| 1879 "Key1: Value1\r\n" | 1896 "Key1: Value1\r\n" |
| 1880 "Key2: Value2, Foo\r\n" | 1897 "Key2: Value2, Foo\r\n" |
| 1881 "\r\n"; | 1898 "\r\n"; |
| 1882 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1899 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1883 new net::HttpResponseHeaders( | 1900 new net::HttpResponseHeaders( |
| 1884 net::HttpUtil::AssembleRawHeaders( | 1901 net::HttpUtil::AssembleRawHeaders( |
| 1885 base_headers_string, sizeof(base_headers_string)))); | 1902 base_headers_string, sizeof(base_headers_string)))); |
| 1886 | 1903 |
| 1887 // Check that we can handle if not touching the response headers. | 1904 // Check that we can handle if not touching the response headers. |
| 1888 linked_ptr<EventResponseDelta> d0( | 1905 linked_ptr<EventResponseDelta> d0( |
| 1889 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1906 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1890 deltas.push_back(d0); | 1907 deltas.push_back(d0); |
| 1891 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1908 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1892 MergeOnHeadersReceivedResponses( | 1909 MergeOnHeadersReceivedResponses(deltas, base_headers.get(), &new_headers0, |
| 1893 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, | 1910 &warning_set, &net_log); |
| 1894 &net_log); | |
| 1895 EXPECT_FALSE(new_headers0.get()); | 1911 EXPECT_FALSE(new_headers0.get()); |
| 1896 EXPECT_EQ(0u, conflicting_extensions.size()); | 1912 EXPECT_EQ(0u, warning_set.size()); |
| 1897 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1913 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1898 | 1914 |
| 1899 linked_ptr<EventResponseDelta> d1( | 1915 linked_ptr<EventResponseDelta> d1( |
| 1900 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1916 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1901 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); | 1917 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
| 1902 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); | 1918 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); |
| 1903 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | 1919 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); |
| 1904 deltas.push_back(d1); | 1920 deltas.push_back(d1); |
| 1905 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1921 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1906 conflicting_extensions.clear(); | 1922 warning_set.clear(); |
| 1907 capturing_net_log.Clear(); | 1923 capturing_net_log.Clear(); |
| 1908 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1924 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1909 MergeOnHeadersReceivedResponses( | 1925 MergeOnHeadersReceivedResponses( |
| 1910 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | 1926 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); |
| 1911 &net_log); | |
| 1912 ASSERT_TRUE(new_headers1.get()); | 1927 ASSERT_TRUE(new_headers1.get()); |
| 1913 std::multimap<std::string, std::string> expected1; | 1928 std::multimap<std::string, std::string> expected1; |
| 1914 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | 1929 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); |
| 1915 void* iter = NULL; | 1930 void* iter = NULL; |
| 1916 std::string name; | 1931 std::string name; |
| 1917 std::string value; | 1932 std::string value; |
| 1918 std::multimap<std::string, std::string> actual1; | 1933 std::multimap<std::string, std::string> actual1; |
| 1919 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1934 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1920 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1935 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1921 } | 1936 } |
| 1922 EXPECT_EQ(expected1, actual1); | 1937 EXPECT_EQ(expected1, actual1); |
| 1923 EXPECT_EQ(0u, conflicting_extensions.size()); | 1938 EXPECT_EQ(0u, warning_set.size()); |
| 1924 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1939 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1925 | 1940 |
| 1926 // Check that we replace response headers only once. | 1941 // Check that we replace response headers only once. |
| 1927 linked_ptr<EventResponseDelta> d2( | 1942 linked_ptr<EventResponseDelta> d2( |
| 1928 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1943 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1929 // Note that we use a different capitalization of KeY2. This should not | 1944 // Note that we use a different capitalization of KeY2. This should not |
| 1930 // matter. | 1945 // matter. |
| 1931 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); | 1946 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); |
| 1932 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | 1947 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); |
| 1933 deltas.push_back(d2); | 1948 deltas.push_back(d2); |
| 1934 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1949 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1935 conflicting_extensions.clear(); | 1950 warning_set.clear(); |
| 1936 capturing_net_log.Clear(); | 1951 capturing_net_log.Clear(); |
| 1937 scoped_refptr<net::HttpResponseHeaders> new_headers2; | 1952 scoped_refptr<net::HttpResponseHeaders> new_headers2; |
| 1938 MergeOnHeadersReceivedResponses( | 1953 MergeOnHeadersReceivedResponses( |
| 1939 deltas, base_headers.get(), &new_headers2, &conflicting_extensions, | 1954 deltas, base_headers.get(), &new_headers2, &warning_set, &net_log); |
| 1940 &net_log); | |
| 1941 ASSERT_TRUE(new_headers2.get()); | 1955 ASSERT_TRUE(new_headers2.get()); |
| 1942 iter = NULL; | 1956 iter = NULL; |
| 1943 std::multimap<std::string, std::string> actual2; | 1957 std::multimap<std::string, std::string> actual2; |
| 1944 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | 1958 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1945 actual2.insert(std::pair<std::string, std::string>(name, value)); | 1959 actual2.insert(std::pair<std::string, std::string>(name, value)); |
| 1946 } | 1960 } |
| 1947 EXPECT_EQ(expected1, actual2); | 1961 EXPECT_EQ(expected1, actual2); |
| 1948 EXPECT_EQ(1u, conflicting_extensions.size()); | 1962 EXPECT_EQ(1u, warning_set.size()); |
| 1949 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1963 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1950 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1964 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1951 } | 1965 } |
| 1952 | 1966 |
| 1953 // Check that we do not delete too much | 1967 // Check that we do not delete too much |
| 1954 TEST(ExtensionWebRequestHelpersTest, | 1968 TEST(ExtensionWebRequestHelpersTest, |
| 1955 TestMergeOnHeadersReceivedResponsesDeletion) { | 1969 TestMergeOnHeadersReceivedResponsesDeletion) { |
| 1956 net::CapturingBoundNetLog capturing_net_log; | 1970 net::CapturingBoundNetLog capturing_net_log; |
| 1957 net::BoundNetLog net_log = capturing_net_log.bound(); | 1971 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1958 std::set<std::string> conflicting_extensions; | 1972 ExtensionWarningSet warning_set; |
| 1959 std::string header_value; | 1973 std::string header_value; |
| 1960 EventResponseDeltas deltas; | 1974 EventResponseDeltas deltas; |
| 1961 | 1975 |
| 1962 char base_headers_string[] = | 1976 char base_headers_string[] = |
| 1963 "HTTP/1.0 200 OK\r\n" | 1977 "HTTP/1.0 200 OK\r\n" |
| 1964 "Key1: Value1\r\n" | 1978 "Key1: Value1\r\n" |
| 1965 "Key1: Value2\r\n" | 1979 "Key1: Value2\r\n" |
| 1966 "Key1: Value3\r\n" | 1980 "Key1: Value3\r\n" |
| 1967 "Key2: Value4\r\n" | 1981 "Key2: Value4\r\n" |
| 1968 "\r\n"; | 1982 "\r\n"; |
| 1969 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1983 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1970 new net::HttpResponseHeaders( | 1984 new net::HttpResponseHeaders( |
| 1971 net::HttpUtil::AssembleRawHeaders( | 1985 net::HttpUtil::AssembleRawHeaders( |
| 1972 base_headers_string, sizeof(base_headers_string)))); | 1986 base_headers_string, sizeof(base_headers_string)))); |
| 1973 | 1987 |
| 1974 linked_ptr<EventResponseDelta> d1( | 1988 linked_ptr<EventResponseDelta> d1( |
| 1975 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1989 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1976 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | 1990 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); |
| 1977 deltas.push_back(d1); | 1991 deltas.push_back(d1); |
| 1978 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1992 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1979 MergeOnHeadersReceivedResponses( | 1993 MergeOnHeadersReceivedResponses( |
| 1980 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | 1994 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); |
| 1981 &net_log); | |
| 1982 ASSERT_TRUE(new_headers1.get()); | 1995 ASSERT_TRUE(new_headers1.get()); |
| 1983 std::multimap<std::string, std::string> expected1; | 1996 std::multimap<std::string, std::string> expected1; |
| 1984 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | 1997 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); |
| 1985 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | 1998 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); |
| 1986 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | 1999 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); |
| 1987 void* iter = NULL; | 2000 void* iter = NULL; |
| 1988 std::string name; | 2001 std::string name; |
| 1989 std::string value; | 2002 std::string value; |
| 1990 std::multimap<std::string, std::string> actual1; | 2003 std::multimap<std::string, std::string> actual1; |
| 1991 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 2004 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1992 actual1.insert(std::pair<std::string, std::string>(name, value)); | 2005 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1993 } | 2006 } |
| 1994 EXPECT_EQ(expected1, actual1); | 2007 EXPECT_EQ(expected1, actual1); |
| 1995 EXPECT_EQ(0u, conflicting_extensions.size()); | 2008 EXPECT_EQ(0u, warning_set.size()); |
| 1996 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2009 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1997 } | 2010 } |
| 1998 | 2011 |
| 1999 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 2012 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
| 2000 net::CapturingBoundNetLog capturing_net_log; | 2013 net::CapturingBoundNetLog capturing_net_log; |
| 2001 net::BoundNetLog net_log = capturing_net_log.bound(); | 2014 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 2002 std::set<std::string> conflicting_extensions; | 2015 ExtensionWarningSet warning_set; |
| 2003 EventResponseDeltas deltas; | 2016 EventResponseDeltas deltas; |
| 2004 string16 username = ASCIIToUTF16("foo"); | 2017 string16 username = ASCIIToUTF16("foo"); |
| 2005 string16 password = ASCIIToUTF16("bar"); | 2018 string16 password = ASCIIToUTF16("bar"); |
| 2006 string16 password2 = ASCIIToUTF16("baz"); | 2019 string16 password2 = ASCIIToUTF16("baz"); |
| 2007 | 2020 |
| 2008 // Check that we can handle if not returning credentials. | 2021 // Check that we can handle if not returning credentials. |
| 2009 linked_ptr<EventResponseDelta> d0( | 2022 linked_ptr<EventResponseDelta> d0( |
| 2010 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 2023 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 2011 deltas.push_back(d0); | 2024 deltas.push_back(d0); |
| 2012 net::AuthCredentials auth0; | 2025 net::AuthCredentials auth0; |
| 2013 bool credentials_set = MergeOnAuthRequiredResponses( | 2026 bool credentials_set = MergeOnAuthRequiredResponses( |
| 2014 deltas, &auth0, &conflicting_extensions, &net_log); | 2027 deltas, &auth0, &warning_set, &net_log); |
| 2015 EXPECT_FALSE(credentials_set); | 2028 EXPECT_FALSE(credentials_set); |
| 2016 EXPECT_TRUE(auth0.Empty()); | 2029 EXPECT_TRUE(auth0.Empty()); |
| 2017 EXPECT_EQ(0u, conflicting_extensions.size()); | 2030 EXPECT_EQ(0u, warning_set.size()); |
| 2018 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 2031 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 2019 | 2032 |
| 2020 // Check that we can set AuthCredentials. | 2033 // Check that we can set AuthCredentials. |
| 2021 linked_ptr<EventResponseDelta> d1( | 2034 linked_ptr<EventResponseDelta> d1( |
| 2022 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 2035 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 2023 d1->auth_credentials.reset(new net::AuthCredentials(username, password)); | 2036 d1->auth_credentials.reset(new net::AuthCredentials(username, password)); |
| 2024 deltas.push_back(d1); | 2037 deltas.push_back(d1); |
| 2025 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2038 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2026 conflicting_extensions.clear(); | 2039 warning_set.clear(); |
| 2027 capturing_net_log.Clear(); | 2040 capturing_net_log.Clear(); |
| 2028 net::AuthCredentials auth1; | 2041 net::AuthCredentials auth1; |
| 2029 credentials_set = MergeOnAuthRequiredResponses( | 2042 credentials_set = MergeOnAuthRequiredResponses( |
| 2030 deltas, &auth1, &conflicting_extensions, &net_log); | 2043 deltas, &auth1, &warning_set, &net_log); |
| 2031 EXPECT_TRUE(credentials_set); | 2044 EXPECT_TRUE(credentials_set); |
| 2032 EXPECT_FALSE(auth1.Empty()); | 2045 EXPECT_FALSE(auth1.Empty()); |
| 2033 EXPECT_EQ(username, auth1.username()); | 2046 EXPECT_EQ(username, auth1.username()); |
| 2034 EXPECT_EQ(password, auth1.password()); | 2047 EXPECT_EQ(password, auth1.password()); |
| 2035 EXPECT_EQ(0u, conflicting_extensions.size()); | 2048 EXPECT_EQ(0u, warning_set.size()); |
| 2036 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2049 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2037 | 2050 |
| 2038 // Check that we set AuthCredentials only once. | 2051 // Check that we set AuthCredentials only once. |
| 2039 linked_ptr<EventResponseDelta> d2( | 2052 linked_ptr<EventResponseDelta> d2( |
| 2040 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 2053 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 2041 d2->auth_credentials.reset(new net::AuthCredentials(username, password2)); | 2054 d2->auth_credentials.reset(new net::AuthCredentials(username, password2)); |
| 2042 deltas.push_back(d2); | 2055 deltas.push_back(d2); |
| 2043 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2056 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2044 conflicting_extensions.clear(); | 2057 warning_set.clear(); |
| 2045 capturing_net_log.Clear(); | 2058 capturing_net_log.Clear(); |
| 2046 net::AuthCredentials auth2; | 2059 net::AuthCredentials auth2; |
| 2047 credentials_set = MergeOnAuthRequiredResponses( | 2060 credentials_set = MergeOnAuthRequiredResponses( |
| 2048 deltas, &auth2, &conflicting_extensions, &net_log); | 2061 deltas, &auth2, &warning_set, &net_log); |
| 2049 EXPECT_TRUE(credentials_set); | 2062 EXPECT_TRUE(credentials_set); |
| 2050 EXPECT_FALSE(auth2.Empty()); | 2063 EXPECT_FALSE(auth2.Empty()); |
| 2051 EXPECT_EQ(username, auth1.username()); | 2064 EXPECT_EQ(username, auth1.username()); |
| 2052 EXPECT_EQ(password, auth1.password()); | 2065 EXPECT_EQ(password, auth1.password()); |
| 2053 EXPECT_EQ(1u, conflicting_extensions.size()); | 2066 EXPECT_EQ(1u, warning_set.size()); |
| 2054 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 2067 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2055 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 2068 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 2056 | 2069 |
| 2057 // Check that we can set identical AuthCredentials twice without causing | 2070 // Check that we can set identical AuthCredentials twice without causing |
| 2058 // a conflict. | 2071 // a conflict. |
| 2059 linked_ptr<EventResponseDelta> d3( | 2072 linked_ptr<EventResponseDelta> d3( |
| 2060 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 2073 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 2061 d3->auth_credentials.reset(new net::AuthCredentials(username, password)); | 2074 d3->auth_credentials.reset(new net::AuthCredentials(username, password)); |
| 2062 deltas.push_back(d3); | 2075 deltas.push_back(d3); |
| 2063 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2076 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2064 conflicting_extensions.clear(); | 2077 warning_set.clear(); |
| 2065 capturing_net_log.Clear(); | 2078 capturing_net_log.Clear(); |
| 2066 net::AuthCredentials auth3; | 2079 net::AuthCredentials auth3; |
| 2067 credentials_set = MergeOnAuthRequiredResponses( | 2080 credentials_set = MergeOnAuthRequiredResponses( |
| 2068 deltas, &auth3, &conflicting_extensions, &net_log); | 2081 deltas, &auth3, &warning_set, &net_log); |
| 2069 EXPECT_TRUE(credentials_set); | 2082 EXPECT_TRUE(credentials_set); |
| 2070 EXPECT_FALSE(auth3.Empty()); | 2083 EXPECT_FALSE(auth3.Empty()); |
| 2071 EXPECT_EQ(username, auth1.username()); | 2084 EXPECT_EQ(username, auth1.username()); |
| 2072 EXPECT_EQ(password, auth1.password()); | 2085 EXPECT_EQ(password, auth1.password()); |
| 2073 EXPECT_EQ(1u, conflicting_extensions.size()); | 2086 EXPECT_EQ(1u, warning_set.size()); |
| 2074 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 2087 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2075 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 2088 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 2076 } | 2089 } |
| 2090 |
| 2091 } // namespace extensions |
| OLD | NEW |