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
3 // found in the LICENSE file.
5 #include "content/browser/loader/resource_request_info_impl.h"
7 #include "content/browser/loader/global_routing_id.h"
8 #include "content/browser/loader/resource_message_filter.h"
9 #include "content/browser/worker_host/worker_service_impl.h"
10 #include "content/common/net/url_request_user_data.h"
11 #include "content/public/browser/global_request_id.h"
12 #include "net/url_request/url_request.h"
16 // ----------------------------------------------------------------------------
17 // ResourceRequestInfo
20 const ResourceRequestInfo* ResourceRequestInfo::ForRequest(
21 const net::URLRequest* request) {
22 return ResourceRequestInfoImpl::ForRequest(request);
26 void ResourceRequestInfo::AllocateForTesting(
27 net::URLRequest* request,
28 ResourceType::Type resource_type,
29 ResourceContext* context,
30 int render_process_id,
33 ResourceRequestInfoImpl* info =
34 new ResourceRequestInfoImpl(
35 PROCESS_TYPE_RENDERER, // process_type
36 render_process_id, // child_id
37 render_view_id, // route_id
40 resource_type == ResourceType::MAIN_FRAME, // is_main_frame
42 false, // parent_is_main_frame
44 resource_type, // resource_type
45 PAGE_TRANSITION_LINK, // transition_type
48 true, // allow_download
49 false, // has_user_gesture
50 WebKit::WebReferrerPolicyDefault, // referrer_policy
52 base::WeakPtr<ResourceMessageFilter>(), // filter
53 is_async); // is_async
54 info->AssociateWithRequest(request);
58 bool ResourceRequestInfo::GetRenderViewForRequest(
59 const net::URLRequest* request,
60 int* render_process_id,
61 int* render_view_id) {
62 URLRequestUserData* user_data = static_cast<URLRequestUserData*>(
63 request->GetUserData(URLRequestUserData::kUserDataKey));
66 *render_process_id = user_data->render_process_id();
67 *render_view_id = user_data->render_view_id();
71 // ----------------------------------------------------------------------------
72 // ResourceRequestInfoImpl
75 ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
76 net::URLRequest* request) {
77 return static_cast<ResourceRequestInfoImpl*>(request->GetUserData(NULL));
81 const ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
82 const net::URLRequest* request) {
83 return ForRequest(const_cast<net::URLRequest*>(request));
86 ResourceRequestInfoImpl::ResourceRequestInfoImpl(
94 bool parent_is_main_frame,
95 int64 parent_frame_id,
96 ResourceType::Type resource_type,
97 PageTransition transition_type,
101 bool has_user_gesture,
102 WebKit::WebReferrerPolicy referrer_policy,
103 ResourceContext* context,
104 base::WeakPtr<ResourceMessageFilter> filter,
106 : cross_site_handler_(NULL),
107 process_type_(process_type),
110 origin_pid_(origin_pid),
111 request_id_(request_id),
112 is_main_frame_(is_main_frame),
114 parent_is_main_frame_(parent_is_main_frame),
115 parent_frame_id_(parent_frame_id),
116 is_download_(is_download),
117 is_stream_(is_stream),
118 allow_download_(allow_download),
119 has_user_gesture_(has_user_gesture),
120 was_ignored_by_handler_(false),
121 resource_type_(resource_type),
122 transition_type_(transition_type),
124 referrer_policy_(referrer_policy),
127 is_async_(is_async) {
130 ResourceRequestInfoImpl::~ResourceRequestInfoImpl() {
133 ResourceContext* ResourceRequestInfoImpl::GetContext() const {
137 int ResourceRequestInfoImpl::GetChildID() const {
141 int ResourceRequestInfoImpl::GetRouteID() const {
145 int ResourceRequestInfoImpl::GetOriginPID() const {
149 int ResourceRequestInfoImpl::GetRequestID() const {
153 bool ResourceRequestInfoImpl::IsMainFrame() const {
154 return is_main_frame_;
157 int64 ResourceRequestInfoImpl::GetFrameID() const {
161 bool ResourceRequestInfoImpl::ParentIsMainFrame() const {
162 return parent_is_main_frame_;
165 int64 ResourceRequestInfoImpl::GetParentFrameID() const {
166 return parent_frame_id_;
169 ResourceType::Type ResourceRequestInfoImpl::GetResourceType() const {
170 return resource_type_;
173 WebKit::WebReferrerPolicy ResourceRequestInfoImpl::GetReferrerPolicy() const {
174 return referrer_policy_;
177 PageTransition ResourceRequestInfoImpl::GetPageTransition() const {
178 return transition_type_;
181 bool ResourceRequestInfoImpl::HasUserGesture() const {
182 return has_user_gesture_;
185 bool ResourceRequestInfoImpl::WasIgnoredByHandler() const {
186 return was_ignored_by_handler_;
189 bool ResourceRequestInfoImpl::GetAssociatedRenderView(
190 int* render_process_id,
191 int* render_view_id) const {
192 // If the request is from the worker process, find a content that owns the
194 if (process_type_ == PROCESS_TYPE_WORKER) {
195 // Need to display some related UI for this network request - pick an
196 // arbitrary parent to do so.
197 if (!WorkerServiceImpl::GetInstance()->GetRendererForWorker(
198 child_id_, render_process_id, render_view_id)) {
199 *render_process_id = -1;
200 *render_view_id = -1;
203 } else if (process_type_ == PROCESS_TYPE_PLUGIN) {
204 *render_process_id = origin_pid_;
205 *render_view_id = route_id_;
207 *render_process_id = child_id_;
208 *render_view_id = route_id_;
213 bool ResourceRequestInfoImpl::IsAsync() const {
217 void ResourceRequestInfoImpl::AssociateWithRequest(net::URLRequest* request) {
218 request->SetUserData(NULL, this);
219 int render_process_id;
221 if (GetAssociatedRenderView(&render_process_id, &render_view_id)) {
222 request->SetUserData(
223 URLRequestUserData::kUserDataKey,
224 new URLRequestUserData(render_process_id, render_view_id));
228 GlobalRequestID ResourceRequestInfoImpl::GetGlobalRequestID() const {
229 return GlobalRequestID(child_id_, request_id_);
232 GlobalRoutingID ResourceRequestInfoImpl::GetGlobalRoutingID() const {
233 return GlobalRoutingID(child_id_, route_id_);
236 void ResourceRequestInfoImpl::UpdateForTransfer(
242 int64 parent_frame_id,
243 base::WeakPtr<ResourceMessageFilter> filter) {
244 child_id_ = child_id;
245 route_id_ = route_id;
246 origin_pid_ = origin_pid;
247 request_id_ = request_id;
248 frame_id_ = frame_id;
252 } // namespace content