Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/run_loop.h" | 6 #include "base/run_loop.h" |
| 7 #include "content/browser/webui/url_data_manager_backend.h" | 7 #include "content/browser/webui/url_data_manager_backend.h" |
| 8 #include "content/public/test/mock_resource_context.h" | 8 #include "content/public/test/mock_resource_context.h" |
| 9 #include "content/public/test/test_browser_thread_bundle.h" | 9 #include "content/public/test/test_browser_thread_bundle.h" |
| 10 #include "net/http/http_response_headers.h" | 10 #include "net/http/http_response_headers.h" |
| 11 #include "net/http/http_response_info.h" | 11 #include "net/http/http_response_info.h" |
| 12 #include "net/url_request/url_request_context.h" | 12 #include "net/url_request/url_request_context.h" |
| 13 #include "net/url_request/url_request_job.h" | 13 #include "net/url_request/url_request_job.h" |
| 14 #include "net/url_request/url_request_job_factory_impl.h" | |
| 15 #include "net/url_request/url_request_test_util.h" | |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 17 |
| 16 namespace content { | 18 namespace content { |
| 17 | 19 |
| 18 namespace { | 20 class CancelAfterFirstReadDelegate : public net::TestDelegate { |
| 21 public: | |
| 22 CancelAfterFirstReadDelegate() {} | |
| 23 ~CancelAfterFirstReadDelegate() override {} | |
| 19 | 24 |
| 20 // Create a request for a chrome://resource URL passing the supplied |origin| | 25 // Cancels the request, after starting the first read. |
| 21 // header and checking that the response header Access-Control-Allow-Origin has | 26 void OnResponseStarted(net::URLRequest* request) override { |
| 22 // value |expected_access_control_allow_origin_value|. | 27 // net::TestDelegate will start the first read. |
| 23 void RunAccessControlAllowOriginTest( | 28 TestDelegate::OnResponseStarted(request); |
| 24 const std::string& origin, | 29 request->Cancel(); |
| 25 const std::string& expected_access_control_allow_origin_value) { | 30 } |
|
davidben
2015/08/05 18:56:39
Do you want to override OnReadCompleted like the o
mmenke
2015/08/05 20:00:24
Done. I've gone ahead and make the classes identi
| |
| 26 TestBrowserThreadBundle thread_bundle; | 31 |
| 27 MockResourceContext resource_context; | 32 private: |
| 28 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> protocol_handler( | 33 DISALLOW_COPY_AND_ASSIGN(CancelAfterFirstReadDelegate); |
| 29 URLDataManagerBackend::CreateProtocolHandler(&resource_context, false, | 34 }; |
| 30 nullptr, nullptr)); | 35 |
| 31 net::URLRequestContext url_request_context; | 36 class UrlDataManagerBackendTest : public testing::Test { |
| 32 scoped_ptr<net::URLRequest> request = url_request_context.CreateRequest( | 37 public: |
| 33 GURL("chrome://resources/polymer/v1_0/polymer/polymer-extracted.js"), | 38 UrlDataManagerBackendTest() { |
| 34 net::HIGHEST, nullptr); | 39 // URLRequestJobFactory takes ownership of the passed in ProtocolHandler. |
| 35 request->SetExtraRequestHeaderByName("Origin", origin, true); | 40 url_request_job_factory_.SetProtocolHandler( |
| 36 scoped_refptr<net::URLRequestJob> job = | 41 "chrome", |
| 37 protocol_handler->MaybeCreateJob(request.get(), nullptr); | 42 URLDataManagerBackend::CreateProtocolHandler( |
| 38 ASSERT_TRUE(job); | 43 &resource_context_, false, nullptr, nullptr)); |
| 39 job->Start(); | 44 url_request_context_.set_job_factory(&url_request_job_factory_); |
| 45 } | |
| 46 | |
| 47 scoped_ptr<net::URLRequest> CreateRequest(net::URLRequest::Delegate* delegate, | |
| 48 const char* origin) { | |
| 49 scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest( | |
| 50 GURL("chrome://resources/polymer/v1_0/polymer/polymer-extracted.js"), | |
| 51 net::HIGHEST, delegate); | |
| 52 request->SetExtraRequestHeaderByName("Origin", origin, true); | |
| 53 return request.Pass(); | |
| 54 } | |
| 55 | |
| 56 protected: | |
| 57 TestBrowserThreadBundle thread_bundle_; | |
| 58 MockResourceContext resource_context_; | |
| 59 net::URLRequestJobFactoryImpl url_request_job_factory_; | |
| 60 net::URLRequestContext url_request_context_; | |
| 61 net::TestDelegate delegate_; | |
| 62 }; | |
| 63 | |
| 64 TEST_F(UrlDataManagerBackendTest, AccessControlAllowOriginChromeUrl) { | |
| 65 scoped_ptr<net::URLRequest> request( | |
| 66 CreateRequest(&delegate_, "chrome://webui")); | |
| 67 request->Start(); | |
| 40 base::RunLoop().RunUntilIdle(); | 68 base::RunLoop().RunUntilIdle(); |
| 41 net::HttpResponseInfo response; | 69 EXPECT_TRUE(request->response_headers()->HasHeaderValue( |
| 42 job->GetResponseInfo(&response); | 70 "Access-Control-Allow-Origin", "chrome://webui")); |
| 43 EXPECT_TRUE(response.headers->HasHeaderValue( | |
| 44 "Access-Control-Allow-Origin", | |
| 45 expected_access_control_allow_origin_value)); | |
| 46 } | 71 } |
| 47 | 72 |
| 48 } // namespace | 73 TEST_F(UrlDataManagerBackendTest, AccessControlAllowOriginNonChromeUrl) { |
| 49 | 74 scoped_ptr<net::URLRequest> request( |
| 50 TEST(UrlDataManagerBackendTest, AccessControlAllowOriginChromeUrl) { | 75 CreateRequest(&delegate_, "http://www.example.com")); |
| 51 RunAccessControlAllowOriginTest("chrome://webui", "chrome://webui"); | 76 request->Start(); |
| 77 base::RunLoop().RunUntilIdle(); | |
| 78 EXPECT_TRUE(request->response_headers()->HasHeaderValue( | |
| 79 "Access-Control-Allow-Origin", "null")); | |
| 52 } | 80 } |
| 53 | 81 |
| 54 TEST(UrlDataManagerBackendTest, AccessControlAllowOriginNonChromeUrl) { | 82 // Check that the URLRequestJob isn't passed headers after cancellation. |
|
davidben
2015/08/05 18:56:39
URLRequestJob -> URLRequest?
mmenke
2015/08/05 20:00:24
Done.
| |
| 55 RunAccessControlAllowOriginTest("http://www.example.com", "null"); | 83 TEST_F(UrlDataManagerBackendTest, CancelBeforeResponseStarts) { |
| 84 scoped_ptr<net::URLRequest> request( | |
| 85 CreateRequest(&delegate_, "chrome://webui")); | |
| 86 request->Start(); | |
| 87 request->Cancel(); | |
| 88 base::RunLoop().RunUntilIdle(); | |
| 89 EXPECT_EQ(net::URLRequestStatus::CANCELED, request->status().status()); | |
| 90 EXPECT_EQ(1, delegate_.response_started_count()); | |
| 91 } | |
| 92 | |
| 93 // Check that the URLRequestJob isn't passed data after cancellation. | |
|
davidben
2015/08/05 18:56:39
Ditto.
mmenke
2015/08/05 20:00:24
Done.
| |
| 94 TEST_F(UrlDataManagerBackendTest, CancelAfterFirstReadStarted) { | |
| 95 CancelAfterFirstReadDelegate cancel_delegate; | |
| 96 scoped_ptr<net::URLRequest> request( | |
| 97 CreateRequest(&cancel_delegate, "chrome://webui")); | |
| 98 request->Start(); | |
| 99 base::RunLoop().RunUntilIdle(); | |
| 100 | |
| 101 EXPECT_EQ(net::URLRequestStatus::CANCELED, request->status().status()); | |
| 102 EXPECT_EQ(1, cancel_delegate.response_started_count()); | |
| 103 EXPECT_EQ("", cancel_delegate.data_received()); | |
| 56 } | 104 } |
| 57 | 105 |
| 58 } // namespace content | 106 } // namespace content |
| OLD | NEW |