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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
11 #include "base/memory/scoped_vector.h" | 11 #include "base/memory/scoped_vector.h" |
12 #include "base/memory/shared_memory.h" | 12 #include "base/memory/shared_memory.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/pickle.h" | 14 #include "base/pickle.h" |
15 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
17 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 18 #include "content/browser/browser_message_filter_peer.h" |
18 #include "content/browser/browser_thread_impl.h" | 19 #include "content/browser/browser_thread_impl.h" |
19 #include "content/browser/child_process_security_policy_impl.h" | 20 #include "content/browser/child_process_security_policy_impl.h" |
20 #include "content/browser/loader/cross_site_resource_handler.h" | 21 #include "content/browser/loader/cross_site_resource_handler.h" |
21 #include "content/browser/loader/detachable_resource_handler.h" | 22 #include "content/browser/loader/detachable_resource_handler.h" |
22 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 23 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
23 #include "content/browser/loader/resource_loader.h" | 24 #include "content/browser/loader/resource_loader.h" |
24 #include "content/browser/loader/resource_message_filter.h" | 25 #include "content/browser/loader/resource_message_filter.h" |
25 #include "content/browser/loader/resource_request_info_impl.h" | 26 #include "content/browser/loader/resource_request_info_impl.h" |
26 #include "content/browser/worker_host/worker_service_impl.h" | 27 #include "content/browser/worker_host/worker_service_impl.h" |
27 #include "content/common/child_process_host_impl.h" | 28 #include "content/common/child_process_host_impl.h" |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 // have a different ID than the original. | 210 // have a different ID than the original. |
210 class TestFilter : public ResourceMessageFilter { | 211 class TestFilter : public ResourceMessageFilter { |
211 public: | 212 public: |
212 explicit TestFilter(ResourceContext* resource_context) | 213 explicit TestFilter(ResourceContext* resource_context) |
213 : ResourceMessageFilter( | 214 : ResourceMessageFilter( |
214 ChildProcessHostImpl::GenerateChildProcessUniqueId(), | 215 ChildProcessHostImpl::GenerateChildProcessUniqueId(), |
215 PROCESS_TYPE_RENDERER, NULL, NULL, NULL, NULL, | 216 PROCESS_TYPE_RENDERER, NULL, NULL, NULL, NULL, |
216 base::Bind(&TestFilter::GetContexts, base::Unretained(this))), | 217 base::Bind(&TestFilter::GetContexts, base::Unretained(this))), |
217 resource_context_(resource_context), | 218 resource_context_(resource_context), |
218 canceled_(false), | 219 canceled_(false), |
219 received_after_canceled_(0) { | 220 received_after_canceled_(0), |
| 221 peer_(new BrowserMessageFilterPeer(base::GetCurrentProcId())) { |
220 ChildProcessSecurityPolicyImpl::GetInstance()->Add(child_id()); | 222 ChildProcessSecurityPolicyImpl::GetInstance()->Add(child_id()); |
221 set_peer_pid_for_testing(base::GetCurrentProcId()); | 223 OnFilterAddedToHost(peer_.get()); |
222 } | 224 } |
223 | 225 |
224 void set_canceled(bool canceled) { canceled_ = canceled; } | 226 void set_canceled(bool canceled) { canceled_ = canceled; } |
225 int received_after_canceled() const { return received_after_canceled_; } | 227 int received_after_canceled() const { return received_after_canceled_; } |
226 | 228 |
227 // ResourceMessageFilter override | 229 // ResourceMessageFilter override |
228 virtual bool Send(IPC::Message* msg) OVERRIDE { | 230 virtual bool Send(IPC::Message* msg) OVERRIDE { |
229 // No messages should be received when the process has been canceled. | 231 // No messages should be received when the process has been canceled. |
230 if (canceled_) | 232 if (canceled_) |
231 received_after_canceled_++; | 233 received_after_canceled_++; |
(...skipping 11 matching lines...) Expand all Loading... |
243 void GetContexts(const ResourceHostMsg_Request& request, | 245 void GetContexts(const ResourceHostMsg_Request& request, |
244 ResourceContext** resource_context, | 246 ResourceContext** resource_context, |
245 net::URLRequestContext** request_context) { | 247 net::URLRequestContext** request_context) { |
246 *resource_context = resource_context_; | 248 *resource_context = resource_context_; |
247 *request_context = resource_context_->GetRequestContext(); | 249 *request_context = resource_context_->GetRequestContext(); |
248 } | 250 } |
249 | 251 |
250 ResourceContext* resource_context_; | 252 ResourceContext* resource_context_; |
251 bool canceled_; | 253 bool canceled_; |
252 int received_after_canceled_; | 254 int received_after_canceled_; |
253 | 255 scoped_ptr<BrowserMessageFilterPeer> peer_; |
254 DISALLOW_COPY_AND_ASSIGN(TestFilter); | 256 DISALLOW_COPY_AND_ASSIGN(TestFilter); |
255 }; | 257 }; |
256 | 258 |
257 | 259 |
258 // This class forwards the incoming messages to the ResourceDispatcherHostTest. | 260 // This class forwards the incoming messages to the ResourceDispatcherHostTest. |
259 // For the test, we want all the incoming messages to go to the same place, | 261 // For the test, we want all the incoming messages to go to the same place, |
260 // which is why this forwards. | 262 // which is why this forwards. |
261 class ForwardingFilter : public TestFilter { | 263 class ForwardingFilter : public TestFilter { |
262 public: | 264 public: |
263 explicit ForwardingFilter(IPC::Sender* dest, | 265 explicit ForwardingFilter(IPC::Sender* dest, |
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1179 host_.OnMessageReceived(msg_ping, filter_); | 1181 host_.OnMessageReceived(msg_ping, filter_); |
1180 | 1182 |
1181 // Remove the filter before processing the requests by simulating channel | 1183 // Remove the filter before processing the requests by simulating channel |
1182 // closure. | 1184 // closure. |
1183 ResourceRequestInfoImpl* info_prefetch = ResourceRequestInfoImpl::ForRequest( | 1185 ResourceRequestInfoImpl* info_prefetch = ResourceRequestInfoImpl::ForRequest( |
1184 host_.GetURLRequest(GlobalRequestID(filter_->child_id(), 1))); | 1186 host_.GetURLRequest(GlobalRequestID(filter_->child_id(), 1))); |
1185 ResourceRequestInfoImpl* info_ping = ResourceRequestInfoImpl::ForRequest( | 1187 ResourceRequestInfoImpl* info_ping = ResourceRequestInfoImpl::ForRequest( |
1186 host_.GetURLRequest(GlobalRequestID(filter_->child_id(), 2))); | 1188 host_.GetURLRequest(GlobalRequestID(filter_->child_id(), 2))); |
1187 DCHECK_EQ(filter_.get(), info_prefetch->filter()); | 1189 DCHECK_EQ(filter_.get(), info_prefetch->filter()); |
1188 DCHECK_EQ(filter_.get(), info_ping->filter()); | 1190 DCHECK_EQ(filter_.get(), info_ping->filter()); |
1189 filter_->OnChannelClosing(); | 1191 filter_->OnSenderClosing(); |
1190 info_prefetch->filter_.reset(); | 1192 info_prefetch->filter_.reset(); |
1191 info_ping->filter_.reset(); | 1193 info_ping->filter_.reset(); |
1192 | 1194 |
1193 // From the renderer's perspective, the requests were cancelled. | 1195 // From the renderer's perspective, the requests were cancelled. |
1194 ResourceIPCAccumulator::ClassifiedMessages msgs; | 1196 ResourceIPCAccumulator::ClassifiedMessages msgs; |
1195 accum_.GetClassifiedMessages(&msgs); | 1197 accum_.GetClassifiedMessages(&msgs); |
1196 ASSERT_EQ(2U, msgs.size()); | 1198 ASSERT_EQ(2U, msgs.size()); |
1197 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_ABORTED); | 1199 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_ABORTED); |
1198 CheckRequestCompleteErrorCode(msgs[1][0], net::ERR_ABORTED); | 1200 CheckRequestCompleteErrorCode(msgs[1][0], net::ERR_ABORTED); |
1199 | 1201 |
(...skipping 24 matching lines...) Expand all Loading... |
1224 net::URLRequestTestJob::test_url_redirect_to_url_2()); | 1226 net::URLRequestTestJob::test_url_redirect_to_url_2()); |
1225 | 1227 |
1226 ResourceHostMsg_RequestResource msg(0, 1, request); | 1228 ResourceHostMsg_RequestResource msg(0, 1, request); |
1227 host_.OnMessageReceived(msg, filter_); | 1229 host_.OnMessageReceived(msg, filter_); |
1228 | 1230 |
1229 // Remove the filter before processing the request by simulating channel | 1231 // Remove the filter before processing the request by simulating channel |
1230 // closure. | 1232 // closure. |
1231 GlobalRequestID global_request_id(filter_->child_id(), 1); | 1233 GlobalRequestID global_request_id(filter_->child_id(), 1); |
1232 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( | 1234 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest( |
1233 host_.GetURLRequest(global_request_id)); | 1235 host_.GetURLRequest(global_request_id)); |
1234 info->filter_->OnChannelClosing(); | 1236 info->filter_->OnSenderClosing(); |
1235 info->filter_.reset(); | 1237 info->filter_.reset(); |
1236 | 1238 |
1237 // From the renderer's perspective, the request was cancelled. | 1239 // From the renderer's perspective, the request was cancelled. |
1238 ResourceIPCAccumulator::ClassifiedMessages msgs; | 1240 ResourceIPCAccumulator::ClassifiedMessages msgs; |
1239 accum_.GetClassifiedMessages(&msgs); | 1241 accum_.GetClassifiedMessages(&msgs); |
1240 ASSERT_EQ(1U, msgs.size()); | 1242 ASSERT_EQ(1U, msgs.size()); |
1241 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_ABORTED); | 1243 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_ABORTED); |
1242 | 1244 |
1243 // But it continues detached. | 1245 // But it continues detached. |
1244 EXPECT_EQ(1, host_.pending_requests()); | 1246 EXPECT_EQ(1, host_.pending_requests()); |
(...skipping 1555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2800 | 2802 |
2801 // Register it for a resource request. | 2803 // Register it for a resource request. |
2802 host_.RegisterDownloadedTempFile(filter_->child_id(), kRequestID, file_path); | 2804 host_.RegisterDownloadedTempFile(filter_->child_id(), kRequestID, file_path); |
2803 deletable_file = NULL; | 2805 deletable_file = NULL; |
2804 | 2806 |
2805 // Should be readable now. | 2807 // Should be readable now. |
2806 EXPECT_TRUE(ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile( | 2808 EXPECT_TRUE(ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile( |
2807 filter_->child_id(), file_path)); | 2809 filter_->child_id(), file_path)); |
2808 | 2810 |
2809 // Let the process die. | 2811 // Let the process die. |
2810 filter_->OnChannelClosing(); | 2812 filter_->OnSenderClosing(); |
2811 base::RunLoop().RunUntilIdle(); | 2813 base::RunLoop().RunUntilIdle(); |
2812 | 2814 |
2813 // The file is no longer readable to the child and has been deleted. | 2815 // The file is no longer readable to the child and has been deleted. |
2814 EXPECT_FALSE(ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile( | 2816 EXPECT_FALSE(ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile( |
2815 filter_->child_id(), file_path)); | 2817 filter_->child_id(), file_path)); |
2816 EXPECT_FALSE(base::PathExists(file_path)); | 2818 EXPECT_FALSE(base::PathExists(file_path)); |
2817 } | 2819 } |
2818 | 2820 |
2819 TEST_F(ResourceDispatcherHostTest, DownloadToFile) { | 2821 TEST_F(ResourceDispatcherHostTest, DownloadToFile) { |
2820 // Make a request which downloads to file. | 2822 // Make a request which downloads to file. |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2921 } else { | 2923 } else { |
2922 return new net::URLRequestTestJob( | 2924 return new net::URLRequestTestJob( |
2923 request, network_delegate, | 2925 request, network_delegate, |
2924 test_fixture_->response_headers_, test_fixture_->response_data_, | 2926 test_fixture_->response_headers_, test_fixture_->response_data_, |
2925 false); | 2927 false); |
2926 } | 2928 } |
2927 } | 2929 } |
2928 } | 2930 } |
2929 | 2931 |
2930 } // namespace content | 2932 } // namespace content |
OLD | NEW |