Home | History | Annotate | Download | only in loader
      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