| 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 |