| 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/utf_string_conversions.h" | 19 #include "base/utf_string_conversions.h" |
| 20 #include "chrome/browser/api/prefs/pref_member.h" | 20 #include "chrome/browser/api/prefs/pref_member.h" |
| 21 #include "chrome/browser/content_settings/cookie_settings.h" | 21 #include "chrome/browser/content_settings/cookie_settings.h" |
| 22 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" | 22 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" |
| 23 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 23 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| 24 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" | 24 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" |
| 25 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" | 25 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
| 26 #include "chrome/browser/extensions/event_router_forwarder.h" | 26 #include "chrome/browser/extensions/event_router_forwarder.h" |
| 27 #include "chrome/browser/extensions/extension_warning_set.h" |
| 27 #include "chrome/browser/net/chrome_network_delegate.h" | 28 #include "chrome/browser/net/chrome_network_delegate.h" |
| 28 #include "chrome/common/extensions/extension_messages.h" | 29 #include "chrome/common/extensions/extension_messages.h" |
| 29 #include "chrome/common/extensions/features/feature.h" | 30 #include "chrome/common/extensions/features/feature.h" |
| 30 #include "chrome/common/pref_names.h" | 31 #include "chrome/common/pref_names.h" |
| 31 #include "chrome/test/base/testing_browser_process.h" | 32 #include "chrome/test/base/testing_browser_process.h" |
| 32 #include "chrome/test/base/testing_pref_service.h" | 33 #include "chrome/test/base/testing_pref_service.h" |
| 33 #include "chrome/test/base/testing_profile.h" | 34 #include "chrome/test/base/testing_profile.h" |
| 34 #include "content/public/test/test_browser_thread.h" | 35 #include "content/public/test/test_browser_thread.h" |
| 35 #include "net/base/auth.h" | 36 #include "net/base/auth.h" |
| 36 #include "net/base/capturing_net_log.h" | 37 #include "net/base/capturing_net_log.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 60 using helpers::EventResponseDeltas; | 61 using helpers::EventResponseDeltas; |
| 61 using helpers::InDecreasingExtensionInstallationTimeOrder; | 62 using helpers::InDecreasingExtensionInstallationTimeOrder; |
| 62 using helpers::MergeCancelOfResponses; | 63 using helpers::MergeCancelOfResponses; |
| 63 using helpers::MergeOnBeforeRequestResponses; | 64 using helpers::MergeOnBeforeRequestResponses; |
| 64 using helpers::RequestCookieModification; | 65 using helpers::RequestCookieModification; |
| 65 using helpers::ResponseCookieModification; | 66 using helpers::ResponseCookieModification; |
| 66 using helpers::ResponseHeader; | 67 using helpers::ResponseHeader; |
| 67 using helpers::ResponseHeaders; | 68 using helpers::ResponseHeaders; |
| 68 using helpers::StringToCharList; | 69 using helpers::StringToCharList; |
| 69 | 70 |
| 71 namespace extensions { |
| 72 |
| 70 namespace { | 73 namespace { |
| 71 static void EventHandledOnIOThread( | 74 static void EventHandledOnIOThread( |
| 72 void* profile, | 75 void* profile, |
| 73 const std::string& extension_id, | 76 const std::string& extension_id, |
| 74 const std::string& event_name, | 77 const std::string& event_name, |
| 75 const std::string& sub_event_name, | 78 const std::string& sub_event_name, |
| 76 uint64 request_id, | 79 uint64 request_id, |
| 77 ExtensionWebRequestEventRouter::EventResponse* response) { | 80 ExtensionWebRequestEventRouter::EventResponse* response) { |
| 78 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 81 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 79 profile, extension_id, event_name, sub_event_name, request_id, | 82 profile, extension_id, event_name, sub_event_name, request_id, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 97 ASSERT_TRUE(ExtensionMsg_MessageInvoke::Read(message, param)); | 100 ASSERT_TRUE(ExtensionMsg_MessageInvoke::Read(message, param)); |
| 98 ASSERT_GE(param->c.GetSize(), 2u); | 101 ASSERT_GE(param->c.GetSize(), 2u); |
| 99 const Value* value = NULL; | 102 const Value* value = NULL; |
| 100 ASSERT_TRUE(param->c.Get(1, &value)); | 103 ASSERT_TRUE(param->c.Get(1, &value)); |
| 101 const ListValue* list = NULL; | 104 const ListValue* list = NULL; |
| 102 ASSERT_TRUE(value->GetAsList(&list)); | 105 ASSERT_TRUE(value->GetAsList(&list)); |
| 103 ASSERT_EQ(1u, list->GetSize()); | 106 ASSERT_EQ(1u, list->GetSize()); |
| 104 ASSERT_TRUE(list->GetDictionary(0, out)); | 107 ASSERT_TRUE(list->GetDictionary(0, out)); |
| 105 } | 108 } |
| 106 | 109 |
| 110 // Returns whether |warnings| contains an extension for |extension_id|. |
| 111 bool HasWarning(const std::set<ExtensionWarning>& warnings, |
| 112 const std::string& extension_id) { |
| 113 for (std::set<ExtensionWarning>::const_iterator i = warnings.begin(); |
| 114 i != warnings.end(); ++i) { |
| 115 if (i->extension_id() == extension_id) |
| 116 return true; |
| 117 } |
| 118 return false; |
| 119 } |
| 120 |
| 107 } // namespace | 121 } // namespace |
| 108 | 122 |
| 109 // A mock event router that responds to events with a pre-arranged queue of | 123 // A mock event router that responds to events with a pre-arranged queue of |
| 110 // Tasks. | 124 // Tasks. |
| 111 class TestIPCSender : public IPC::Sender { | 125 class TestIPCSender : public IPC::Sender { |
| 112 public: | 126 public: |
| 113 typedef std::list<linked_ptr<IPC::Message> > SentMessages; | 127 typedef std::list<linked_ptr<IPC::Message> > SentMessages; |
| 114 | 128 |
| 115 // Adds a Task to the queue. We will fire these in order as events are | 129 // Adds a Task to the queue. We will fire these in order as events are |
| 116 // dispatched. | 130 // dispatched. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 146 }; | 160 }; |
| 147 | 161 |
| 148 class ExtensionWebRequestTest : public testing::Test { | 162 class ExtensionWebRequestTest : public testing::Test { |
| 149 public: | 163 public: |
| 150 ExtensionWebRequestTest() | 164 ExtensionWebRequestTest() |
| 151 : ui_thread_(content::BrowserThread::UI, &message_loop_), | 165 : ui_thread_(content::BrowserThread::UI, &message_loop_), |
| 152 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 166 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
| 153 | 167 |
| 154 protected: | 168 protected: |
| 155 virtual void SetUp() OVERRIDE { | 169 virtual void SetUp() OVERRIDE { |
| 156 event_router_ = new extensions::EventRouterForwarder(); | 170 event_router_ = new EventRouterForwarder(); |
| 157 enable_referrers_.Init( | 171 enable_referrers_.Init( |
| 158 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 172 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
| 159 network_delegate_.reset(new ChromeNetworkDelegate( | 173 network_delegate_.reset(new ChromeNetworkDelegate( |
| 160 event_router_.get(), NULL, NULL, NULL, &profile_, | 174 event_router_.get(), NULL, NULL, NULL, &profile_, |
| 161 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, | 175 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, |
| 162 NULL, NULL)); | 176 NULL, NULL)); |
| 163 context_.reset(new TestURLRequestContext(true)); | 177 context_.reset(new TestURLRequestContext(true)); |
| 164 context_->set_network_delegate(network_delegate_.get()); | 178 context_->set_network_delegate(network_delegate_.get()); |
| 165 context_->Init(); | 179 context_->Init(); |
| 166 } | 180 } |
| 167 | 181 |
| 168 // Fires a URLRequest with the specified |method|, |content_type| and three | 182 // Fires a URLRequest with the specified |method|, |content_type| and three |
| 169 // elements of upload data: bytes_1, a dummy empty file, bytes_2. | 183 // elements of upload data: bytes_1, a dummy empty file, bytes_2. |
| 170 void FireURLRequestWithData(const std::string& method, | 184 void FireURLRequestWithData(const std::string& method, |
| 171 const char* content_type, | 185 const char* content_type, |
| 172 const std::vector<char>& bytes_1, | 186 const std::vector<char>& bytes_1, |
| 173 const std::vector<char>& bytes_2); | 187 const std::vector<char>& bytes_2); |
| 174 | 188 |
| 175 MessageLoopForIO message_loop_; | 189 MessageLoopForIO message_loop_; |
| 176 content::TestBrowserThread ui_thread_; | 190 content::TestBrowserThread ui_thread_; |
| 177 content::TestBrowserThread io_thread_; | 191 content::TestBrowserThread io_thread_; |
| 178 TestingProfile profile_; | 192 TestingProfile profile_; |
| 179 TestDelegate delegate_; | 193 TestDelegate delegate_; |
| 180 BooleanPrefMember enable_referrers_; | 194 BooleanPrefMember enable_referrers_; |
| 181 TestIPCSender ipc_sender_; | 195 TestIPCSender ipc_sender_; |
| 182 scoped_refptr<extensions::EventRouterForwarder> event_router_; | 196 scoped_refptr<EventRouterForwarder> event_router_; |
| 183 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 197 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
| 184 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 198 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
| 185 scoped_ptr<TestURLRequestContext> context_; | 199 scoped_ptr<TestURLRequestContext> context_; |
| 186 }; | 200 }; |
| 187 | 201 |
| 188 // Tests that we handle disagreements among extensions about responses to | 202 // Tests that we handle disagreements among extensions about responses to |
| 189 // blocking events (redirection) by choosing the response from the | 203 // blocking events (redirection) by choosing the response from the |
| 190 // most-recently-installed extension. | 204 // most-recently-installed extension. |
| 191 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { | 205 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { |
| 192 std::string extension1_id("1"); | 206 std::string extension1_id("1"); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 | 704 |
| 691 class ExtensionWebRequestHeaderModificationTest : | 705 class ExtensionWebRequestHeaderModificationTest : |
| 692 public testing::TestWithParam<HeaderModificationTest> { | 706 public testing::TestWithParam<HeaderModificationTest> { |
| 693 public: | 707 public: |
| 694 ExtensionWebRequestHeaderModificationTest() | 708 ExtensionWebRequestHeaderModificationTest() |
| 695 : ui_thread_(content::BrowserThread::UI, &message_loop_), | 709 : ui_thread_(content::BrowserThread::UI, &message_loop_), |
| 696 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 710 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
| 697 | 711 |
| 698 protected: | 712 protected: |
| 699 virtual void SetUp() { | 713 virtual void SetUp() { |
| 700 event_router_ = new extensions::EventRouterForwarder(); | 714 event_router_ = new EventRouterForwarder(); |
| 701 enable_referrers_.Init( | 715 enable_referrers_.Init( |
| 702 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 716 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
| 703 network_delegate_.reset(new ChromeNetworkDelegate( | 717 network_delegate_.reset(new ChromeNetworkDelegate( |
| 704 event_router_.get(), NULL, NULL, NULL, &profile_, | 718 event_router_.get(), NULL, NULL, NULL, &profile_, |
| 705 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, | 719 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_, |
| 706 NULL, NULL)); | 720 NULL, NULL)); |
| 707 context_.reset(new TestURLRequestContext(true)); | 721 context_.reset(new TestURLRequestContext(true)); |
| 708 host_resolver_.reset(new net::MockHostResolver()); | 722 host_resolver_.reset(new net::MockHostResolver()); |
| 709 host_resolver_->rules()->AddSimulatedFailure("doesnotexist"); | 723 host_resolver_->rules()->AddSimulatedFailure("doesnotexist"); |
| 710 context_->set_host_resolver(host_resolver_.get()); | 724 context_->set_host_resolver(host_resolver_.get()); |
| 711 context_->set_network_delegate(network_delegate_.get()); | 725 context_->set_network_delegate(network_delegate_.get()); |
| 712 context_->Init(); | 726 context_->Init(); |
| 713 } | 727 } |
| 714 | 728 |
| 715 MessageLoopForIO message_loop_; | 729 MessageLoopForIO message_loop_; |
| 716 content::TestBrowserThread ui_thread_; | 730 content::TestBrowserThread ui_thread_; |
| 717 content::TestBrowserThread io_thread_; | 731 content::TestBrowserThread io_thread_; |
| 718 TestingProfile profile_; | 732 TestingProfile profile_; |
| 719 TestDelegate delegate_; | 733 TestDelegate delegate_; |
| 720 BooleanPrefMember enable_referrers_; | 734 BooleanPrefMember enable_referrers_; |
| 721 TestIPCSender ipc_sender_; | 735 TestIPCSender ipc_sender_; |
| 722 scoped_refptr<extensions::EventRouterForwarder> event_router_; | 736 scoped_refptr<EventRouterForwarder> event_router_; |
| 723 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 737 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
| 724 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 738 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
| 725 scoped_ptr<net::MockHostResolver> host_resolver_; | 739 scoped_ptr<net::MockHostResolver> host_resolver_; |
| 726 scoped_ptr<TestURLRequestContext> context_; | 740 scoped_ptr<TestURLRequestContext> context_; |
| 727 }; | 741 }; |
| 728 | 742 |
| 729 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { | 743 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { |
| 730 std::string extension1_id("1"); | 744 std::string extension1_id("1"); |
| 731 std::string extension2_id("2"); | 745 std::string extension2_id("2"); |
| 732 std::string extension3_id("3"); | 746 std::string extension3_id("3"); |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 EXPECT_TRUE(delta->cancel); | 1224 EXPECT_TRUE(delta->cancel); |
| 1211 EXPECT_EQ(2u, delta->added_response_headers.size()); | 1225 EXPECT_EQ(2u, delta->added_response_headers.size()); |
| 1212 EXPECT_TRUE(Contains(delta->added_response_headers, | 1226 EXPECT_TRUE(Contains(delta->added_response_headers, |
| 1213 ResponseHeader("Key2", "Value1"))); | 1227 ResponseHeader("Key2", "Value1"))); |
| 1214 EXPECT_TRUE(Contains(delta->added_response_headers, | 1228 EXPECT_TRUE(Contains(delta->added_response_headers, |
| 1215 ResponseHeader("Key4", "Value4"))); | 1229 ResponseHeader("Key4", "Value4"))); |
| 1216 EXPECT_EQ(2u, delta->deleted_response_headers.size()); | 1230 EXPECT_EQ(2u, delta->deleted_response_headers.size()); |
| 1217 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 1231 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
| 1218 ResponseHeader("Key2", "Value2, Bar"))); | 1232 ResponseHeader("Key2", "Value2, Bar"))); |
| 1219 EXPECT_TRUE(Contains(delta->deleted_response_headers, | 1233 EXPECT_TRUE(Contains(delta->deleted_response_headers, |
| 1220 ResponseHeader("Key3", "Value3"))); | 1234 ResponseHeader("Key3", "Value3"))); |
| 1221 } | 1235 } |
| 1222 | 1236 |
| 1223 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { | 1237 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { |
| 1224 const bool cancel = true; | 1238 const bool cancel = true; |
| 1225 | 1239 |
| 1226 string16 username = ASCIIToUTF16("foo"); | 1240 string16 username = ASCIIToUTF16("foo"); |
| 1227 string16 password = ASCIIToUTF16("bar"); | 1241 string16 password = ASCIIToUTF16("bar"); |
| 1228 scoped_ptr<net::AuthCredentials> credentials( | 1242 scoped_ptr<net::AuthCredentials> credentials( |
| 1229 new net::AuthCredentials(username, password)); | 1243 new net::AuthCredentials(username, password)); |
| 1230 | 1244 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1261 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1275 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1262 MergeCancelOfResponses(deltas, &canceled, &net_log); | 1276 MergeCancelOfResponses(deltas, &canceled, &net_log); |
| 1263 EXPECT_TRUE(canceled); | 1277 EXPECT_TRUE(canceled); |
| 1264 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1278 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1265 } | 1279 } |
| 1266 | 1280 |
| 1267 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) { | 1281 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses) { |
| 1268 EventResponseDeltas deltas; | 1282 EventResponseDeltas deltas; |
| 1269 net::CapturingBoundNetLog capturing_net_log; | 1283 net::CapturingBoundNetLog capturing_net_log; |
| 1270 net::BoundNetLog net_log = capturing_net_log.bound(); | 1284 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1271 std::set<std::string> conflicting_extensions; | 1285 std::set<ExtensionWarning> warning_set; |
| 1272 GURL effective_new_url; | 1286 GURL effective_new_url; |
| 1273 | 1287 |
| 1274 // No redirect | 1288 // No redirect |
| 1275 linked_ptr<EventResponseDelta> d0( | 1289 linked_ptr<EventResponseDelta> d0( |
| 1276 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); | 1290 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); |
| 1277 deltas.push_back(d0); | 1291 deltas.push_back(d0); |
| 1278 MergeOnBeforeRequestResponses( | 1292 MergeOnBeforeRequestResponses( |
| 1279 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1293 deltas, &effective_new_url, &warning_set, &net_log); |
| 1280 EXPECT_TRUE(effective_new_url.is_empty()); | 1294 EXPECT_TRUE(effective_new_url.is_empty()); |
| 1281 | 1295 |
| 1282 // Single redirect. | 1296 // Single redirect. |
| 1283 GURL new_url_1("http://foo.com"); | 1297 GURL new_url_1("http://foo.com"); |
| 1284 linked_ptr<EventResponseDelta> d1( | 1298 linked_ptr<EventResponseDelta> d1( |
| 1285 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); | 1299 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); |
| 1286 d1->new_url = GURL(new_url_1); | 1300 d1->new_url = GURL(new_url_1); |
| 1287 deltas.push_back(d1); | 1301 deltas.push_back(d1); |
| 1288 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1302 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1289 capturing_net_log.Clear(); | 1303 capturing_net_log.Clear(); |
| 1290 MergeOnBeforeRequestResponses( | 1304 MergeOnBeforeRequestResponses( |
| 1291 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1305 deltas, &effective_new_url, &warning_set, &net_log); |
| 1292 EXPECT_EQ(new_url_1, effective_new_url); | 1306 EXPECT_EQ(new_url_1, effective_new_url); |
| 1293 EXPECT_TRUE(conflicting_extensions.empty()); | 1307 EXPECT_TRUE(warning_set.empty()); |
| 1294 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1308 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1295 | 1309 |
| 1296 // Ignored redirect (due to precedence). | 1310 // Ignored redirect (due to precedence). |
| 1297 GURL new_url_2("http://bar.com"); | 1311 GURL new_url_2("http://bar.com"); |
| 1298 linked_ptr<EventResponseDelta> d2( | 1312 linked_ptr<EventResponseDelta> d2( |
| 1299 new EventResponseDelta("extid2", base::Time::FromInternalValue(500))); | 1313 new EventResponseDelta("extid2", base::Time::FromInternalValue(500))); |
| 1300 d2->new_url = GURL(new_url_2); | 1314 d2->new_url = GURL(new_url_2); |
| 1301 deltas.push_back(d2); | 1315 deltas.push_back(d2); |
| 1302 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1316 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1317 warning_set.clear(); |
| 1303 capturing_net_log.Clear(); | 1318 capturing_net_log.Clear(); |
| 1304 MergeOnBeforeRequestResponses( | 1319 MergeOnBeforeRequestResponses( |
| 1305 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1320 deltas, &effective_new_url, &warning_set, &net_log); |
| 1306 EXPECT_EQ(new_url_1, effective_new_url); | 1321 EXPECT_EQ(new_url_1, effective_new_url); |
| 1307 EXPECT_EQ(1u, conflicting_extensions.size()); | 1322 EXPECT_EQ(1u, warning_set.size()); |
| 1308 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1323 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1309 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1324 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1310 | 1325 |
| 1311 // Overriding redirect. | 1326 // Overriding redirect. |
| 1312 GURL new_url_3("http://baz.com"); | 1327 GURL new_url_3("http://baz.com"); |
| 1313 linked_ptr<EventResponseDelta> d3( | 1328 linked_ptr<EventResponseDelta> d3( |
| 1314 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500))); | 1329 new EventResponseDelta("extid3", base::Time::FromInternalValue(1500))); |
| 1315 d3->new_url = GURL(new_url_3); | 1330 d3->new_url = GURL(new_url_3); |
| 1316 deltas.push_back(d3); | 1331 deltas.push_back(d3); |
| 1317 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1332 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1318 conflicting_extensions.clear(); | 1333 warning_set.clear(); |
| 1319 capturing_net_log.Clear(); | 1334 capturing_net_log.Clear(); |
| 1320 MergeOnBeforeRequestResponses( | 1335 MergeOnBeforeRequestResponses( |
| 1321 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1336 deltas, &effective_new_url, &warning_set, &net_log); |
| 1322 EXPECT_EQ(new_url_3, effective_new_url); | 1337 EXPECT_EQ(new_url_3, effective_new_url); |
| 1323 EXPECT_EQ(2u, conflicting_extensions.size()); | 1338 EXPECT_EQ(2u, warning_set.size()); |
| 1324 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1")); | 1339 EXPECT_TRUE(HasWarning(warning_set, "extid1")); |
| 1325 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1340 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1326 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1341 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1327 | 1342 |
| 1328 // Check that identical redirects don't cause a conflict. | 1343 // Check that identical redirects don't cause a conflict. |
| 1329 linked_ptr<EventResponseDelta> d4( | 1344 linked_ptr<EventResponseDelta> d4( |
| 1330 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000))); | 1345 new EventResponseDelta("extid4", base::Time::FromInternalValue(2000))); |
| 1331 d4->new_url = GURL(new_url_3); | 1346 d4->new_url = GURL(new_url_3); |
| 1332 deltas.push_back(d4); | 1347 deltas.push_back(d4); |
| 1333 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1348 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1334 conflicting_extensions.clear(); | 1349 warning_set.clear(); |
| 1335 capturing_net_log.Clear(); | 1350 capturing_net_log.Clear(); |
| 1336 MergeOnBeforeRequestResponses( | 1351 MergeOnBeforeRequestResponses( |
| 1337 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1352 deltas, &effective_new_url, &warning_set, &net_log); |
| 1338 EXPECT_EQ(new_url_3, effective_new_url); | 1353 EXPECT_EQ(new_url_3, effective_new_url); |
| 1339 EXPECT_EQ(2u, conflicting_extensions.size()); | 1354 EXPECT_EQ(2u, warning_set.size()); |
| 1340 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid1")); | 1355 EXPECT_TRUE(HasWarning(warning_set, "extid1")); |
| 1341 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1356 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1342 EXPECT_EQ(4u, capturing_net_log.GetSize()); | 1357 EXPECT_EQ(4u, capturing_net_log.GetSize()); |
| 1343 } | 1358 } |
| 1344 | 1359 |
| 1345 // This tests that we can redirect to data:// urls, which is considered | 1360 // This tests that we can redirect to data:// urls, which is considered |
| 1346 // a kind of cancelling requests. | 1361 // a kind of cancelling requests. |
| 1347 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses2) { | 1362 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses2) { |
| 1348 EventResponseDeltas deltas; | 1363 EventResponseDeltas deltas; |
| 1349 net::CapturingBoundNetLog capturing_net_log; | 1364 net::CapturingBoundNetLog capturing_net_log; |
| 1350 net::BoundNetLog net_log = capturing_net_log.bound(); | 1365 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1351 std::set<std::string> conflicting_extensions; | 1366 std::set<ExtensionWarning> warning_set; |
| 1352 GURL effective_new_url; | 1367 GURL effective_new_url; |
| 1353 | 1368 |
| 1354 // Single redirect. | 1369 // Single redirect. |
| 1355 GURL new_url_0("http://foo.com"); | 1370 GURL new_url_0("http://foo.com"); |
| 1356 linked_ptr<EventResponseDelta> d0( | 1371 linked_ptr<EventResponseDelta> d0( |
| 1357 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); | 1372 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); |
| 1358 d0->new_url = GURL(new_url_0); | 1373 d0->new_url = GURL(new_url_0); |
| 1359 deltas.push_back(d0); | 1374 deltas.push_back(d0); |
| 1360 MergeOnBeforeRequestResponses( | 1375 MergeOnBeforeRequestResponses( |
| 1361 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1376 deltas, &effective_new_url, &warning_set, &net_log); |
| 1362 EXPECT_EQ(new_url_0, effective_new_url); | 1377 EXPECT_EQ(new_url_0, effective_new_url); |
| 1363 | 1378 |
| 1364 // Cancel request by redirecting to a data:// URL. This shall override | 1379 // Cancel request by redirecting to a data:// URL. This shall override |
| 1365 // the other redirect but not cause any conflict warnings. | 1380 // the other redirect but not cause any conflict warnings. |
| 1366 GURL new_url_1("data://foo"); | 1381 GURL new_url_1("data://foo"); |
| 1367 linked_ptr<EventResponseDelta> d1( | 1382 linked_ptr<EventResponseDelta> d1( |
| 1368 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); | 1383 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); |
| 1369 d1->new_url = GURL(new_url_1); | 1384 d1->new_url = GURL(new_url_1); |
| 1370 deltas.push_back(d1); | 1385 deltas.push_back(d1); |
| 1371 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1386 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1387 warning_set.clear(); |
| 1372 capturing_net_log.Clear(); | 1388 capturing_net_log.Clear(); |
| 1373 MergeOnBeforeRequestResponses( | 1389 MergeOnBeforeRequestResponses( |
| 1374 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1390 deltas, &effective_new_url, &warning_set, &net_log); |
| 1375 EXPECT_EQ(new_url_1, effective_new_url); | 1391 EXPECT_EQ(new_url_1, effective_new_url); |
| 1376 EXPECT_TRUE(conflicting_extensions.empty()); | 1392 EXPECT_TRUE(warning_set.empty()); |
| 1377 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1393 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1378 | 1394 |
| 1379 // Cancel request by redirecting to the same data:// URL. This shall | 1395 // Cancel request by redirecting to the same data:// URL. This shall |
| 1380 // not create any conflicts as it is in line with d1. | 1396 // not create any conflicts as it is in line with d1. |
| 1381 GURL new_url_2("data://foo"); | 1397 GURL new_url_2("data://foo"); |
| 1382 linked_ptr<EventResponseDelta> d2( | 1398 linked_ptr<EventResponseDelta> d2( |
| 1383 new EventResponseDelta("extid2", base::Time::FromInternalValue(1000))); | 1399 new EventResponseDelta("extid2", base::Time::FromInternalValue(1000))); |
| 1384 d2->new_url = GURL(new_url_2); | 1400 d2->new_url = GURL(new_url_2); |
| 1385 deltas.push_back(d2); | 1401 deltas.push_back(d2); |
| 1386 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1402 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1403 warning_set.clear(); |
| 1387 capturing_net_log.Clear(); | 1404 capturing_net_log.Clear(); |
| 1388 MergeOnBeforeRequestResponses( | 1405 MergeOnBeforeRequestResponses( |
| 1389 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1406 deltas, &effective_new_url, &warning_set, &net_log); |
| 1390 EXPECT_EQ(new_url_1, effective_new_url); | 1407 EXPECT_EQ(new_url_1, effective_new_url); |
| 1391 EXPECT_TRUE(conflicting_extensions.empty()); | 1408 EXPECT_TRUE(warning_set.empty()); |
| 1392 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1409 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1393 | 1410 |
| 1394 // Cancel redirect by redirecting to a different data:// URL. This needs | 1411 // Cancel redirect by redirecting to a different data:// URL. This needs |
| 1395 // to create a conflict. | 1412 // to create a conflict. |
| 1396 GURL new_url_3("data://something_totally_different"); | 1413 GURL new_url_3("data://something_totally_different"); |
| 1397 linked_ptr<EventResponseDelta> d3( | 1414 linked_ptr<EventResponseDelta> d3( |
| 1398 new EventResponseDelta("extid3", base::Time::FromInternalValue(500))); | 1415 new EventResponseDelta("extid3", base::Time::FromInternalValue(500))); |
| 1399 d3->new_url = GURL(new_url_3); | 1416 d3->new_url = GURL(new_url_3); |
| 1400 deltas.push_back(d3); | 1417 deltas.push_back(d3); |
| 1401 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1418 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1419 warning_set.clear(); |
| 1402 capturing_net_log.Clear(); | 1420 capturing_net_log.Clear(); |
| 1403 MergeOnBeforeRequestResponses( | 1421 MergeOnBeforeRequestResponses( |
| 1404 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1422 deltas, &effective_new_url, &warning_set, &net_log); |
| 1405 EXPECT_EQ(new_url_1, effective_new_url); | 1423 EXPECT_EQ(new_url_1, effective_new_url); |
| 1406 EXPECT_EQ(1u, conflicting_extensions.size()); | 1424 EXPECT_EQ(1u, warning_set.size()); |
| 1407 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid3")); | 1425 EXPECT_TRUE(HasWarning(warning_set, "extid3")); |
| 1408 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1426 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1409 } | 1427 } |
| 1410 | 1428 |
| 1411 // This tests that we can redirect to about:blank, which is considered | 1429 // This tests that we can redirect to about:blank, which is considered |
| 1412 // a kind of cancelling requests. | 1430 // a kind of cancelling requests. |
| 1413 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses3) { | 1431 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeRequestResponses3) { |
| 1414 EventResponseDeltas deltas; | 1432 EventResponseDeltas deltas; |
| 1415 net::CapturingBoundNetLog capturing_net_log; | 1433 net::CapturingBoundNetLog capturing_net_log; |
| 1416 net::BoundNetLog net_log = capturing_net_log.bound(); | 1434 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1417 std::set<std::string> conflicting_extensions; | 1435 std::set<ExtensionWarning> warning_set; |
| 1418 GURL effective_new_url; | 1436 GURL effective_new_url; |
| 1419 | 1437 |
| 1420 // Single redirect. | 1438 // Single redirect. |
| 1421 GURL new_url_0("http://foo.com"); | 1439 GURL new_url_0("http://foo.com"); |
| 1422 linked_ptr<EventResponseDelta> d0( | 1440 linked_ptr<EventResponseDelta> d0( |
| 1423 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); | 1441 new EventResponseDelta("extid0", base::Time::FromInternalValue(2000))); |
| 1424 d0->new_url = GURL(new_url_0); | 1442 d0->new_url = GURL(new_url_0); |
| 1425 deltas.push_back(d0); | 1443 deltas.push_back(d0); |
| 1426 MergeOnBeforeRequestResponses( | 1444 MergeOnBeforeRequestResponses( |
| 1427 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1445 deltas, &effective_new_url, &warning_set, &net_log); |
| 1428 EXPECT_EQ(new_url_0, effective_new_url); | 1446 EXPECT_EQ(new_url_0, effective_new_url); |
| 1429 | 1447 |
| 1430 // Cancel request by redirecting to about:blank. This shall override | 1448 // Cancel request by redirecting to about:blank. This shall override |
| 1431 // the other redirect but not cause any conflict warnings. | 1449 // the other redirect but not cause any conflict warnings. |
| 1432 GURL new_url_1("about:blank"); | 1450 GURL new_url_1("about:blank"); |
| 1433 linked_ptr<EventResponseDelta> d1( | 1451 linked_ptr<EventResponseDelta> d1( |
| 1434 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); | 1452 new EventResponseDelta("extid1", base::Time::FromInternalValue(1500))); |
| 1435 d1->new_url = GURL(new_url_1); | 1453 d1->new_url = GURL(new_url_1); |
| 1436 deltas.push_back(d1); | 1454 deltas.push_back(d1); |
| 1437 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1455 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1456 warning_set.clear(); |
| 1438 capturing_net_log.Clear(); | 1457 capturing_net_log.Clear(); |
| 1439 MergeOnBeforeRequestResponses( | 1458 MergeOnBeforeRequestResponses( |
| 1440 deltas, &effective_new_url, &conflicting_extensions, &net_log); | 1459 deltas, &effective_new_url, &warning_set, &net_log); |
| 1441 EXPECT_EQ(new_url_1, effective_new_url); | 1460 EXPECT_EQ(new_url_1, effective_new_url); |
| 1442 EXPECT_TRUE(conflicting_extensions.empty()); | 1461 EXPECT_TRUE(warning_set.empty()); |
| 1443 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1462 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1444 } | 1463 } |
| 1445 | 1464 |
| 1446 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { | 1465 TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { |
| 1447 net::HttpRequestHeaders base_headers; | 1466 net::HttpRequestHeaders base_headers; |
| 1448 base_headers.AddHeaderFromString("key1: value 1"); | 1467 base_headers.AddHeaderFromString("key1: value 1"); |
| 1449 base_headers.AddHeaderFromString("key2: value 2"); | 1468 base_headers.AddHeaderFromString("key2: value 2"); |
| 1450 net::CapturingBoundNetLog capturing_net_log; | 1469 net::CapturingBoundNetLog capturing_net_log; |
| 1451 net::BoundNetLog net_log = capturing_net_log.bound(); | 1470 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1452 std::set<std::string> conflicting_extensions; | 1471 std::set<ExtensionWarning> warning_set; |
| 1453 std::string header_value; | 1472 std::string header_value; |
| 1454 EventResponseDeltas deltas; | 1473 EventResponseDeltas deltas; |
| 1455 | 1474 |
| 1456 // Check that we can handle not changing the headers. | 1475 // Check that we can handle not changing the headers. |
| 1457 linked_ptr<EventResponseDelta> d0( | 1476 linked_ptr<EventResponseDelta> d0( |
| 1458 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); | 1477 new EventResponseDelta("extid0", base::Time::FromInternalValue(2500))); |
| 1459 deltas.push_back(d0); | 1478 deltas.push_back(d0); |
| 1460 net::HttpRequestHeaders headers0; | 1479 net::HttpRequestHeaders headers0; |
| 1461 headers0.MergeFrom(base_headers); | 1480 headers0.MergeFrom(base_headers); |
| 1462 MergeOnBeforeSendHeadersResponses( | 1481 MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log); |
| 1463 deltas, &headers0, &conflicting_extensions, &net_log); | |
| 1464 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); | 1482 ASSERT_TRUE(headers0.GetHeader("key1", &header_value)); |
| 1465 EXPECT_EQ("value 1", header_value); | 1483 EXPECT_EQ("value 1", header_value); |
| 1466 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); | 1484 ASSERT_TRUE(headers0.GetHeader("key2", &header_value)); |
| 1467 EXPECT_EQ("value 2", header_value); | 1485 EXPECT_EQ("value 2", header_value); |
| 1468 EXPECT_EQ(0u, conflicting_extensions.size()); | 1486 EXPECT_EQ(0u, warning_set.size()); |
| 1469 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1487 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1470 | 1488 |
| 1471 // Delete, modify and add a header. | 1489 // Delete, modify and add a header. |
| 1472 linked_ptr<EventResponseDelta> d1( | 1490 linked_ptr<EventResponseDelta> d1( |
| 1473 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1491 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1474 d1->deleted_request_headers.push_back("key1"); | 1492 d1->deleted_request_headers.push_back("key1"); |
| 1475 d1->modified_request_headers.AddHeaderFromString("key2: value 3"); | 1493 d1->modified_request_headers.AddHeaderFromString("key2: value 3"); |
| 1476 d1->modified_request_headers.AddHeaderFromString("key3: value 3"); | 1494 d1->modified_request_headers.AddHeaderFromString("key3: value 3"); |
| 1477 deltas.push_back(d1); | 1495 deltas.push_back(d1); |
| 1478 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1496 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1497 warning_set.clear(); |
| 1498 capturing_net_log.Clear(); |
| 1479 net::HttpRequestHeaders headers1; | 1499 net::HttpRequestHeaders headers1; |
| 1480 headers1.MergeFrom(base_headers); | 1500 headers1.MergeFrom(base_headers); |
| 1481 MergeOnBeforeSendHeadersResponses( | 1501 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); |
| 1482 deltas, &headers1, &conflicting_extensions, &net_log); | |
| 1483 EXPECT_FALSE(headers1.HasHeader("key1")); | 1502 EXPECT_FALSE(headers1.HasHeader("key1")); |
| 1484 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); | 1503 ASSERT_TRUE(headers1.GetHeader("key2", &header_value)); |
| 1485 EXPECT_EQ("value 3", header_value); | 1504 EXPECT_EQ("value 3", header_value); |
| 1486 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); | 1505 ASSERT_TRUE(headers1.GetHeader("key3", &header_value)); |
| 1487 EXPECT_EQ("value 3", header_value); | 1506 EXPECT_EQ("value 3", header_value); |
| 1488 EXPECT_EQ(0u, conflicting_extensions.size()); | 1507 EXPECT_EQ(0u, warning_set.size()); |
| 1489 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1508 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1490 | 1509 |
| 1491 // Check that conflicts are atomic, i.e. if one header modification | 1510 // Check that conflicts are atomic, i.e. if one header modification |
| 1492 // collides all other conflicts of the same extension are declined as well. | 1511 // collides all other conflicts of the same extension are declined as well. |
| 1493 linked_ptr<EventResponseDelta> d2( | 1512 linked_ptr<EventResponseDelta> d2( |
| 1494 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1513 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1495 // This one conflicts: | 1514 // This one conflicts: |
| 1496 d2->modified_request_headers.AddHeaderFromString("key3: value 0"); | 1515 d2->modified_request_headers.AddHeaderFromString("key3: value 0"); |
| 1497 d2->modified_request_headers.AddHeaderFromString("key4: value 4"); | 1516 d2->modified_request_headers.AddHeaderFromString("key4: value 4"); |
| 1498 deltas.push_back(d2); | 1517 deltas.push_back(d2); |
| 1499 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1518 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1500 conflicting_extensions.clear(); | 1519 warning_set.clear(); |
| 1501 capturing_net_log.Clear(); | 1520 capturing_net_log.Clear(); |
| 1502 net::HttpRequestHeaders headers2; | 1521 net::HttpRequestHeaders headers2; |
| 1503 headers2.MergeFrom(base_headers); | 1522 headers2.MergeFrom(base_headers); |
| 1504 MergeOnBeforeSendHeadersResponses( | 1523 MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log); |
| 1505 deltas, &headers2, &conflicting_extensions, &net_log); | |
| 1506 EXPECT_FALSE(headers2.HasHeader("key1")); | 1524 EXPECT_FALSE(headers2.HasHeader("key1")); |
| 1507 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); | 1525 ASSERT_TRUE(headers2.GetHeader("key2", &header_value)); |
| 1508 EXPECT_EQ("value 3", header_value); | 1526 EXPECT_EQ("value 3", header_value); |
| 1509 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); | 1527 ASSERT_TRUE(headers2.GetHeader("key3", &header_value)); |
| 1510 EXPECT_EQ("value 3", header_value); | 1528 EXPECT_EQ("value 3", header_value); |
| 1511 EXPECT_FALSE(headers2.HasHeader("key4")); | 1529 EXPECT_FALSE(headers2.HasHeader("key4")); |
| 1512 EXPECT_EQ(1u, conflicting_extensions.size()); | 1530 EXPECT_EQ(1u, warning_set.size()); |
| 1513 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1531 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1514 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1532 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1515 | 1533 |
| 1516 // Check that identical modifications don't conflict and operations | 1534 // Check that identical modifications don't conflict and operations |
| 1517 // can be merged. | 1535 // can be merged. |
| 1518 linked_ptr<EventResponseDelta> d3( | 1536 linked_ptr<EventResponseDelta> d3( |
| 1519 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 1537 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 1520 d3->deleted_request_headers.push_back("key1"); | 1538 d3->deleted_request_headers.push_back("key1"); |
| 1521 d3->modified_request_headers.AddHeaderFromString("key2: value 3"); | 1539 d3->modified_request_headers.AddHeaderFromString("key2: value 3"); |
| 1522 d3->modified_request_headers.AddHeaderFromString("key5: value 5"); | 1540 d3->modified_request_headers.AddHeaderFromString("key5: value 5"); |
| 1523 deltas.push_back(d3); | 1541 deltas.push_back(d3); |
| 1524 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1542 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1525 conflicting_extensions.clear(); | 1543 warning_set.clear(); |
| 1526 capturing_net_log.Clear(); | 1544 capturing_net_log.Clear(); |
| 1527 net::HttpRequestHeaders headers3; | 1545 net::HttpRequestHeaders headers3; |
| 1528 headers3.MergeFrom(base_headers); | 1546 headers3.MergeFrom(base_headers); |
| 1529 MergeOnBeforeSendHeadersResponses( | 1547 MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log); |
| 1530 deltas, &headers3, &conflicting_extensions, &net_log); | |
| 1531 EXPECT_FALSE(headers3.HasHeader("key1")); | 1548 EXPECT_FALSE(headers3.HasHeader("key1")); |
| 1532 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); | 1549 ASSERT_TRUE(headers3.GetHeader("key2", &header_value)); |
| 1533 EXPECT_EQ("value 3", header_value); | 1550 EXPECT_EQ("value 3", header_value); |
| 1534 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); | 1551 ASSERT_TRUE(headers3.GetHeader("key3", &header_value)); |
| 1535 EXPECT_EQ("value 3", header_value); | 1552 EXPECT_EQ("value 3", header_value); |
| 1536 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); | 1553 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); |
| 1537 EXPECT_EQ("value 5", header_value); | 1554 EXPECT_EQ("value 5", header_value); |
| 1538 EXPECT_EQ(1u, conflicting_extensions.size()); | 1555 EXPECT_EQ(1u, warning_set.size()); |
| 1539 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1556 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1540 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1557 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1541 } | 1558 } |
| 1542 | 1559 |
| 1543 TEST(ExtensionWebRequestHelpersTest, | 1560 TEST(ExtensionWebRequestHelpersTest, |
| 1544 TestMergeOnBeforeSendHeadersResponses_Cookies) { | 1561 TestMergeOnBeforeSendHeadersResponses_Cookies) { |
| 1545 net::HttpRequestHeaders base_headers; | 1562 net::HttpRequestHeaders base_headers; |
| 1546 base_headers.AddHeaderFromString( | 1563 base_headers.AddHeaderFromString( |
| 1547 "Cookie: name=value; name2=value2; name3=value3"); | 1564 "Cookie: name=value; name2=value2; name3=value3"); |
| 1548 net::CapturingBoundNetLog capturing_net_log; | 1565 net::CapturingBoundNetLog capturing_net_log; |
| 1549 net::BoundNetLog net_log = capturing_net_log.bound(); | 1566 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1550 std::set<std::string> conflicting_extensions; | 1567 std::set<ExtensionWarning> warning_set; |
| 1551 std::string header_value; | 1568 std::string header_value; |
| 1552 EventResponseDeltas deltas; | 1569 EventResponseDeltas deltas; |
| 1553 | 1570 |
| 1554 linked_ptr<RequestCookieModification> add_cookie = | 1571 linked_ptr<RequestCookieModification> add_cookie = |
| 1555 make_linked_ptr(new RequestCookieModification); | 1572 make_linked_ptr(new RequestCookieModification); |
| 1556 add_cookie->type = helpers::ADD; | 1573 add_cookie->type = helpers::ADD; |
| 1557 add_cookie->modification.reset(new helpers::RequestCookie); | 1574 add_cookie->modification.reset(new helpers::RequestCookie); |
| 1558 add_cookie->modification->name.reset(new std::string("name4")); | 1575 add_cookie->modification->name.reset(new std::string("name4")); |
| 1559 add_cookie->modification->value.reset(new std::string("\"value 4\"")); | 1576 add_cookie->modification->value.reset(new std::string("\"value 4\"")); |
| 1560 | 1577 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1585 | 1602 |
| 1586 for (size_t i = 0; i < arraysize(operations); ++i) { | 1603 for (size_t i = 0; i < arraysize(operations); ++i) { |
| 1587 linked_ptr<EventResponseDelta> delta( | 1604 linked_ptr<EventResponseDelta> delta( |
| 1588 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1605 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1589 delta->request_cookie_modifications.push_back(operations[i]); | 1606 delta->request_cookie_modifications.push_back(operations[i]); |
| 1590 deltas.push_back(delta); | 1607 deltas.push_back(delta); |
| 1591 } | 1608 } |
| 1592 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1609 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1593 net::HttpRequestHeaders headers1; | 1610 net::HttpRequestHeaders headers1; |
| 1594 headers1.MergeFrom(base_headers); | 1611 headers1.MergeFrom(base_headers); |
| 1595 MergeOnBeforeSendHeadersResponses( | 1612 warning_set.clear(); |
| 1596 deltas, &headers1, &conflicting_extensions, &net_log); | 1613 MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log); |
| 1597 EXPECT_TRUE(headers1.HasHeader("Cookie")); | 1614 EXPECT_TRUE(headers1.HasHeader("Cookie")); |
| 1598 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); | 1615 ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value)); |
| 1599 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); | 1616 EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value); |
| 1600 EXPECT_EQ(0u, conflicting_extensions.size()); | 1617 EXPECT_EQ(0u, warning_set.size()); |
| 1601 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1618 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1602 } | 1619 } |
| 1603 | 1620 |
| 1604 TEST(ExtensionWebRequestHelpersTest, | 1621 TEST(ExtensionWebRequestHelpersTest, |
| 1605 TestMergeCookiesInOnHeadersReceivedResponses) { | 1622 TestMergeCookiesInOnHeadersReceivedResponses) { |
| 1606 net::CapturingBoundNetLog capturing_net_log; | 1623 net::CapturingBoundNetLog capturing_net_log; |
| 1607 net::BoundNetLog net_log = capturing_net_log.bound(); | 1624 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1608 std::set<std::string> conflicting_extensions; | 1625 std::set<ExtensionWarning> warning_set; |
| 1609 std::string header_value; | 1626 std::string header_value; |
| 1610 EventResponseDeltas deltas; | 1627 EventResponseDeltas deltas; |
| 1611 | 1628 |
| 1612 char base_headers_string[] = | 1629 char base_headers_string[] = |
| 1613 "HTTP/1.0 200 OK\r\n" | 1630 "HTTP/1.0 200 OK\r\n" |
| 1614 "Foo: Bar\r\n" | 1631 "Foo: Bar\r\n" |
| 1615 "Set-Cookie: name=value; DOMAIN=google.com; Secure\r\n" | 1632 "Set-Cookie: name=value; DOMAIN=google.com; Secure\r\n" |
| 1616 "Set-Cookie: name2=value2\r\n" | 1633 "Set-Cookie: name2=value2\r\n" |
| 1617 "Set-Cookie: name3=value3\r\n" | 1634 "Set-Cookie: name3=value3\r\n" |
| 1618 "\r\n"; | 1635 "\r\n"; |
| 1619 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1636 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1620 new net::HttpResponseHeaders( | 1637 new net::HttpResponseHeaders( |
| 1621 net::HttpUtil::AssembleRawHeaders( | 1638 net::HttpUtil::AssembleRawHeaders( |
| 1622 base_headers_string, sizeof(base_headers_string)))); | 1639 base_headers_string, sizeof(base_headers_string)))); |
| 1623 | 1640 |
| 1624 // Check that we can handle if not touching the response headers. | 1641 // Check that we can handle if not touching the response headers. |
| 1625 linked_ptr<EventResponseDelta> d0( | 1642 linked_ptr<EventResponseDelta> d0( |
| 1626 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1643 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1627 deltas.push_back(d0); | 1644 deltas.push_back(d0); |
| 1628 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1645 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1629 MergeCookiesInOnHeadersReceivedResponses( | 1646 MergeCookiesInOnHeadersReceivedResponses( |
| 1630 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, | 1647 deltas, base_headers.get(), &new_headers0, &warning_set, &net_log); |
| 1631 &net_log); | |
| 1632 EXPECT_FALSE(new_headers0.get()); | 1648 EXPECT_FALSE(new_headers0.get()); |
| 1633 EXPECT_EQ(0u, conflicting_extensions.size()); | 1649 EXPECT_EQ(0u, warning_set.size()); |
| 1634 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1650 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1635 | 1651 |
| 1636 linked_ptr<ResponseCookieModification> add_cookie = | 1652 linked_ptr<ResponseCookieModification> add_cookie = |
| 1637 make_linked_ptr(new ResponseCookieModification); | 1653 make_linked_ptr(new ResponseCookieModification); |
| 1638 add_cookie->type = helpers::ADD; | 1654 add_cookie->type = helpers::ADD; |
| 1639 add_cookie->modification.reset(new helpers::ResponseCookie); | 1655 add_cookie->modification.reset(new helpers::ResponseCookie); |
| 1640 add_cookie->modification->name.reset(new std::string("name4")); | 1656 add_cookie->modification->name.reset(new std::string("name4")); |
| 1641 add_cookie->modification->value.reset(new std::string("\"value4\"")); | 1657 add_cookie->modification->value.reset(new std::string("\"value4\"")); |
| 1642 | 1658 |
| 1643 linked_ptr<ResponseCookieModification> edit_cookie = | 1659 linked_ptr<ResponseCookieModification> edit_cookie = |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1671 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); | 1687 new EventResponseDelta("extid0", base::Time::FromInternalValue(i * 5))); |
| 1672 delta->response_cookie_modifications.push_back(operations[i]); | 1688 delta->response_cookie_modifications.push_back(operations[i]); |
| 1673 deltas.push_back(delta); | 1689 deltas.push_back(delta); |
| 1674 } | 1690 } |
| 1675 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1691 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1676 scoped_refptr<net::HttpResponseHeaders> headers1( | 1692 scoped_refptr<net::HttpResponseHeaders> headers1( |
| 1677 new net::HttpResponseHeaders( | 1693 new net::HttpResponseHeaders( |
| 1678 net::HttpUtil::AssembleRawHeaders( | 1694 net::HttpUtil::AssembleRawHeaders( |
| 1679 base_headers_string, sizeof(base_headers_string)))); | 1695 base_headers_string, sizeof(base_headers_string)))); |
| 1680 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1696 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1697 warning_set.clear(); |
| 1681 MergeCookiesInOnHeadersReceivedResponses( | 1698 MergeCookiesInOnHeadersReceivedResponses( |
| 1682 deltas, headers1.get(), &new_headers1, &conflicting_extensions, &net_log); | 1699 deltas, headers1.get(), &new_headers1, &warning_set, &net_log); |
| 1683 | 1700 |
| 1684 EXPECT_TRUE(new_headers1->HasHeader("Foo")); | 1701 EXPECT_TRUE(new_headers1->HasHeader("Foo")); |
| 1685 void* iter = NULL; | 1702 void* iter = NULL; |
| 1686 std::string cookie_string; | 1703 std::string cookie_string; |
| 1687 std::set<std::string> expected_cookies; | 1704 std::set<std::string> expected_cookies; |
| 1688 expected_cookies.insert("name=value; domain=google.com; secure"); | 1705 expected_cookies.insert("name=value; domain=google.com; secure"); |
| 1689 expected_cookies.insert("name2=value2; secure"); | 1706 expected_cookies.insert("name2=value2; secure"); |
| 1690 expected_cookies.insert("name4=\"value4\"; secure"); | 1707 expected_cookies.insert("name4=\"value4\"; secure"); |
| 1691 std::set<std::string> actual_cookies; | 1708 std::set<std::string> actual_cookies; |
| 1692 while (new_headers1->EnumerateHeader(&iter, "Set-Cookie", &cookie_string)) | 1709 while (new_headers1->EnumerateHeader(&iter, "Set-Cookie", &cookie_string)) |
| 1693 actual_cookies.insert(cookie_string); | 1710 actual_cookies.insert(cookie_string); |
| 1694 EXPECT_EQ(expected_cookies, actual_cookies); | 1711 EXPECT_EQ(expected_cookies, actual_cookies); |
| 1695 EXPECT_EQ(0u, conflicting_extensions.size()); | 1712 EXPECT_EQ(0u, warning_set.size()); |
| 1696 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1713 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1697 } | 1714 } |
| 1698 | 1715 |
| 1699 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { | 1716 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { |
| 1700 net::CapturingBoundNetLog capturing_net_log; | 1717 net::CapturingBoundNetLog capturing_net_log; |
| 1701 net::BoundNetLog net_log = capturing_net_log.bound(); | 1718 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1702 std::set<std::string> conflicting_extensions; | 1719 std::set<ExtensionWarning> warning_set; |
| 1703 std::string header_value; | 1720 std::string header_value; |
| 1704 EventResponseDeltas deltas; | 1721 EventResponseDeltas deltas; |
| 1705 | 1722 |
| 1706 char base_headers_string[] = | 1723 char base_headers_string[] = |
| 1707 "HTTP/1.0 200 OK\r\n" | 1724 "HTTP/1.0 200 OK\r\n" |
| 1708 "Key1: Value1\r\n" | 1725 "Key1: Value1\r\n" |
| 1709 "Key2: Value2, Foo\r\n" | 1726 "Key2: Value2, Foo\r\n" |
| 1710 "\r\n"; | 1727 "\r\n"; |
| 1711 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1728 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1712 new net::HttpResponseHeaders( | 1729 new net::HttpResponseHeaders( |
| 1713 net::HttpUtil::AssembleRawHeaders( | 1730 net::HttpUtil::AssembleRawHeaders( |
| 1714 base_headers_string, sizeof(base_headers_string)))); | 1731 base_headers_string, sizeof(base_headers_string)))); |
| 1715 | 1732 |
| 1716 // Check that we can handle if not touching the response headers. | 1733 // Check that we can handle if not touching the response headers. |
| 1717 linked_ptr<EventResponseDelta> d0( | 1734 linked_ptr<EventResponseDelta> d0( |
| 1718 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1735 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1719 deltas.push_back(d0); | 1736 deltas.push_back(d0); |
| 1720 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1737 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1721 MergeOnHeadersReceivedResponses( | 1738 MergeOnHeadersReceivedResponses(deltas, base_headers.get(), &new_headers0, |
| 1722 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, | 1739 &warning_set, &net_log); |
| 1723 &net_log); | |
| 1724 EXPECT_FALSE(new_headers0.get()); | 1740 EXPECT_FALSE(new_headers0.get()); |
| 1725 EXPECT_EQ(0u, conflicting_extensions.size()); | 1741 EXPECT_EQ(0u, warning_set.size()); |
| 1726 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1742 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1727 | 1743 |
| 1728 linked_ptr<EventResponseDelta> d1( | 1744 linked_ptr<EventResponseDelta> d1( |
| 1729 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1745 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1730 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); | 1746 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
| 1731 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); | 1747 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); |
| 1732 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | 1748 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); |
| 1733 deltas.push_back(d1); | 1749 deltas.push_back(d1); |
| 1734 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1750 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1735 conflicting_extensions.clear(); | 1751 warning_set.clear(); |
| 1736 capturing_net_log.Clear(); | 1752 capturing_net_log.Clear(); |
| 1737 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1753 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1738 MergeOnHeadersReceivedResponses( | 1754 MergeOnHeadersReceivedResponses( |
| 1739 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | 1755 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); |
| 1740 &net_log); | |
| 1741 ASSERT_TRUE(new_headers1.get()); | 1756 ASSERT_TRUE(new_headers1.get()); |
| 1742 std::multimap<std::string, std::string> expected1; | 1757 std::multimap<std::string, std::string> expected1; |
| 1743 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | 1758 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); |
| 1744 void* iter = NULL; | 1759 void* iter = NULL; |
| 1745 std::string name; | 1760 std::string name; |
| 1746 std::string value; | 1761 std::string value; |
| 1747 std::multimap<std::string, std::string> actual1; | 1762 std::multimap<std::string, std::string> actual1; |
| 1748 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1763 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1749 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1764 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1750 } | 1765 } |
| 1751 EXPECT_EQ(expected1, actual1); | 1766 EXPECT_EQ(expected1, actual1); |
| 1752 EXPECT_EQ(0u, conflicting_extensions.size()); | 1767 EXPECT_EQ(0u, warning_set.size()); |
| 1753 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1768 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1754 | 1769 |
| 1755 // Check that we replace response headers only once. | 1770 // Check that we replace response headers only once. |
| 1756 linked_ptr<EventResponseDelta> d2( | 1771 linked_ptr<EventResponseDelta> d2( |
| 1757 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1772 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1758 // Note that we use a different capitalization of KeY2. This should not | 1773 // Note that we use a different capitalization of KeY2. This should not |
| 1759 // matter. | 1774 // matter. |
| 1760 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); | 1775 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); |
| 1761 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | 1776 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); |
| 1762 deltas.push_back(d2); | 1777 deltas.push_back(d2); |
| 1763 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1778 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1764 conflicting_extensions.clear(); | 1779 warning_set.clear(); |
| 1765 capturing_net_log.Clear(); | 1780 capturing_net_log.Clear(); |
| 1766 scoped_refptr<net::HttpResponseHeaders> new_headers2; | 1781 scoped_refptr<net::HttpResponseHeaders> new_headers2; |
| 1767 MergeOnHeadersReceivedResponses( | 1782 MergeOnHeadersReceivedResponses( |
| 1768 deltas, base_headers.get(), &new_headers2, &conflicting_extensions, | 1783 deltas, base_headers.get(), &new_headers2, &warning_set, &net_log); |
| 1769 &net_log); | |
| 1770 ASSERT_TRUE(new_headers2.get()); | 1784 ASSERT_TRUE(new_headers2.get()); |
| 1771 iter = NULL; | 1785 iter = NULL; |
| 1772 std::multimap<std::string, std::string> actual2; | 1786 std::multimap<std::string, std::string> actual2; |
| 1773 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | 1787 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1774 actual2.insert(std::pair<std::string, std::string>(name, value)); | 1788 actual2.insert(std::pair<std::string, std::string>(name, value)); |
| 1775 } | 1789 } |
| 1776 EXPECT_EQ(expected1, actual2); | 1790 EXPECT_EQ(expected1, actual2); |
| 1777 EXPECT_EQ(1u, conflicting_extensions.size()); | 1791 EXPECT_EQ(1u, warning_set.size()); |
| 1778 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1792 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1779 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1793 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1780 } | 1794 } |
| 1781 | 1795 |
| 1782 // Check that we do not delete too much | 1796 // Check that we do not delete too much |
| 1783 TEST(ExtensionWebRequestHelpersTest, | 1797 TEST(ExtensionWebRequestHelpersTest, |
| 1784 TestMergeOnHeadersReceivedResponsesDeletion) { | 1798 TestMergeOnHeadersReceivedResponsesDeletion) { |
| 1785 net::CapturingBoundNetLog capturing_net_log; | 1799 net::CapturingBoundNetLog capturing_net_log; |
| 1786 net::BoundNetLog net_log = capturing_net_log.bound(); | 1800 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1787 std::set<std::string> conflicting_extensions; | 1801 std::set<ExtensionWarning> warning_set; |
| 1788 std::string header_value; | 1802 std::string header_value; |
| 1789 EventResponseDeltas deltas; | 1803 EventResponseDeltas deltas; |
| 1790 | 1804 |
| 1791 char base_headers_string[] = | 1805 char base_headers_string[] = |
| 1792 "HTTP/1.0 200 OK\r\n" | 1806 "HTTP/1.0 200 OK\r\n" |
| 1793 "Key1: Value1\r\n" | 1807 "Key1: Value1\r\n" |
| 1794 "Key1: Value2\r\n" | 1808 "Key1: Value2\r\n" |
| 1795 "Key1: Value3\r\n" | 1809 "Key1: Value3\r\n" |
| 1796 "Key2: Value4\r\n" | 1810 "Key2: Value4\r\n" |
| 1797 "\r\n"; | 1811 "\r\n"; |
| 1798 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1812 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1799 new net::HttpResponseHeaders( | 1813 new net::HttpResponseHeaders( |
| 1800 net::HttpUtil::AssembleRawHeaders( | 1814 net::HttpUtil::AssembleRawHeaders( |
| 1801 base_headers_string, sizeof(base_headers_string)))); | 1815 base_headers_string, sizeof(base_headers_string)))); |
| 1802 | 1816 |
| 1803 linked_ptr<EventResponseDelta> d1( | 1817 linked_ptr<EventResponseDelta> d1( |
| 1804 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1818 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1805 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | 1819 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); |
| 1806 deltas.push_back(d1); | 1820 deltas.push_back(d1); |
| 1807 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1821 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1808 MergeOnHeadersReceivedResponses( | 1822 MergeOnHeadersReceivedResponses( |
| 1809 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | 1823 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); |
| 1810 &net_log); | |
| 1811 ASSERT_TRUE(new_headers1.get()); | 1824 ASSERT_TRUE(new_headers1.get()); |
| 1812 std::multimap<std::string, std::string> expected1; | 1825 std::multimap<std::string, std::string> expected1; |
| 1813 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | 1826 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); |
| 1814 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | 1827 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); |
| 1815 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | 1828 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); |
| 1816 void* iter = NULL; | 1829 void* iter = NULL; |
| 1817 std::string name; | 1830 std::string name; |
| 1818 std::string value; | 1831 std::string value; |
| 1819 std::multimap<std::string, std::string> actual1; | 1832 std::multimap<std::string, std::string> actual1; |
| 1820 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1833 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1821 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1834 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1822 } | 1835 } |
| 1823 EXPECT_EQ(expected1, actual1); | 1836 EXPECT_EQ(expected1, actual1); |
| 1824 EXPECT_EQ(0u, conflicting_extensions.size()); | 1837 EXPECT_EQ(0u, warning_set.size()); |
| 1825 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1838 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1826 } | 1839 } |
| 1827 | 1840 |
| 1828 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 1841 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
| 1829 net::CapturingBoundNetLog capturing_net_log; | 1842 net::CapturingBoundNetLog capturing_net_log; |
| 1830 net::BoundNetLog net_log = capturing_net_log.bound(); | 1843 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1831 std::set<std::string> conflicting_extensions; | 1844 std::set<ExtensionWarning> warning_set; |
| 1832 EventResponseDeltas deltas; | 1845 EventResponseDeltas deltas; |
| 1833 string16 username = ASCIIToUTF16("foo"); | 1846 string16 username = ASCIIToUTF16("foo"); |
| 1834 string16 password = ASCIIToUTF16("bar"); | 1847 string16 password = ASCIIToUTF16("bar"); |
| 1835 string16 password2 = ASCIIToUTF16("baz"); | 1848 string16 password2 = ASCIIToUTF16("baz"); |
| 1836 | 1849 |
| 1837 // Check that we can handle if not returning credentials. | 1850 // Check that we can handle if not returning credentials. |
| 1838 linked_ptr<EventResponseDelta> d0( | 1851 linked_ptr<EventResponseDelta> d0( |
| 1839 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1852 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1840 deltas.push_back(d0); | 1853 deltas.push_back(d0); |
| 1841 net::AuthCredentials auth0; | 1854 net::AuthCredentials auth0; |
| 1842 bool credentials_set = MergeOnAuthRequiredResponses( | 1855 bool credentials_set = MergeOnAuthRequiredResponses( |
| 1843 deltas, &auth0, &conflicting_extensions, &net_log); | 1856 deltas, &auth0, &warning_set, &net_log); |
| 1844 EXPECT_FALSE(credentials_set); | 1857 EXPECT_FALSE(credentials_set); |
| 1845 EXPECT_TRUE(auth0.Empty()); | 1858 EXPECT_TRUE(auth0.Empty()); |
| 1846 EXPECT_EQ(0u, conflicting_extensions.size()); | 1859 EXPECT_EQ(0u, warning_set.size()); |
| 1847 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1860 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1848 | 1861 |
| 1849 // Check that we can set AuthCredentials. | 1862 // Check that we can set AuthCredentials. |
| 1850 linked_ptr<EventResponseDelta> d1( | 1863 linked_ptr<EventResponseDelta> d1( |
| 1851 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1864 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1852 d1->auth_credentials.reset(new net::AuthCredentials(username, password)); | 1865 d1->auth_credentials.reset(new net::AuthCredentials(username, password)); |
| 1853 deltas.push_back(d1); | 1866 deltas.push_back(d1); |
| 1854 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1867 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1855 conflicting_extensions.clear(); | 1868 warning_set.clear(); |
| 1856 capturing_net_log.Clear(); | 1869 capturing_net_log.Clear(); |
| 1857 net::AuthCredentials auth1; | 1870 net::AuthCredentials auth1; |
| 1858 credentials_set = MergeOnAuthRequiredResponses( | 1871 credentials_set = MergeOnAuthRequiredResponses( |
| 1859 deltas, &auth1, &conflicting_extensions, &net_log); | 1872 deltas, &auth1, &warning_set, &net_log); |
| 1860 EXPECT_TRUE(credentials_set); | 1873 EXPECT_TRUE(credentials_set); |
| 1861 EXPECT_FALSE(auth1.Empty()); | 1874 EXPECT_FALSE(auth1.Empty()); |
| 1862 EXPECT_EQ(username, auth1.username()); | 1875 EXPECT_EQ(username, auth1.username()); |
| 1863 EXPECT_EQ(password, auth1.password()); | 1876 EXPECT_EQ(password, auth1.password()); |
| 1864 EXPECT_EQ(0u, conflicting_extensions.size()); | 1877 EXPECT_EQ(0u, warning_set.size()); |
| 1865 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1878 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1866 | 1879 |
| 1867 // Check that we set AuthCredentials only once. | 1880 // Check that we set AuthCredentials only once. |
| 1868 linked_ptr<EventResponseDelta> d2( | 1881 linked_ptr<EventResponseDelta> d2( |
| 1869 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1882 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1870 d2->auth_credentials.reset(new net::AuthCredentials(username, password2)); | 1883 d2->auth_credentials.reset(new net::AuthCredentials(username, password2)); |
| 1871 deltas.push_back(d2); | 1884 deltas.push_back(d2); |
| 1872 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1885 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1873 conflicting_extensions.clear(); | 1886 warning_set.clear(); |
| 1874 capturing_net_log.Clear(); | 1887 capturing_net_log.Clear(); |
| 1875 net::AuthCredentials auth2; | 1888 net::AuthCredentials auth2; |
| 1876 credentials_set = MergeOnAuthRequiredResponses( | 1889 credentials_set = MergeOnAuthRequiredResponses( |
| 1877 deltas, &auth2, &conflicting_extensions, &net_log); | 1890 deltas, &auth2, &warning_set, &net_log); |
| 1878 EXPECT_TRUE(credentials_set); | 1891 EXPECT_TRUE(credentials_set); |
| 1879 EXPECT_FALSE(auth2.Empty()); | 1892 EXPECT_FALSE(auth2.Empty()); |
| 1880 EXPECT_EQ(username, auth1.username()); | 1893 EXPECT_EQ(username, auth1.username()); |
| 1881 EXPECT_EQ(password, auth1.password()); | 1894 EXPECT_EQ(password, auth1.password()); |
| 1882 EXPECT_EQ(1u, conflicting_extensions.size()); | 1895 EXPECT_EQ(1u, warning_set.size()); |
| 1883 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1896 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1884 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 1897 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 1885 | 1898 |
| 1886 // Check that we can set identical AuthCredentials twice without causing | 1899 // Check that we can set identical AuthCredentials twice without causing |
| 1887 // a conflict. | 1900 // a conflict. |
| 1888 linked_ptr<EventResponseDelta> d3( | 1901 linked_ptr<EventResponseDelta> d3( |
| 1889 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); | 1902 new EventResponseDelta("extid3", base::Time::FromInternalValue(1000))); |
| 1890 d3->auth_credentials.reset(new net::AuthCredentials(username, password)); | 1903 d3->auth_credentials.reset(new net::AuthCredentials(username, password)); |
| 1891 deltas.push_back(d3); | 1904 deltas.push_back(d3); |
| 1892 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1905 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1893 conflicting_extensions.clear(); | 1906 warning_set.clear(); |
| 1894 capturing_net_log.Clear(); | 1907 capturing_net_log.Clear(); |
| 1895 net::AuthCredentials auth3; | 1908 net::AuthCredentials auth3; |
| 1896 credentials_set = MergeOnAuthRequiredResponses( | 1909 credentials_set = MergeOnAuthRequiredResponses( |
| 1897 deltas, &auth3, &conflicting_extensions, &net_log); | 1910 deltas, &auth3, &warning_set, &net_log); |
| 1898 EXPECT_TRUE(credentials_set); | 1911 EXPECT_TRUE(credentials_set); |
| 1899 EXPECT_FALSE(auth3.Empty()); | 1912 EXPECT_FALSE(auth3.Empty()); |
| 1900 EXPECT_EQ(username, auth1.username()); | 1913 EXPECT_EQ(username, auth1.username()); |
| 1901 EXPECT_EQ(password, auth1.password()); | 1914 EXPECT_EQ(password, auth1.password()); |
| 1902 EXPECT_EQ(1u, conflicting_extensions.size()); | 1915 EXPECT_EQ(1u, warning_set.size()); |
| 1903 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1916 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 1904 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 1917 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 1905 } | 1918 } |
| 1919 |
| 1920 } // namespace extensions |
| OLD | NEW |