Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: chrome/browser/extensions/api/web_request/web_request_api_unittest.cc

Issue 10407105: Improve error messaging of webRequest API in case of conflicts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Evan's comments Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698