chrome_resource_dispatcher_host_delegate.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_request_limiter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_resource_throttle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_util.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/streams_private/streams_private_api.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/user_script_listener.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/metrics/variations/variations_http_header_provider.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/resource_prefetch_predictor_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prerender/prerender_util.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_url_request_user_data.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/safe_browsing_resource_throttle_factory.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/auto_login_prompter.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/login/login_prompt.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/one_click_signin_helper.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/mime_types_handler.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/user_script.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_info.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/stream_handle.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/resource_response.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h"
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/load_timing_info.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_resource_throttle.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_SYSTEM_PROTOBUF)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <google/protobuf/repeated_field.h>
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/android/intercept_download_resource_throttle.h"
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/navigation_interception/intercept_navigation_delegate.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/merge_session_throttle.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(oshima): Enable this for other platforms.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/offline_resource_throttle.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceDispatcherHostLoginDelegate;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceRequestInfo;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Extension;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extensions::StreamsPrivateAPI;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NotifyDownloadInitiatedOnUI(int render_process_id, int render_view_id) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = RenderViewHost::FromID(render_process_id,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               render_view_id);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_DOWNLOAD_INITIATED,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<RenderViewHost>(rvh),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Goes through the extension's file browser handlers and checks if there is one
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that can handle the |mime_type|.
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |extension| must not be NULL.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionCanHandleMimeType(const Extension* extension,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const std::string& mime_type) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!handler)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return handler->CanHandleMIMEType(mime_type);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendExecuteMimeTypeHandlerEvent(scoped_ptr<content::StreamHandle> stream,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     int render_process_id,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     int render_view_id,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     const std::string& extension_id) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderViewHost* render_view_host =
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::RenderViewHost::FromID(render_process_id, render_view_id);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* web_contents =
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents::FromRenderViewHost(render_view_host);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserContext* browser_context = web_contents->GetBrowserContext();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser_context)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!profile)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StreamsPrivateAPI* streams_private = StreamsPrivateAPI::Get(profile);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!streams_private)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  streams_private->ExecuteMimeTypeHandler(
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_id, web_contents, stream.Pass());
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // end namespace
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender::PrerenderTracker* prerender_tracker)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : download_request_limiter_(g_browser_process->download_request_limiter()),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      safe_browsing_(g_browser_process->safe_browsing_service()),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_script_listener_(new extensions::UserScriptListener()),
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_tracker_(prerender_tracker) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_id,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& method,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceType::Type resource_type,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::Referrer& referrer) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle a PREFETCH resource type. If prefetch is disabled, squelch the
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.  Otherwise, do a normal request to warm the cache.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (resource_type == ResourceType::PREFETCH) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // All PREFETCH requests should be GETs, but be defensive about it.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method != "GET")
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If prefetch is disabled, kill the request.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!prerender::PrerenderManager::IsPrefetchEnabled())
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Abort any prerenders that spawn requests that use invalid HTTP methods
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or invalid schemes.
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!prerender::PrerenderManager::IsValidHttpMethod(method)) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_tracker_->TryCancelOnIOThread(
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          child_id, route_id, prerender::FINAL_STATUS_INVALID_HTTP_METHOD);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!prerender::PrerenderManager::DoesURLHaveValidScheme(url)) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_tracker_->TryCancelOnIOThread(
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          child_id, route_id, prerender::FINAL_STATUS_UNSUPPORTED_SCHEME);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::RequestBeginning(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    appcache::AppCacheService* appcache_service,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceType::Type resource_type,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_id,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_continuation_of_transferred_request,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_continuation_of_transferred_request)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeURLRequestUserData::Delete(request);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeURLRequestUserData* user_data =
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChromeURLRequestUserData::Create(request);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_prerendering = prerender_tracker_->IsPrerenderingOnIOThread(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id, route_id);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_prerendering) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_data->set_is_prerender(true);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request->SetPriority(net::IDLE);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_prerendering && resource_type == ResourceType::MAIN_FRAME) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles->push_back(
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        components::InterceptNavigationDelegate::CreateThrottleFor(request));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (resource_type == ResourceType::MAIN_FRAME) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We check offline first, then check safe browsing so that we still can
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // block unsafe site after we remove offline page.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles->push_back(new OfflineResourceThrottle(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child_id, route_id, request, appcache_service));
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Add interstitial page while merge session process (cookie
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // reconstruction from OAuth2 refresh token in ChromeOS login) is still in
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // progress while we are attempting to load a google property.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    throttles->push_back(new MergeSessionThrottle(
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child_id, route_id, request));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't attempt to append headers to requests that have already started.
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(stevet): Remove this once the request ordering issues are resolved
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in crbug.com/128048.
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!request->is_pending()) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::HttpRequestHeaders headers;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers.CopyFrom(request->extra_request_headers());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileIOData* io_data = ProfileIOData::FromResourceContext(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        resource_context);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool incognito = io_data->is_incognito();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome_variations::VariationsHttpHeaderProvider::GetInstance()->
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AppendHeaders(request->url(),
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      incognito,
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      !incognito && io_data->GetMetricsEnabledStateOnIOThread(),
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      &headers);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request->SetExtraRequestHeaders(headers);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendChromeSyncGaiaHeader(request, resource_context);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendStandardResourceThrottles(request,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  resource_context,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  child_id,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  route_id,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  resource_type,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  throttles);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (io_data->resource_prefetch_predictor_observer()) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_data->resource_prefetch_predictor_observer()->OnRequestStarted(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request, resource_type, child_id, route_id);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::DownloadStarting(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_id,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int request_id,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_content_initiated,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool must_download,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NotifyDownloadInitiatedOnUI, child_id, route_id));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If it's from the web, we don't trust it, so we push the throttle on.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_content_initiated) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles->push_back(new DownloadResourceThrottle(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        download_request_limiter_, child_id, route_id, request_id,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request->method()));
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID)
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    throttles->push_back(
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new chrome::InterceptDownloadResourceThrottle(
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            request, child_id, route_id, request_id));
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this isn't a new request, we've seen this before and added the standard
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  resource throttles already so no need to add it again.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!request->is_pending()) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendStandardResourceThrottles(request,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    resource_context,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    child_id,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    route_id,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ResourceType::MAIN_FRAME,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    throttles);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::AcceptSSLClientCertificateRequest(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request->load_flags() & net::LOAD_PREFETCH)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeURLRequestUserData* user_data = ChromeURLRequestUserData::Get(request);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (user_data && user_data->is_prerender()) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_id, route_id;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &child_id, &route_id)) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (prerender_tracker_->TryCancel(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              child_id, route_id,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED)) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::AcceptAuthRequest(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::AuthChallengeInfo* auth_info) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeURLRequestUserData* user_data = ChromeURLRequestUserData::Get(request);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!user_data || !user_data->is_prerender())
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int child_id, route_id;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &child_id, &route_id)) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prerender_tracker_->TryCancelOnIOThread(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_id, route_id, prerender::FINAL_STATUS_AUTH_NEEDED)) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceDispatcherHostLoginDelegate*
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeResourceDispatcherHostDelegate::CreateLoginDelegate(
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::AuthChallengeInfo* auth_info, net::URLRequest* request) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateLoginPrompt(auth_info, request);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url, int child_id, int route_id) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Android use a resource throttle to handle external as well as internal
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // protocols.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_tracker_->TryCancel(
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child_id, route_id, prerender::FINAL_STATUS_UNSUPPORTED_SCHEME);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ExternalProtocolHandler::LaunchUrl, url, child_id, route_id));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles(
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequest* request,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_id,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceType::Type resource_type,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert safe browsing at the front of the list, so it gets to decide on
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // policies first.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (io_data->safe_browsing_enabled()->GetValue()) {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_subresource_request = resource_type != ResourceType::MAIN_FRAME;
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::ResourceThrottle* throttle =
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SafeBrowsingResourceThrottleFactory::Create(request, child_id, route_id,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            is_subresource_request, safe_browsing_);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (throttle)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      throttles->push_back(throttle);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_subresource_request = resource_type != ResourceType::MAIN_FRAME;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  throttles->push_back(new ManagedModeResourceThrottle(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        request, child_id, route_id, !is_subresource_request,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        io_data->managed_mode_url_filter()));
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ResourceThrottle* throttle =
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_script_listener_->CreateResourceThrottle(request->url(),
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    resource_type);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (throttle)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles->push_back(throttle);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::AppendChromeSyncGaiaHeader(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context) {
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kAllowChromeSignIn[] = "Allow-Chrome-SignIn";
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninHelper::Offer offer =
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OneClickSigninHelper::CanOfferOnIOThread(request, io_data);
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (offer) {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case OneClickSigninHelper::CAN_OFFER:
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request->SetExtraRequestHeaderByName(kAllowChromeSignIn, "1", false);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case OneClickSigninHelper::DONT_OFFER:
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request->RemoveRequestHeaderByName(kAllowChromeSignIn);
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case OneClickSigninHelper::IGNORE_REQUEST:
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::ShouldForceDownloadResource(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url, const std::string& mime_type) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Special-case user scripts to get downloaded instead of viewed.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extensions::UserScript::IsURLUserScript(url, mime_type);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream(
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::ResourceContext* resource_context,
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& url,
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& mime_type,
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL* security_origin,
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string* target_id) {
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data =
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProfileIOData::FromResourceContext(resource_context);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool profile_is_incognito = io_data->is_incognito();
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const scoped_refptr<const ExtensionInfoMap> extension_info_map(
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      io_data->GetExtensionInfoMap());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> whitelist = MimeTypesHandler::GetMIMETypeWhitelist();
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Go through the white-listed extensions and try to use them to intercept
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the URL request.
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < whitelist.size(); ++i) {
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* extension_id = whitelist[i].c_str();
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Extension* extension =
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_info_map->extensions().GetByID(extension_id);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The white-listed extension may not be installed, so we have to NULL check
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |extension|.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!extension ||
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (profile_is_incognito &&
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         !extension_info_map->IsIncognitoEnabled(extension_id))) {
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ExtensionCanHandleMimeType(extension, mime_type)) {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *security_origin = Extension::GetBaseURLFromExtensionId(extension_id);
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *target_id = extension_id;
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeResourceDispatcherHostDelegate::OnStreamCreated(
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::ResourceContext* resource_context,
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int render_process_id,
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int render_view_id,
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& target_id,
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<content::StreamHandle> stream) {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserThread::PostTask(
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::UI, FROM_HERE,
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&SendExecuteMimeTypeHandlerEvent, base::Passed(&stream),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 render_process_id, render_view_id,
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 target_id));
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::OnResponseStarted(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceResponse* response,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Sender* sender) {
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(mmenke):  Figure out if LOAD_ENABLE_LOAD_TIMING is safe to remove.
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    request->GetLoadTimingInfo(&response->head.load_timing);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request->url().SchemeIsSecure()) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLRequestContext* context = request->context();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TransportSecurityState* state = context->transport_security_state();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::TransportSecurityState::DomainState domain_state;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool has_sni = net::SSLConfigService::IsSNIAvailable(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          context->ssl_config_service());
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (state->GetDomainState(request->url().host(), has_sni,
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                &domain_state) &&
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          domain_state.ShouldUpgradeToSSL()) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sender->Send(new ChromeViewMsg_AddStrictSecurityHost(
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info->GetRouteID(), request->url().host()));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the response contains the X-Auto-Login header.  If so, this was
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a request for a login page, and the server is allowing the browser to
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suggest auto-login, if available.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutoLoginPrompter::ShowInfoBarIfPossible(request, info->GetChildID(),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           info->GetRouteID());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the response contains the Google-Accounts-SignIn header.  If so,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then the user has just finished signing in, and the server is allowing the
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser to suggest connecting the user's profile to the account.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninHelper::ShowInfoBarIfPossible(request, io_data,
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              info->GetChildID(),
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              info->GetRouteID());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build in additional protection for the chrome web store origin.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL webstore_url(extension_urls::GetWebstoreLaunchURL());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request->url().DomainIs(webstore_url.host().c_str())) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpResponseHeaders* response_headers = request->response_headers();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response_headers->HasHeaderValue("x-frame-options", "deny") &&
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !response_headers->HasHeaderValue("x-frame-options", "sameorigin")) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response_headers->RemoveHeader("x-frame-options");
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response_headers->AddHeader("x-frame-options: sameorigin");
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (io_data->resource_prefetch_predictor_observer())
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_data->resource_prefetch_predictor_observer()->OnResponseStarted(request);
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender::URLRequestResponseStarted(request);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::OnRequestRedirected(
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& redirect_url,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceResponse* response) {
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(mmenke):  Figure out if LOAD_ENABLE_LOAD_TIMING is safe to remove.
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING)
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    request->GetLoadTimingInfo(&response->head.load_timing);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the response contains the Google-Accounts-SignIn header.  If so,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then the user has just finished signing in, and the server is allowing the
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser to suggest connecting the user's profile to the account.
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninHelper::ShowInfoBarIfPossible(request, io_data,
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              info->GetChildID(),
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              info->GetRouteID());
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendChromeSyncGaiaHeader(request, resource_context);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (io_data->resource_prefetch_predictor_observer()) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_data->resource_prefetch_predictor_observer()->OnRequestRedirected(
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirect_url, request);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int child_id, route_id;
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!prerender::PrerenderManager::DoesURLHaveValidScheme(redirect_url) &&
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView(
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &child_id, &route_id) &&
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) {
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prerender_tracker_->TryCancel(
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child_id, route_id, prerender::FINAL_STATUS_UNSUPPORTED_SCHEME);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request->Cancel();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
588