| 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_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/json/json_string_value_serializer.h" | 11 #include "base/json/json_string_value_serializer.h" |
| 12 #include "base/memory/weak_ptr.h" | 12 #include "base/memory/weak_ptr.h" |
| 13 #include "base/message_loop.h" | 13 #include "base/message_loop.h" |
| 14 #include "base/path_service.h" | 14 #include "base/path_service.h" |
| 15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 16 #include "base/utf_string_conversions.h" | 16 #include "base/utf_string_conversions.h" |
| 17 #include "chrome/browser/api/prefs/pref_member.h" | 17 #include "chrome/browser/api/prefs/pref_member.h" |
| 18 #include "chrome/browser/content_settings/cookie_settings.h" | 18 #include "chrome/browser/content_settings/cookie_settings.h" |
| 19 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 19 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| 20 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" | 20 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" |
| 21 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" | 21 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
| 22 #include "chrome/browser/extensions/event_router_forwarder.h" | 22 #include "chrome/browser/extensions/event_router_forwarder.h" |
| 23 #include "chrome/browser/extensions/extension_warning_set.h" |
| 23 #include "chrome/browser/net/chrome_network_delegate.h" | 24 #include "chrome/browser/net/chrome_network_delegate.h" |
| 24 #include "chrome/common/extensions/extension_messages.h" | 25 #include "chrome/common/extensions/extension_messages.h" |
| 25 #include "chrome/common/pref_names.h" | 26 #include "chrome/common/pref_names.h" |
| 26 #include "chrome/test/base/testing_browser_process.h" | 27 #include "chrome/test/base/testing_browser_process.h" |
| 27 #include "chrome/test/base/testing_pref_service.h" | 28 #include "chrome/test/base/testing_pref_service.h" |
| 28 #include "chrome/test/base/testing_profile.h" | 29 #include "chrome/test/base/testing_profile.h" |
| 29 #include "content/public/test/test_browser_thread.h" | 30 #include "content/public/test/test_browser_thread.h" |
| 30 #include "net/base/auth.h" | 31 #include "net/base/auth.h" |
| 31 #include "net/base/capturing_net_log.h" | 32 #include "net/base/capturing_net_log.h" |
| 32 #include "net/base/mock_host_resolver.h" | 33 #include "net/base/mock_host_resolver.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 47 using helpers::EventResponseDeltas; | 48 using helpers::EventResponseDeltas; |
| 48 using helpers::InDecreasingExtensionInstallationTimeOrder; | 49 using helpers::InDecreasingExtensionInstallationTimeOrder; |
| 49 using helpers::MergeCancelOfResponses; | 50 using helpers::MergeCancelOfResponses; |
| 50 using helpers::MergeOnBeforeRequestResponses; | 51 using helpers::MergeOnBeforeRequestResponses; |
| 51 using helpers::RequestCookieModification; | 52 using helpers::RequestCookieModification; |
| 52 using helpers::ResponseCookieModification; | 53 using helpers::ResponseCookieModification; |
| 53 using helpers::ResponseHeader; | 54 using helpers::ResponseHeader; |
| 54 using helpers::ResponseHeaders; | 55 using helpers::ResponseHeaders; |
| 55 using helpers::StringToCharList; | 56 using helpers::StringToCharList; |
| 56 | 57 |
| 58 namespace extensions { |
| 59 |
| 57 namespace { | 60 namespace { |
| 58 static void EventHandledOnIOThread( | 61 static void EventHandledOnIOThread( |
| 59 void* profile, | 62 void* profile, |
| 60 const std::string& extension_id, | 63 const std::string& extension_id, |
| 61 const std::string& event_name, | 64 const std::string& event_name, |
| 62 const std::string& sub_event_name, | 65 const std::string& sub_event_name, |
| 63 uint64 request_id, | 66 uint64 request_id, |
| 64 ExtensionWebRequestEventRouter::EventResponse* response) { | 67 ExtensionWebRequestEventRouter::EventResponse* response) { |
| 65 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 68 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 66 profile, extension_id, event_name, sub_event_name, request_id, | 69 profile, extension_id, event_name, sub_event_name, request_id, |
| 67 response); | 70 response); |
| 68 } | 71 } |
| 69 | 72 |
| 70 // Searches |key| in |collection| by iterating over its elements and returns | 73 // Searches |key| in |collection| by iterating over its elements and returns |
| 71 // true if found. | 74 // true if found. |
| 72 template <typename Collection, typename Key> | 75 template <typename Collection, typename Key> |
| 73 bool Contains(const Collection& collection, const Key& key) { | 76 bool Contains(const Collection& collection, const Key& key) { |
| 74 return std::find(collection.begin(), collection.end(), key) != | 77 return std::find(collection.begin(), collection.end(), key) != |
| 75 collection.end(); | 78 collection.end(); |
| 76 } | 79 } |
| 77 | 80 |
| 81 // Returns whether |warnings| contains an extension for |extension_id|. |
| 82 bool HasWarning(const ExtensionWarningSet& warnings, |
| 83 const std::string& extension_id) { |
| 84 for (ExtensionWarningSet::const_iterator i = warnings.begin(); |
| 85 i != warnings.end(); ++i) { |
| 86 if (i->extension_id() == extension_id) |
| 87 return true; |
| 88 } |
| 89 return false; |
| 90 } |
| 91 |
| 78 } // namespace | 92 } // namespace |
| 79 | 93 |
| 80 // A mock event router that responds to events with a pre-arranged queue of | 94 // A mock event router that responds to events with a pre-arranged queue of |
| 81 // Tasks. | 95 // Tasks. |
| 82 class TestIPCSender : public IPC::Sender { | 96 class TestIPCSender : public IPC::Sender { |
| 83 public: | 97 public: |
| 84 typedef std::list<linked_ptr<IPC::Message> > SentMessages; | 98 typedef std::list<linked_ptr<IPC::Message> > SentMessages; |
| 85 | 99 |
| 86 // Adds a Task to the queue. We will fire these in order as events are | 100 // Adds a Task to the queue. We will fire these in order as events are |
| 87 // dispatched. | 101 // dispatched. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 117 }; | 131 }; |
| 118 | 132 |
| 119 class ExtensionWebRequestTest : public testing::Test { | 133 class ExtensionWebRequestTest : public testing::Test { |
| 120 public: | 134 public: |
| 121 ExtensionWebRequestTest() | 135 ExtensionWebRequestTest() |
| 122 : ui_thread_(content::BrowserThread::UI, &message_loop_), | 136 : ui_thread_(content::BrowserThread::UI, &message_loop_), |
| 123 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 137 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
| 124 | 138 |
| 125 protected: | 139 protected: |
| 126 virtual void SetUp() OVERRIDE { | 140 virtual void SetUp() OVERRIDE { |
| 127 event_router_ = new extensions::EventRouterForwarder(); | 141 event_router_ = new EventRouterForwarder(); |
| 128 enable_referrers_.Init( | 142 enable_referrers_.Init( |
| 129 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 143 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
| 130 network_delegate_.reset(new ChromeNetworkDelegate( | 144 network_delegate_.reset(new ChromeNetworkDelegate( |
| 131 event_router_.get(), NULL, NULL, NULL, &profile_, | 145 event_router_.get(), NULL, NULL, NULL, &profile_, |
| 132 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, | 146 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, |
| 133 NULL)); | 147 NULL)); |
| 134 context_.reset(new TestURLRequestContext(true)); | 148 context_.reset(new TestURLRequestContext(true)); |
| 135 context_->set_network_delegate(network_delegate_.get()); | 149 context_->set_network_delegate(network_delegate_.get()); |
| 136 context_->Init(); | 150 context_->Init(); |
| 137 } | 151 } |
| 138 | 152 |
| 139 MessageLoopForIO message_loop_; | 153 MessageLoopForIO message_loop_; |
| 140 content::TestBrowserThread ui_thread_; | 154 content::TestBrowserThread ui_thread_; |
| 141 content::TestBrowserThread io_thread_; | 155 content::TestBrowserThread io_thread_; |
| 142 TestingProfile profile_; | 156 TestingProfile profile_; |
| 143 TestDelegate delegate_; | 157 TestDelegate delegate_; |
| 144 BooleanPrefMember enable_referrers_; | 158 BooleanPrefMember enable_referrers_; |
| 145 TestIPCSender ipc_sender_; | 159 TestIPCSender ipc_sender_; |
| 146 scoped_refptr<extensions::EventRouterForwarder> event_router_; | 160 scoped_refptr<EventRouterForwarder> event_router_; |
| 147 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 161 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
| 148 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 162 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
| 149 scoped_ptr<TestURLRequestContext> context_; | 163 scoped_ptr<TestURLRequestContext> context_; |
| 150 }; | 164 }; |
| 151 | 165 |
| 152 // Tests that we handle disagreements among extensions about responses to | 166 // Tests that we handle disagreements among extensions about responses to |
| 153 // blocking events (redirection) by choosing the response from the | 167 // blocking events (redirection) by choosing the response from the |
| 154 // most-recently-installed extension. | 168 // most-recently-installed extension. |
| 155 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { | 169 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { |
| 156 std::string extension1_id("1"); | 170 std::string extension1_id("1"); |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 | 446 |
| 433 class ExtensionWebRequestHeaderModificationTest : | 447 class ExtensionWebRequestHeaderModificationTest : |
| 434 public testing::TestWithParam<HeaderModificationTest> { | 448 public testing::TestWithParam<HeaderModificationTest> { |
| 435 public: | 449 public: |
| 436 ExtensionWebRequestHeaderModificationTest() | 450 ExtensionWebRequestHeaderModificationTest() |
| 437 : ui_thread_(content::BrowserThread::UI, &message_loop_), | 451 : ui_thread_(content::BrowserThread::UI, &message_loop_), |
| 438 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 452 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
| 439 | 453 |
| 440 protected: | 454 protected: |
| 441 virtual void SetUp() { | 455 virtual void SetUp() { |
| 442 event_router_ = new extensions::EventRouterForwarder(); | 456 event_router_ = new EventRouterForwarder(); |
| 443 enable_referrers_.Init( | 457 enable_referrers_.Init( |
| 444 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 458 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
| 445 network_delegate_.reset(new ChromeNetworkDelegate( | 459 network_delegate_.reset(new ChromeNetworkDelegate( |
| 446 event_router_.get(), NULL, NULL, NULL, &profile_, | 460 event_router_.get(), NULL, NULL, NULL, &profile_, |
| 447 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, | 461 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, |
| 448 NULL)); | 462 NULL)); |
| 449 context_.reset(new TestURLRequestContext(true)); | 463 context_.reset(new TestURLRequestContext(true)); |
| 450 host_resolver_.reset(new net::MockHostResolver()); | 464 host_resolver_.reset(new net::MockHostResolver()); |
| 451 host_resolver_->rules()->AddSimulatedFailure("doesnotexist"); | 465 host_resolver_->rules()->AddSimulatedFailure("doesnotexist"); |
| 452 context_->set_host_resolver(host_resolver_.get()); | 466 context_->set_host_resolver(host_resolver_.get()); |
| 453 context_->set_network_delegate(network_delegate_.get()); | 467 context_->set_network_delegate(network_delegate_.get()); |
| 454 context_->Init(); | 468 context_->Init(); |
| 455 } | 469 } |
| 456 | 470 |
| 457 MessageLoopForIO message_loop_; | 471 MessageLoopForIO message_loop_; |
| 458 content::TestBrowserThread ui_thread_; | 472 content::TestBrowserThread ui_thread_; |
| 459 content::TestBrowserThread io_thread_; | 473 content::TestBrowserThread io_thread_; |
| 460 TestingProfile profile_; | 474 TestingProfile profile_; |
| 461 TestDelegate delegate_; | 475 TestDelegate delegate_; |
| 462 BooleanPrefMember enable_referrers_; | 476 BooleanPrefMember enable_referrers_; |
| 463 TestIPCSender ipc_sender_; | 477 TestIPCSender ipc_sender_; |
| 464 scoped_refptr<extensions::EventRouterForwarder> event_router_; | 478 scoped_refptr<EventRouterForwarder> event_router_; |
| 465 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 479 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
| 466 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 480 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
| 467 scoped_ptr<net::MockHostResolver> host_resolver_; | 481 scoped_ptr<net::MockHostResolver> host_resolver_; |
| 468 scoped_ptr<TestURLRequestContext> context_; | 482 scoped_ptr<TestURLRequestContext> context_; |
| 469 }; | 483 }; |
| 470 | 484 |
| 471 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { | 485 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { |
| 472 std::string extension1_id("1"); | 486 std::string extension1_id("1"); |
| 473 std::string extension2_id("2"); | 487 std::string extension2_id("2"); |
| 474 std::string extension3_id("3"); | 488 std::string extension3_id("3"); |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 EXPECT_TRUE(delta->cancel); | 960 EXPECT_TRUE(delta->cancel); |
| 947 EXPECT_EQ(2u, delta->added_response_headers.size()); | 961 EXPECT_EQ(2u, delta->added_response_headers.size()); |
| 948 EXPECT_TRUE(Contains(delta->added_response_headers, | 962 EXPECT_TRUE(Contains(delta->added_response_headers, |
| 949 ResponseHeader("Key2", "Value1"))); | 963 ResponseHeader("Key2", "Value1"))); |
| 950 EXPECT_TRUE(Contains(delta->added_response_headers, | 964 EXPECT_TRUE(Contains(delta->added_response_headers, |
| 951 ResponseHeader("Key4", "Value4"))); | 965 ResponseHeader("Key4", "Value4"))); |
| 952 EXPECT_EQ(2u, delta->deleted_response_headers.size()); | 966 EXPECT_EQ(2u, delta->deleted_response_headers.size()); |
| 953 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 967 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
| 954 ResponseHeader("Key2", "Value2, Bar"))); | 968 ResponseHeader("Key2", "Value2, Bar"))); |
| 955 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 969 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
| 956 ResponseHeader("Key3", "Value3"))); | 970 ResponseHeader("Key3", "Value3"))); |
| 957 } | 971 } |
| 958 | 972 |
| 959 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { | 973 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { |
| 960 const bool cancel = true; | 974 const bool cancel = true; |
| 961 | 975 |
| 962 string16 username = ASCIIToUTF16("foo"); | 976 string16 username = ASCIIToUTF16("foo"); |
| 963 string16 password = ASCIIToUTF16("bar"); | 977 string16 password = ASCIIToUTF16("bar"); |
| 964 scoped_ptr<net::AuthCredentials> credentials( | 978 scoped_ptr<net::AuthCredentials> credentials( |
| 965 new net::AuthCredentials(username, password)); | 979 new net::AuthCredentials(username, password)); |
| 966 | 980 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 997 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1011 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 998 MergeCancelOfResponses(deltas, &canceled, &net_log); | 1012 MergeCancelOfResponses(deltas, &canceled, &net_log); |
| 999 EXPECT_TRUE(canceled); | 1013 EXPECT_TRUE(canceled); |
| 1000 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1014 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1001 } | 1015 } |
| 1002 | 1016 |
| 1003 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) { | 1017 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) { |
| 1004 EventResponseDeltas deltas; | 1018 EventResponseDeltas deltas; |
| 1005 net::CapturingBoundNetLog capturing_net_log; | 1019 net::CapturingBoundNetLog capturing_net_log; |
| 1006 net::BoundNetLog net_log = capturing_net_log.bound(); | 1020 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1007 std::set<std::string> conflicting_extensions; | 1021 ExtensionWarningSet warning_set; |
| 1008 GURL effective_new_url; | 1022 GURL effective_new_url; |
| 1009 | 1023 |
| 1010 // No redirect | 1024 // No redirect |
| 1011 linked_ptr<EventResponseDelta> d0( | 1025 linked_ptr<EventResponseDelta> d0( |
| 1012 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); | 1026 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); |
| 1013 deltas.push_back(d0); | 1027 deltas.push_back(d0); |
| 1014 MergeOnBeforeRequestResponses( | 1028 MergeOnBeforeRequestResponses( |
| 1015 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1029 deltas, &effective_new_url, &warning_set, &net_log); |
| 1016 EXPECT_TRUE(effective_new_url.is_empty()); | 1030 EXPECT_TRUE(effective_new_url.is_empty()); |
| 1017 | 1031 |
| 1018 // Single redirect. | 1032 // Single redirect. |
| 1019 GURL new_url_1("http://foo.com"); | 1033 GURL new_url_1("http://foo.com"); |
| 1020 linked_ptr<EventResponseDelta> d1( | 1034 linked_ptr<EventResponseDelta> d1( |
| 1021 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); | 1035 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); |
| 1022 d1->new_url = GURL(new_url_1); | 1036 d1->new_url = GURL(new_url_1); |
| 1023 deltas.push_back(d1); | 1037 deltas.push_back(d1); |
| 1024 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1038 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1025 capturing_net_log.Clear(); | 1039 capturing_net_log.Clear(); |
| 1026 MergeOnBeforeRequestResponses( | 1040 MergeOnBeforeRequestResponses( |
| 1027 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1041 deltas, &effective_new_url, &warning_set, &net_log); |
| 1028 EXPECT_EQ(new_url_1, effective_new_url); | 1042 EXPECT_EQ(new_url_1, effective_new_url); |
| 1029 EXPECT_TRUE(conflicting_extensions.empty()); | 1043 EXPECT_TRUE(warning_set.empty()); |
| 1030 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1044 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1031 | 1045 |
| 1032 // Ignored redirect (due to precedence). | 1046 // Ignored redirect (due to precedence). |
| 1033 GURL new_url_2("http://bar.com"); | 1047 GURL new_url_2("http://bar.com"); |
| 1034 linked_ptr<EventResponseDelta> d2( | 1048 linked_ptr<EventResponseDelta> d2( |
| 1035 new EventResponseDelta("extid2", base::Time::FromInternalValue(500))); | 1049 new EventResponseDelta("extid2", base::Time::FromInternalValue(500))); |
| 1036 d2->new_url = GURL(new_url_2); | 1050 d2->new_url = GURL(new_url_2); |
| 1037 deltas.push_back(d2); | 1051 deltas.push_back(d2); |
| 1038 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1052 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1053 warning_set.clear(); |
| 1039 capturing_net_log.Clear(); | 1054 capturing_net_log.Clear(); |
| 1040 MergeOnBeforeRequestResponses( | 1055 MergeOnBeforeRequestResponses( |
| 1041 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1056 deltas, &effective_new_url, &warning_set, &net_log); |
| 1042 EXPECT_EQ(new_url_1, effective_new_url); | 1057 EXPECT_EQ(new_url_1, effective_new_url); |
| 1043 EXPECT_EQ(1u, conflicting_extensions.size()); | 1058 EXPECT_EQ(1u, warning_set.size()); |
| 1044 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1059 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1045 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1060 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1046 | 1061 |
| 1047 // Overriding redirect. | 1062 // Overriding redirect. |
| 1048 GURL new_url_3("http://baz.com"); | 1063 GURL new_url_3("http://baz.com"); |
| 1049 linked_ptr<EventResponseDelta> d3( | 1064 linked_ptr<EventResponseDelta> d3( |
| 1050 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500))); | 1065 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500))); |
| 1051 d3->new_url = GURL(new_url_3); | 1066 d3->new_url = GURL(new_url_3); |
| 1052 deltas.push_back(d3); | 1067 deltas.push_back(d3); |
| 1053 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1068 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1054 conflicting_extensions.clear(); | 1069 warning_set.clear(); |
| 1055 capturing_net_log.Clear(); | 1070 capturing_net_log.Clear(); |
| 1056 MergeOnBeforeRequestResponses( | 1071 MergeOnBeforeRequestResponses( |
| 1057 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1072 deltas, &effective_new_url, &warning_set, &net_log); |
| 1058 EXPECT_EQ(new_url_3, effective_new_url); | 1073 EXPECT_EQ(new_url_3, effective_new_url); |
| 1059 EXPECT_EQ(2u, conflicting_extensions.size()); | 1074 EXPECT_EQ(2u, warning_set.size()); |
| 1060 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1")); | 1075 EXPECT_TRUE(HasWarning(warning_set, "extid1")); |
| 1061 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1076 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1062 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1077 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1063 | 1078 |
| 1064 // Check that identical redirects don't cause a conflict. | 1079 // Check that identical redirects don't cause a conflict. |
| 1065 linked_ptr<EventResponseDelta> d4( | 1080 linked_ptr<EventResponseDelta> d4( |
| 1066 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000))); | 1081 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000))); |
| 1067 d4->new_url = GURL(new_url_3); | 1082 d4->new_url = GURL(new_url_3); |
| 1068 deltas.push_back(d4); | 1083 deltas.push_back(d4); |
| 1069 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1084 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1070 conflicting_extensions.clear(); | 1085 warning_set.clear(); |
| 1071 capturing_net_log.Clear(); | 1086 capturing_net_log.Clear(); |
| 1072 MergeOnBeforeRequestResponses( | 1087 MergeOnBeforeRequestResponses( |
| 1073 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1088 deltas, &effective_new_url, &warning_set, &net_log); |
| 1074 EXPECT_EQ(new_url_3, effective_new_url); | 1089 EXPECT_EQ(new_url_3, effective_new_url); |
| 1075 EXPECT_EQ(2u, conflicting_extensions.size()); | 1090 EXPECT_EQ(2u, warning_set.size()); |
| 1076 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1")); | 1091 EXPECT_TRUE(HasWarning(warning_set, "extid1")); |
| 1077 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1092 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1078 EXPECT_EQ(4u, capturing_net_log.GetSize()); | 1093 EXPECT_EQ(4u, capturing_net_log.GetSize()); |
| 1079 } | 1094 } |
| 1080 | 1095 |
| 1081 // This tests that we can redirect to data:// urls, which is considered | 1096 // This tests that we can redirect to data:// urls, which is considered |
| 1082 // a kind of cancelling requests. | 1097 // a kind of cancelling requests. |
| 1083 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses2) { | 1098 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses2) { |
| 1084 EventResponseDeltas deltas; | 1099 EventResponseDeltas deltas; |
| 1085 net::CapturingBoundNetLog capturing_net_log; | 1100 net::CapturingBoundNetLog capturing_net_log; |
| 1086 net::BoundNetLog net_log = capturing_net_log.bound(); | 1101 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1087 std::set<std::string> conflicting_extensions; | 1102 ExtensionWarningSet warning_set; |
| 1088 GURL effective_new_url; | 1103 GURL effective_new_url; |
| 1089 | 1104 |
| 1090 // Single redirect. | 1105 // Single redirect. |
| 1091 GURL new_url_0("http://foo.com"); | 1106 GURL new_url_0("http://foo.com"); |
| 1092 linked_ptr<EventResponseDelta> d0( | 1107 linked_ptr<EventResponseDelta> d0( |
| 1093 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); | 1108 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); |
| 1094 d0->new_url = GURL(new_url_0); | 1109 d0->new_url = GURL(new_url_0); |
| 1095 deltas.push_back(d0); | 1110 deltas.push_back(d0); |
| 1096 MergeOnBeforeRequestResponses( | 1111 MergeOnBeforeRequestResponses( |
| 1097 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1112 deltas, &effective_new_url, &warning_set, &net_log); |
| 1098 EXPECT_EQ(new_url_0, effective_new_url); | 1113 EXPECT_EQ(new_url_0, effective_new_url); |
| 1099 | 1114 |
| 1100 // Cancel request by redirecting to a data:// URL. This shall override | 1115 // Cancel request by redirecting to a data:// URL. This shall override |
| 1101 // the other redirect but not cause any conflict warnings. | 1116 // the other redirect but not cause any conflict warnings. |
| 1102 GURL new_url_1("data://foo"); | 1117 GURL new_url_1("data://foo"); |
| 1103 linked_ptr<EventResponseDelta> d1( | 1118 linked_ptr<EventResponseDelta> d1( |
| 1104 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); | 1119 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); |
| 1105 d1->new_url = GURL(new_url_1); | 1120 d1->new_url = GURL(new_url_1); |
| 1106 deltas.push_back(d1); | 1121 deltas.push_back(d1); |
| 1107 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1122 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1123 warning_set.clear(); |
| 1108 capturing_net_log.Clear(); | 1124 capturing_net_log.Clear(); |
| 1109 MergeOnBeforeRequestResponses( | 1125 MergeOnBeforeRequestResponses( |
| 1110 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1126 deltas, &effective_new_url, &warning_set, &net_log); |
| 1111 EXPECT_EQ(new_url_1, effective_new_url); | 1127 EXPECT_EQ(new_url_1, effective_new_url); |
| 1112 EXPECT_TRUE(conflicting_extensions.empty()); | 1128 EXPECT_TRUE(warning_set.empty()); |
| 1113 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1129 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1114 | 1130 |
| 1115 // Cancel request by redirecting to the same data:// URL. This shall | 1131 // Cancel request by redirecting to the same data:// URL. This shall |
| 1116 // not create any conflicts as it is in line with d1. | 1132 // not create any conflicts as it is in line with d1. |
| 1117 GURL new_url_2("data://foo"); | 1133 GURL new_url_2("data://foo"); |
| 1118 linked_ptr<EventResponseDelta> d2( | 1134 linked_ptr<EventResponseDelta> d2( |
| 1119 new EventResponseDelta("extid2", base::Time::FromInternalValue(1000))); | 1135 new EventResponseDelta("extid2", base::Time::FromInternalValue(1000))); |
| 1120 d2->new_url = GURL(new_url_2); | 1136 d2->new_url = GURL(new_url_2); |
| 1121 deltas.push_back(d2); | 1137 deltas.push_back(d2); |
| 1122 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1138 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1139 warning_set.clear(); |
| 1123 capturing_net_log.Clear(); | 1140 capturing_net_log.Clear(); |
| 1124 MergeOnBeforeRequestResponses( | 1141 MergeOnBeforeRequestResponses( |
| 1125 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1142 deltas, &effective_new_url, &warning_set, &net_log); |
| 1126 EXPECT_EQ(new_url_1, effective_new_url); | 1143 EXPECT_EQ(new_url_1, effective_new_url); |
| 1127 EXPECT_TRUE(conflicting_extensions.empty()); | 1144 EXPECT_TRUE(warning_set.empty()); |
| 1128 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1145 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1129 | 1146 |
| 1130 // Cancel redirect by redirecting to a different data:// URL. This needs | 1147 // Cancel redirect by redirecting to a different data:// URL. This needs |
| 1131 // to create a conflict. | 1148 // to create a conflict. |
| 1132 GURL new_url_3("data://something_totally_different"); | 1149 GURL new_url_3("data://something_totally_different"); |
| 1133 linked_ptr<EventResponseDelta> d3( | 1150 linked_ptr<EventResponseDelta> d3( |
| 1134 new EventResponseDelta("extid3", base::Time::FromInternalValue(500))); | 1151 new EventResponseDelta("extid3", base::Time::FromInternalValue(500))); |
| 1135 d3->new_url = GURL(new_url_3); | 1152 d3->new_url = GURL(new_url_3); |
| 1136 deltas.push_back(d3); | 1153 deltas.push_back(d3); |
| 1137 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1154 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1155 warning_set.clear(); |
| 1138 capturing_net_log.Clear(); | 1156 capturing_net_log.Clear(); |
| 1139 MergeOnBeforeRequestResponses( | 1157 MergeOnBeforeRequestResponses( |
| 1140 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1158 deltas, &effective_new_url, &warning_set, &net_log); |
| 1141 EXPECT_EQ(new_url_1, effective_new_url); | 1159 EXPECT_EQ(new_url_1, effective_new_url); |
| 1142 EXPECT_EQ(1u, conflicting_extensions.size()); | 1160 EXPECT_EQ(1u, warning_set.size()); |
| 1143 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid3")); | 1161 EXPECT_TRUE(HasWarning(warning_set, "extid3")); |
| 1144 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1162 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1145 } | 1163 } |
| 1146 | 1164 |
| 1147 // This tests that we can redirect to about:blank, which is considered | 1165 // This tests that we can redirect to about:blank, which is considered |
| 1148 // a kind of cancelling requests. | 1166 // a kind of cancelling requests. |
| 1149 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses3) { | 1167 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses3) { |
| 1150 EventResponseDeltas deltas; | 1168 EventResponseDeltas deltas; |
| 1151 net::CapturingBoundNetLog capturing_net_log; | 1169 net::CapturingBoundNetLog capturing_net_log; |
| 1152 net::BoundNetLog net_log = capturing_net_log.bound(); | 1170 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1153 std::set<std::string> conflicting_extensions; | 1171 ExtensionWarningSet warning_set; |
| 1154 GURL effective_new_url; | 1172 GURL effective_new_url; |
| 1155 | 1173 |
| 1156 // Single redirect. | 1174 // Single redirect. |
| 1157 GURL new_url_0("http://foo.com"); | 1175 GURL new_url_0("http://foo.com"); |
| 1158 linked_ptr<EventResponseDelta> d0( | 1176 linked_ptr<EventResponseDelta> d0( |
| 1159 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); | 1177 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); |
| 1160 d0->new_url = GURL(new_url_0); | 1178 d0->new_url = GURL(new_url_0); |
| 1161 deltas.push_back(d0); | 1179 deltas.push_back(d0); |
| 1162 MergeOnBeforeRequestResponses( | 1180 MergeOnBeforeRequestResponses( |
| 1163 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1181 deltas, &effective_new_url, &warning_set, &net_log); |
| 1164 EXPECT_EQ(new_url_0, effective_new_url); | 1182 EXPECT_EQ(new_url_0, effective_new_url); |
| 1165 | 1183 |
| 1166 // Cancel request by redirecting to about:blank. This shall override | 1184 // Cancel request by redirecting to about:blank. This shall override |
| 1167 // the other redirect but not cause any conflict warnings. | 1185 // the other redirect but not cause any conflict warnings. |
| 1168 GURL new_url_1("about:blank"); | 1186 GURL new_url_1("about:blank"); |
| 1169 linked_ptr<EventResponseDelta> d1( | 1187 linked_ptr<EventResponseDelta> d1( |
| 1170 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); | 1188 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); |
| 1171 d1->new_url = GURL(new_url_1); | 1189 d1->new_url = GURL(new_url_1); |
| 1172 deltas.push_back(d1); | 1190 deltas.push_back(d1); |
| 1173 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1191 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1192 warning_set.clear(); |
| 1174 capturing_net_log.Clear(); | 1193 capturing_net_log.Clear(); |
| 1175 MergeOnBeforeRequestResponses( | 1194 MergeOnBeforeRequestResponses( |
| 1176 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1195 deltas, &effective_new_url, &warning_set, &net_log); |
| 1177 EXPECT_EQ(new_url_1, effective_new_url); | 1196 EXPECT_EQ(new_url_1, effective_new_url); |
| 1178 EXPECT_TRUE(conflicting_extensions.empty()); | 1197 EXPECT_TRUE(warning_set.empty()); |
| 1179 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1198 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1180 } | 1199 } |
| 1181 | 1200 |
| 1182 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { | 1201 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { |
| 1183 net::HttpRequestHeaders base_headers; | 1202 net::HttpRequestHeaders base_headers; |
| 1184 base_headers.AddHeaderFromString("key1: value 1"); | 1203 base_headers.AddHeaderFromString("key1: value 1"); |
| 1185 base_headers.AddHeaderFromString("key2: value 2"); | 1204 base_headers.AddHeaderFromString("key2: value 2"); |
| 1186 net::CapturingBoundNetLog capturing_net_log; | 1205 net::CapturingBoundNetLog capturing_net_log; |
| 1187 net::BoundNetLog net_log = capturing_net_log.bound(); | 1206 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1188 std::set<std::string> conflicting_extensions; | 1207 ExtensionWarningSet warning_set; |
| 1189 std::string header_value; | 1208 std::string header_value; |
| 1190 EventResponseDeltas deltas; | 1209 EventResponseDeltas deltas; |
| 1191 | 1210 |
| 1192 // Check that we can handle not changing the headers. | 1211 // Check that we can handle not changing the headers. |
| 1193 linked_ptr<EventResponseDelta> d0( | 1212 linked_ptr<EventResponseDelta> d0( |
| 1194 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); | 1213 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); |
| 1195 deltas.push_back(d0); | 1214 deltas.push_back(d0); |
| 1196 net::HttpRequestHeaders headers0; | 1215 net::HttpRequestHeaders headers0; |
| 1197 headers0.MergeFrom(base_headers); | 1216 headers0.MergeFrom(base_headers); |
| 1198 MergeOnBeforeSendHeadersResponses( | 1217 MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log); |
| 1199 deltas, &headers0, &conflicting_extensions, &net_log); | |
| 1200 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); | 1218 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); |
| 1201 EXPECT_EQ("value 1", header_value); | 1219 EXPECT_EQ("value 1", header_value); |
| 1202 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); | 1220 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); |
| 1203 EXPECT_EQ("value 2", header_value); | 1221 EXPECT_EQ("value 2", header_value); |
| 1204 EXPECT_EQ(0u, conflicting_extensions.size()); | 1222 EXPECT_EQ(0u, warning_set.size()); |
| 1205 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1223 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1206 | 1224 |
| 1207 // Delete, modify and add a header. | 1225 // Delete, modify and add a header. |
| 1208 linked_ptr<EventResponseDelta> d1( | 1226 linked_ptr<EventResponseDelta> d1( |
| 1209 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1227 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1210 d1->deleted_request_headers.push_back("key1"); | 1228 d1->deleted_request_headers.push_back("key1"); |
| 1211 d1->modified_request_headers.AddHeaderFromString("key2: value 3"); | 1229 d1->modified_request_headers.AddHeaderFromString("key2: value 3"); |
| 1212 d1->modified_request_headers.AddHeaderFromString("key3: value 3"); | 1230 d1->modified_request_headers.AddHeaderFromString("key3: value 3"); |
| 1213 deltas.push_back(d1); | 1231 deltas.push_back(d1); |
| 1214 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1232 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1233 warning_set.clear(); |
| 1234 capturing_net_log.Clear(); |
| 1215 net::HttpRequestHeaders headers1; | 1235 net::HttpRequestHeaders headers1; |
| 1216 headers1.MergeFrom(base_headers); | 1236 headers1.MergeFrom(base_headers); |
| 1217 MergeOnBeforeSendHeadersResponses( | 1237 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); |
| 1218 deltas, &headers1, &conflicting_extensions, &net_log); | |
| 1219 EXPECT_FALSE(headers1.HasHeader("key1")); | 1238 EXPECT_FALSE(headers1.HasHeader("key1")); |
| 1220 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); | 1239 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); |
| 1221 EXPECT_EQ("value 3", header_value); | 1240 EXPECT_EQ("value 3", header_value); |
| 1222 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); | 1241 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); |
| 1223 EXPECT_EQ("value 3", header_value); | 1242 EXPECT_EQ("value 3", header_value); |
| 1224 EXPECT_EQ(0u, conflicting_extensions.size()); | 1243 EXPECT_EQ(0u, warning_set.size()); |
| 1225 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1244 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1226 | 1245 |
| 1227 // Check that conflicts are atomic, i.e. if one header modification | 1246 // Check that conflicts are atomic, i.e. if one header modification |
| 1228 // collides all other conflicts of the same extension are declined as well. | 1247 // collides all other conflicts of the same extension are declined as well. |
| 1229 linked_ptr<EventResponseDelta> d2( | 1248 linked_ptr<EventResponseDelta> d2( |
| 1230 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1249 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1231 // This one conflicts: | 1250 // This one conflicts: |
| 1232 d2->modified_request_headers.AddHeaderFromString("key3: value 0"); | 1251 d2->modified_request_headers.AddHeaderFromString("key3: value 0"); |
| 1233 d2->modified_request_headers.AddHeaderFromString("key4: value 4"); | 1252 d2->modified_request_headers.AddHeaderFromString("key4: value 4"); |
| 1234 deltas.push_back(d2); | 1253 deltas.push_back(d2); |
| 1235 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1254 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1236 conflicting_extensions.clear(); | 1255 warning_set.clear(); |
| 1237 capturing_net_log.Clear(); | 1256 capturing_net_log.Clear(); |
| 1238 net::HttpRequestHeaders headers2; | 1257 net::HttpRequestHeaders headers2; |
| 1239 headers2.MergeFrom(base_headers); | 1258 headers2.MergeFrom(base_headers); |
| 1240 MergeOnBeforeSendHeadersResponses( | 1259 MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log); |
| 1241 deltas, &headers2, &conflicting_extensions, &net_log); | |
| 1242 EXPECT_FALSE(headers2.HasHeader("key1")); | 1260 EXPECT_FALSE(headers2.HasHeader("key1")); |
| 1243 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); | 1261 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); |
| 1244 EXPECT_EQ("value 3", header_value); | 1262 EXPECT_EQ("value 3", header_value); |
| 1245 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); | 1263 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); |
| 1246 EXPECT_EQ("value 3", header_value); | 1264 EXPECT_EQ("value 3", header_value); |
| 1247 EXPECT_FALSE(headers2.HasHeader("key4")); | 1265 EXPECT_FALSE(headers2.HasHeader("key4")); |
| 1248 EXPECT_EQ(1u, conflicting_extensions.size()); | 1266 EXPECT_EQ(1u, warning_set.size()); |
| 1249 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1267 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1250 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1268 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1251 | 1269 |
| 1252 // Check that identical modifications don't conflict and operations | 1270 // Check that identical modifications don't conflict and operations |
| 1253 // can be merged. | 1271 // can be merged. |
| 1254 linked_ptr<EventResponseDelta> d3( | 1272 linked_ptr<EventResponseDelta> d3( |
| 1255 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 1273 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 1256 d3->deleted_request_headers.push_back("key1"); | 1274 d3->deleted_request_headers.push_back("key1"); |
| 1257 d3->modified_request_headers.AddHeaderFromString("key2: value 3"); | 1275 d3->modified_request_headers.AddHeaderFromString("key2: value 3"); |
| 1258 d3->modified_request_headers.AddHeaderFromString("key5: value 5"); | 1276 d3->modified_request_headers.AddHeaderFromString("key5: value 5"); |
| 1259 deltas.push_back(d3); | 1277 deltas.push_back(d3); |
| 1260 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1278 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1261 conflicting_extensions.clear(); | 1279 warning_set.clear(); |
| 1262 capturing_net_log.Clear(); | 1280 capturing_net_log.Clear(); |
| 1263 net::HttpRequestHeaders headers3; | 1281 net::HttpRequestHeaders headers3; |
| 1264 headers3.MergeFrom(base_headers); | 1282 headers3.MergeFrom(base_headers); |
| 1265 MergeOnBeforeSendHeadersResponses( | 1283 MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log); |
| 1266 deltas, &headers3, &conflicting_extensions, &net_log); | |
| 1267 EXPECT_FALSE(headers3.HasHeader("key1")); | 1284 EXPECT_FALSE(headers3.HasHeader("key1")); |
| 1268 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); | 1285 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); |
| 1269 EXPECT_EQ("value 3", header_value); | 1286 EXPECT_EQ("value 3", header_value); |
| 1270 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); | 1287 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); |
| 1271 EXPECT_EQ("value 3", header_value); | 1288 EXPECT_EQ("value 3", header_value); |
| 1272 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); | 1289 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); |
| 1273 EXPECT_EQ("value 5", header_value); | 1290 EXPECT_EQ("value 5", header_value); |
| 1274 EXPECT_EQ(1u, conflicting_extensions.size()); | 1291 EXPECT_EQ(1u, warning_set.size()); |
| 1275 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1292 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1276 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1293 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1277 } | 1294 } |
| 1278 | 1295 |
| 1279 TEST(ExtensionWebRequestHelpersTest, | 1296 TEST(ExtensionWebRequestHelpersTest, |
| 1280 TestMergeOnBeforeSendHeadersResponses_Cookies) { | 1297 TestMergeOnBeforeSendHeadersResponses_Cookies) { |
| 1281 net::HttpRequestHeaders base_headers; | 1298 net::HttpRequestHeaders base_headers; |
| 1282 base_headers.AddHeaderFromString( | 1299 base_headers.AddHeaderFromString( |
| 1283 "Cookie: name=value; name2=value2; name3=value3"); | 1300 "Cookie: name=value; name2=value2; name3=value3"); |
| 1284 net::CapturingBoundNetLog capturing_net_log; | 1301 net::CapturingBoundNetLog capturing_net_log; |
| 1285 net::BoundNetLog net_log = capturing_net_log.bound(); | 1302 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1286 std::set<std::string> conflicting_extensions; | 1303 ExtensionWarningSet warning_set; |
| 1287 std::string header_value; | 1304 std::string header_value; |
| 1288 EventResponseDeltas deltas; | 1305 EventResponseDeltas deltas; |
| 1289 | 1306 |
| 1290 linked_ptr<RequestCookieModification> add_cookie = | 1307 linked_ptr<RequestCookieModification> add_cookie = |
| 1291 make_linked_ptr(new RequestCookieModification); | 1308 make_linked_ptr(new RequestCookieModification); |
| 1292 add_cookie->type = helpers::ADD; | 1309 add_cookie->type = helpers::ADD; |
| 1293 add_cookie->modification.reset(new helpers::RequestCookie); | 1310 add_cookie->modification.reset(new helpers::RequestCookie); |
| 1294 add_cookie->modification->name.reset(new std::string("name4")); | 1311 add_cookie->modification->name.reset(new std::string("name4")); |
| 1295 add_cookie->modification->value.reset(new std::string("\"value 4\"")); | 1312 add_cookie->modification->value.reset(new std::string("\"value 4\"")); |
| 1296 | 1313 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1321 | 1338 |
| 1322 for (size_t i = 0; i < arraysize(operations); ++i) { | 1339 for (size_t i = 0; i < arraysize(operations); ++i) { |
| 1323 linked_ptr<EventResponseDelta> delta( | 1340 linked_ptr<EventResponseDelta> delta( |
| 1324 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1341 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1325 delta->request_cookie_modifications.push_back(operations[i]); | 1342 delta->request_cookie_modifications.push_back(operations[i]); |
| 1326 deltas.push_back(delta); | 1343 deltas.push_back(delta); |
| 1327 } | 1344 } |
| 1328 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1345 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1329 net::HttpRequestHeaders headers1; | 1346 net::HttpRequestHeaders headers1; |
| 1330 headers1.MergeFrom(base_headers); | 1347 headers1.MergeFrom(base_headers); |
| 1331 MergeOnBeforeSendHeadersResponses( | 1348 warning_set.clear(); |
| 1332 deltas, &headers1, &conflicting_extensions, &net_log); | 1349 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); |
| 1333 EXPECT_TRUE(headers1.HasHeader("Cookie")); | 1350 EXPECT_TRUE(headers1.HasHeader("Cookie")); |
| 1334 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); | 1351 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); |
| 1335 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); | 1352 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); |
| 1336 EXPECT_EQ(0u, conflicting_extensions.size()); | 1353 EXPECT_EQ(0u, warning_set.size()); |
| 1337 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1354 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1338 } | 1355 } |
| 1339 | 1356 |
| 1340 TEST(ExtensionWebRequestHelpersTest, | 1357 TEST(ExtensionWebRequestHelpersTest, |
| 1341 TestMergeCookiesInOnHeadersReceivedResponses) { | 1358 TestMergeCookiesInOnHeadersReceivedResponses) { |
| 1342 net::CapturingBoundNetLog capturing_net_log; | 1359 net::CapturingBoundNetLog capturing_net_log; |
| 1343 net::BoundNetLog net_log = capturing_net_log.bound(); | 1360 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1344 std::set<std::string> conflicting_extensions; | 1361 ExtensionWarningSet warning_set; |
| 1345 std::string header_value; | 1362 std::string header_value; |
| 1346 EventResponseDeltas deltas; | 1363 EventResponseDeltas deltas; |
| 1347 | 1364 |
| 1348 char base_headers_string[] = | 1365 char base_headers_string[] = |
| 1349 "HTTP/1.0 200 OK\r\n" | 1366 "HTTP/1.0 200 OK\r\n" |
| 1350 "Foo: Bar\r\n" | 1367 "Foo: Bar\r\n" |
| 1351 "Set-Cookie: name=value; DOMAIN=google.com; Secure\r\n" | 1368 "Set-Cookie: name=value; DOMAIN=google.com; Secure\r\n" |
| 1352 "Set-Cookie: name2=value2\r\n" | 1369 "Set-Cookie: name2=value2\r\n" |
| 1353 "Set-Cookie: name3=value3\r\n" | 1370 "Set-Cookie: name3=value3\r\n" |
| 1354 "\r\n"; | 1371 "\r\n"; |
| 1355 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1372 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1356 new net::HttpResponseHeaders( | 1373 new net::HttpResponseHeaders( |
| 1357 net::HttpUtil::AssembleRawHeaders( | 1374 net::HttpUtil::AssembleRawHeaders( |
| 1358 base_headers_string, sizeof(base_headers_string)))); | 1375 base_headers_string, sizeof(base_headers_string)))); |
| 1359 | 1376 |
| 1360 // Check that we can handle if not touching the response headers. | 1377 // Check that we can handle if not touching the response headers. |
| 1361 linked_ptr<EventResponseDelta> d0( | 1378 linked_ptr<EventResponseDelta> d0( |
| 1362 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1379 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1363 deltas.push_back(d0); | 1380 deltas.push_back(d0); |
| 1364 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1381 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1365 MergeCookiesInOnHeadersReceivedResponses( | 1382 MergeCookiesInOnHeadersReceivedResponses( |
| 1366 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, | 1383 deltas, base_headers.get(), &new_headers0, &warning_set, &net_log); |
| 1367 &net_log); | |
| 1368 EXPECT_FALSE(new_headers0.get()); | 1384 EXPECT_FALSE(new_headers0.get()); |
| 1369 EXPECT_EQ(0u, conflicting_extensions.size()); | 1385 EXPECT_EQ(0u, warning_set.size()); |
| 1370 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1386 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1371 | 1387 |
| 1372 linked_ptr<ResponseCookieModification> add_cookie = | 1388 linked_ptr<ResponseCookieModification> add_cookie = |
| 1373 make_linked_ptr(new ResponseCookieModification); | 1389 make_linked_ptr(new ResponseCookieModification); |
| 1374 add_cookie->type = helpers::ADD; | 1390 add_cookie->type = helpers::ADD; |
| 1375 add_cookie->modification.reset(new helpers::ResponseCookie); | 1391 add_cookie->modification.reset(new helpers::ResponseCookie); |
| 1376 add_cookie->modification->name.reset(new std::string("name4")); | 1392 add_cookie->modification->name.reset(new std::string("name4")); |
| 1377 add_cookie->modification->value.reset(new std::string("\"value4\"")); | 1393 add_cookie->modification->value.reset(new std::string("\"value4\"")); |
| 1378 | 1394 |
| 1379 linked_ptr<ResponseCookieModification> edit_cookie = | 1395 linked_ptr<ResponseCookieModification> edit_cookie = |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1407 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1423 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1408 delta->response_cookie_modifications.push_back(operations[i]); | 1424 delta->response_cookie_modifications.push_back(operations[i]); |
| 1409 deltas.push_back(delta); | 1425 deltas.push_back(delta); |
| 1410 } | 1426 } |
| 1411 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1427 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1412 scoped_refptr<net::HttpResponseHeaders> headers1( | 1428 scoped_refptr<net::HttpResponseHeaders> headers1( |
| 1413 new net::HttpResponseHeaders( | 1429 new net::HttpResponseHeaders( |
| 1414 net::HttpUtil::AssembleRawHeaders( | 1430 net::HttpUtil::AssembleRawHeaders( |
| 1415 base_headers_string, sizeof(base_headers_string)))); | 1431 base_headers_string, sizeof(base_headers_string)))); |
| 1416 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1432 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1433 warning_set.clear(); |
| 1417 MergeCookiesInOnHeadersReceivedResponses( | 1434 MergeCookiesInOnHeadersReceivedResponses( |
| 1418 deltas, headers1.get(), &new_headers1, &conflicting_extensions, &net_log); | 1435 deltas, headers1.get(), &new_headers1, &warning_set, &net_log); |
| 1419 | 1436 |
| 1420 EXPECT_TRUE(new_headers1->HasHeader("Foo")); | 1437 EXPECT_TRUE(new_headers1->HasHeader("Foo")); |
| 1421 void* iter = NULL; | 1438 void* iter = NULL; |
| 1422 std::string cookie_string; | 1439 std::string cookie_string; |
| 1423 std::set<std::string> expected_cookies; | 1440 std::set<std::string> expected_cookies; |
| 1424 expected_cookies.insert("name=value; domain=google.com; secure"); | 1441 expected_cookies.insert("name=value; domain=google.com; secure"); |
| 1425 expected_cookies.insert("name2=value2; secure"); | 1442 expected_cookies.insert("name2=value2; secure"); |
| 1426 expected_cookies.insert("name4=\"value4\"; secure"); | 1443 expected_cookies.insert("name4=\"value4\"; secure"); |
| 1427 std::set<std::string> actual_cookies; | 1444 std::set<std::string> actual_cookies; |
| 1428 while (new_headers1->EnumerateHeader(&iter, "Set-Cookie", &cookie_string)) | 1445 while (new_headers1->EnumerateHeader(&iter, "Set-Cookie", &cookie_string)) |
| 1429 actual_cookies.insert(cookie_string); | 1446 actual_cookies.insert(cookie_string); |
| 1430 EXPECT_EQ(expected_cookies, actual_cookies); | 1447 EXPECT_EQ(expected_cookies, actual_cookies); |
| 1431 EXPECT_EQ(0u, conflicting_extensions.size()); | 1448 EXPECT_EQ(0u, warning_set.size()); |
| 1432 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1449 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1433 } | 1450 } |
| 1434 | 1451 |
| 1435 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { | 1452 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { |
| 1436 net::CapturingBoundNetLog capturing_net_log; | 1453 net::CapturingBoundNetLog capturing_net_log; |
| 1437 net::BoundNetLog net_log = capturing_net_log.bound(); | 1454 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1438 std::set<std::string> conflicting_extensions; | 1455 ExtensionWarningSet warning_set; |
| 1439 std::string header_value; | 1456 std::string header_value; |
| 1440 EventResponseDeltas deltas; | 1457 EventResponseDeltas deltas; |
| 1441 | 1458 |
| 1442 char base_headers_string[] = | 1459 char base_headers_string[] = |
| 1443 "HTTP/1.0 200 OK\r\n" | 1460 "HTTP/1.0 200 OK\r\n" |
| 1444 "Key1: Value1\r\n" | 1461 "Key1: Value1\r\n" |
| 1445 "Key2: Value2, Foo\r\n" | 1462 "Key2: Value2, Foo\r\n" |
| 1446 "\r\n"; | 1463 "\r\n"; |
| 1447 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1464 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1448 new net::HttpResponseHeaders( | 1465 new net::HttpResponseHeaders( |
| 1449 net::HttpUtil::AssembleRawHeaders( | 1466 net::HttpUtil::AssembleRawHeaders( |
| 1450 base_headers_string, sizeof(base_headers_string)))); | 1467 base_headers_string, sizeof(base_headers_string)))); |
| 1451 | 1468 |
| 1452 // Check that we can handle if not touching the response headers. | 1469 // Check that we can handle if not touching the response headers. |
| 1453 linked_ptr<EventResponseDelta> d0( | 1470 linked_ptr<EventResponseDelta> d0( |
| 1454 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1471 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1455 deltas.push_back(d0); | 1472 deltas.push_back(d0); |
| 1456 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1473 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1457 MergeOnHeadersReceivedResponses( | 1474 MergeOnHeadersReceivedResponses(deltas, base_headers.get(), &new_headers0, |
| 1458 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, | 1475 &warning_set, &net_log); |
| 1459 &net_log); | |
| 1460 EXPECT_FALSE(new_headers0.get()); | 1476 EXPECT_FALSE(new_headers0.get()); |
| 1461 EXPECT_EQ(0u, conflicting_extensions.size()); | 1477 EXPECT_EQ(0u, warning_set.size()); |
| 1462 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1478 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1463 | 1479 |
| 1464 linked_ptr<EventResponseDelta> d1( | 1480 linked_ptr<EventResponseDelta> d1( |
| 1465 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1481 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1466 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); | 1482 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
| 1467 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); | 1483 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); |
| 1468 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | 1484 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); |
| 1469 deltas.push_back(d1); | 1485 deltas.push_back(d1); |
| 1470 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1486 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1471 conflicting_extensions.clear(); | 1487 warning_set.clear(); |
| 1472 capturing_net_log.Clear(); | 1488 capturing_net_log.Clear(); |
| 1473 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1489 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1474 MergeOnHeadersReceivedResponses( | 1490 MergeOnHeadersReceivedResponses( |
| 1475 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | 1491 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); |
| 1476 &net_log); | |
| 1477 ASSERT_TRUE(new_headers1.get()); | 1492 ASSERT_TRUE(new_headers1.get()); |
| 1478 std::multimap<std::string, std::string> expected1; | 1493 std::multimap<std::string, std::string> expected1; |
| 1479 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | 1494 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); |
| 1480 void* iter = NULL; | 1495 void* iter = NULL; |
| 1481 std::string name; | 1496 std::string name; |
| 1482 std::string value; | 1497 std::string value; |
| 1483 std::multimap<std::string, std::string> actual1; | 1498 std::multimap<std::string, std::string> actual1; |
| 1484 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1499 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1485 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1500 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1486 } | 1501 } |
| 1487 EXPECT_EQ(expected1, actual1); | 1502 EXPECT_EQ(expected1, actual1); |
| 1488 EXPECT_EQ(0u, conflicting_extensions.size()); | 1503 EXPECT_EQ(0u, warning_set.size()); |
| 1489 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1504 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1490 | 1505 |
| 1491 // Check that we replace response headers only once. | 1506 // Check that we replace response headers only once. |
| 1492 linked_ptr<EventResponseDelta> d2( | 1507 linked_ptr<EventResponseDelta> d2( |
| 1493 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1508 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1494 // Note that we use a different capitalization of KeY2. This should not | 1509 // Note that we use a different capitalization of KeY2. This should not |
| 1495 // matter. | 1510 // matter. |
| 1496 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); | 1511 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); |
| 1497 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | 1512 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); |
| 1498 deltas.push_back(d2); | 1513 deltas.push_back(d2); |
| 1499 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1514 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1500 conflicting_extensions.clear(); | 1515 warning_set.clear(); |
| 1501 capturing_net_log.Clear(); | 1516 capturing_net_log.Clear(); |
| 1502 scoped_refptr<net::HttpResponseHeaders> new_headers2; | 1517 scoped_refptr<net::HttpResponseHeaders> new_headers2; |
| 1503 MergeOnHeadersReceivedResponses( | 1518 MergeOnHeadersReceivedResponses( |
| 1504 deltas, base_headers.get(), &new_headers2, &conflicting_extensions, | 1519 deltas, base_headers.get(), &new_headers2, &warning_set, &net_log); |
| 1505 &net_log); | |
| 1506 ASSERT_TRUE(new_headers2.get()); | 1520 ASSERT_TRUE(new_headers2.get()); |
| 1507 iter = NULL; | 1521 iter = NULL; |
| 1508 std::multimap<std::string, std::string> actual2; | 1522 std::multimap<std::string, std::string> actual2; |
| 1509 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | 1523 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1510 actual2.insert(std::pair<std::string, std::string>(name, value)); | 1524 actual2.insert(std::pair<std::string, std::string>(name, value)); |
| 1511 } | 1525 } |
| 1512 EXPECT_EQ(expected1, actual2); | 1526 EXPECT_EQ(expected1, actual2); |
| 1513 EXPECT_EQ(1u, conflicting_extensions.size()); | 1527 EXPECT_EQ(1u, warning_set.size()); |
| 1514 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1528 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1515 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1529 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1516 } | 1530 } |
| 1517 | 1531 |
| 1518 // Check that we do not delete too much | 1532 // Check that we do not delete too much |
| 1519 TEST(ExtensionWebRequestHelpersTest, | 1533 TEST(ExtensionWebRequestHelpersTest, |
| 1520 TestMergeOnHeadersReceivedResponsesDeletion) { | 1534 TestMergeOnHeadersReceivedResponsesDeletion) { |
| 1521 net::CapturingBoundNetLog capturing_net_log; | 1535 net::CapturingBoundNetLog capturing_net_log; |
| 1522 net::BoundNetLog net_log = capturing_net_log.bound(); | 1536 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1523 std::set<std::string> conflicting_extensions; | 1537 ExtensionWarningSet warning_set; |
| 1524 std::string header_value; | 1538 std::string header_value; |
| 1525 EventResponseDeltas deltas; | 1539 EventResponseDeltas deltas; |
| 1526 | 1540 |
| 1527 char base_headers_string[] = | 1541 char base_headers_string[] = |
| 1528 "HTTP/1.0 200 OK\r\n" | 1542 "HTTP/1.0 200 OK\r\n" |
| 1529 "Key1: Value1\r\n" | 1543 "Key1: Value1\r\n" |
| 1530 "Key1: Value2\r\n" | 1544 "Key1: Value2\r\n" |
| 1531 "Key1: Value3\r\n" | 1545 "Key1: Value3\r\n" |
| 1532 "Key2: Value4\r\n" | 1546 "Key2: Value4\r\n" |
| 1533 "\r\n"; | 1547 "\r\n"; |
| 1534 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1548 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1535 new net::HttpResponseHeaders( | 1549 new net::HttpResponseHeaders( |
| 1536 net::HttpUtil::AssembleRawHeaders( | 1550 net::HttpUtil::AssembleRawHeaders( |
| 1537 base_headers_string, sizeof(base_headers_string)))); | 1551 base_headers_string, sizeof(base_headers_string)))); |
| 1538 | 1552 |
| 1539 linked_ptr<EventResponseDelta> d1( | 1553 linked_ptr<EventResponseDelta> d1( |
| 1540 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1554 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1541 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | 1555 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); |
| 1542 deltas.push_back(d1); | 1556 deltas.push_back(d1); |
| 1543 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1557 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1544 MergeOnHeadersReceivedResponses( | 1558 MergeOnHeadersReceivedResponses( |
| 1545 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | 1559 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); |
| 1546 &net_log); | |
| 1547 ASSERT_TRUE(new_headers1.get()); | 1560 ASSERT_TRUE(new_headers1.get()); |
| 1548 std::multimap<std::string, std::string> expected1; | 1561 std::multimap<std::string, std::string> expected1; |
| 1549 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | 1562 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); |
| 1550 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | 1563 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); |
| 1551 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | 1564 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); |
| 1552 void* iter = NULL; | 1565 void* iter = NULL; |
| 1553 std::string name; | 1566 std::string name; |
| 1554 std::string value; | 1567 std::string value; |
| 1555 std::multimap<std::string, std::string> actual1; | 1568 std::multimap<std::string, std::string> actual1; |
| 1556 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1569 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1557 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1570 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1558 } | 1571 } |
| 1559 EXPECT_EQ(expected1, actual1); | 1572 EXPECT_EQ(expected1, actual1); |
| 1560 EXPECT_EQ(0u, conflicting_extensions.size()); | 1573 EXPECT_EQ(0u, warning_set.size()); |
| 1561 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1574 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1562 } | 1575 } |
| 1563 | 1576 |
| 1564 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 1577 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
| 1565 net::CapturingBoundNetLog capturing_net_log; | 1578 net::CapturingBoundNetLog capturing_net_log; |
| 1566 net::BoundNetLog net_log = capturing_net_log.bound(); | 1579 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1567 std::set<std::string> conflicting_extensions; | 1580 ExtensionWarningSet warning_set; |
| 1568 EventResponseDeltas deltas; | 1581 EventResponseDeltas deltas; |
| 1569 string16 username = ASCIIToUTF16("foo"); | 1582 string16 username = ASCIIToUTF16("foo"); |
| 1570 string16 password = ASCIIToUTF16("bar"); | 1583 string16 password = ASCIIToUTF16("bar"); |
| 1571 string16 password2 = ASCIIToUTF16("baz"); | 1584 string16 password2 = ASCIIToUTF16("baz"); |
| 1572 | 1585 |
| 1573 // Check that we can handle if not returning credentials. | 1586 // Check that we can handle if not returning credentials. |
| 1574 linked_ptr<EventResponseDelta> d0( | 1587 linked_ptr<EventResponseDelta> d0( |
| 1575 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1588 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1576 deltas.push_back(d0); | 1589 deltas.push_back(d0); |
| 1577 net::AuthCredentials auth0; | 1590 net::AuthCredentials auth0; |
| 1578 bool credentials_set = MergeOnAuthRequiredResponses( | 1591 bool credentials_set = MergeOnAuthRequiredResponses( |
| 1579 deltas, &auth0, &conflicting_extensions, &net_log); | 1592 deltas, &auth0, &warning_set, &net_log); |
| 1580 EXPECT_FALSE(credentials_set); | 1593 EXPECT_FALSE(credentials_set); |
| 1581 EXPECT_TRUE(auth0.Empty()); | 1594 EXPECT_TRUE(auth0.Empty()); |
| 1582 EXPECT_EQ(0u, conflicting_extensions.size()); | 1595 EXPECT_EQ(0u, warning_set.size()); |
| 1583 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1596 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1584 | 1597 |
| 1585 // Check that we can set AuthCredentials. | 1598 // Check that we can set AuthCredentials. |
| 1586 linked_ptr<EventResponseDelta> d1( | 1599 linked_ptr<EventResponseDelta> d1( |
| 1587 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1600 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1588 d1->auth_credentials.reset(new net::AuthCredentials(username, password)); | 1601 d1->auth_credentials.reset(new net::AuthCredentials(username, password)); |
| 1589 deltas.push_back(d1); | 1602 deltas.push_back(d1); |
| 1590 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1603 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1591 conflicting_extensions.clear(); | 1604 warning_set.clear(); |
| 1592 capturing_net_log.Clear(); | 1605 capturing_net_log.Clear(); |
| 1593 net::AuthCredentials auth1; | 1606 net::AuthCredentials auth1; |
| 1594 credentials_set = MergeOnAuthRequiredResponses( | 1607 credentials_set = MergeOnAuthRequiredResponses( |
| 1595 deltas, &auth1, &conflicting_extensions, &net_log); | 1608 deltas, &auth1, &warning_set, &net_log); |
| 1596 EXPECT_TRUE(credentials_set); | 1609 EXPECT_TRUE(credentials_set); |
| 1597 EXPECT_FALSE(auth1.Empty()); | 1610 EXPECT_FALSE(auth1.Empty()); |
| 1598 EXPECT_EQ(username, auth1.username()); | 1611 EXPECT_EQ(username, auth1.username()); |
| 1599 EXPECT_EQ(password, auth1.password()); | 1612 EXPECT_EQ(password, auth1.password()); |
| 1600 EXPECT_EQ(0u, conflicting_extensions.size()); | 1613 EXPECT_EQ(0u, warning_set.size()); |
| 1601 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1614 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1602 | 1615 |
| 1603 // Check that we set AuthCredentials only once. | 1616 // Check that we set AuthCredentials only once. |
| 1604 linked_ptr<EventResponseDelta> d2( | 1617 linked_ptr<EventResponseDelta> d2( |
| 1605 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1618 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1606 d2->auth_credentials.reset(new net::AuthCredentials(username, password2)); | 1619 d2->auth_credentials.reset(new net::AuthCredentials(username, password2)); |
| 1607 deltas.push_back(d2); | 1620 deltas.push_back(d2); |
| 1608 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1621 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1609 conflicting_extensions.clear(); | 1622 warning_set.clear(); |
| 1610 capturing_net_log.Clear(); | 1623 capturing_net_log.Clear(); |
| 1611 net::AuthCredentials auth2; | 1624 net::AuthCredentials auth2; |
| 1612 credentials_set = MergeOnAuthRequiredResponses( | 1625 credentials_set = MergeOnAuthRequiredResponses( |
| 1613 deltas, &auth2, &conflicting_extensions, &net_log); | 1626 deltas, &auth2, &warning_set, &net_log); |
| 1614 EXPECT_TRUE(credentials_set); | 1627 EXPECT_TRUE(credentials_set); |
| 1615 EXPECT_FALSE(auth2.Empty()); | 1628 EXPECT_FALSE(auth2.Empty()); |
| 1616 EXPECT_EQ(username, auth1.username()); | 1629 EXPECT_EQ(username, auth1.username()); |
| 1617 EXPECT_EQ(password, auth1.password()); | 1630 EXPECT_EQ(password, auth1.password()); |
| 1618 EXPECT_EQ(1u, conflicting_extensions.size()); | 1631 EXPECT_EQ(1u, warning_set.size()); |
| 1619 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1632 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1620 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1633 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1621 | 1634 |
| 1622 // Check that we can set identical AuthCredentials twice without causing | 1635 // Check that we can set identical AuthCredentials twice without causing |
| 1623 // a conflict. | 1636 // a conflict. |
| 1624 linked_ptr<EventResponseDelta> d3( | 1637 linked_ptr<EventResponseDelta> d3( |
| 1625 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 1638 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 1626 d3->auth_credentials.reset(new net::AuthCredentials(username, password)); | 1639 d3->auth_credentials.reset(new net::AuthCredentials(username, password)); |
| 1627 deltas.push_back(d3); | 1640 deltas.push_back(d3); |
| 1628 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1641 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1629 conflicting_extensions.clear(); | 1642 warning_set.clear(); |
| 1630 capturing_net_log.Clear(); | 1643 capturing_net_log.Clear(); |
| 1631 net::AuthCredentials auth3; | 1644 net::AuthCredentials auth3; |
| 1632 credentials_set = MergeOnAuthRequiredResponses( | 1645 credentials_set = MergeOnAuthRequiredResponses( |
| 1633 deltas, &auth3, &conflicting_extensions, &net_log); | 1646 deltas, &auth3, &warning_set, &net_log); |
| 1634 EXPECT_TRUE(credentials_set); | 1647 EXPECT_TRUE(credentials_set); |
| 1635 EXPECT_FALSE(auth3.Empty()); | 1648 EXPECT_FALSE(auth3.Empty()); |
| 1636 EXPECT_EQ(username, auth1.username()); | 1649 EXPECT_EQ(username, auth1.username()); |
| 1637 EXPECT_EQ(password, auth1.password()); | 1650 EXPECT_EQ(password, auth1.password()); |
| 1638 EXPECT_EQ(1u, conflicting_extensions.size()); | 1651 EXPECT_EQ(1u, warning_set.size()); |
| 1639 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1652 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1640 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1653 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1641 } | 1654 } |
| 1642 | 1655 |
| 1656 } // namespace extensions |
| OLD | NEW |