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

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

Powered by Google App Engine
This is Rietveld 408576698