16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file. 46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/net/chrome_extensions_network_delegate.h" 66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/base/net_errors.h" 86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/browser_process.h" 116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/extensions/api/proxy/proxy_api.h" 126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/extensions/event_router_forwarder.h" 136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/resource_request_info.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/web_request/web_request_api.h" 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/extension_system.h" 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/info_map.h" 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/process_manager.h" 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/url_request/url_request.h" 226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using content::BrowserThread; 246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using content::ResourceRequestInfo; 256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace { 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)enum RequestStatus { REQUEST_STARTED, REQUEST_DONE }; 296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Notifies the extensions::ProcessManager that a request has started or stopped 316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// for a particular RenderFrame. 326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void NotifyEPMRequestStatus(RequestStatus status, 336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void* profile_id, 346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int process_id, 356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int render_frame_id) { 366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Profile* profile = reinterpret_cast<Profile*>(profile_id); 386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!g_browser_process->profile_manager()->IsValidProfile(profile)) 396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::ProcessManager* process_manager = 426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->process_manager(); 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // This may be NULL in unit tests. 446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!process_manager) 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Will be NULL if the request was not issued on behalf of a renderer (e.g. a 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // system-level request). 496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) content::RenderFrameHost* render_frame_host = 506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) content::RenderFrameHost::FromID(process_id, render_frame_id); 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (render_frame_host) { 526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (status == REQUEST_STARTED) { 536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) process_manager->OnNetworkRequestStarted(render_frame_host); 546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else if (status == REQUEST_DONE) { 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) process_manager->OnNetworkRequestDone(render_frame_host); 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else { 576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NOTREACHED(); 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ForwardRequestStatus( 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) RequestStatus status, net::URLRequest* request, void* profile_id) { 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!info) 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (status == REQUEST_STARTED && request->url_chain().size() > 1) { 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // It's a redirect, this request has already been counted. 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int process_id, render_frame_id; 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (info->GetAssociatedRenderFrame(&process_id, &render_frame_id)) { 756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Bind(&NotifyEPMRequestStatus, 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) status, profile_id, process_id, render_frame_id)); 786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class ChromeExtensionsNetworkDelegateImpl 826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : public ChromeExtensionsNetworkDelegate { 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) public: 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) explicit ChromeExtensionsNetworkDelegateImpl( 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::EventRouterForwarder* event_router); 866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual ~ChromeExtensionsNetworkDelegateImpl(); 876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private: 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // ChromeExtensionsNetworkDelegate implementation. 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void ForwardProxyErrors(net::URLRequest* request) OVERRIDE; 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void ForwardStartRequestStatus(net::URLRequest* request) OVERRIDE; 926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void ForwardDoneRequestStatus(net::URLRequest* request) OVERRIDE; 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual int OnBeforeURLRequest(net::URLRequest* request, 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL* new_url) OVERRIDE; 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual int OnBeforeSendHeaders(net::URLRequest* request, 976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HttpRequestHeaders* headers) OVERRIDE; 996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void OnSendHeaders(net::URLRequest* request, 1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::HttpRequestHeaders& headers) OVERRIDE; 1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual int OnHeadersReceived( 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL* allowed_unsafe_redirect_url) OVERRIDE; 1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void OnBeforeRedirect(net::URLRequest* request, 1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const GURL& new_location) OVERRIDE; 1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE; 1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void OnCompleted(net::URLRequest* request, bool started) OVERRIDE; 1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void OnURLRequestDestroyed(net::URLRequest* request) OVERRIDE; 1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void OnPACScriptError(int line_number, 1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const base::string16& error) OVERRIDE; 1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual net::NetworkDelegate::AuthRequiredResponse OnAuthRequired( 1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::AuthChallengeInfo& auth_info, 1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const AuthCallback& callback, 1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::AuthCredentials* credentials) OVERRIDE; 1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_refptr<extensions::EventRouterForwarder> event_router_; 1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChromeExtensionsNetworkDelegateImpl); 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}; 1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegateImpl::ChromeExtensionsNetworkDelegateImpl( 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::EventRouterForwarder* event_router) { 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(event_router); 1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) event_router_ = event_router; 1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegateImpl::~ChromeExtensionsNetworkDelegateImpl() {} 1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::ForwardProxyErrors( 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (request->status().status() == net::URLRequestStatus::FAILED) { 1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) switch (request->status().error()) { 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case net::ERR_PROXY_AUTH_UNSUPPORTED: 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case net::ERR_PROXY_CONNECTION_FAILED: 1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case net::ERR_TUNNEL_CONNECTION_FAILED: 1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::ProxyEventRouter::GetInstance()->OnProxyError( 1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) event_router_.get(), profile_, request->status().error()); 1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::ForwardStartRequestStatus( 1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ForwardRequestStatus(REQUEST_STARTED, request, profile_); 1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::ForwardDoneRequestStatus( 1526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ForwardRequestStatus(REQUEST_DONE, request, profile_); 1546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int ChromeExtensionsNetworkDelegateImpl::OnBeforeURLRequest( 1576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL* new_url) { 1606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest( 1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request, callback, new_url); 1626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int ChromeExtensionsNetworkDelegateImpl::OnBeforeSendHeaders( 1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 1676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HttpRequestHeaders* headers) { 1686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders( 1696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request, callback, headers); 1706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::OnSendHeaders( 1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::HttpRequestHeaders& headers) { 1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ExtensionWebRequestEventRouter::GetInstance()->OnSendHeaders( 1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request, headers); 1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int ChromeExtensionsNetworkDelegateImpl::OnHeadersReceived( 1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 1826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL* allowed_unsafe_redirect_url) { 1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return ExtensionWebRequestEventRouter::GetInstance()->OnHeadersReceived( 1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, 1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extension_info_map_.get(), 1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request, 1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) callback, 1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) original_response_headers, 1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) override_response_headers, 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) allowed_unsafe_redirect_url); 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::OnBeforeRedirect( 1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const GURL& new_location) { 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRedirect( 1996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request, new_location); 2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::OnResponseStarted( 2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ExtensionWebRequestEventRouter::GetInstance()->OnResponseStarted( 2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request); 2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ForwardProxyErrors(request); 2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::OnCompleted( 2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool started) { 2136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (request->status().status() == net::URLRequestStatus::SUCCESS) { 2146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool is_redirect = request->response_headers() && 2156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HttpResponseHeaders::IsRedirectResponseCode( 2166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request->response_headers()->response_code()); 2176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!is_redirect) { 2186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ExtensionWebRequestEventRouter::GetInstance()->OnCompleted( 2196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request); 2206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 2216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 2226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 2236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (request->status().status() == net::URLRequestStatus::FAILED || 2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request->status().status() == net::URLRequestStatus::CANCELED) { 2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred( 2276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request, started); 2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 2296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 2306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NOTREACHED(); 2326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::OnURLRequestDestroyed( 2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 2366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ExtensionWebRequestEventRouter::GetInstance()->OnURLRequestDestroyed( 2376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, request); 2386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegateImpl::OnPACScriptError( 2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int line_number, 2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const base::string16& error) { 2436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::ProxyEventRouter::GetInstance()->OnPACScriptError( 2446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) event_router_.get(), profile_, line_number, error); 2456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)net::NetworkDelegate::AuthRequiredResponse 2486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegateImpl::OnAuthRequired( 2496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 2506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::AuthChallengeInfo& auth_info, 2516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const AuthCallback& callback, 2526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::AuthCredentials* credentials) { 2536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return ExtensionWebRequestEventRouter::GetInstance()->OnAuthRequired( 2546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_, extension_info_map_.get(), request, auth_info, callback, 2556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) credentials); 2566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} // namespace 2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 2616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// static 2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegate* ChromeExtensionsNetworkDelegate::Create( 2646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::EventRouterForwarder* event_router) { 2656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return new ChromeExtensionsNetworkDelegateImpl(event_router); 2676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#else 2686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return new ChromeExtensionsNetworkDelegate(); 2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif 2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegate::ChromeExtensionsNetworkDelegate() 2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : profile_(NULL) { 2746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegate::~ChromeExtensionsNetworkDelegate() {} 2776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::set_extension_info_map( 2796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extensions::InfoMap* extension_info_map) { 2806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 2816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) extension_info_map_ = extension_info_map; 2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif 2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::ForwardProxyErrors( 2866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::ForwardStartRequestStatus( 2906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 2916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::ForwardDoneRequestStatus( 2946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int ChromeExtensionsNetworkDelegate::OnBeforeURLRequest( 2986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 2996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 3006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL* new_url) { 3016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return net::OK; 3026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int ChromeExtensionsNetworkDelegate::OnBeforeSendHeaders( 3056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 3066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 3076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::HttpRequestHeaders* headers) { 3086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return net::OK; 3096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::OnSendHeaders( 3126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::HttpRequestHeaders& headers) { 3146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int ChromeExtensionsNetworkDelegate::OnHeadersReceived( 3176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 3186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::CompletionCallback& callback, 3196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 3206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 3216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GURL* allowed_unsafe_redirect_url) { 3226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return net::OK; 3236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::OnBeforeRedirect( 3266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 3276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const GURL& new_location) { 3286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::OnResponseStarted( 3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 3336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::OnCompleted( 3366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 3376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool started) { 3386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::OnURLRequestDestroyed( 3416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request) { 3426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeExtensionsNetworkDelegate::OnPACScriptError( 3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int line_number, 3466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const base::string16& error) { 3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 3486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)net::NetworkDelegate::AuthRequiredResponse 3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)ChromeExtensionsNetworkDelegate::OnAuthRequired( 3516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequest* request, 3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const net::AuthChallengeInfo& auth_info, 3536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const AuthCallback& callback, 3546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::AuthCredentials* credentials) { 3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return net::NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; 3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 357