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