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