| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <queue> | 6 #include <queue> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "chrome/test/base/testing_browser_process.h" | 35 #include "chrome/test/base/testing_browser_process.h" |
| 36 #include "chrome/test/base/testing_pref_service_syncable.h" | 36 #include "chrome/test/base/testing_pref_service_syncable.h" |
| 37 #include "chrome/test/base/testing_profile.h" | 37 #include "chrome/test/base/testing_profile.h" |
| 38 #include "chrome/test/base/testing_profile_manager.h" | 38 #include "chrome/test/base/testing_profile_manager.h" |
| 39 #include "content/public/common/url_constants.h" | 39 #include "content/public/common/url_constants.h" |
| 40 #include "content/public/test/test_browser_thread_bundle.h" | 40 #include "content/public/test/test_browser_thread_bundle.h" |
| 41 #include "extensions/common/features/feature.h" | 41 #include "extensions/common/features/feature.h" |
| 42 #include "net/base/auth.h" | 42 #include "net/base/auth.h" |
| 43 #include "net/base/capturing_net_log.h" | 43 #include "net/base/capturing_net_log.h" |
| 44 #include "net/base/net_util.h" | 44 #include "net/base/net_util.h" |
| 45 #include "net/base/request_priority.h" |
| 45 #include "net/base/upload_bytes_element_reader.h" | 46 #include "net/base/upload_bytes_element_reader.h" |
| 46 #include "net/base/upload_data_stream.h" | 47 #include "net/base/upload_data_stream.h" |
| 47 #include "net/base/upload_file_element_reader.h" | 48 #include "net/base/upload_file_element_reader.h" |
| 48 #include "net/dns/mock_host_resolver.h" | 49 #include "net/dns/mock_host_resolver.h" |
| 49 #include "net/url_request/url_request_job_factory_impl.h" | 50 #include "net/url_request/url_request_job_factory_impl.h" |
| 50 #include "net/url_request/url_request_test_util.h" | 51 #include "net/url_request/url_request_test_util.h" |
| 51 #include "testing/gtest/include/gtest/gtest-message.h" | 52 #include "testing/gtest/include/gtest/gtest-message.h" |
| 52 #include "testing/gtest/include/gtest/gtest.h" | 53 #include "testing/gtest/include/gtest/gtest.h" |
| 53 | 54 |
| 54 namespace helpers = extension_web_request_api_helpers; | 55 namespace helpers = extension_web_request_api_helpers; |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 | 234 |
| 234 net::URLRequestJobFactoryImpl job_factory; | 235 net::URLRequestJobFactoryImpl job_factory; |
| 235 job_factory.SetProtocolHandler( | 236 job_factory.SetProtocolHandler( |
| 236 chrome::kAboutScheme, | 237 chrome::kAboutScheme, |
| 237 new chrome_browser_net::AboutProtocolHandler()); | 238 new chrome_browser_net::AboutProtocolHandler()); |
| 238 context_->set_job_factory(&job_factory); | 239 context_->set_job_factory(&job_factory); |
| 239 | 240 |
| 240 GURL redirect_url("about:redirected"); | 241 GURL redirect_url("about:redirected"); |
| 241 GURL not_chosen_redirect_url("about:not_chosen"); | 242 GURL not_chosen_redirect_url("about:not_chosen"); |
| 242 | 243 |
| 243 net::URLRequest request(GURL("about:blank"), &delegate_, context_.get()); | 244 net::URLRequest request( |
| 245 GURL("about:blank"), net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 244 { | 246 { |
| 245 // onBeforeRequest will be dispatched twice initially. The second response - | 247 // onBeforeRequest will be dispatched twice initially. The second response - |
| 246 // the redirect - should win, since it has a later |install_time|. The | 248 // the redirect - should win, since it has a later |install_time|. The |
| 247 // redirect will dispatch another pair of onBeforeRequest. There, the first | 249 // redirect will dispatch another pair of onBeforeRequest. There, the first |
| 248 // response should win (later |install_time|). | 250 // response should win (later |install_time|). |
| 249 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 251 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
| 250 | 252 |
| 251 // Extension1 response. Arrives first, but ignored due to install_time. | 253 // Extension1 response. Arrives first, but ignored due to install_time. |
| 252 response = new ExtensionWebRequestEventRouter::EventResponse( | 254 response = new ExtensionWebRequestEventRouter::EventResponse( |
| 253 extension1_id, base::Time::FromDoubleT(1)); | 255 extension1_id, base::Time::FromDoubleT(1)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 | 289 |
| 288 EXPECT_TRUE(!request.is_pending()); | 290 EXPECT_TRUE(!request.is_pending()); |
| 289 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 291 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); |
| 290 EXPECT_EQ(0, request.status().error()); | 292 EXPECT_EQ(0, request.status().error()); |
| 291 EXPECT_EQ(redirect_url, request.url()); | 293 EXPECT_EQ(redirect_url, request.url()); |
| 292 EXPECT_EQ(2U, request.url_chain().size()); | 294 EXPECT_EQ(2U, request.url_chain().size()); |
| 293 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); | 295 EXPECT_EQ(0U, ipc_sender_.GetNumTasks()); |
| 294 } | 296 } |
| 295 | 297 |
| 296 // Now test the same thing but the extensions answer in reverse order. | 298 // Now test the same thing but the extensions answer in reverse order. |
| 297 net::URLRequest request2(GURL("about:blank"), &delegate_, context_.get()); | 299 net::URLRequest request2( |
| 300 GURL("about:blank"), net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 298 { | 301 { |
| 299 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 302 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
| 300 | 303 |
| 301 // Extension2 response. Arrives first, and chosen because of install_time. | 304 // Extension2 response. Arrives first, and chosen because of install_time. |
| 302 response = new ExtensionWebRequestEventRouter::EventResponse( | 305 response = new ExtensionWebRequestEventRouter::EventResponse( |
| 303 extension2_id, base::Time::FromDoubleT(2)); | 306 extension2_id, base::Time::FromDoubleT(2)); |
| 304 response->new_url = redirect_url; | 307 response->new_url = redirect_url; |
| 305 ipc_sender_.PushTask( | 308 ipc_sender_.PushTask( |
| 306 base::Bind(&EventHandledOnIOThread, | 309 base::Bind(&EventHandledOnIOThread, |
| 307 &profile_, extension2_id, kEventName, kEventName + "/2", | 310 &profile_, extension2_id, kEventName, kEventName + "/2", |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 363 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 361 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", | 364 &profile_, extension1_id, extension1_id, kEventName, kEventName + "/1", |
| 362 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, | 365 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, |
| 363 ipc_sender_factory.GetWeakPtr()); | 366 ipc_sender_factory.GetWeakPtr()); |
| 364 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 367 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 365 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", | 368 &profile_, extension2_id, extension2_id, kEventName, kEventName + "/2", |
| 366 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, | 369 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, |
| 367 ipc_sender_factory.GetWeakPtr()); | 370 ipc_sender_factory.GetWeakPtr()); |
| 368 | 371 |
| 369 GURL request_url("about:blank"); | 372 GURL request_url("about:blank"); |
| 370 net::URLRequest request(request_url, &delegate_, context_.get()); | 373 net::URLRequest request( |
| 374 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 371 | 375 |
| 372 // onBeforeRequest will be dispatched twice. The second response - | 376 // onBeforeRequest will be dispatched twice. The second response - |
| 373 // the redirect - would win, since it has a later |install_time|, but | 377 // the redirect - would win, since it has a later |install_time|, but |
| 374 // the first response takes precedence because cancel >> redirect. | 378 // the first response takes precedence because cancel >> redirect. |
| 375 GURL redirect_url("about:redirected"); | 379 GURL redirect_url("about:redirected"); |
| 376 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 380 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
| 377 | 381 |
| 378 // Extension1 response. Arrives first, would be ignored in principle due to | 382 // Extension1 response. Arrives first, would be ignored in principle due to |
| 379 // install_time but "cancel" always wins. | 383 // install_time but "cancel" always wins. |
| 380 response = new ExtensionWebRequestEventRouter::EventResponse( | 384 response = new ExtensionWebRequestEventRouter::EventResponse( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); | 431 base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
| 428 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 432 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 429 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", | 433 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", |
| 430 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, | 434 filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1, |
| 431 ipc_sender_factory.GetWeakPtr()); | 435 ipc_sender_factory.GetWeakPtr()); |
| 432 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 436 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 433 &profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1", | 437 &profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1", |
| 434 filter, 0, -1, -1, ipc_sender_factory.GetWeakPtr()); | 438 filter, 0, -1, -1, ipc_sender_factory.GetWeakPtr()); |
| 435 | 439 |
| 436 GURL request_url("about:blank"); | 440 GURL request_url("about:blank"); |
| 437 net::URLRequest request(request_url, &delegate_, context_.get()); | 441 net::URLRequest request( |
| 442 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 438 | 443 |
| 439 ExtensionWebRequestEventRouter::EventResponse* response = NULL; | 444 ExtensionWebRequestEventRouter::EventResponse* response = NULL; |
| 440 | 445 |
| 441 // Extension response for the OnBeforeRequest handler. This should not be | 446 // Extension response for the OnBeforeRequest handler. This should not be |
| 442 // processed because request is canceled before the handler responds. | 447 // processed because request is canceled before the handler responds. |
| 443 response = new ExtensionWebRequestEventRouter::EventResponse( | 448 response = new ExtensionWebRequestEventRouter::EventResponse( |
| 444 extension_id, base::Time::FromDoubleT(1)); | 449 extension_id, base::Time::FromDoubleT(1)); |
| 445 GURL redirect_url("about:redirected"); | 450 GURL redirect_url("about:redirected"); |
| 446 response->new_url = redirect_url; | 451 response->new_url = redirect_url; |
| 447 ipc_sender_.PushTask( | 452 ipc_sender_.PushTask( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 | 495 |
| 491 } // namespace | 496 } // namespace |
| 492 | 497 |
| 493 void ExtensionWebRequestTest::FireURLRequestWithData( | 498 void ExtensionWebRequestTest::FireURLRequestWithData( |
| 494 const std::string& method, | 499 const std::string& method, |
| 495 const char* content_type, | 500 const char* content_type, |
| 496 const std::vector<char>& bytes_1, | 501 const std::vector<char>& bytes_1, |
| 497 const std::vector<char>& bytes_2) { | 502 const std::vector<char>& bytes_2) { |
| 498 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme. | 503 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme. |
| 499 GURL request_url("http://www.example.com"); | 504 GURL request_url("http://www.example.com"); |
| 500 net::URLRequest request(request_url, &delegate_, context_.get()); | 505 net::URLRequest request( |
| 506 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 501 request.set_method(method); | 507 request.set_method(method); |
| 502 if (content_type != NULL) | 508 if (content_type != NULL) |
| 503 request.SetExtraRequestHeaderByName(net::HttpRequestHeaders::kContentType, | 509 request.SetExtraRequestHeaderByName(net::HttpRequestHeaders::kContentType, |
| 504 content_type, | 510 content_type, |
| 505 true /* overwrite */); | 511 true /* overwrite */); |
| 506 ScopedVector<net::UploadElementReader> element_readers; | 512 ScopedVector<net::UploadElementReader> element_readers; |
| 507 element_readers.push_back(new net::UploadBytesElementReader( | 513 element_readers.push_back(new net::UploadBytesElementReader( |
| 508 &(bytes_1[0]), bytes_1.size())); | 514 &(bytes_1[0]), bytes_1.size())); |
| 509 element_readers.push_back( | 515 element_readers.push_back( |
| 510 new net::UploadFileElementReader(base::MessageLoopProxy::current().get(), | 516 new net::UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 | 709 |
| 704 // Subscribe to OnBeforeRequest with requestBody requirement. | 710 // Subscribe to OnBeforeRequest with requestBody requirement. |
| 705 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 711 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 706 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", | 712 &profile_, extension_id, extension_id, kEventName, kEventName + "/1", |
| 707 filter, extra_info_spec, -1, -1, ipc_sender_factory.GetWeakPtr()); | 713 filter, extra_info_spec, -1, -1, ipc_sender_factory.GetWeakPtr()); |
| 708 | 714 |
| 709 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme. | 715 // The request URL can be arbitrary but must have an HTTP or HTTPS scheme. |
| 710 const GURL request_url("http://www.example.com"); | 716 const GURL request_url("http://www.example.com"); |
| 711 | 717 |
| 712 for (size_t i = 0; i < arraysize(kMethods); ++i) { | 718 for (size_t i = 0; i < arraysize(kMethods); ++i) { |
| 713 net::URLRequest request(request_url, &delegate_, context_.get()); | 719 net::URLRequest request( |
| 720 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 714 request.set_method(kMethods[i]); | 721 request.set_method(kMethods[i]); |
| 715 ipc_sender_.PushTask(base::Bind(&base::DoNothing)); | 722 ipc_sender_.PushTask(base::Bind(&base::DoNothing)); |
| 716 request.Start(); | 723 request.Start(); |
| 717 } | 724 } |
| 718 | 725 |
| 719 // We inspect the result in the message list of |ipc_sender_| later. | 726 // We inspect the result in the message list of |ipc_sender_| later. |
| 720 base::MessageLoop::current()->RunUntilIdle(); | 727 base::MessageLoop::current()->RunUntilIdle(); |
| 721 | 728 |
| 722 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( | 729 ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( |
| 723 &profile_, extension_id, kEventName + "/1"); | 730 &profile_, extension_id, kEventName + "/1"); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 ipc_sender_factory.GetWeakPtr()); | 829 ipc_sender_factory.GetWeakPtr()); |
| 823 | 830 |
| 824 // Install one extension that observes the final headers. | 831 // Install one extension that observes the final headers. |
| 825 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 832 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
| 826 &profile_, extension3_id, extension3_id, keys::kOnSendHeadersEvent, | 833 &profile_, extension3_id, extension3_id, keys::kOnSendHeadersEvent, |
| 827 std::string(keys::kOnSendHeadersEvent) + "/3", filter, | 834 std::string(keys::kOnSendHeadersEvent) + "/3", filter, |
| 828 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, -1, -1, | 835 ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, -1, -1, |
| 829 ipc_sender_factory.GetWeakPtr()); | 836 ipc_sender_factory.GetWeakPtr()); |
| 830 | 837 |
| 831 GURL request_url("http://doesnotexist/does_not_exist.html"); | 838 GURL request_url("http://doesnotexist/does_not_exist.html"); |
| 832 net::URLRequest request(request_url, &delegate_, context_.get()); | 839 net::URLRequest request( |
| 840 request_url, net::DEFAULT_PRIORITY, &delegate_, context_.get()); |
| 833 | 841 |
| 834 // Initialize headers available before extensions are notified of the | 842 // Initialize headers available before extensions are notified of the |
| 835 // onBeforeSendHeaders event. | 843 // onBeforeSendHeaders event. |
| 836 HeaderModificationTest test = GetParam(); | 844 HeaderModificationTest test = GetParam(); |
| 837 net::HttpRequestHeaders before_headers; | 845 net::HttpRequestHeaders before_headers; |
| 838 for (int i = 0; i < test.before_size; ++i) | 846 for (int i = 0; i < test.before_size; ++i) |
| 839 before_headers.SetHeader(test.before[i].name, test.before[i].value); | 847 before_headers.SetHeader(test.before[i].name, test.before[i].value); |
| 840 request.SetExtraRequestHeaders(before_headers); | 848 request.SetExtraRequestHeaders(before_headers); |
| 841 | 849 |
| 842 // Gather the modifications to the headers for the respective extensions. | 850 // Gather the modifications to the headers for the respective extensions. |
| (...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2130 EXPECT_TRUE(credentials_set); | 2138 EXPECT_TRUE(credentials_set); |
| 2131 EXPECT_FALSE(auth3.Empty()); | 2139 EXPECT_FALSE(auth3.Empty()); |
| 2132 EXPECT_EQ(username, auth1.username()); | 2140 EXPECT_EQ(username, auth1.username()); |
| 2133 EXPECT_EQ(password, auth1.password()); | 2141 EXPECT_EQ(password, auth1.password()); |
| 2134 EXPECT_EQ(1u, warning_set.size()); | 2142 EXPECT_EQ(1u, warning_set.size()); |
| 2135 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2143 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2136 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 2144 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 2137 } | 2145 } |
| 2138 | 2146 |
| 2139 } // namespace extensions | 2147 } // namespace extensions |
| OLD | NEW |