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
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(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
61bool 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
78ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
79    net::URLRequest* request) {
80  return static_cast<ResourceRequestInfoImpl*>(request->GetUserData(NULL));
81}
82
83// static
84const ResourceRequestInfoImpl* ResourceRequestInfoImpl::ForRequest(
85    const net::URLRequest* request) {
86  return ForRequest(const_cast<net::URLRequest*>(request));
87}
88
89ResourceRequestInfoImpl::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
140ResourceRequestInfoImpl::~ResourceRequestInfoImpl() {
141}
142
143ResourceContext* ResourceRequestInfoImpl::GetContext() const {
144  return context_;
145}
146
147int ResourceRequestInfoImpl::GetChildID() const {
148  return child_id_;
149}
150
151int ResourceRequestInfoImpl::GetRouteID() const {
152  return route_id_;
153}
154
155int ResourceRequestInfoImpl::GetOriginPID() const {
156  return origin_pid_;
157}
158
159int ResourceRequestInfoImpl::GetRequestID() const {
160  return request_id_;
161}
162
163int ResourceRequestInfoImpl::GetRenderFrameID() const {
164  return render_frame_id_;
165}
166
167bool ResourceRequestInfoImpl::IsMainFrame() const {
168  return is_main_frame_;
169}
170
171bool ResourceRequestInfoImpl::ParentIsMainFrame() const {
172  return parent_is_main_frame_;
173}
174
175int ResourceRequestInfoImpl::GetParentRenderFrameID() const {
176  return parent_render_frame_id_;
177}
178
179ResourceType ResourceRequestInfoImpl::GetResourceType() const {
180  return resource_type_;
181}
182
183int ResourceRequestInfoImpl::GetProcessType() const {
184  return process_type_;
185}
186
187blink::WebReferrerPolicy ResourceRequestInfoImpl::GetReferrerPolicy() const {
188  return referrer_policy_;
189}
190
191blink::WebPageVisibilityState
192ResourceRequestInfoImpl::GetVisibilityState() const {
193  return visibility_state_;
194}
195
196ui::PageTransition ResourceRequestInfoImpl::GetPageTransition() const {
197  return transition_type_;
198}
199
200bool ResourceRequestInfoImpl::HasUserGesture() const {
201  return has_user_gesture_;
202}
203
204bool ResourceRequestInfoImpl::WasIgnoredByHandler() const {
205  return was_ignored_by_handler_;
206}
207
208bool 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
221bool ResourceRequestInfoImpl::IsAsync() const {
222  return is_async_;
223}
224
225bool ResourceRequestInfoImpl::IsDownload() const {
226  return is_download_;
227}
228
229void 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
240GlobalRequestID ResourceRequestInfoImpl::GetGlobalRequestID() const {
241  return GlobalRequestID(child_id_, request_id_);
242}
243
244GlobalRoutingID ResourceRequestInfoImpl::GetGlobalRoutingID() const {
245  return GlobalRoutingID(child_id_, route_id_);
246}
247
248void 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