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