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/loader/resource_message_filter.h"
      9 #include "content/common/net/url_request_user_data.h"
     10 #include "content/public/browser/global_request_id.h"
     11 #include "content/public/common/process_type.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(net::URLRequest* request,
     27                                              ResourceType resource_type,
     28                                              ResourceContext* context,
     29                                              int render_process_id,
     30                                              int render_view_id,
     31                                              int render_frame_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           render_frame_id,                   // render_frame_id
     41           resource_type == RESOURCE_TYPE_MAIN_FRAME,  // is_main_frame
     42           false,                             // parent_is_main_frame
     43           0,                                 // parent_render_frame_id
     44           resource_type,                     // resource_type
     45           ui::PAGE_TRANSITION_LINK,          // transition_type
     46           false,                             // should_replace_current_entry
     47           false,                             // is_download
     48           false,                             // is_stream
     49           true,                              // allow_download
     50           false,                             // has_user_gesture
     51           false,                             // enable load timing
     52           blink::WebReferrerPolicyDefault,   // referrer_policy
     53           blink::WebPageVisibilityStateVisible,  // visibility_state
     54           context,                           // context
     55           base::WeakPtr<ResourceMessageFilter>(),  // filter
     56           is_async);                         // is_async
     57   info->AssociateWithRequest(request);
     58 }
     59 
     60 // static
     61 bool ResourceRequestInfo::GetRenderFrameForRequest(
     62     const net::URLRequest* request,
     63     int* render_process_id,
     64     int* render_frame_id) {
     65   URLRequestUserData* user_data = static_cast<URLRequestUserData*>(
     66       request->GetUserData(URLRequestUserData::kUserDataKey));
     67   if (!user_data)
     68     return false;
     69   *render_process_id = user_data->render_process_id();
     70   *render_frame_id = user_data->render_frame_id();
     71   return true;
     72 }
     73 
     74 // ----------------------------------------------------------------------------
     75 // ResourceRequestInfoImpl
     76 
     77 // static
     78 ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
     79     net::URLRequest* request) {
     80   return static_cast<ResourceRequestInfoImpl*>(request->GetUserData(NULL));
     81 }
     82 
     83 // static
     84 const ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
     85     const net::URLRequest* request) {
     86   return ForRequest(const_cast<net::URLRequest*>(request));
     87 }
     88 
     89 ResourceRequestInfoImpl::ResourceRequestInfoImpl(
     90     int process_type,
     91     int child_id,
     92     int route_id,
     93     int origin_pid,
     94     int request_id,
     95     int render_frame_id,
     96     bool is_main_frame,
     97     bool parent_is_main_frame,
     98     int parent_render_frame_id,
     99     ResourceType resource_type,
    100     ui::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     bool enable_load_timing,
    107     blink::WebReferrerPolicy referrer_policy,
    108     blink::WebPageVisibilityState visibility_state,
    109     ResourceContext* context,
    110     base::WeakPtr<ResourceMessageFilter> filter,
    111     bool is_async)
    112     : cross_site_handler_(NULL),
    113       detachable_handler_(NULL),
    114       process_type_(process_type),
    115       child_id_(child_id),
    116       route_id_(route_id),
    117       origin_pid_(origin_pid),
    118       request_id_(request_id),
    119       render_frame_id_(render_frame_id),
    120       is_main_frame_(is_main_frame),
    121       parent_is_main_frame_(parent_is_main_frame),
    122       parent_render_frame_id_(parent_render_frame_id),
    123       should_replace_current_entry_(should_replace_current_entry),
    124       is_download_(is_download),
    125       is_stream_(is_stream),
    126       allow_download_(allow_download),
    127       has_user_gesture_(has_user_gesture),
    128       enable_load_timing_(enable_load_timing),
    129       was_ignored_by_handler_(false),
    130       resource_type_(resource_type),
    131       transition_type_(transition_type),
    132       memory_cost_(0),
    133       referrer_policy_(referrer_policy),
    134       visibility_state_(visibility_state),
    135       context_(context),
    136       filter_(filter),
    137       is_async_(is_async) {
    138 }
    139 
    140 ResourceRequestInfoImpl::~ResourceRequestInfoImpl() {
    141 }
    142 
    143 ResourceContext* ResourceRequestInfoImpl::GetContext() const {
    144   return context_;
    145 }
    146 
    147 int ResourceRequestInfoImpl::GetChildID() const {
    148   return child_id_;
    149 }
    150 
    151 int ResourceRequestInfoImpl::GetRouteID() const {
    152   return route_id_;
    153 }
    154 
    155 int ResourceRequestInfoImpl::GetOriginPID() const {
    156   return origin_pid_;
    157 }
    158 
    159 int ResourceRequestInfoImpl::GetRequestID() const {
    160   return request_id_;
    161 }
    162 
    163 int ResourceRequestInfoImpl::GetRenderFrameID() const {
    164   return render_frame_id_;
    165 }
    166 
    167 bool ResourceRequestInfoImpl::IsMainFrame() const {
    168   return is_main_frame_;
    169 }
    170 
    171 bool ResourceRequestInfoImpl::ParentIsMainFrame() const {
    172   return parent_is_main_frame_;
    173 }
    174 
    175 int ResourceRequestInfoImpl::GetParentRenderFrameID() const {
    176   return parent_render_frame_id_;
    177 }
    178 
    179 ResourceType ResourceRequestInfoImpl::GetResourceType() const {
    180   return resource_type_;
    181 }
    182 
    183 int ResourceRequestInfoImpl::GetProcessType() const {
    184   return process_type_;
    185 }
    186 
    187 blink::WebReferrerPolicy ResourceRequestInfoImpl::GetReferrerPolicy() const {
    188   return referrer_policy_;
    189 }
    190 
    191 blink::WebPageVisibilityState
    192 ResourceRequestInfoImpl::GetVisibilityState() const {
    193   return visibility_state_;
    194 }
    195 
    196 ui::PageTransition ResourceRequestInfoImpl::GetPageTransition() const {
    197   return transition_type_;
    198 }
    199 
    200 bool ResourceRequestInfoImpl::HasUserGesture() const {
    201   return has_user_gesture_;
    202 }
    203 
    204 bool ResourceRequestInfoImpl::WasIgnoredByHandler() const {
    205   return was_ignored_by_handler_;
    206 }
    207 
    208 bool ResourceRequestInfoImpl::GetAssociatedRenderFrame(
    209     int* render_process_id,
    210     int* render_frame_id) const {
    211   if (process_type_ == PROCESS_TYPE_PLUGIN) {
    212     *render_process_id = origin_pid_;
    213     *render_frame_id = render_frame_id_;
    214   } else {
    215     *render_process_id = child_id_;
    216     *render_frame_id = render_frame_id_;
    217   }
    218   return true;
    219 }
    220 
    221 bool ResourceRequestInfoImpl::IsAsync() const {
    222   return is_async_;
    223 }
    224 
    225 bool ResourceRequestInfoImpl::IsDownload() const {
    226   return is_download_;
    227 }
    228 
    229 void ResourceRequestInfoImpl::AssociateWithRequest(net::URLRequest* request) {
    230   request->SetUserData(NULL, this);
    231   int render_process_id;
    232   int render_frame_id;
    233   if (GetAssociatedRenderFrame(&render_process_id, &render_frame_id)) {
    234     request->SetUserData(
    235         URLRequestUserData::kUserDataKey,
    236         new URLRequestUserData(render_process_id, render_frame_id));
    237   }
    238 }
    239 
    240 GlobalRequestID ResourceRequestInfoImpl::GetGlobalRequestID() const {
    241   return GlobalRequestID(child_id_, request_id_);
    242 }
    243 
    244 GlobalRoutingID ResourceRequestInfoImpl::GetGlobalRoutingID() const {
    245   return GlobalRoutingID(child_id_, route_id_);
    246 }
    247 
    248 void ResourceRequestInfoImpl::UpdateForTransfer(
    249     int child_id,
    250     int route_id,
    251     int origin_pid,
    252     int request_id,
    253     int parent_render_frame_id,
    254     base::WeakPtr<ResourceMessageFilter> filter) {
    255   child_id_ = child_id;
    256   route_id_ = route_id;
    257   origin_pid_ = origin_pid;
    258   request_id_ = request_id;
    259   parent_render_frame_id_ = parent_render_frame_id;
    260   filter_ = filter;
    261 }
    262 
    263 }  // namespace content
    264