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/worker_host/worker_service_impl.h" 9 #include "content/common/net/url_request_user_data.h" 10 #include "content/public/browser/global_request_id.h" 11 #include "net/url_request/url_request.h" 12 #include "webkit/common/blob/blob_data.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 ResourceRequestInfoImpl* info = 33 new ResourceRequestInfoImpl( 34 PROCESS_TYPE_RENDERER, // process_type 35 render_process_id, // child_id 36 render_view_id, // route_id 37 0, // origin_pid 38 0, // request_id 39 resource_type == ResourceType::MAIN_FRAME, // is_main_frame 40 0, // frame_id 41 false, // parent_is_main_frame 42 0, // parent_frame_id 43 resource_type, // resource_type 44 PAGE_TRANSITION_LINK, // transition_type 45 false, // is_download 46 false, // is_stream 47 true, // allow_download 48 false, // has_user_gesture 49 WebKit::WebReferrerPolicyDefault, // referrer_policy 50 context, // context 51 false); // is_async 52 info->AssociateWithRequest(request); 53 } 54 55 // static 56 bool ResourceRequestInfo::GetRenderViewForRequest( 57 const net::URLRequest* request, 58 int* render_process_id, 59 int* render_view_id) { 60 URLRequestUserData* user_data = static_cast<URLRequestUserData*>( 61 request->GetUserData(URLRequestUserData::kUserDataKey)); 62 if (!user_data) 63 return false; 64 *render_process_id = user_data->render_process_id(); 65 *render_view_id = user_data->render_view_id(); 66 return true; 67 } 68 69 // ---------------------------------------------------------------------------- 70 // ResourceRequestInfoImpl 71 72 // static 73 ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest( 74 net::URLRequest* request) { 75 return static_cast<ResourceRequestInfoImpl*>(request->GetUserData(NULL)); 76 } 77 78 // static 79 const ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest( 80 const net::URLRequest* request) { 81 return ForRequest(const_cast<net::URLRequest*>(request)); 82 } 83 84 ResourceRequestInfoImpl::ResourceRequestInfoImpl( 85 int process_type, 86 int child_id, 87 int route_id, 88 int origin_pid, 89 int request_id, 90 bool is_main_frame, 91 int64 frame_id, 92 bool parent_is_main_frame, 93 int64 parent_frame_id, 94 ResourceType::Type resource_type, 95 PageTransition transition_type, 96 bool is_download, 97 bool is_stream, 98 bool allow_download, 99 bool has_user_gesture, 100 WebKit::WebReferrerPolicy referrer_policy, 101 ResourceContext* context, 102 bool is_async) 103 : cross_site_handler_(NULL), 104 process_type_(process_type), 105 child_id_(child_id), 106 route_id_(route_id), 107 origin_pid_(origin_pid), 108 request_id_(request_id), 109 is_main_frame_(is_main_frame), 110 frame_id_(frame_id), 111 parent_is_main_frame_(parent_is_main_frame), 112 parent_frame_id_(parent_frame_id), 113 is_download_(is_download), 114 is_stream_(is_stream), 115 allow_download_(allow_download), 116 has_user_gesture_(has_user_gesture), 117 was_ignored_by_handler_(false), 118 resource_type_(resource_type), 119 transition_type_(transition_type), 120 memory_cost_(0), 121 referrer_policy_(referrer_policy), 122 context_(context), 123 is_async_(is_async) { 124 } 125 126 ResourceRequestInfoImpl::~ResourceRequestInfoImpl() { 127 } 128 129 ResourceContext* ResourceRequestInfoImpl::GetContext() const { 130 return context_; 131 } 132 133 int ResourceRequestInfoImpl::GetChildID() const { 134 return child_id_; 135 } 136 137 int ResourceRequestInfoImpl::GetRouteID() const { 138 return route_id_; 139 } 140 141 int ResourceRequestInfoImpl::GetOriginPID() const { 142 return origin_pid_; 143 } 144 145 int ResourceRequestInfoImpl::GetRequestID() const { 146 return request_id_; 147 } 148 149 bool ResourceRequestInfoImpl::IsMainFrame() const { 150 return is_main_frame_; 151 } 152 153 int64 ResourceRequestInfoImpl::GetFrameID() const { 154 return frame_id_; 155 } 156 157 bool ResourceRequestInfoImpl::ParentIsMainFrame() const { 158 return parent_is_main_frame_; 159 } 160 161 int64 ResourceRequestInfoImpl::GetParentFrameID() const { 162 return parent_frame_id_; 163 } 164 165 ResourceType::Type ResourceRequestInfoImpl::GetResourceType() const { 166 return resource_type_; 167 } 168 169 WebKit::WebReferrerPolicy ResourceRequestInfoImpl::GetReferrerPolicy() const { 170 return referrer_policy_; 171 } 172 173 PageTransition ResourceRequestInfoImpl::GetPageTransition() const { 174 return transition_type_; 175 } 176 177 bool ResourceRequestInfoImpl::HasUserGesture() const { 178 return has_user_gesture_; 179 } 180 181 bool ResourceRequestInfoImpl::WasIgnoredByHandler() const { 182 return was_ignored_by_handler_; 183 } 184 185 bool ResourceRequestInfoImpl::GetAssociatedRenderView( 186 int* render_process_id, 187 int* render_view_id) const { 188 // If the request is from the worker process, find a content that owns the 189 // worker. 190 if (process_type_ == PROCESS_TYPE_WORKER) { 191 // Need to display some related UI for this network request - pick an 192 // arbitrary parent to do so. 193 if (!WorkerServiceImpl::GetInstance()->GetRendererForWorker( 194 child_id_, render_process_id, render_view_id)) { 195 *render_process_id = -1; 196 *render_view_id = -1; 197 return false; 198 } 199 } else { 200 *render_process_id = child_id_; 201 *render_view_id = route_id_; 202 } 203 return true; 204 } 205 206 bool ResourceRequestInfoImpl::IsAsync() const { 207 return is_async_; 208 } 209 210 void ResourceRequestInfoImpl::AssociateWithRequest(net::URLRequest* request) { 211 request->SetUserData(NULL, this); 212 int render_process_id; 213 int render_view_id; 214 if (GetAssociatedRenderView(&render_process_id, &render_view_id)) { 215 request->SetUserData( 216 URLRequestUserData::kUserDataKey, 217 new URLRequestUserData(render_process_id, render_view_id)); 218 } 219 } 220 221 GlobalRequestID ResourceRequestInfoImpl::GetGlobalRequestID() const { 222 return GlobalRequestID(child_id_, request_id_); 223 } 224 225 GlobalRoutingID ResourceRequestInfoImpl::GetGlobalRoutingID() const { 226 return GlobalRoutingID(child_id_, route_id_); 227 } 228 229 void ResourceRequestInfoImpl::set_requested_blob_data( 230 webkit_blob::BlobData* data) { 231 requested_blob_data_ = data; 232 } 233 234 } // namespace content 235