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 |