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. 4 5 #include "content/browser/loader/resource_request_info_impl.h" 6 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" 13 14 namespace content { 15 16 // ---------------------------------------------------------------------------- 17 // ResourceRequestInfo 18 19 // static 20 const ResourceRequestInfo* ResourceRequestInfo::ForRequest( 21 const net::URLRequest* request) { 22 return ResourceRequestInfoImpl::ForRequest(request); 23 } 24 25 // static 26 void ResourceRequestInfo::AllocateForTesting( 27 net::URLRequest* request, 28 ResourceType::Type resource_type, 29 ResourceContext* context, 30 int render_process_id, 31 int render_view_id, 32 bool is_async) { 33 ResourceRequestInfoImpl* info = 34 new ResourceRequestInfoImpl( 35 PROCESS_TYPE_RENDERER, // process_type 36 render_process_id, // child_id 37 render_view_id, // route_id 38 0, // origin_pid 39 0, // request_id 40 MSG_ROUTING_NONE, // render_frame_id 41 resource_type == ResourceType::MAIN_FRAME, // is_main_frame 42 0, // frame_id 43 false, // parent_is_main_frame 44 0, // parent_frame_id 45 resource_type, // resource_type 46 PAGE_TRANSITION_LINK, // transition_type 47 false, // should_replace_current_entry 48 false, // is_download 49 false, // is_stream 50 true, // allow_download 51 false, // has_user_gesture 52 blink::WebReferrerPolicyDefault, // referrer_policy 53 context, // context 54 base::WeakPtr<ResourceMessageFilter>(), // filter 55 is_async); // is_async 56 info->AssociateWithRequest(request); 57 } 58 59 // static 60 bool ResourceRequestInfo::GetRenderViewForRequest( 61 const net::URLRequest* request, 62 int* render_process_id, 63 int* render_view_id) { 64 URLRequestUserData* user_data = static_cast<URLRequestUserData*>( 65 request->GetUserData(URLRequestUserData::kUserDataKey)); 66 if (!user_data) 67 return false; 68 *render_process_id = user_data->render_process_id(); 69 *render_view_id = user_data->render_view_id(); 70 return true; 71 } 72 73 // ---------------------------------------------------------------------------- 74 // ResourceRequestInfoImpl 75 76 // static 77 ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest( 78 net::URLRequest* request) { 79 return static_cast<ResourceRequestInfoImpl*>(request->GetUserData(NULL)); 80 } 81 82 // static 83 const ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest( 84 const net::URLRequest* request) { 85 return ForRequest(const_cast<net::URLRequest*>(request)); 86 } 87 88 ResourceRequestInfoImpl::ResourceRequestInfoImpl( 89 int process_type, 90 int child_id, 91 int route_id, 92 int origin_pid, 93 int request_id, 94 int render_frame_id, 95 bool is_main_frame, 96 int64 frame_id, 97 bool parent_is_main_frame, 98 int64 parent_frame_id, 99 ResourceType::Type resource_type, 100 PageTransition transition_type, 101 bool should_replace_current_entry, 102 bool is_download, 103 bool is_stream, 104 bool allow_download, 105 bool has_user_gesture, 106 blink::WebReferrerPolicy referrer_policy, 107 ResourceContext* context, 108 base::WeakPtr<ResourceMessageFilter> filter, 109 bool is_async) 110 : cross_site_handler_(NULL), 111 detachable_handler_(NULL), 112 process_type_(process_type), 113 child_id_(child_id), 114 route_id_(route_id), 115 origin_pid_(origin_pid), 116 request_id_(request_id), 117 render_frame_id_(render_frame_id), 118 is_main_frame_(is_main_frame), 119 frame_id_(frame_id), 120 parent_is_main_frame_(parent_is_main_frame), 121 parent_frame_id_(parent_frame_id), 122 should_replace_current_entry_(should_replace_current_entry), 123 is_download_(is_download), 124 is_stream_(is_stream), 125 allow_download_(allow_download), 126 has_user_gesture_(has_user_gesture), 127 was_ignored_by_handler_(false), 128 resource_type_(resource_type), 129 transition_type_(transition_type), 130 memory_cost_(0), 131 referrer_policy_(referrer_policy), 132 context_(context), 133 filter_(filter), 134 is_async_(is_async) { 135 } 136 137 ResourceRequestInfoImpl::~ResourceRequestInfoImpl() { 138 } 139 140 ResourceContext* ResourceRequestInfoImpl::GetContext() const { 141 return context_; 142 } 143 144 int ResourceRequestInfoImpl::GetChildID() const { 145 return child_id_; 146 } 147 148 int ResourceRequestInfoImpl::GetRouteID() const { 149 return route_id_; 150 } 151 152 int ResourceRequestInfoImpl::GetOriginPID() const { 153 return origin_pid_; 154 } 155 156 int ResourceRequestInfoImpl::GetRequestID() const { 157 return request_id_; 158 } 159 160 int ResourceRequestInfoImpl::GetRenderFrameID() const { 161 return render_frame_id_; 162 } 163 164 bool ResourceRequestInfoImpl::IsMainFrame() const { 165 return is_main_frame_; 166 } 167 168 int64 ResourceRequestInfoImpl::GetFrameID() const { 169 return frame_id_; 170 } 171 172 bool ResourceRequestInfoImpl::ParentIsMainFrame() const { 173 return parent_is_main_frame_; 174 } 175 176 int64 ResourceRequestInfoImpl::GetParentFrameID() const { 177 return parent_frame_id_; 178 } 179 180 ResourceType::Type ResourceRequestInfoImpl::GetResourceType() const { 181 return resource_type_; 182 } 183 184 blink::WebReferrerPolicy ResourceRequestInfoImpl::GetReferrerPolicy() const { 185 return referrer_policy_; 186 } 187 188 PageTransition ResourceRequestInfoImpl::GetPageTransition() const { 189 return transition_type_; 190 } 191 192 bool ResourceRequestInfoImpl::HasUserGesture() const { 193 return has_user_gesture_; 194 } 195 196 bool ResourceRequestInfoImpl::WasIgnoredByHandler() const { 197 return was_ignored_by_handler_; 198 } 199 200 bool ResourceRequestInfoImpl::GetAssociatedRenderView( 201 int* render_process_id, 202 int* render_view_id) const { 203 // If the request is from the worker process, find a content that owns the 204 // worker. 205 if (process_type_ == PROCESS_TYPE_WORKER) { 206 // Need to display some related UI for this network request - pick an 207 // arbitrary parent to do so. 208 if (!WorkerServiceImpl::GetInstance()->GetRendererForWorker( 209 child_id_, render_process_id, render_view_id)) { 210 *render_process_id = -1; 211 *render_view_id = -1; 212 return false; 213 } 214 } else if (process_type_ == PROCESS_TYPE_PLUGIN) { 215 *render_process_id = origin_pid_; 216 *render_view_id = route_id_; 217 } else { 218 *render_process_id = child_id_; 219 *render_view_id = route_id_; 220 } 221 return true; 222 } 223 224 bool ResourceRequestInfoImpl::IsAsync() const { 225 return is_async_; 226 } 227 228 bool ResourceRequestInfoImpl::IsDownload() const { 229 return is_download_; 230 } 231 232 void ResourceRequestInfoImpl::AssociateWithRequest(net::URLRequest* request) { 233 request->SetUserData(NULL, this); 234 int render_process_id; 235 int render_view_id; 236 if (GetAssociatedRenderView(&render_process_id, &render_view_id)) { 237 request->SetUserData( 238 URLRequestUserData::kUserDataKey, 239 new URLRequestUserData(render_process_id, render_view_id)); 240 } 241 } 242 243 GlobalRequestID ResourceRequestInfoImpl::GetGlobalRequestID() const { 244 return GlobalRequestID(child_id_, request_id_); 245 } 246 247 GlobalRoutingID ResourceRequestInfoImpl::GetGlobalRoutingID() const { 248 return GlobalRoutingID(child_id_, route_id_); 249 } 250 251 void ResourceRequestInfoImpl::UpdateForTransfer( 252 int child_id, 253 int route_id, 254 int origin_pid, 255 int request_id, 256 int64 frame_id, 257 int64 parent_frame_id, 258 base::WeakPtr<ResourceMessageFilter> filter) { 259 child_id_ = child_id; 260 route_id_ = route_id; 261 origin_pid_ = origin_pid; 262 request_id_ = request_id; 263 frame_id_ = frame_id; 264 filter_ = filter; 265 } 266 267 } // namespace content 268