Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: extensions/browser/extension_network_delegate.cc

Issue 615583003: Introduce NetworkDelegate's implementation in extensions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/net/chrome_extensions_network_delegate.h" 5 #include "extensions/browser/extension_network_delegate.h"
6 6
7 #include "net/base/net_errors.h"
8
9 #if defined(ENABLE_EXTENSIONS)
10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/extensions/api/proxy/proxy_api.h"
12 #include "chrome/browser/extensions/event_router_forwarder.h"
13 #include "chrome/browser/profiles/profile_manager.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/render_frame_host.h" 7 #include "content/public/browser/render_frame_host.h"
16 #include "content/public/browser/resource_request_info.h" 8 #include "content/public/browser/resource_request_info.h"
17 #include "extensions/browser/api/web_request/web_request_api.h" 9 #include "extensions/browser/api/web_request/web_request_api.h"
18 #include "extensions/browser/extension_system.h" 10 #include "extensions/browser/extension_system.h"
19 #include "extensions/browser/info_map.h" 11 #include "extensions/browser/extensions_browser_client.h"
20 #include "extensions/browser/process_manager.h" 12 #include "extensions/browser/process_manager.h"
21 #include "net/url_request/url_request.h" 13 #include "net/url_request/url_request.h"
22 14
23 using content::BrowserThread; 15 namespace extensions {
24 using content::ResourceRequestInfo;
25 16
26 namespace { 17 namespace {
27 18 bool g_accept_all_cookies = true;
28 enum RequestStatus { REQUEST_STARTED, REQUEST_DONE };
29
30 // Notifies the extensions::ProcessManager that a request has started or stopped
31 // for a particular RenderFrame.
32 void NotifyEPMRequestStatus(RequestStatus status,
33 void* profile_id,
34 int process_id,
35 int render_frame_id) {
36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
37 Profile* profile = reinterpret_cast<Profile*>(profile_id);
38 if (!g_browser_process->profile_manager()->IsValidProfile(profile))
39 return;
40
41 extensions::ProcessManager* process_manager =
42 extensions::ExtensionSystem::Get(profile)->process_manager();
43 // This may be NULL in unit tests.
44 if (!process_manager)
45 return;
46
47 // Will be NULL if the request was not issued on behalf of a renderer (e.g. a
48 // system-level request).
49 content::RenderFrameHost* render_frame_host =
50 content::RenderFrameHost::FromID(process_id, render_frame_id);
51 if (render_frame_host) {
52 if (status == REQUEST_STARTED) {
53 process_manager->OnNetworkRequestStarted(render_frame_host);
54 } else if (status == REQUEST_DONE) {
55 process_manager->OnNetworkRequestDone(render_frame_host);
56 } else {
57 NOTREACHED();
58 }
59 }
60 } 19 }
61 20
62 void ForwardRequestStatus( 21 ExtensionNetworkDelegate::ExtensionNetworkDelegate(
63 RequestStatus status, net::URLRequest* request, void* profile_id) { 22 void* browser_context, InfoMap* extension_info_map) {
64 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 23 browser_context_ = browser_context;
65 if (!info) 24 extension_info_map_ = extension_info_map;
66 return;
67
68 if (status == REQUEST_STARTED && request->url_chain().size() > 1) {
69 // It's a redirect, this request has already been counted.
70 return;
71 }
72
73 int process_id, render_frame_id;
74 if (info->GetAssociatedRenderFrame(&process_id, &render_frame_id)) {
75 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
76 base::Bind(&NotifyEPMRequestStatus,
77 status, profile_id, process_id, render_frame_id));
78 }
79 } 25 }
80 26
81 class ChromeExtensionsNetworkDelegateImpl 27 ExtensionNetworkDelegate::~ExtensionNetworkDelegate() {}
82 : public ChromeExtensionsNetworkDelegate {
83 public:
84 explicit ChromeExtensionsNetworkDelegateImpl(
85 extensions::EventRouterForwarder* event_router);
86 virtual ~ChromeExtensionsNetworkDelegateImpl();
87 28
88 private: 29 void ExtensionNetworkDelegate::SetAcceptAllCookies(bool accept) {
89 // ChromeExtensionsNetworkDelegate implementation. 30 g_accept_all_cookies = accept;
90 virtual void ForwardProxyErrors(net::URLRequest* request) OVERRIDE;
91 virtual void ForwardStartRequestStatus(net::URLRequest* request) OVERRIDE;
92 virtual void ForwardDoneRequestStatus(net::URLRequest* request) OVERRIDE;
93 virtual int OnBeforeURLRequest(net::URLRequest* request,
94 const net::CompletionCallback& callback,
95 GURL* new_url) OVERRIDE;
96 virtual int OnBeforeSendHeaders(net::URLRequest* request,
97 const net::CompletionCallback& callback,
98 net::HttpRequestHeaders* headers) OVERRIDE;
99 virtual void OnSendHeaders(net::URLRequest* request,
100 const net::HttpRequestHeaders& headers) OVERRIDE;
101 virtual int OnHeadersReceived(
102 net::URLRequest* request,
103 const net::CompletionCallback& callback,
104 const net::HttpResponseHeaders* original_response_headers,
105 scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
106 GURL* allowed_unsafe_redirect_url) OVERRIDE;
107 virtual void OnBeforeRedirect(net::URLRequest* request,
108 const GURL& new_location) OVERRIDE;
109 virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE;
110 virtual void OnCompleted(net::URLRequest* request, bool started) OVERRIDE;
111 virtual void OnURLRequestDestroyed(net::URLRequest* request) OVERRIDE;
112 virtual void OnPACScriptError(int line_number,
113 const base::string16& error) OVERRIDE;
114 virtual net::NetworkDelegate::AuthRequiredResponse OnAuthRequired(
115 net::URLRequest* request,
116 const net::AuthChallengeInfo& auth_info,
117 const AuthCallback& callback,
118 net::AuthCredentials* credentials) OVERRIDE;
119
120 scoped_refptr<extensions::EventRouterForwarder> event_router_;
121
122 DISALLOW_COPY_AND_ASSIGN(ChromeExtensionsNetworkDelegateImpl);
123 };
124
125 ChromeExtensionsNetworkDelegateImpl::ChromeExtensionsNetworkDelegateImpl(
126 extensions::EventRouterForwarder* event_router) {
127 DCHECK(event_router);
128 event_router_ = event_router;
129 } 31 }
130 32
131 ChromeExtensionsNetworkDelegateImpl::~ChromeExtensionsNetworkDelegateImpl() {} 33 int ExtensionNetworkDelegate::OnBeforeURLRequest(
132
133 void ChromeExtensionsNetworkDelegateImpl::ForwardProxyErrors(
134 net::URLRequest* request) {
135 if (request->status().status() == net::URLRequestStatus::FAILED) {
136 switch (request->status().error()) {
137 case net::ERR_PROXY_AUTH_UNSUPPORTED:
138 case net::ERR_PROXY_CONNECTION_FAILED:
139 case net::ERR_TUNNEL_CONNECTION_FAILED:
140 extensions::ProxyEventRouter::GetInstance()->OnProxyError(
141 event_router_.get(), profile_, request->status().error());
142 }
143 }
144 }
145
146 void ChromeExtensionsNetworkDelegateImpl::ForwardStartRequestStatus(
147 net::URLRequest* request) {
148 ForwardRequestStatus(REQUEST_STARTED, request, profile_);
149 }
150
151 void ChromeExtensionsNetworkDelegateImpl::ForwardDoneRequestStatus(
152 net::URLRequest* request) {
153 ForwardRequestStatus(REQUEST_DONE, request, profile_);
154 }
155
156 int ChromeExtensionsNetworkDelegateImpl::OnBeforeURLRequest(
157 net::URLRequest* request, 34 net::URLRequest* request,
158 const net::CompletionCallback& callback, 35 const net::CompletionCallback& callback,
159 GURL* new_url) { 36 GURL* new_url) {
160 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest( 37 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest(
161 profile_, extension_info_map_.get(), request, callback, new_url); 38 browser_context_, extension_info_map_.get(), request, callback, new_url);
162 } 39 }
163 40
164 int ChromeExtensionsNetworkDelegateImpl::OnBeforeSendHeaders( 41 int ExtensionNetworkDelegate::OnBeforeSendHeaders(
165 net::URLRequest* request, 42 net::URLRequest* request,
166 const net::CompletionCallback& callback, 43 const net::CompletionCallback& callback,
167 net::HttpRequestHeaders* headers) { 44 net::HttpRequestHeaders* headers) {
168 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders( 45 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders(
169 profile_, extension_info_map_.get(), request, callback, headers); 46 browser_context_, extension_info_map_.get(), request, callback, headers);
170 } 47 }
171 48
172 void ChromeExtensionsNetworkDelegateImpl::OnSendHeaders( 49 void ExtensionNetworkDelegate::OnSendHeaders(
173 net::URLRequest* request, 50 net::URLRequest* request,
174 const net::HttpRequestHeaders& headers) { 51 const net::HttpRequestHeaders& headers) {
175 ExtensionWebRequestEventRouter::GetInstance()->OnSendHeaders( 52 ExtensionWebRequestEventRouter::GetInstance()->OnSendHeaders(
176 profile_, extension_info_map_.get(), request, headers); 53 browser_context_, extension_info_map_.get(), request, headers);
177 } 54 }
178 55
179 int ChromeExtensionsNetworkDelegateImpl::OnHeadersReceived( 56 int ExtensionNetworkDelegate::OnHeadersReceived(
180 net::URLRequest* request, 57 net::URLRequest* request,
181 const net::CompletionCallback& callback, 58 const net::CompletionCallback& callback,
182 const net::HttpResponseHeaders* original_response_headers, 59 const net::HttpResponseHeaders* original_response_headers,
183 scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 60 scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
184 GURL* allowed_unsafe_redirect_url) { 61 GURL* allowed_unsafe_redirect_url) {
185 return ExtensionWebRequestEventRouter::GetInstance()->OnHeadersReceived( 62 return ExtensionWebRequestEventRouter::GetInstance()->OnHeadersReceived(
186 profile_, 63 browser_context_,
187 extension_info_map_.get(), 64 extension_info_map_.get(),
188 request, 65 request,
189 callback, 66 callback,
190 original_response_headers, 67 original_response_headers,
191 override_response_headers, 68 override_response_headers,
192 allowed_unsafe_redirect_url); 69 allowed_unsafe_redirect_url);
193 } 70 }
194 71
195 void ChromeExtensionsNetworkDelegateImpl::OnBeforeRedirect( 72 void ExtensionNetworkDelegate::OnBeforeRedirect(
196 net::URLRequest* request, 73 net::URLRequest* request,
197 const GURL& new_location) { 74 const GURL& new_location) {
198 ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRedirect( 75 ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRedirect(
199 profile_, extension_info_map_.get(), request, new_location); 76 browser_context_, extension_info_map_.get(), request, new_location);
200 } 77 }
201 78
202 79
203 void ChromeExtensionsNetworkDelegateImpl::OnResponseStarted( 80 void ExtensionNetworkDelegate::OnResponseStarted(
204 net::URLRequest* request) { 81 net::URLRequest* request) {
205 ExtensionWebRequestEventRouter::GetInstance()->OnResponseStarted( 82 ExtensionWebRequestEventRouter::GetInstance()->OnResponseStarted(
206 profile_, extension_info_map_.get(), request); 83 browser_context_, extension_info_map_.get(), request);
207 ForwardProxyErrors(request);
208 } 84 }
209 85
210 void ChromeExtensionsNetworkDelegateImpl::OnCompleted( 86 void ExtensionNetworkDelegate::OnCompleted(
211 net::URLRequest* request, 87 net::URLRequest* request,
212 bool started) { 88 bool started) {
213 if (request->status().status() == net::URLRequestStatus::SUCCESS) { 89 if (request->status().status() == net::URLRequestStatus::SUCCESS) {
214 bool is_redirect = request->response_headers() && 90 bool is_redirect = request->response_headers() &&
215 net::HttpResponseHeaders::IsRedirectResponseCode( 91 net::HttpResponseHeaders::IsRedirectResponseCode(
216 request->response_headers()->response_code()); 92 request->response_headers()->response_code());
217 if (!is_redirect) { 93 if (!is_redirect) {
218 ExtensionWebRequestEventRouter::GetInstance()->OnCompleted( 94 ExtensionWebRequestEventRouter::GetInstance()->OnCompleted(
219 profile_, extension_info_map_.get(), request); 95 browser_context_, extension_info_map_.get(), request);
220 } 96 }
221 return; 97 return;
222 } 98 }
223 99
224 if (request->status().status() == net::URLRequestStatus::FAILED || 100 if (request->status().status() == net::URLRequestStatus::FAILED ||
225 request->status().status() == net::URLRequestStatus::CANCELED) { 101 request->status().status() == net::URLRequestStatus::CANCELED) {
226 ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred( 102 ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred(
227 profile_, extension_info_map_.get(), request, started); 103 browser_context_, extension_info_map_.get(), request, started);
228 return; 104 return;
229 } 105 }
230 106
231 NOTREACHED(); 107 NOTREACHED();
232 } 108 }
233 109
234 void ChromeExtensionsNetworkDelegateImpl::OnURLRequestDestroyed( 110 void ExtensionNetworkDelegate::OnURLRequestDestroyed(
235 net::URLRequest* request) { 111 net::URLRequest* request) {
236 ExtensionWebRequestEventRouter::GetInstance()->OnURLRequestDestroyed( 112 ExtensionWebRequestEventRouter::GetInstance()->OnURLRequestDestroyed(
237 profile_, request); 113 browser_context_, request);
238 } 114 }
239 115
240 void ChromeExtensionsNetworkDelegateImpl::OnPACScriptError( 116 void ExtensionNetworkDelegate::OnPACScriptError(
241 int line_number, 117 int line_number,
242 const base::string16& error) { 118 const base::string16& error) {
243 extensions::ProxyEventRouter::GetInstance()->OnPACScriptError(
244 event_router_.get(), profile_, line_number, error);
245 } 119 }
246 120
247 net::NetworkDelegate::AuthRequiredResponse 121 net::NetworkDelegate::AuthRequiredResponse
248 ChromeExtensionsNetworkDelegateImpl::OnAuthRequired( 122 ExtensionNetworkDelegate::OnAuthRequired(
249 net::URLRequest* request, 123 net::URLRequest* request,
250 const net::AuthChallengeInfo& auth_info, 124 const net::AuthChallengeInfo& auth_info,
251 const AuthCallback& callback, 125 const AuthCallback& callback,
252 net::AuthCredentials* credentials) { 126 net::AuthCredentials* credentials) {
253 return ExtensionWebRequestEventRouter::GetInstance()->OnAuthRequired( 127 return ExtensionWebRequestEventRouter::GetInstance()->OnAuthRequired(
254 profile_, extension_info_map_.get(), request, auth_info, callback, 128 browser_context_, extension_info_map_.get(), request, auth_info, callback,
255 credentials); 129 credentials);
256 } 130 }
257 131
258 } // namespace 132 } // namespace extensions
259
260 #endif // defined(ENABLE_EXTENSIONS)
261
262 // static
263 ChromeExtensionsNetworkDelegate* ChromeExtensionsNetworkDelegate::Create(
264 extensions::EventRouterForwarder* event_router) {
265 #if defined(ENABLE_EXTENSIONS)
266 return new ChromeExtensionsNetworkDelegateImpl(event_router);
267 #else
268 return new ChromeExtensionsNetworkDelegate();
269 #endif
270 }
271
272 ChromeExtensionsNetworkDelegate::ChromeExtensionsNetworkDelegate()
273 : profile_(NULL) {
274 }
275
276 ChromeExtensionsNetworkDelegate::~ChromeExtensionsNetworkDelegate() {}
277
278 void ChromeExtensionsNetworkDelegate::set_extension_info_map(
279 extensions::InfoMap* extension_info_map) {
280 #if defined(ENABLE_EXTENSIONS)
281 extension_info_map_ = extension_info_map;
282 #endif
283 }
284
285 void ChromeExtensionsNetworkDelegate::ForwardProxyErrors(
286 net::URLRequest* request) {
287 }
288
289 void ChromeExtensionsNetworkDelegate::ForwardStartRequestStatus(
290 net::URLRequest* request) {
291 }
292
293 void ChromeExtensionsNetworkDelegate::ForwardDoneRequestStatus(
294 net::URLRequest* request) {
295 }
296
297 int ChromeExtensionsNetworkDelegate::OnBeforeURLRequest(
298 net::URLRequest* request,
299 const net::CompletionCallback& callback,
300 GURL* new_url) {
301 return net::OK;
302 }
303
304 int ChromeExtensionsNetworkDelegate::OnBeforeSendHeaders(
305 net::URLRequest* request,
306 const net::CompletionCallback& callback,
307 net::HttpRequestHeaders* headers) {
308 return net::OK;
309 }
310
311 void ChromeExtensionsNetworkDelegate::OnSendHeaders(
312 net::URLRequest* request,
313 const net::HttpRequestHeaders& headers) {
314 }
315
316 int ChromeExtensionsNetworkDelegate::OnHeadersReceived(
317 net::URLRequest* request,
318 const net::CompletionCallback& callback,
319 const net::HttpResponseHeaders* original_response_headers,
320 scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
321 GURL* allowed_unsafe_redirect_url) {
322 return net::OK;
323 }
324
325 void ChromeExtensionsNetworkDelegate::OnBeforeRedirect(
326 net::URLRequest* request,
327 const GURL& new_location) {
328 }
329
330
331 void ChromeExtensionsNetworkDelegate::OnResponseStarted(
332 net::URLRequest* request) {
333 }
334
335 void ChromeExtensionsNetworkDelegate::OnCompleted(
336 net::URLRequest* request,
337 bool started) {
338 }
339
340 void ChromeExtensionsNetworkDelegate::OnURLRequestDestroyed(
341 net::URLRequest* request) {
342 }
343
344 void ChromeExtensionsNetworkDelegate::OnPACScriptError(
345 int line_number,
346 const base::string16& error) {
347 }
348
349 net::NetworkDelegate::AuthRequiredResponse
350 ChromeExtensionsNetworkDelegate::OnAuthRequired(
351 net::URLRequest* request,
352 const net::AuthChallengeInfo& auth_info,
353 const AuthCallback& callback,
354 net::AuthCredentials* credentials) {
355 return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
356 }
OLDNEW
« no previous file with comments | « extensions/browser/extension_network_delegate.h ('k') | extensions/browser/extension_url_request_context_getter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698