resource_request_info_impl.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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/blob/blob_data.h"
13
14namespace content {
15
16// ----------------------------------------------------------------------------
17// ResourceRequestInfo
18
19// static
20const ResourceRequestInfo* ResourceRequestInfo::ForRequest(
21    const net::URLRequest* request) {
22  return ResourceRequestInfoImpl::ForRequest(request);
23}
24
25// static
26void 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
56bool 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
73ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
74    net::URLRequest* request) {
75  return static_cast<ResourceRequestInfoImpl*>(request->GetUserData(NULL));
76}
77
78// static
79const ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
80    const net::URLRequest* request) {
81  return ForRequest(const_cast<net::URLRequest*>(request));
82}
83
84ResourceRequestInfoImpl::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
126ResourceRequestInfoImpl::~ResourceRequestInfoImpl() {
127}
128
129ResourceContext* ResourceRequestInfoImpl::GetContext() const {
130  return context_;
131}
132
133int ResourceRequestInfoImpl::GetChildID() const {
134  return child_id_;
135}
136
137int ResourceRequestInfoImpl::GetRouteID() const {
138  return route_id_;
139}
140
141int ResourceRequestInfoImpl::GetOriginPID() const {
142  return origin_pid_;
143}
144
145int ResourceRequestInfoImpl::GetRequestID() const {
146  return request_id_;
147}
148
149bool ResourceRequestInfoImpl::IsMainFrame() const {
150  return is_main_frame_;
151}
152
153int64 ResourceRequestInfoImpl::GetFrameID() const {
154  return frame_id_;
155}
156
157bool ResourceRequestInfoImpl::ParentIsMainFrame() const {
158  return parent_is_main_frame_;
159}
160
161int64 ResourceRequestInfoImpl::GetParentFrameID() const {
162  return parent_frame_id_;
163}
164
165ResourceType::Type ResourceRequestInfoImpl::GetResourceType() const {
166  return resource_type_;
167}
168
169WebKit::WebReferrerPolicy ResourceRequestInfoImpl::GetReferrerPolicy() const {
170  return referrer_policy_;
171}
172
173PageTransition ResourceRequestInfoImpl::GetPageTransition() const {
174  return transition_type_;
175}
176
177bool ResourceRequestInfoImpl::HasUserGesture() const {
178  return has_user_gesture_;
179}
180
181bool ResourceRequestInfoImpl::WasIgnoredByHandler() const {
182  return was_ignored_by_handler_;
183}
184
185bool 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
206bool ResourceRequestInfoImpl::IsAsync() const {
207  return is_async_;
208}
209
210void 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
221GlobalRequestID ResourceRequestInfoImpl::GetGlobalRequestID() const {
222  return GlobalRequestID(child_id_, request_id_);
223}
224
225GlobalRoutingID ResourceRequestInfoImpl::GetGlobalRoutingID() const {
226  return GlobalRoutingID(child_id_, route_id_);
227}
228
229void ResourceRequestInfoImpl::set_requested_blob_data(
230    webkit_blob::BlobData* data) {
231  requested_blob_data_ = data;
232}
233
234}  // namespace content
235