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>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/guid.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_resource_throttle.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_request_limiter.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_resource_throttle.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/net/resource_prefetch_predictor_observer.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prefetch/prefetch.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prerender/prerender_pending_swap_throttle.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/prerender/prerender_resource_throttle.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prerender/prerender_util.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_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"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_header_helper.h"
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/login/login_prompt.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/one_click_signin_helper.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/url_constants.h"
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/variations/variations_http_header_provider.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_info.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/stream_handle.h"
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/resource_response.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h"
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/load_timing_info.h"
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/request_priority.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_NACL)
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/component_updater/pnacl/pnacl_component_installer.h"
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/policy_header_io_helper.h"
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/apps/app_url_redirector.h"
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/apps/ephemeral_app_throttle.h"
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/api/streams_private/streams_private_api.h"
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/user_script_listener.h"
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/manifest_handlers/mime_types_handler.h"
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/info_map.h"
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/constants.h"
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_urls.h"
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/user_script.h"
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_resource_throttle.h"
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_SYSTEM_PROTOBUF)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <google/protobuf/repeated_field.h>
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/android/intercept_download_resource_throttle.h"
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/android/infobars/auto_login_prompter.h"
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/navigation_interception/intercept_navigation_delegate.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/merge_session_throttle.h"
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(oshima): Enable this for other platforms.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/offline_resource_throttle.h"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceDispatcherHostLoginDelegate;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceRequestInfo;
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::ResourceType;
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Extension;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extensions::StreamsPrivateAPI;
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_ANDROID)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using navigation_interception::InterceptNavigationDelegate;
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExternalProtocolHandler::Delegate* g_external_protocol_handler_delegate = NULL;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NotifyDownloadInitiatedOnUI(int render_process_id, int render_view_id) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = RenderViewHost::FromID(render_process_id,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               render_view_id);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_DOWNLOAD_INITIATED,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<RenderViewHost>(rvh),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)prerender::PrerenderManager* GetPrerenderManager(int render_process_id,
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 int render_view_id) {
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* web_contents =
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      tab_util::GetWebContentsByID(render_process_id, render_view_id);
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!web_contents)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return NULL;
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::BrowserContext* browser_context = web_contents->GetBrowserContext();
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!browser_context)
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return NULL;
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(browser_context);
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!profile)
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return NULL;
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return prerender::PrerenderManagerFactory::GetForProfile(profile);
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UpdatePrerenderNetworkBytesCallback(int render_process_id,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         int render_view_id,
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         int64 bytes) {
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::WebContents* web_contents =
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      tab_util::GetWebContentsByID(render_process_id, render_view_id);
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // PrerenderContents::FromWebContents handles the NULL case.
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender::PrerenderContents* prerender_contents =
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      prerender::PrerenderContents::FromWebContents(web_contents);
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (prerender_contents)
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prerender_contents->AddNetworkBytes(bytes);
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  prerender::PrerenderManager* prerender_manager =
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetPrerenderManager(render_process_id, render_view_id);
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (prerender_manager)
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prerender_manager->AddProfileNetworkBytesIfEnabled(bytes);
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SendExecuteMimeTypeHandlerEvent(scoped_ptr<content::StreamHandle> stream,
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     int64 expected_content_size,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     int render_process_id,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     int render_view_id,
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     const std::string& extension_id,
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     const std::string& view_id) {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* web_contents =
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      tab_util::GetWebContentsByID(render_process_id, render_view_id);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents)
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the request was for a prerender, abort the prerender and do not
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // continue.
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  prerender::PrerenderContents* prerender_contents =
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      prerender::PrerenderContents::FromWebContents(web_contents);
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (prerender_contents) {
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prerender_contents->Destroy(prerender::FINAL_STATUS_DOWNLOAD);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Profile* profile =
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Profile::FromBrowserContext(web_contents->GetBrowserContext());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StreamsPrivateAPI* streams_private = StreamsPrivateAPI::Get(profile);
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!streams_private)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  streams_private->ExecuteMimeTypeHandler(
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extension_id, web_contents, stream.Pass(), view_id,
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      expected_content_size);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // !defined(ENABLE_EXTENSIONS)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_ANDROID)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LaunchURL(const GURL& url, int render_process_id, int render_view_id) {
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If there is no longer a WebContents, the request may have raced with tab
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // closing. Don't fire the external request. (It may have been a prerender.)
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::WebContents* web_contents =
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      tab_util::GetWebContentsByID(render_process_id, render_view_id);
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!web_contents)
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Do not launch external requests attached to unswapped prerenders.
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender::PrerenderContents* prerender_contents =
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      prerender::PrerenderContents::FromWebContents(web_contents);
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (prerender_contents) {
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME);
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prerender::ReportPrerenderExternalURL();
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExternalProtocolHandler::LaunchUrlWithDelegate(
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      url,
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      render_process_id,
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      render_view_id,
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      g_external_protocol_handler_delegate);
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_NACL)
2310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AppendComponentUpdaterThrottles(
2320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    net::URLRequest* request,
2330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::ResourceContext* resource_context,
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResourceType resource_type,
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const char* crx_id = NULL;
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater::ComponentUpdateService* cus =
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->component_updater();
2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!cus)
2400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Check for PNaCl pexe request.
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (resource_type == content::RESOURCE_TYPE_OBJECT) {
2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const net::HttpRequestHeaders& headers = request->extra_request_headers();
2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::string accept_headers;
2450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (headers.GetHeader("Accept", &accept_headers)) {
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (accept_headers.find("application/x-pnacl") != std::string::npos &&
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          pnacl::NeedsOnDemandUpdate())
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        crx_id = "hnimpnehoodheedghdeeijklkeaacbdc";
2490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
2500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
2510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (crx_id) {
2530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // We got a component we need to install, so throttle the resource
2540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // until the component is installed.
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    throttles->push_back(
2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        component_updater::GetOnDemandResourceThrottle(cus, crx_id));
2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
2580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // !defined(DISABLE_NACL)
2600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender::PrerenderTracker* prerender_tracker)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : download_request_limiter_(g_browser_process->download_request_limiter()),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      safe_browsing_(g_browser_process->safe_browsing_service()),
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_script_listener_(new extensions::UserScriptListener()),
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prerender_tracker_(prerender_tracker) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() {
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CHECK(stream_target_info_.empty());
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& method,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResourceType resource_type,
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::ResourceContext* resource_context) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle a PREFETCH resource type. If prefetch is disabled, squelch the
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.  Otherwise, do a normal request to warm the cache.
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (resource_type == content::RESOURCE_TYPE_PREFETCH) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // All PREFETCH requests should be GETs, but be defensive about it.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method != "GET")
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If prefetch is disabled, kill the request.
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!prefetch::IsPrefetchEnabled(resource_context))
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::RequestBeginning(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::AppCacheService* appcache_service,
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResourceType resource_type,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool is_prerendering =
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      info->GetVisibilityState() == blink::WebPageVisibilityStatePrerender;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_prerendering) {
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Requests with the IGNORE_LIMITS flag set (i.e., sync XHRs)
312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // should remain at MAXIMUM_PRIORITY.
313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (request->load_flags() & net::LOAD_IGNORE_LIMITS) {
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      DCHECK_EQ(request->priority(), net::MAXIMUM_PRIORITY);
315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else {
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      request->SetPriority(net::IDLE);
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      resource_context);
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID)
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(davidben): This is insufficient to integrate with prerender properly.
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // https://crbug.com/370595
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME && !is_prerendering) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles->push_back(
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        InterceptNavigationDelegate::CreateThrottleFor(request));
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Redirect some navigations to apps that have registered matching URL
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // handlers ('url_handlers' in the manifest).
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::ResourceThrottle* url_to_app_throttle =
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        AppUrlRedirector::MaybeCreateThrottleFor(request, io_data);
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (url_to_app_throttle)
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      throttles->push_back(url_to_app_throttle);
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!is_prerendering) {
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Experimental: Launch ephemeral apps from search results.
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::ResourceThrottle* ephemeral_app_throttle =
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          EphemeralAppThrottle::MaybeCreateThrottleForLaunch(
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              request, io_data);
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (ephemeral_app_throttle)
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        throttles->push_back(ephemeral_app_throttle);
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check if we need to add offline throttle. This should be done only
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // for main frames.
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We check offline first, then check safe browsing so that we still can
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // block unsafe site after we remove offline page.
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    throttles->push_back(new OfflineResourceThrottle(request,
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                     appcache_service));
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check if we need to add merge session throttle. This throttle will postpone
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // loading of main frames and XHR request.
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME ||
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      resource_type == content::RESOURCE_TYPE_XHR) {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Add interstitial page while merge session process (cookie
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // reconstruction from OAuth2 refresh token in ChromeOS login) is still in
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // progress while we are attempting to load a google property.
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!MergeSessionThrottle::AreAllSessionMergedAlready() &&
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        request->url().SchemeIsHTTPOrHTTPS()) {
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      throttles->push_back(new MergeSessionThrottle(request, resource_type));
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't attempt to append headers to requests that have already started.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(stevet): Remove this once the request ordering issues are resolved
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in crbug.com/128048.
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!request->is_pending()) {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::HttpRequestHeaders headers;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    headers.CopyFrom(request->extra_request_headers());
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool is_off_the_record = io_data->IsOffTheRecord();
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    variations::VariationsHttpHeaderProvider::GetInstance()->
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AppendHeaders(request->url(),
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      is_off_the_record,
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      !is_off_the_record &&
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          io_data->GetMetricsEnabledStateOnIOThread(),
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      &headers);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request->SetExtraRequestHeaders(headers);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendChromeSyncGaiaHeader(request, resource_context);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (io_data->policy_header_helper())
39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    io_data->policy_header_helper()->AddPolicyHeaders(request->url(), request);
397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  signin::AppendMirrorRequestHeaderIfPossible(
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      request, GURL() /* redirect_url */, io_data);
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendStandardResourceThrottles(request,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  resource_context,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  resource_type,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  throttles);
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_NACL)
4070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!is_prerendering) {
4080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    AppendComponentUpdaterThrottles(request,
4090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    resource_context,
4100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    resource_type,
4110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    throttles);
4120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (io_data->resource_prefetch_predictor_observer()) {
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    io_data->resource_prefetch_predictor_observer()->OnRequestStarted(
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        request, resource_type, info->GetChildID(), info->GetRenderFrameID());
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
41968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
42068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::DownloadStarting(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_id,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int request_id,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_content_initiated,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool must_download,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NotifyDownloadInitiatedOnUI, child_id, route_id));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If it's from the web, we don't trust it, so we push the throttle on.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_content_initiated) {
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    throttles->push_back(
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new DownloadResourceThrottle(download_request_limiter_.get(),
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     child_id,
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     route_id,
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     request->url(),
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     request->method()));
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID)
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    throttles->push_back(
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new chrome::InterceptDownloadResourceThrottle(
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            request, child_id, route_id, request_id));
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this isn't a new request, we've seen this before and added the standard
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  resource throttles already so no need to add it again.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!request->is_pending()) {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendStandardResourceThrottles(request,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    resource_context,
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    content::RESOURCE_TYPE_MAIN_FRAME,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    throttles);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceDispatcherHostLoginDelegate*
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeResourceDispatcherHostDelegate::CreateLoginDelegate(
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::AuthChallengeInfo* auth_info, net::URLRequest* request) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateLoginPrompt(auth_info, request);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol(
466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const GURL& url,
467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    int child_id,
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int route_id) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Android use a resource throttle to handle external as well as internal
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // protocols.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
4766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (extensions::WebViewRendererState::GetInstance()->IsGuest(child_id))
477424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return false;
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // defined(ENABLE_EXTENSIONS)
480424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          FROM_HERE,
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          base::Bind(&LaunchURL, url, child_id, route_id));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles(
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequest* request,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResourceType resource_type,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<content::ResourceThrottle>* throttles) {
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert safe browsing at the front of the list, so it gets to decide on
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // policies first.
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (io_data->safe_browsing_enabled()->GetValue()
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      || io_data->IsDataReductionProxyEnabled()
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::ResourceThrottle* throttle =
503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SafeBrowsingResourceThrottleFactory::Create(request,
504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                    resource_context,
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    resource_type,
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                    safe_browsing_.get());
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (throttle)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      throttles->push_back(throttle);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool is_subresource_request =
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      resource_type != content::RESOURCE_TYPE_MAIN_FRAME;
515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  throttles->push_back(new SupervisedUserResourceThrottle(
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        request, !is_subresource_request,
517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        io_data->supervised_user_url_filter()));
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ResourceThrottle* throttle =
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_script_listener_->CreateResourceThrottle(request->url(),
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    resource_type);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (throttle)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles->push_back(throttle);
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (info->GetVisibilityState() == blink::WebPageVisibilityStatePrerender) {
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    throttles->push_back(new prerender::PrerenderResourceThrottle(request));
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (prerender_tracker_->IsPendingSwapRequestOnIOThread(
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          info->GetChildID(), info->GetRenderFrameID(), request->url())) {
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    throttles->push_back(new prerender::PrerenderPendingSwapThrottle(
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        request, prerender_tracker_));
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::AppendChromeSyncGaiaHeader(
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context) {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kAllowChromeSignIn[] = "Allow-Chrome-SignIn";
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninHelper::Offer offer =
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OneClickSigninHelper::CanOfferOnIOThread(request, io_data);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (offer) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case OneClickSigninHelper::CAN_OFFER:
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request->SetExtraRequestHeaderByName(kAllowChromeSignIn, "1", false);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case OneClickSigninHelper::DONT_OFFER:
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request->RemoveRequestHeaderByName(kAllowChromeSignIn);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case OneClickSigninHelper::IGNORE_REQUEST:
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::ShouldForceDownloadResource(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url, const std::string& mime_type) {
563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Special-case user scripts to get downloaded instead of viewed.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extensions::UserScript::IsURLUserScript(url, mime_type);
566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream(
572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    net::URLRequest* request,
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& mime_type,
574558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    GURL* origin,
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string* payload) {
576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data =
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ProfileIOData::FromResourceContext(info->GetContext());
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool profile_is_off_the_record = io_data->IsOffTheRecord();
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const scoped_refptr<const extensions::InfoMap> extension_info_map(
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      io_data->GetExtensionInfoMap());
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> whitelist = MimeTypesHandler::GetMIMETypeWhitelist();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Go through the white-listed extensions and try to use them to intercept
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the URL request.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < whitelist.size(); ++i) {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* extension_id = whitelist[i].c_str();
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Extension* extension =
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_info_map->extensions().GetByID(extension_id);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The white-listed extension may not be installed, so we have to NULL check
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |extension|.
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!extension ||
593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        (profile_is_off_the_record &&
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         !extension_info_map->IsIncognitoEnabled(extension_id))) {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension);
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (handler && handler->CanHandleMIMEType(mime_type)) {
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      StreamTargetInfo target_info;
601558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      *origin = Extension::GetBaseURLFromExtensionId(extension_id);
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      target_info.extension_id = extension_id;
603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (!handler->handler_url().empty()) {
604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        target_info.view_id = base::GenerateGUID();
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        *payload = origin->spec() + handler->handler_url() +
606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            "?id=" + target_info.view_id;
607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      }
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      stream_target_info_[request] = target_info;
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeResourceDispatcherHostDelegate::OnStreamCreated(
617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    net::URLRequest* request,
618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<content::StreamHandle> stream) {
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::map<net::URLRequest*, StreamTargetInfo>::iterator ix =
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      stream_target_info_.find(request);
623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CHECK(ix != stream_target_info_.end());
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::BrowserThread::PostTask(
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::BrowserThread::UI, FROM_HERE,
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&SendExecuteMimeTypeHandlerEvent, base::Passed(&stream),
627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 request->GetExpectedContentSize(),
628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 info->GetChildID(), info->GetRouteID(),
629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 ix->second.extension_id, ix->second.view_id));
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  stream_target_info_.erase(request);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::OnResponseStarted(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceResponse* response,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Sender* sender) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the response contains the X-Auto-Login header.  If so, this was
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a request for a login page, and the server is allowing the browser to
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suggest auto-login, if available.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutoLoginPrompter::ShowInfoBarIfPossible(request, info->GetChildID(),
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           info->GetRouteID());
6470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the response contains the Google-Accounts-SignIn header.  If so,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then the user has just finished signing in, and the server is allowing the
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser to suggest connecting the user's profile to the account.
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninHelper::ShowInfoBarIfPossible(request, io_data,
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              info->GetChildID(),
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              info->GetRouteID());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // See if the response contains the X-Chrome-Manage-Accounts header. If so
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // show the profile avatar bubble so that user can complete signin/out action
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the native UI.
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  signin::ProcessMirrorResponseHeaderIfExists(request, io_data,
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                              info->GetChildID(),
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                              info->GetRouteID());
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build in additional protection for the chrome web store origin.
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_EXTENSIONS)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL webstore_url(extension_urls::GetWebstoreLaunchURL());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request->url().DomainIs(webstore_url.host().c_str())) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HttpResponseHeaders* response_headers = request->response_headers();
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!response_headers->HasHeaderValue("x-frame-options", "deny") &&
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !response_headers->HasHeaderValue("x-frame-options", "sameorigin")) {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response_headers->RemoveHeader("x-frame-options");
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response_headers->AddHeader("x-frame-options: sameorigin");
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (io_data->resource_prefetch_predictor_observer())
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    io_data->resource_prefetch_predictor_observer()->OnResponseStarted(request);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ignores x-frame-options for the chrome signin UI.
684e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const std::string request_spec(
685e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request->first_party_for_cookies().GetOrigin().spec());
686e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#if defined(OS_CHROMEOS)
687e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (request_spec == chrome::kChromeUIOobeURL ||
688e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_spec == chrome::kChromeUIChromeSigninURL) {
689e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#else
690e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (request_spec == chrome::kChromeUIChromeSigninURL) {
691e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    net::HttpResponseHeaders* response_headers = request->response_headers();
693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (response_headers && response_headers->HasHeader("x-frame-options"))
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      response_headers->RemoveHeader("x-frame-options");
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prerender::URLRequestResponseStarted(request);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::OnRequestRedirected(
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& redirect_url,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context,
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceResponse* response) {
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN)
70803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
70903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the response contains the Google-Accounts-SignIn header.  If so,
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then the user has just finished signing in, and the server is allowing the
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser to suggest connecting the user's profile to the account.
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OneClickSigninHelper::ShowInfoBarIfPossible(request, io_data,
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              info->GetChildID(),
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              info->GetRouteID());
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendChromeSyncGaiaHeader(request, resource_context);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // In the Mirror world, Chrome should append a X-Chrome-Connected header to
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // all Gaia requests from a connected profile so Gaia could return a 204
721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // response and let Chrome handle the action with native UI. The only
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // exception is requests from gaia webview, since the native profile
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // management UI is built on top of it.
72403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  signin::AppendMirrorRequestHeaderIfPossible(request, redirect_url, io_data);
725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (io_data->resource_prefetch_predictor_observer()) {
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    io_data->resource_prefetch_predictor_observer()->OnRequestRedirected(
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        redirect_url, request);
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (io_data->policy_header_helper())
73346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    io_data->policy_header_helper()->AddPolicyHeaders(redirect_url, request);
734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Notification that a request has completed.
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::RequestComplete(
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    net::URLRequest* url_request) {
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Jump on the UI thread and inform the prerender about the bytes.
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ResourceRequestInfo* info =
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ResourceRequestInfo::ForRequest(url_request);
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (url_request && !url_request->was_cached()) {
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI,
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            FROM_HERE,
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::Bind(&UpdatePrerenderNetworkBytesCallback,
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       info->GetChildID(),
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       info->GetRouteID(),
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       url_request->GetTotalReceivedBytes()));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeResourceDispatcherHostDelegate::
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetExternalProtocolHandlerDelegateForTesting(
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExternalProtocolHandler::Delegate* delegate) {
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_external_protocol_handler_delegate = delegate;
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
759