OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <queue> | 5 #include <queue> |
6 #include <map> | 6 #include <map> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 120 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
121 | 121 |
122 protected: | 122 protected: |
123 virtual void SetUp() OVERRIDE { | 123 virtual void SetUp() OVERRIDE { |
124 event_router_ = new ExtensionEventRouterForwarder(); | 124 event_router_ = new ExtensionEventRouterForwarder(); |
125 enable_referrers_.Init( | 125 enable_referrers_.Init( |
126 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 126 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
127 network_delegate_.reset(new ChromeNetworkDelegate( | 127 network_delegate_.reset(new ChromeNetworkDelegate( |
128 event_router_.get(), NULL, NULL, &profile_, | 128 event_router_.get(), NULL, NULL, &profile_, |
129 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_)); | 129 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_)); |
130 context_ = new TestURLRequestContext(); | 130 context_.reset(new TestURLRequestContext()); |
131 context_->set_network_delegate(network_delegate_.get()); | 131 context_->set_network_delegate(network_delegate_.get()); |
132 } | 132 } |
133 | 133 |
134 MessageLoopForIO message_loop_; | 134 MessageLoopForIO message_loop_; |
135 content::TestBrowserThread ui_thread_; | 135 content::TestBrowserThread ui_thread_; |
136 content::TestBrowserThread io_thread_; | 136 content::TestBrowserThread io_thread_; |
137 TestingProfile profile_; | 137 TestingProfile profile_; |
138 TestDelegate delegate_; | 138 TestDelegate delegate_; |
139 BooleanPrefMember enable_referrers_; | 139 BooleanPrefMember enable_referrers_; |
140 TestIPCSender ipc_sender_; | 140 TestIPCSender ipc_sender_; |
141 scoped_refptr<ExtensionEventRouterForwarder> event_router_; | 141 scoped_refptr<ExtensionEventRouterForwarder> event_router_; |
142 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 142 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
143 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 143 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
144 scoped_refptr<TestURLRequestContext> context_; | 144 scoped_ptr<TestURLRequestContext> context_; |
145 }; | 145 }; |
146 | 146 |
147 // Tests that we handle disagreements among extensions about responses to | 147 // Tests that we handle disagreements among extensions about responses to |
148 // blocking events (redirection) by choosing the response from the | 148 // blocking events (redirection) by choosing the response from the |
149 // most-recently-installed extension. | 149 // most-recently-installed extension. |
150 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { | 150 TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { |
151 std::string extension1_id("1"); | 151 std::string extension1_id("1"); |
152 std::string extension2_id("2"); | 152 std::string extension2_id("2"); |
153 ExtensionWebRequestEventRouter::RequestFilter filter; | 153 ExtensionWebRequestEventRouter::RequestFilter filter; |
154 const std::string kEventName(keys::kOnBeforeRequest); | 154 const std::string kEventName(keys::kOnBeforeRequest); |
155 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); | 155 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
156 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 156 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
157 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", | 157 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", |
158 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, | 158 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, |
159 ipc_sender_factory.GetWeakPtr()); | 159 ipc_sender_factory.GetWeakPtr()); |
160 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 160 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
161 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", | 161 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", |
162 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, | 162 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, |
163 ipc_sender_factory.GetWeakPtr()); | 163 ipc_sender_factory.GetWeakPtr()); |
164 | 164 |
165 GURL redirect_url("about:redirected"); | 165 GURL redirect_url("about:redirected"); |
166 GURL not_chosen_redirect_url("about:not_chosen"); | 166 GURL not_chosen_redirect_url("about:not_chosen"); |
167 | 167 |
168 net::URLRequest request(GURL("about:blank"), &delegate_); | 168 net::URLRequest request(GURL("about:blank"), &delegate_); |
169 request.set_context(context_); | 169 request.set_context(context_.get()); |
170 { | 170 { |
171 // onBeforeRequest will be dispatched twice initially. The second response - | 171 // onBeforeRequest will be dispatched twice initially. The second response - |
172 // the redirect - should win, since it has a later |install_time|. The | 172 // the redirect - should win, since it has a later |install_time|. The |
173 // redirect will dispatch another pair of onBeforeRequest. There, the first | 173 // redirect will dispatch another pair of onBeforeRequest. There, the first |
174 // response should win (later |install_time|). | 174 // response should win (later |install_time|). |
175 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 175 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
176 | 176 |
177 // Extension1 response. Arrives first, but ignored due to install_time. | 177 // Extension1 response. Arrives first, but ignored due to install_time. |
178 response = new ExtensionWebRequestEventRouter::EventResponse( | 178 response = new ExtensionWebRequestEventRouter::EventResponse( |
179 extension1_id, base::Time::FromDoubleT(1)); | 179 extension1_id, base::Time::FromDoubleT(1)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 EXPECT_TRUE(!request.is_pending()); | 214 EXPECT_TRUE(!request.is_pending()); |
215 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 215 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
216 EXPECT_EQ(0, request.status().error()); | 216 EXPECT_EQ(0, request.status().error()); |
217 EXPECT_EQ(redirect_url, request.url()); | 217 EXPECT_EQ(redirect_url, request.url()); |
218 EXPECT_EQ(2U, request.url_chain().size()); | 218 EXPECT_EQ(2U, request.url_chain().size()); |
219 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); | 219 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); |
220 } | 220 } |
221 | 221 |
222 // Now test the same thing but the extensions answer in reverse order. | 222 // Now test the same thing but the extensions answer in reverse order. |
223 net::URLRequest request2(GURL("about:blank"), &delegate_); | 223 net::URLRequest request2(GURL("about:blank"), &delegate_); |
224 request2.set_context(context_); | 224 request2.set_context(context_.get()); |
225 { | 225 { |
226 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 226 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
227 | 227 |
228 // Extension2 response. Arrives first, and chosen because of install_time. | 228 // Extension2 response. Arrives first, and chosen because of install_time. |
229 response = new ExtensionWebRequestEventRouter::EventResponse( | 229 response = new ExtensionWebRequestEventRouter::EventResponse( |
230 extension2_id, base::Time::FromDoubleT(2)); | 230 extension2_id, base::Time::FromDoubleT(2)); |
231 response->new_url = redirect_url; | 231 response->new_url = redirect_url; |
232 ipc_sender_.PushTask( | 232 ipc_sender_.PushTask( |
233 base::Bind(&EventHandledOnIOThread, | 233 base::Bind(&EventHandledOnIOThread, |
234 &profile_, extension2_id, kEventName, kEventName + "/2", | 234 &profile_, extension2_id, kEventName, kEventName + "/2", |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", | 288 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", |
289 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, | 289 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, |
290 ipc_sender_factory.GetWeakPtr()); | 290 ipc_sender_factory.GetWeakPtr()); |
291 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 291 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
292 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", | 292 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", |
293 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, | 293 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, |
294 ipc_sender_factory.GetWeakPtr()); | 294 ipc_sender_factory.GetWeakPtr()); |
295 | 295 |
296 GURL request_url("about:blank"); | 296 GURL request_url("about:blank"); |
297 net::URLRequest request(request_url, &delegate_); | 297 net::URLRequest request(request_url, &delegate_); |
298 request.set_context(context_); | 298 request.set_context(context_.get()); |
299 | 299 |
300 // onBeforeRequest will be dispatched twice. The second response - | 300 // onBeforeRequest will be dispatched twice. The second response - |
301 // the redirect - would win, since it has a later |install_time|, but | 301 // the redirect - would win, since it has a later |install_time|, but |
302 // the first response takes precedence because cancel >> redirect. | 302 // the first response takes precedence because cancel >> redirect. |
303 GURL redirect_url("about:redirected"); | 303 GURL redirect_url("about:redirected"); |
304 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 304 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
305 | 305 |
306 // Extension1 response. Arrives first, would be ignored in principle due to | 306 // Extension1 response. Arrives first, would be ignored in principle due to |
307 // install_time but "cancel" always wins. | 307 // install_time but "cancel" always wins. |
308 response = new ExtensionWebRequestEventRouter::EventResponse( | 308 response = new ExtensionWebRequestEventRouter::EventResponse( |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 356 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
357 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", | 357 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", |
358 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, | 358 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, |
359 ipc_sender_factory.GetWeakPtr()); | 359 ipc_sender_factory.GetWeakPtr()); |
360 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 360 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
361 &profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1", | 361 &profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1", |
362 filter, 0, ipc_sender_factory.GetWeakPtr()); | 362 filter, 0, ipc_sender_factory.GetWeakPtr()); |
363 | 363 |
364 GURL request_url("about:blank"); | 364 GURL request_url("about:blank"); |
365 net::URLRequest request(request_url, &delegate_); | 365 net::URLRequest request(request_url, &delegate_); |
366 request.set_context(context_); | 366 request.set_context(context_.get()); |
367 | 367 |
368 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 368 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
369 | 369 |
370 // Extension response for the OnBeforeRequest handler. This should not be | 370 // Extension response for the OnBeforeRequest handler. This should not be |
371 // processed because request is canceled before the handler responds. | 371 // processed because request is canceled before the handler responds. |
372 response = new ExtensionWebRequestEventRouter::EventResponse( | 372 response = new ExtensionWebRequestEventRouter::EventResponse( |
373 extension_id, base::Time::FromDoubleT(1)); | 373 extension_id, base::Time::FromDoubleT(1)); |
374 GURL redirect_url("about:redirected"); | 374 GURL redirect_url("about:redirected"); |
375 response->new_url = redirect_url; | 375 response->new_url = redirect_url; |
376 ipc_sender_.PushTask( | 376 ipc_sender_.PushTask( |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 io_thread_(content::BrowserThread::IO, &message_loop_) {} | 437 io_thread_(content::BrowserThread::IO, &message_loop_) {} |
438 | 438 |
439 protected: | 439 protected: |
440 virtual void SetUp() { | 440 virtual void SetUp() { |
441 event_router_ = new ExtensionEventRouterForwarder(); | 441 event_router_ = new ExtensionEventRouterForwarder(); |
442 enable_referrers_.Init( | 442 enable_referrers_.Init( |
443 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); | 443 prefs::kEnableReferrers, profile_.GetTestingPrefService(), NULL); |
444 network_delegate_.reset(new ChromeNetworkDelegate( | 444 network_delegate_.reset(new ChromeNetworkDelegate( |
445 event_router_.get(), NULL, NULL, &profile_, | 445 event_router_.get(), NULL, NULL, &profile_, |
446 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_)); | 446 CookieSettings::Factory::GetForProfile(&profile_), &enable_referrers_)); |
447 context_ = new TestURLRequestContext(); | 447 context_.reset(new TestURLRequestContext()); |
448 context_->set_network_delegate(network_delegate_.get()); | 448 context_->set_network_delegate(network_delegate_.get()); |
449 } | 449 } |
450 | 450 |
451 MessageLoopForIO message_loop_; | 451 MessageLoopForIO message_loop_; |
452 content::TestBrowserThread ui_thread_; | 452 content::TestBrowserThread ui_thread_; |
453 content::TestBrowserThread io_thread_; | 453 content::TestBrowserThread io_thread_; |
454 TestingProfile profile_; | 454 TestingProfile profile_; |
455 TestDelegate delegate_; | 455 TestDelegate delegate_; |
456 BooleanPrefMember enable_referrers_; | 456 BooleanPrefMember enable_referrers_; |
457 TestIPCSender ipc_sender_; | 457 TestIPCSender ipc_sender_; |
458 scoped_refptr<ExtensionEventRouterForwarder> event_router_; | 458 scoped_refptr<ExtensionEventRouterForwarder> event_router_; |
459 scoped_refptr<ExtensionInfoMap> extension_info_map_; | 459 scoped_refptr<ExtensionInfoMap> extension_info_map_; |
460 scoped_ptr<ChromeNetworkDelegate> network_delegate_; | 460 scoped_ptr<ChromeNetworkDelegate> network_delegate_; |
461 scoped_refptr<TestURLRequestContext> context_; | 461 scoped_ptr<TestURLRequestContext> context_; |
462 }; | 462 }; |
463 | 463 |
464 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { | 464 TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { |
465 std::string extension1_id("1"); | 465 std::string extension1_id("1"); |
466 std::string extension2_id("2"); | 466 std::string extension2_id("2"); |
467 std::string extension3_id("3"); | 467 std::string extension3_id("3"); |
468 ExtensionWebRequestEventRouter::RequestFilter filter; | 468 ExtensionWebRequestEventRouter::RequestFilter filter; |
469 const std::string kEventName(keys::kOnBeforeSendHeaders); | 469 const std::string kEventName(keys::kOnBeforeSendHeaders); |
470 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); | 470 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
471 | 471 |
(...skipping 10 matching lines...) Expand all Loading... |
482 | 482 |
483 // Install one extension that observes the final headers. | 483 // Install one extension that observes the final headers. |
484 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 484 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
485 &profile_, extension3_id, extension3_id, keys::kOnSendHeaders, | 485 &profile_, extension3_id, extension3_id, keys::kOnSendHeaders, |
486 std::string(keys::kOnSendHeaders) + "/3", filter, | 486 std::string(keys::kOnSendHeaders) + "/3", filter, |
487 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, | 487 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, |
488 ipc_sender_factory.GetWeakPtr()); | 488 ipc_sender_factory.GetWeakPtr()); |
489 | 489 |
490 GURL request_url("http://doesnotexist/does_not_exist.html"); | 490 GURL request_url("http://doesnotexist/does_not_exist.html"); |
491 net::URLRequest request(request_url, &delegate_); | 491 net::URLRequest request(request_url, &delegate_); |
492 request.set_context(context_); | 492 request.set_context(context_.get()); |
493 | 493 |
494 // Initialize headers available before extensions are notified of the | 494 // Initialize headers available before extensions are notified of the |
495 // onBeforeSendHeaders event. | 495 // onBeforeSendHeaders event. |
496 HeaderModificationTest test = GetParam(); | 496 HeaderModificationTest test = GetParam(); |
497 net::HttpRequestHeaders before_headers; | 497 net::HttpRequestHeaders before_headers; |
498 for (int i = 0; i < test.before_size; ++i) | 498 for (int i = 0; i < test.before_size; ++i) |
499 before_headers.SetHeader(test.before[i].name, test.before[i].value); | 499 before_headers.SetHeader(test.before[i].name, test.before[i].value); |
500 request.SetExtraRequestHeaders(before_headers); | 500 request.SetExtraRequestHeaders(before_headers); |
501 | 501 |
502 // Gather the modifications to the headers for the respective extensions. | 502 // Gather the modifications to the headers for the respective extensions. |
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 }; | 1500 }; |
1501 for (size_t i = 0; i < arraysize(sensitive_urls); ++i) { | 1501 for (size_t i = 0; i < arraysize(sensitive_urls); ++i) { |
1502 EXPECT_TRUE(helpers::HideRequestForURL(GURL(sensitive_urls[i]))) | 1502 EXPECT_TRUE(helpers::HideRequestForURL(GURL(sensitive_urls[i]))) |
1503 << sensitive_urls[i]; | 1503 << sensitive_urls[i]; |
1504 } | 1504 } |
1505 for (size_t i = 0; i < arraysize(non_sensitive_urls); ++i) { | 1505 for (size_t i = 0; i < arraysize(non_sensitive_urls); ++i) { |
1506 EXPECT_FALSE(helpers::HideRequestForURL(GURL(non_sensitive_urls[i]))) | 1506 EXPECT_FALSE(helpers::HideRequestForURL(GURL(non_sensitive_urls[i]))) |
1507 << non_sensitive_urls[i]; | 1507 << non_sensitive_urls[i]; |
1508 } | 1508 } |
1509 } | 1509 } |
OLD | NEW |