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 CancelAfterFirstReadURLRequestDelegate : public net::TestDelegate { |
| 21 public: |
| 22 CancelAfterFirstReadURLRequestDelegate() {} |
19 | 23 |
20 // Create a request for a chrome://resource URL passing the supplied |origin| | 24 ~CancelAfterFirstReadURLRequestDelegate() override {} |
21 // header and checking that the response header Access-Control-Allow-Origin has | 25 |
22 // value |expected_access_control_allow_origin_value|. | 26 void OnResponseStarted(net::URLRequest* request) override { |
23 void RunAccessControlAllowOriginTest( | 27 // net::TestDelegate will start the first read. |
24 const std::string& origin, | 28 TestDelegate::OnResponseStarted(request); |
25 const std::string& expected_access_control_allow_origin_value) { | 29 request->Cancel(); |
26 TestBrowserThreadBundle thread_bundle; | 30 } |
27 MockResourceContext resource_context; | 31 |
28 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> protocol_handler( | 32 void OnReadCompleted(net::URLRequest* request, int bytes_read) override { |
29 URLDataManagerBackend::CreateProtocolHandler(&resource_context, false, | 33 // Read should have been cancelled. |
30 nullptr, nullptr)); | 34 EXPECT_EQ(-1, bytes_read); |
31 net::URLRequestContext url_request_context; | 35 } |
32 scoped_ptr<net::URLRequest> request = url_request_context.CreateRequest( | 36 |
33 GURL("chrome://resources/polymer/v1_0/polymer/polymer-extracted.js"), | 37 private: |
34 net::HIGHEST, nullptr); | 38 DISALLOW_COPY_AND_ASSIGN(CancelAfterFirstReadURLRequestDelegate); |
35 request->SetExtraRequestHeaderByName("Origin", origin, true); | 39 }; |
36 scoped_refptr<net::URLRequestJob> job = | 40 |
37 protocol_handler->MaybeCreateJob(request.get(), nullptr); | 41 class UrlDataManagerBackendTest : public testing::Test { |
38 ASSERT_TRUE(job); | 42 public: |
39 job->Start(); | 43 UrlDataManagerBackendTest() { |
| 44 // URLRequestJobFactory takes ownership of the passed in ProtocolHandler. |
| 45 url_request_job_factory_.SetProtocolHandler( |
| 46 "chrome", |
| 47 URLDataManagerBackend::CreateProtocolHandler( |
| 48 &resource_context_, false, nullptr, nullptr)); |
| 49 url_request_context_.set_job_factory(&url_request_job_factory_); |
| 50 } |
| 51 |
| 52 scoped_ptr<net::URLRequest> CreateRequest(net::URLRequest::Delegate* delegate, |
| 53 const char* origin) { |
| 54 scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest( |
| 55 GURL("chrome://resources/polymer/v1_0/polymer/polymer-extracted.js"), |
| 56 net::HIGHEST, delegate); |
| 57 request->SetExtraRequestHeaderByName("Origin", origin, true); |
| 58 return request.Pass(); |
| 59 } |
| 60 |
| 61 protected: |
| 62 TestBrowserThreadBundle thread_bundle_; |
| 63 MockResourceContext resource_context_; |
| 64 net::URLRequestJobFactoryImpl url_request_job_factory_; |
| 65 net::URLRequestContext url_request_context_; |
| 66 net::TestDelegate delegate_; |
| 67 }; |
| 68 |
| 69 TEST_F(UrlDataManagerBackendTest, AccessControlAllowOriginChromeUrl) { |
| 70 scoped_ptr<net::URLRequest> request( |
| 71 CreateRequest(&delegate_, "chrome://webui")); |
| 72 request->Start(); |
40 base::RunLoop().RunUntilIdle(); | 73 base::RunLoop().RunUntilIdle(); |
41 net::HttpResponseInfo response; | 74 EXPECT_TRUE(request->response_headers()->HasHeaderValue( |
42 job->GetResponseInfo(&response); | 75 "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 } | 76 } |
47 | 77 |
48 } // namespace | 78 TEST_F(UrlDataManagerBackendTest, AccessControlAllowOriginNonChromeUrl) { |
49 | 79 scoped_ptr<net::URLRequest> request( |
50 TEST(UrlDataManagerBackendTest, AccessControlAllowOriginChromeUrl) { | 80 CreateRequest(&delegate_, "http://www.example.com")); |
51 RunAccessControlAllowOriginTest("chrome://webui", "chrome://webui"); | 81 request->Start(); |
| 82 base::RunLoop().RunUntilIdle(); |
| 83 EXPECT_TRUE(request->response_headers()->HasHeaderValue( |
| 84 "Access-Control-Allow-Origin", "null")); |
52 } | 85 } |
53 | 86 |
54 TEST(UrlDataManagerBackendTest, AccessControlAllowOriginNonChromeUrl) { | 87 // Check that the URLRequest isn't passed headers after cancellation. |
55 RunAccessControlAllowOriginTest("http://www.example.com", "null"); | 88 TEST_F(UrlDataManagerBackendTest, CancelBeforeResponseStarts) { |
| 89 scoped_ptr<net::URLRequest> request( |
| 90 CreateRequest(&delegate_, "chrome://webui")); |
| 91 request->Start(); |
| 92 request->Cancel(); |
| 93 base::RunLoop().RunUntilIdle(); |
| 94 EXPECT_EQ(net::URLRequestStatus::CANCELED, request->status().status()); |
| 95 EXPECT_EQ(1, delegate_.response_started_count()); |
| 96 } |
| 97 |
| 98 // Check that the URLRequest isn't passed data after cancellation. |
| 99 TEST_F(UrlDataManagerBackendTest, CancelAfterFirstReadStarted) { |
| 100 CancelAfterFirstReadURLRequestDelegate cancel_delegate; |
| 101 scoped_ptr<net::URLRequest> request( |
| 102 CreateRequest(&cancel_delegate, "chrome://webui")); |
| 103 request->Start(); |
| 104 base::RunLoop().RunUntilIdle(); |
| 105 |
| 106 EXPECT_EQ(net::URLRequestStatus::CANCELED, request->status().status()); |
| 107 EXPECT_EQ(1, cancel_delegate.response_started_count()); |
| 108 EXPECT_EQ("", cancel_delegate.data_received()); |
56 } | 109 } |
57 | 110 |
58 } // namespace content | 111 } // namespace content |
OLD | NEW |