chrome_content_browser_client.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/chrome_content_browser_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_tokenizer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/breakpad_mac.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_about_handler.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/character_encoding.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chrome_net_benchmarking_message_filter.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_quota_permission_context.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_util.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/activity_log.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_web_ui.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_webkit_preferences.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/message_handler.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/suggest_permission_util.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/geolocation/chrome_access_token_store.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/nacl_host/nacl_process_host.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service_factory.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/plugin_info_message_filter.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_message_filter.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printing_message_filter.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_render_message_filter.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_render_view_host_observer.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service_factory.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_message_filter.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ssl/ssl_add_certificate.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_blocking_page.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_tab_helper.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/toolkit_extra_parts.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/user_style_sheet_watcher.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/user_style_sheet_watcher_factory.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/view_type_utils.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/child_process_logging.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_process_type.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_process_policy.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_set.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/socket_permission.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_main_parts.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_url_handler.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/compositor_util.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/site_instance.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_host.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_descriptors.h" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_resources.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/mime_util.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h" 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webpreferences.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/plugin_switches.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_win.h" 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sandbox/win/src/sandbox_policy.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_mac.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_message_filter_mac.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/chrome_browser_main_chromeos.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_linux.h" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/crash_dump_manager.h" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_android.h" 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/descriptors_android.h" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_posix.h" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_OPENBSD) || defined(OS_ANDROID) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/linux_util.h" 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/crash_handler_host_linux.h" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/captive_portal/captive_portal_tab_helper.h" 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/crypto_module_password_dialog.h" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FileDescriptor; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::AccessTokenStore; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserChildProcessHostIterator; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserURLHandler; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessSecurityPolicy; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::FileDescriptorInfo; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::QuotaPermissionContext; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SiteInstance; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_glue::WebPreferences; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kPredefinedAllowedSocketOrigins[] = { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "okddffdblfhhnmhodogpojmfkjmhinfp", // Test SSH Client 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pnhechapfaindjhompbnflcldabbghjo", // HTerm App (SSH Client) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bglhmjfplikpjnfoegeomebmfnkjomhe", // see crbug.com/122126 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gbchcmhmhahfdphkhkmpfmihenigjmpp", // Chrome Remote Desktop 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kgngmbheleoaphbjbaiobfdepmghbfah", // Pre-release Chrome Remote Desktop 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "odkaodonbgfohohmklejpjiejmcipmib", // Dogfood Chrome Remote Desktop 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ojoimpklfciegopdfgeenehpalipignm", // Chromoting canary 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cbkkbcmdlboombapidmoeolnmdacpkch", // see crbug.com/129089 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hhnbmknkdabfoieppbbljkhkfjcmcbjh", // see crbug.com/134099 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mablfbjkhmhkmefkjjacnbaikjkipphg", // see crbug.com/134099 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pdeelgamlgannhelgoegilelnnojegoh", // see crbug.com/134099 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cabapfdbkniadpollkckdnedaanlciaj", // see crbug.com/134099 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mapljbgnjledlpdmlchihnmeclmefbba", // see crbug.com/134099 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ghbfeebgmiidnnmeobbbaiamklmpbpii", // see crbug.com/134099 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jdfhpkjeckflbbleddjlpimecpbjdeep", // see crbug.com/142514 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "iabmpiboiopbgfabjmgeedhcmjenhbla" // see crbug.com/165080 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a copy of the given url with its host set to given host and path set 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to given path. Other parts of the url will be the same. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ReplaceURLHostAndPath(const GURL& url, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_canon::Replacements<char> replacements; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetHost(host.c_str(), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Component(0, host.length())); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetPath(path.c_str(), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Component(0, path.length())); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url.ReplaceComponents(replacements); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps "foo://bar/baz/" to "foo://chrome/bar/baz/". 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL AddUberHost(const GURL& url) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string uber_host = chrome::kChromeUIUberHost; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string new_path = url.host() + url.path(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ReplaceURLHostAndPath(url, uber_host, new_path); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If url->host() is "chrome" and url->path() has characters other than the 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first slash, changes the url from "foo://chrome/bar/" to "foo://bar/" and 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns true. Otherwise returns false. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RemoveUberHost(GURL* url) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->host() != chrome::kChromeUIUberHost) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->path().empty() || url->path() == "/") 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string old_path = url->path(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string::size_type separator = old_path.find('/', 1); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_host; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_path; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (separator == std::string::npos) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_host = old_path.substr(1); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_host = old_path.substr(1, separator - 1); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_path = old_path.substr(separator); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = ReplaceURLHostAndPath(*url, new_host, new_path); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles rewriting Web UI URLs. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleWebUI(GURL* url, content::BrowserContext* browser_context) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not handle special URLs such as "about:foo" 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->host().empty()) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL chrome_url = AddUberHost(*url); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle valid "chrome://chrome/foo" URLs so the reverse handler will 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, chrome_url)) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, *url)) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case : in ChromeOS in Guest mode bookmarks and history are 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled for security reasons. New tab page explains the reasons, so 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we redirect user to new tab page. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chromeos::UserManager::Get()->IsLoggedInAsGuest()) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->SchemeIs(chrome::kChromeUIScheme) && 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url->DomainIs(chrome::kChromeUIBookmarksHost) || 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url->DomainIs(chrome::kChromeUIHistoryHost))) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rewrite with new tab URL 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case the new tab page. In older versions of Chrome, the new tab 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page was hosted at chrome-internal:<blah>. This might be in people's saved 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sessions or bookmarks, so we say any URL with that scheme triggers the new 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab page. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->SchemeIs(chrome::kChromeInternalScheme)) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rewrite it with the proper new tab URL. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reverse URL handler for Web UI. Maps "chrome://chrome/foo/" to 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "chrome://foo/". 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleWebUIReverse(GURL* url, content::BrowserContext* browser_context) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->is_valid() || !url->SchemeIs(chrome::kChromeUIScheme)) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RemoveUberHost(url); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// below. Extension, and isolated apps require different privileges to be 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// granted to their RenderProcessHosts. This classification allows us to make 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sure URLs are served by hosts with the right set of privileges. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum RenderProcessHostPrivilege { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_NORMAL, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_HOSTED, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_ISOLATED, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_EXTENSION, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default to a normal renderer cause it is lower privileged. This should only 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // occur if the URL on a site instance is either malformed, or uninitialized. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is malformed, then there is no need for better privileges anyways. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is uninitialized, but eventually settles on being an a scheme other 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than normal webrenderer, the navigation logic will correct us out of band 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anyways. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetByID(url.host()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_storage_isolated()) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_ISOLATED; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_hosted_app()) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_HOSTED; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_EXTENSION; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHostPrivilege GetProcessPrivilege( 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process_host, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> extension_ids = 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map->GetExtensionsInProcess(process_host->GetID()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_ids.empty()) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::iterator iter = extension_ids.begin(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != extension_ids.end(); ++iter) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->GetExtensionById(*iter, false); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_storage_isolated()) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_ISOLATED; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_hosted_app()) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_HOSTED; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_EXTENSION; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CertMatchesFilter(const net::X509Certificate& cert, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& filter) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(markusheintz): This is the minimal required filter implementation. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implement a better matcher. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An empty filter matches any client certificate since no requirements are 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified at all. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.empty()) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string common_name; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.GetString("ISSUER.CN", &common_name) && 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cert.issuer().common_name == common_name)) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills |map| with the per-script font prefs under path |map_name|. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillFontFamilyMap(const PrefService* prefs, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* map_name, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPreferences::ScriptFontFamilyMap* map) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pref_name = base::StringPrintf("%s.%s", map_name, script); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string font_family = prefs->GetString(pref_name.c_str()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!font_family.empty()) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*map)[script] = UTF8ToUTF16(font_family); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCrashSignalFD(const CommandLine& command_line) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kExtensionProcess)) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCrashHandlerHostLinux* crash_handler = 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCrashHandlerHostLinux::GetInstance(); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string process_type = 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kProcessType); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kRendererProcess) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RendererCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kPluginProcess) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PluginCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kPpapiPluginProcess) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PpapiCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kGpuProcess) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GpuCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Transforms the input |url| into its "effective URL". The returned URL 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// facilitates grouping process-per-site. The |url| is transformed, for 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// example, from 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// https://www.google.com/search?espv=1&q=tractors 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the effective URL 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// chrome-search://www.google.com/search?espv=1&q=tractors 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Notice the scheme change. 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If the input is already an effective URL then that same URL is returned. 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetEffectiveURLForInstant(const GURL& url, Profile* profile) { 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(chrome::search::ShouldAssignURLToInstantRenderer(url, profile)) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Error granting Instant access."; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(chrome::kChromeSearchScheme)) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL effective_url(url); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replace the scheme with "chrome-search:". 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_canon::Replacements<char> replacements; 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string search_scheme(chrome::kChromeSearchScheme); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacements.SetScheme(search_scheme.data(), 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_parse::Component(0, search_scheme.length())); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_url = effective_url.ReplaceComponents(replacements); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return effective_url; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetEffectiveURLForSignin(const GURL& url) { 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(SigninManager::IsWebBasedSigninFlowURL(url)); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL effective_url(SigninManager::kChromeSigninEffectiveSite); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy the path because the argument to SetPathStr must outlive 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the Replacements object. 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string path_copy(url.path()); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL::Replacements replacements; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacements.SetPathStr(path_copy); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_url = effective_url.ReplaceComponents(replacements); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return effective_url; 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::ChromeContentBrowserClient() { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kPredefinedAllowedSocketOrigins); ++i) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_socket_origins_.insert(kPredefinedAllowedSocketOrigins[i]); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::~ChromeContentBrowserClient() { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::RegisterUserPrefs( 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable* registry) { 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kDisable3DAPIs, 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kEnableHyperlinkAuditing, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kEnableMemoryInfo, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::BrowserMainParts* ChromeContentBrowserClient::CreateBrowserMainParts( 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters) { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeBrowserMainParts* main_parts; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the Main browser parts based on the OS type. 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsWin(parameters); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsMac(parameters); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_parts = new chromeos::ChromeBrowserMainPartsChromeos(parameters); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsLinux(parameters); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsAndroid(parameters); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsPosix(parameters); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainParts(parameters); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct additional browser parts. Stages are called in the order in 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which they are added. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::AddGtkToolkitExtraParts(main_parts); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::AddViewsToolkitExtraParts(main_parts); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::AddAshToolkitExtraParts(main_parts); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::AddAuraToolkitExtraParts(main_parts); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return main_parts; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetStoragePartitionIdForSite( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site) { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_id; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partition ID for webview guest processes is the string value of its 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance URL - "chrome-guest://app_id/persist?partition". 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site.SchemeIs(chrome::kGuestScheme)) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_id = site.spec(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsValidStoragePartitionId(browser_context,partition_id)); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return partition_id; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsValidStoragePartitionId( 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& partition_id) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default ID is empty and is always valid. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partition_id.empty()) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(partition_id).is_valid(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::GetStoragePartitionConfigForSite( 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site, 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_be_default, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* partition_domain, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* partition_name, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* in_memory) { 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Default to the browser-wide storage partition and override based on |site| 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // below. 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_domain->clear(); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_name->clear(); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *in_memory = false; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the webview tag, we create special guest processes, which host the 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag content separately from the main application that embeds the tag. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A webview tag can specify both the partition name and whether the storage 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for that partition should be persisted. Each tag gets a SiteInstance with 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a specially formatted URL, based on the application it is hosted by and 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the partition requested by it. The format for that URL is: 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome-guest://partition_domain/persist?partition_name 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site.SchemeIs(chrome::kGuestScheme)) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since guest URLs are only used for packaged apps, there must be an app 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // id in the URL. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(site.has_host()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *partition_domain = site.host(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since persistence is optional, the path must either be empty or the 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // literal string. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *in_memory = (site.path() != "/persist"); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partition name is user supplied value, which we have encoded when the 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL was created, so it needs to be decoded. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *partition_name = net::UnescapeURLComponent(site.query(), 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::UnescapeRule::NORMAL); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (site.SchemeIs(extensions::kExtensionScheme)) { 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |can_be_default| is false, the caller is stating that the |site| 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be parsed as if it had isolated storage. In particular it is 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // important to NOT check ExtensionService for the is_storage_isolated() 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // attribute because this code path is run during Extension uninstall 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to do cleanup after the Extension has already been unloaded from the 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ExtensionService. 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_isolated = !can_be_default; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (can_be_default) { 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = NULL; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension = extension_service->extensions()-> 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(site)); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension && extension->is_storage_isolated()) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_isolated = true; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_isolated) { 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(site.has_host()); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For extensions with isolated storage, the the host of the |site| is 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the |partition_domain|. The |in_memory| and |partition_name| are only 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // used in guest schemes so they are cleared here. 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *partition_domain = site.host(); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *in_memory = false; 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_name->clear(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Assert that if |can_be_default| is false, the code above must have found a 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-default partition. If this fails, the caller has a serious logic 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error about which StoragePartition they expect to be in and it is not 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // safe to continue. 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(can_be_default || !partition_domain->empty()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContentsViewDelegate* 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetWebContentsViewDelegate( 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CreateWebContentsViewDelegate(web_contents); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RenderViewHostCreated( 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance = render_view_host->GetSiteInstance(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeRenderViewHostObserver(render_view_host, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetNetworkPredictor()); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new extensions::MessageHandler(render_view_host); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check if the extension activity log is enabled for the profile. 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool IsExtensionActivityLogEnabledForProfile(Profile* profile) { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ActivityLog* activity_log = 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ActivityLog::GetInstance(profile); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return activity_log->IsLogEnabled(); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::GuestWebContentsCreated( 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* guest_web_contents, WebContents* embedder_web_contents) { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder_web_contents->GetBrowserContext()); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url = embedder_web_contents->GetSiteInstance()->GetSiteURL(); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = service->extensions()-> 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(url)); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ExtensionMsg_Loaded_Params> extensions; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions.push_back(ExtensionMsg_Loaded_Params(extension)); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) guest_web_contents->Send(new ExtensionMsg_Loaded(extensions)); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RenderProcessHostCreated( 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* host) { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = host->GetID(); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestContextGetter* context = 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetRequestContextForRenderProcess(id); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new ChromeRenderMessageFilter( 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, profile, context)); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new PluginInfoMessageFilter(id, profile)); 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new PrintingMessageFilter(id, profile)); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter( 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SearchProviderInstallStateMessageFilter(id, profile)); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new SpellCheckMessageFilter(id)); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new SpellCheckMessageFilterMac()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->GetChannel()->AddFilter(new ChromeNetBenchmarkingMessageFilter( 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, profile, context)); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter( 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new prerender::PrerenderMessageFilter(id, profile)); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->Send(new ChromeViewMsg_SetIsIncognitoProcess( 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->IsOffTheRecord())); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->Send(new ChromeViewMsg_SetExtensionActivityLogEnabled( 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IsExtensionActivityLogEnabledForProfile(profile))); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendExtensionWebRequestStatusToHost(host); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererContentSettingRules rules; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRendererContentSettingRules(profile->GetHostContentSettingsMap(), &rules); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->Send(new ChromeViewMsg_SetContentSettingRules(rules)); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ChromeContentBrowserClient::GetEffectiveURL( 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& url) { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url; 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| should be assigned to the Instant renderer, make its 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effective URL distinct from other URLs on the search provider's domain. 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::search::ShouldAssignURLToInstantRenderer(url, profile)) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetEffectiveURLForInstant(url, profile); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| should be assigned to the Signin renderer, make its 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effective URL distinct from other URLs on the signin service's domain. 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the signin renderer will be allowed to sign the user in to 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chrome. 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(url)) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetEffectiveURLForSignin(url); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| is part of an installed app, the effective URL is an 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension URL with the ID of that extension as the host. This has the 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effect of grouping apps together in a common SiteInstance. 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_service) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = extension_service->extensions()-> 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHostedAppByURL(ExtensionURLInfo(url)); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bookmark apps do not use the hosted app process model, and should be 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treated as normal URLs. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->from_bookmark()) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is part of an extension's web extent, convert it to an 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension URL. 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension->GetResourceURL(url.path()); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldUseProcessPerSite( 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& effective_url) { 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Non-extension, non-Instant URLs should generally use 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process-per-site-instance. Because we expect to use the effective URL, 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // URLs for hosted apps (apart from bookmark apps) should have an extension 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scheme by now. 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::search::ShouldAssignURLToInstantRenderer(effective_url, profile)) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(effective_url)) 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!effective_url.SchemeIs(extensions::kExtensionScheme)) 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_service) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = extension_service->extensions()-> 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(effective_url)); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is part of a hosted app that does not have the background 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission, or that does not allow JavaScript access to the background 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page, we want to give each instance its own process to improve 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // responsiveness. 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension->GetType() == Manifest::TYPE_HOSTED_APP) { 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension->HasAPIPermission(APIPermission::kBackground) || 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !extensions::BackgroundInfo::AllowJSAccess(extension)) { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hosted apps that have script access to their background page must use 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process per site, since all instances can make synchronous calls to the 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background window. Other extensions should use process per site as well. 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are treated as WebUI schemes but do not get WebUI bindings. 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<std::string> 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::GetAdditionalWebUISchemes() { 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> additional_schemes; 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) additional_schemes.push_back(chrome::kChromeSearchScheme); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return additional_schemes; 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::CreateRequestContext( 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ProtocolHandlerMap* protocol_handlers) { 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->CreateRequestContext(protocol_handlers); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::CreateRequestContextForStoragePartition( 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& partition_path, 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_memory, 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ProtocolHandlerMap* protocol_handlers) { 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->CreateRequestContextForStoragePartition( 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_path, in_memory, protocol_handlers); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsHandledURL(const GURL& url) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProfileIOData::IsHandledURL(url); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsSuitableHost( 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process_host, 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site_url) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(process_host->GetBrowserContext()); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This may be NULL during tests. In that case, just assume any site can 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // share any host. 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service && 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->IsInstantProcess(process_host->GetID())) 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return chrome::search::ShouldAssignURLToInstantRenderer(site_url, profile); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager && signin_manager->IsSigninProcess(process_host->GetID())) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SigninManager::IsWebBasedSigninFlowURL(site_url); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map = service->process_map(); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't allow the Task Manager to share a process with anything else. 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it can affect the renderers it is observing. 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we could create another RenderProcessHostPrivilege bucket for 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this to allow multiple chrome://tasks instances to share, but that's 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a very unlikely case without serious consequences. 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_url.GetOrigin() == GURL(chrome::kChromeUITaskManagerURL).GetOrigin()) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These may be NULL during tests. In that case, just assume any site can 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // share any host. 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service || !process_map) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, just make sure the process privilege matches the privilege 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // required by the site. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHostPrivilege privilege_required = 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrivilegeRequiredByUrl(site_url, service); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetProcessPrivilege(process_host, process_map, service) == 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privilege_required; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function is trying to limit the amount of processes used by extensions 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with background pages. It uses a globally set percentage of processes to 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run such extensions and if the limit is exceeded, it returns true, to 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicate to the content module to group extensions together. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldTryToUseExistingProcessHost( 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& url) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It has to be a valid URL for us to check for an extension. 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = !profile ? NULL : 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to have a valid extension with background page to proceed. 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo(url)); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extensions::BackgroundInfo::HasBackgroundPage(extension)) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<int> process_ids; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_process_count = 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::GetMaxRendererProcessCount(); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go through all profiles to ensure we have total count of extension 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processes containing background pages, otherwise one profile can 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starve the other. 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> profiles = g_browser_process->profile_manager()-> 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLoadedProfiles(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* epm = 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profiles[i])->process_manager(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionProcessManager::const_iterator iter = 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) epm->background_hosts().begin(); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != epm->background_hosts().end(); ++iter) { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::ExtensionHost* host = *iter; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_ids.insert(host->render_process_host()->GetID()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_ids.size() > 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (max_process_count * chrome::kMaxShareOfExtensionProcesses)) { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SiteInstanceGotProcess( 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(site_instance->HasProcess()); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remember the ID of the Instant process to signal the renderer process 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on startup in |AppendExtraCommandLineSwitches| below. 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::search::ShouldAssignURLToInstantRenderer( 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->GetSiteURL(), profile)) { 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->AddInstantProcess(site_instance->GetProcess()->GetID()); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only expect there to be one signin process as we use process-per-site 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for signin URLs. The signin process will be cleared from SigninManager 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the renderer is destroyed. 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(site_instance->GetSiteURL())) { 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager) 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_manager->SetSigninProcess(site_instance->GetProcess()->GetID()); 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo( 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetSiteURL())); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->process_map()->Insert(extension->id(), 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId()); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionInfoMap::RegisterExtensionProcess, 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId())); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SiteInstanceDeleting( 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!site_instance->HasProcess()) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL( 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(site_instance->GetSiteURL())); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->process_map()->Remove(extension->id(), 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId()); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionInfoMap::UnregisterExtensionProcess, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId())); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldSwapProcessesForNavigation( 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SiteInstance* site_instance, 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& current_url, 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url) { 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_url.is_empty()) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always choose a new process when navigating to extension URLs. The 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process grouping logic will combine all of a given extension's pages 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the same process. 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_url.SchemeIs(extensions::kExtensionScheme)) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also, we must switch if one is an extension and the other is not the exact 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same extension. 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_url.SchemeIs(extensions::kExtensionScheme) || 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_url.SchemeIs(extensions::kExtensionScheme)) { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_url.GetOrigin() != new_url.GetOrigin()) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The checks below only matter if we can retrieve which extensions are 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // installed. 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext()); 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We must swap if the URL is for an extension and we are not using an 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension process. 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* new_extension = 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo(new_url)); 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore all hosted apps except the Chrome Web Store, since they do not 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // require their own BrowsingInstance (e.g., postMessage is ok). 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_extension && 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension->is_hosted_app() && 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension->id() != extension_misc::kWebStoreAppId) 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension = NULL; 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_extension && 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->HasProcess() && 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !service->process_map()->Contains(new_extension->id(), 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->GetProcess()->GetID())) 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldSwapProcessesForRedirect( 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* resource_context, const GURL& current_url, 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extensions::CrossesExtensionProcessBoundary( 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetExtensionInfoMap()->extensions(), 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(current_url), ExtensionURLInfo(new_url), false); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetCanonicalEncodingNameByAliasName( 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& alias_name) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CharacterEncoding::GetCanonicalEncodingNameByAliasName(alias_name); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line, int child_process_id) { 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LINUX_BREAKPAD) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsCrashReporterEnabled()) { 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kEnableCrashReporter, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_process_logging::GetClientId() + "," + base::GetLinuxDistro()); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsCrashReporterEnabled()) { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kEnableCrashReporter, 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_process_logging::GetClientId()); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (logging::DialogsAreSuppressed()) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kNoErrorDialogs); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string process_type = 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->GetSwitchValueASCII(switches::kProcessType); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_command_line.HasSwitch(switches::kChromeFrame)) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kChromeFrame); 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kRendererProcess) { 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir = 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_command_line.GetSwitchValuePath(switches::kUserDataDir); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_data_dir.empty()) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& login_profile = 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_command_line.GetSwitchValueASCII(switches::kLoginProfile); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!login_profile.empty()) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLoginProfile, login_profile); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::FromID(child_process_id); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process) { 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process->GetBrowserContext()); 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ProcessMap* process_map = extension_service->process_map(); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_map && process_map->Contains(process->GetID())) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kExtensionProcess); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently this pref is only registered if applied via a policy. 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->HasPrefPath(prefs::kDisable3DAPIs) && 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kDisable3DAPIs)) { 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn this policy into a command line switch. 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisable3DAPIs); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable client-side phishing detection in the renderer if it is 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled in the Profile preferences or the browser process. 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kSafeBrowsingEnabled) || 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !g_browser_process->safe_browsing_detection_service()) { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch( 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableClientSidePhishingDetection); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kPrintPreviewDisabled)) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kRendererPrintPreview); 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service && 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->IsInstantProcess(process->GetID())) 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kInstantProcess); 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager && signin_manager->IsSigninProcess(process->GetID())) 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kSigninProcess); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content::IsThreadedCompositingEnabled()) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableThreadedCompositing); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please keep this in alphabetical order. 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowHTTPBackgroundPage, 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowLegacyExtensionManifests, 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowScriptingGallery, 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsCheckoutURL, 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsGalleryURL, 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kCloudPrintServiceURL, 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDebugPrint, 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableBundledPpapiFlash, 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableExtensionsResourceWhitelist, 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableScriptedPrintThrottling, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDumpHistogramsOnExit, 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableAdview, 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableAdviewSrcAttribute, 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableBenchmarking, 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableExperimentalExtensionApis, 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableExperimentalFormFilling, 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableIPCFuzzing, 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableInteractiveAutocomplete, 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableNaCl, 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableNetBenchmarking, 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePasswordGeneration, 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePnacl, 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableWatchdog, 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kExtensionsOnChromeURLs, 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMemoryProfiling, 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMessageLoopHistogrammer, 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kNoJsRandomness, 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPerformCrashAnalysis, 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPlaybackMode, 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashArgs, 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashInProcess, 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashPath, 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashVersion, 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingAtStart, 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingFile, 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingFlush, 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kRecordMode, 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSilentDumpOnDCHECK, 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kSpdyProxyAuthOrigin, 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kWhitelistedExtensionID, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kUtilityProcess) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowHTTPBackgroundPage, 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableExperimentalExtensionApis, 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kWhitelistedExtensionID, 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kPluginProcess) { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #if defined(OS_CHROMEOS) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kLoginProfile, 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMemoryProfiling, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSilentDumpOnDCHECK, 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kUserDataDir, 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kZygoteProcess) { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kUserDataDir, // Make logs go to the right file. 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load (in-process) Pepper plugins in-process in the zygote pre-sandbox. 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableBundledPpapiFlash, 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashInProcess, 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashPath, 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashVersion, 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kGpuProcess) { 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir = 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_command_line.GetSwitchValuePath(switches::kUserDataDir); 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_data_dir.empty()) 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If --ignore-gpu-blacklist is passed in, don't send in crash reports 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because GPU is expected to be unreliable. 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) && 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line->HasSwitch(switches::kDisableBreakpad)) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisableBreakpad); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The command line switch kEnableBenchmarking needs to be specified along 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the kEnableStatsTable switch to ensure that the stats table global 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is initialized correctly. 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line->HasSwitch(switches::kEnableBenchmarking)) 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(command_line->HasSwitch(switches::kEnableStatsTable)); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetApplicationLocale() { 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BrowserThread::CurrentlyOn(BrowserThread::IO)) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_thread_application_locale_; 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->GetApplicationLocale(); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetAcceptLangs( 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* context) { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(context); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile->GetPrefs()->GetString(prefs::kAcceptLanguages); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* ChromeContentBrowserClient::GetDefaultFavicon() { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowAppCache( 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& manifest_url, 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context) { 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->GetCookieSettings()-> 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsSettingCookieAllowed(manifest_url, first_party); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowGetCookie( 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list, 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = io_data->GetCookieSettings()-> 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsReadingCookieAllowed(url, first_party); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookiesRead, render_process_id, 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, url, first_party, cookie_list, !allow)); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowSetCookie( 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions* options) { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, first_party); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookieChanged, render_process_id, 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, url, first_party, cookie_line, *options, 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !allow)); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowSaveLocalState( 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context) { 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting setting = cookie_settings->GetDefaultCookieSetting(NULL); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(bauerb): Should we also disallow local state if the default is BLOCK? 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Could we even support per-origin settings? 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return setting != CONTENT_SETTING_SESSION_ONLY; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerDatabase( 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long estimated_size, 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to database for potential display in UI. 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::WebDatabaseAccessed, 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, name, display_name, !allow)); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerFileSystem( 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to file system for potential display in UI. 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::FileSystemAccessed, 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, !allow)); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerIndexedDB( 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to IndexedDB for potential display in UI. 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::IndexedDBAccessed, 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, name, !allow)); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContext* 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::OverrideRequestContextForURL( 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, content::ResourceContext* context) { 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->extensions_request_context(); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaPermissionContext* 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::CreateQuotaPermissionContext() { 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeQuotaPermissionContext(); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::AllowCertificateError( 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_error, 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::SSLInfo& ssl_info, 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& request_url, 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType::Type resource_type, 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool overridable, 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool strict_enforcement, 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(bool)>& callback, 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* cancel_request) { 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (resource_type != ResourceType::MAIN_FRAME) { 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A sub-resource has a certificate error. The user doesn't really 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have a context for making the right decision, so block the 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request hard, without an info bar to allow showing the insecure 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content. 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *cancel_request = true; 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab is being prerendered, cancel the prerender and the request. 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID( 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab) { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager* prerender_manager = 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManagerFactory::GetForProfile( 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(tab->GetBrowserContext())); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_manager && prerender_manager->IsWebContentsPrerendering(tab, 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)) { 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_manager->prerender_tracker()->TryCancel( 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id, 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::FINAL_STATUS_SSL_ERROR)) { 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cancel_request = true; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal::CaptivePortalTabHelper* captive_portal_tab_helper = 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal::CaptivePortalTabHelper::FromWebContents(tab); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (captive_portal_tab_helper) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal_tab_helper->OnSSLCertError(ssl_info); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, display an SSL blocking page. 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SSLBlockingPage(tab, cert_error, ssl_info, request_url, overridable, 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strict_enforcement, callback); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SelectClientCertificate( 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpNetworkSession* network_session, 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLCertRequestInfo* cert_request_info, 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(net::X509Certificate*)>& callback) { 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID( 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab) { 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_url("https://" + cert_request_info->host_and_port); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(requesting_url.is_valid()) << "Invalid URL string: https://" 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << cert_request_info->host_and_port; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext()); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> filter( 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetHostContentSettingsMap()->GetWebsiteSetting( 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requesting_url, 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requesting_url, 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(), NULL)); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.get()) { 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to automatically select a client certificate. 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter->IsType(Value::TYPE_DICTIONARY)) { 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* filter_dict = 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DictionaryValue*>(filter.get()); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<scoped_refptr<net::X509Certificate> >& 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_client_certs = cert_request_info->client_certs; 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_client_certs.size(); ++i) { 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CertMatchesFilter(*all_client_certs[i], *filter_dict)) { 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the first certificate that is matched by the filter. 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(all_client_certs[i]); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLTabHelper* ssl_tab_helper = SSLTabHelper::FromWebContents(tab); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ssl_tab_helper) { 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is no SSLTabHelper for the given WebContents then we can't 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // show the user a dialog to select a client certificate. So we simply 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // proceed with no client certificate. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(NULL); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_tab_helper->ShowClientCertificateRequestDialog( 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session, cert_request_info, callback); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::AddCertificate( 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::CertificateMimeType cert_type, 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* cert_data, 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t cert_size, 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::SSLAddCertificate(request, cert_type, cert_data, cert_size, 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_process_id, render_view_id); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() { 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaCaptureDevicesDispatcher::GetInstance(); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RequestDesktopNotificationPermission( 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_context, 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents = 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_util::GetWebContentsByID(render_process_id, render_view_id); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip showing the infobar if the request comes from an extension, and that 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension has the 'notify' permission. (If the extension does not have the 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission, the user will still be prompted.) 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = !service ? NULL : 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo( 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin)); 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* rvh = 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FromID(render_process_id, render_view_id); 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsExtensionWithPermissionOrSuggestInConsole( 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APIPermission::kNotification, extension, rvh)) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->DesktopNotificationPermissionRequestDone(callback_context); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* notifications = 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifications->RequestPermission(source_origin, render_process_id, 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, callback_context, contents); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter::Permission 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::CheckDesktopNotificationPermission( 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id) { 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (io_data->GetExtensionInfoMap()->SecurityOriginHasAPIPermission( 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin, render_process_id, 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kNotification)) 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall back to the regular notification preferences, which works on an 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin basis. 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->GetNotificationService() ? 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetNotificationService()->HasPermission(source_origin) : 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebNotificationPresenter::PermissionNotAllowed; 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ShowDesktopNotification( 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ShowDesktopNotificationHostMsgParams& params, 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool worker) { 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::FromID( 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = rvh->GetProcess(); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext()); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* service = 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->ShowDesktopNotification( 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params, render_process_id, render_view_id, 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker ? DesktopNotificationService::WorkerNotification : 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService::PageNotification); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::CancelDesktopNotification( 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notification_id) { 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::FromID( 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = rvh->GetProcess(); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext()); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* service = 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->CancelDesktopNotification( 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id, notification_id); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::CanCreateWindow( 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& opener_url, 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowContainerType container_type, 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* no_javascript_access) { 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *no_javascript_access = false; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the opener is trying to create a background window but doesn't have 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the appropriate permission, fail the attempt. 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) { 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionInfoMap* map = io_data->GetExtensionInfoMap(); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!map->SecurityOriginHasAPIPermission( 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin, 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kBackground)) { 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: this use of GetExtensionOrAppByURL is safe but imperfect. It may 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return a recently installed Extension even if this CanCreateWindow call 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // was made by an old copy of the page in a normal web process. That's ok, 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the permission check above would have caused an early return 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already. We must use the full URL to find hosted apps, though, and not 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just the origin. 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = map->extensions().GetExtensionOrAppByURL( 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(opener_url)); 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension && !extensions::BackgroundInfo::AllowJSAccess(extension)) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *no_javascript_access = true; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetWorkerProcessTitle( 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, content::ResourceContext* context) { 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if it's an extension-created worker, in which case we want to use 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the name of the extension. 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetExtensionInfoMap()->extensions().GetByID(url.host()); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension ? extension->name() : std::string(); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ResourceDispatcherHostCreated() { 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->ResourceDispatcherHostCreated(); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::SpeechRecognitionManagerDelegate* 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetSpeechRecognitionManagerDelegate() { 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_INPUT_SPEECH) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new speech::ChromeSpeechRecognitionManagerDelegate(); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::NetLog* ChromeContentBrowserClient::GetNetLog() { 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->net_log(); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessTokenStore* ChromeContentBrowserClient::CreateAccessTokenStore() { 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeAccessTokenStore(); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsFastShutdownPossible() { 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::OverrideWebkitPrefs( 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, const GURL& url, WebPreferences* web_prefs) { 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext()); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitStandardFontFamilyMap, 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->standard_font_family_map); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitFixedFontFamilyMap, 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->fixed_font_family_map); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitSerifFontFamilyMap, 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->serif_font_family_map); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitSansSerifFontFamilyMap, 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->sans_serif_font_family_map); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitCursiveFontFamilyMap, 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->cursive_font_family_map); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitFantasyFontFamilyMap, 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->fantasy_font_family_map); 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitPictographFontFamilyMap, 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->pictograph_font_family_map); 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_font_size = 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitDefaultFontSize); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_fixed_font_size = 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitDefaultFixedFontSize); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->minimum_font_size = 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitMinimumFontSize); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->minimum_logical_font_size = 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitMinimumLogicalFontSize); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->javascript_can_open_windows_automatically = 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitJavascriptCanOpenWindowsAutomatically); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->dom_paste_enabled = 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitDomPasteEnabled); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->shrinks_standalone_images_to_fit = 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitShrinksStandaloneImagesToFit); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* inspector_settings = 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetDictionary(prefs::kWebKitInspectorSettings); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inspector_settings) { 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator iter(*inspector_settings); !iter.IsAtEnd(); 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsString(&value)) { 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->inspector_settings.push_back( 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(iter.key(), value)); 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->tabs_to_links = prefs->GetBoolean(prefs::kWebkitTabsToLinks); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitJavascriptEnabled)) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->javascript_enabled = false; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitWebSecurityEnabled)) 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->web_security_enabled = false; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitPluginsEnabled)) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->plugins_enabled = false; 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitJavaEnabled)) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->java_enabled = false; 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->loads_images_automatically = 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitLoadsImagesAutomatically); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->GetBoolean(prefs::kDisable3DAPIs)) 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->experimental_webgl_enabled = false; 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->memory_info_enabled = 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kEnableMemoryInfo); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_displaying_insecure_content = 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitAllowDisplayingInsecureContent); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_running_insecure_content = 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitAllowRunningInsecureContent); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->font_scale_factor = 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<float>(prefs->GetDouble(prefs::kWebKitFontScaleFactor)); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->force_enable_zoom = 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitForceEnableZoom); 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GOOGLE_TV) 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_prefs->user_gesture_required_for_media_playback = false; 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->password_echo_enabled = browser_defaults::kPasswordEchoEnabled; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user stylesheet watcher may not exist in a testing profile. 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserStyleSheetWatcher* user_style_sheet_watcher = 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserStyleSheetWatcherFactory::GetForProfile(profile); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_style_sheet_watcher) { 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_enabled = true; 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_location = 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_style_sheet_watcher->user_style_sheet(); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_enabled = false; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->asynchronous_spell_checking_enabled = 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(groby): Bug 107371: Implement asynchronous spellchecking API for 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mac so it uses NSSpellChecker in the background. 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false; 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true; 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->unified_textchecker_enabled = 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->asynchronous_spell_checking_enabled; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->uses_universal_detector = 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitUsesUniversalDetector); 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->text_areas_are_resizable = 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitTextAreasAreResizable); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->hyperlink_auditing_enabled = 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kEnableHyperlinkAuditing); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we will set the default_encoding with canonical encoding name. 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterEncoding::GetCanonicalEncodingNameByAliasName( 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_prefs->default_encoding.empty()) { 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->ClearPref(prefs::kDefaultCharset); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!web_prefs->default_encoding.empty()); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (content::IsForceCompositingModeEnabled()) 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_prefs->force_compositing_mode = true; 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = WebContents::FromRenderViewHost(rvh); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ViewType view_type = chrome::GetViewType(web_contents); 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service) { 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = rvh->GetSiteInstance()->GetSiteURL(); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->extensions()->GetByID(url.host()); 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we are only granting extension preferences to URLs with 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct scheme. Without this check, chrome-guest:// schemes used by 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // webview tags as well as hosts that happen to match the id of an 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installed extension would get the wrong preferences. 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_webkit_preferences::SetPreferences( 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, view_type, web_prefs); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_type == chrome::VIEW_TYPE_NOTIFICATION) { 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_scripts_to_close_windows = true; 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (view_type == chrome::VIEW_TYPE_BACKGROUND_CONTENTS) { 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable all kinds of acceleration for background pages. 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/96005 and http://crbug.com/96006 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->force_compositing_mode = false; 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_compositing_enabled = false; 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FILE_MANAGER_EXTENSION) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the default of suppressing HW compositing for WebUI pages for the 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file manager, which is implemented using WebUI but wants HW acceleration 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for video decode & render. 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.spec() == chrome::kChromeUIFileManagerURL) { 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_compositing_enabled = true; 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_2d_canvas_enabled = true; 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::UpdateInspectorSetting( 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, const std::string& key, const std::string& value) { 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context = 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext(); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update( 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(browser_context)->GetPrefs(), 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kWebKitInspectorSettings); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* inspector_settings = update.Get(); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inspector_settings->SetWithoutPathExpansion(key, 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value::CreateStringValue(value)); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearInspectorSettings(RenderViewHost* rvh) { 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context = 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext(); 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(browser_context)->GetPrefs()-> 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearPref(prefs::kWebKitInspectorSettings); 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::BrowserURLHandlerCreated( 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler* handler) { 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the default URL handlers. 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&ExtensionWebUI::HandleChromeURLOverride, 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler::null_handler()); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(BrowserURLHandler::null_handler(), 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ExtensionWebUI::HandleChromeURLOverrideReverse); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about: handler. Must come before chrome: handler, since it will 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rewrite about: urls to chrome: URLs and then expect chrome: to 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actually handle them. 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&WillHandleBrowserAboutURL, 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler::null_handler()); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome: & friends. 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&HandleWebUI, &HandleWebUIReverse); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearCache(RenderViewHost* rvh) { 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance()->GetProcess()->GetBrowserContext()); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(profile); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(BrowsingDataRemover::REMOVE_CACHE, 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataHelper::UNPROTECTED_WEB); 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover takes care of deleting itself when done. 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearCookies(RenderViewHost* rvh) { 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance()->GetProcess()->GetBrowserContext()); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(profile); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int remove_mask = BrowsingDataRemover::REMOVE_SITE_DATA; 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover takes care of deleting itself when done. 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() { 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return download_util::GetDefaultDownloadDirectory(); 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetDefaultDownloadName() { 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF8(IDS_DEFAULT_DOWNLOAD_FILENAME); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::DidCreatePpapiPlugin( 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserPpapiHost* browser_host) { 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_host->GetPpapiHost()->AddHostFactoryFilter( 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::host::HostFactory>( 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeBrowserPepperHostFactory(browser_host))); 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::BrowserPpapiHost* 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetExternalBrowserPpapiHost( 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_process_id) { 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserChildProcessHostIterator iter(PROCESS_TYPE_NACL_LOADER); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!iter.Done()) { 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClProcessHost* host = static_cast<NaClProcessHost*>(iter.GetDelegate()); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->process() && 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->process()->GetData().id == plugin_process_id) { 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Found the plugin. 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host->browser_ppapi_host(); 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeContentBrowserClient::SupportsBrowserPlugin( 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, const GURL& site_url) { 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableBrowserPluginForAllViewTypes)) 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = service->extensions()-> 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(site_url)); 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension) 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extension->HasAPIPermission(APIPermission::kWebView); 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowPepperSocketAPI( 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::SocketPermissionRequest& params) { 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string host = url.host(); 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme) && 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) allowed_socket_origins_.count(host)) { 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = NULL; 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = !profile ? NULL : 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension = extension_service->extensions()-> 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(url)); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to check this now and not on construction because otherwise it won't 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // work with browser_tests. 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string allowed_list = 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kAllowNaClSocketAPI); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (allowed_list == "*") { 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The wildcard allows socket API only for packaged and platform apps. 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension && 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (extension->GetType() == Manifest::TYPE_LEGACY_PACKAGED_APP || 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension->GetType() == Manifest::TYPE_PLATFORM_APP); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!allowed_list.empty()) { 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringTokenizer t(allowed_list, ","); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (t.GetNext()) { 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (t.token() == host) 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::SocketPermission::CheckParam extension_params( 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.type, params.host, params.port); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->CheckAPIPermissionWithParam(APIPermission::kSocket, 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &extension_params)) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeContentBrowserClient::GetHyphenDictionaryDirectory() { 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath directory; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP_DICTIONARIES, &directory); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return directory.Append(FILE_PATH_LITERAL("Hyphen")); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::SelectFilePolicy* ChromeContentBrowserClient::CreateSelectFilePolicy( 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents) { 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ChromeSelectFilePolicy(web_contents); 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess( 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line, 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_process_id, 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FileDescriptorInfo>* mappings) { 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_path; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &data_path); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!data_path.empty()); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ; 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath chrome_pak = data_path.AppendASCII("chrome.pak"); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile f = 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CreatePlatformFile(chrome_pak, flags, NULL, NULL); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidChromePakDescriptor, 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath chrome_resources_pak = 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("chrome_100_percent.pak"); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = base::CreatePlatformFile(chrome_resources_pak, flags, NULL, NULL); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidChrome100PercentPakDescriptor, 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string locale = GetApplicationLocale(); 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale_pak = ResourceBundle::GetSharedInstance(). 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocaleFilePath(locale, false); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = base::CreatePlatformFile(locale_pak, flags, NULL, NULL); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidLocalePakDescriptor, 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath resources_pack_path; 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f = base::CreatePlatformFile(resources_pack_path, flags, NULL, NULL); 20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidUIResourcesPakDescriptor, 20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileDescriptor(f, true))); 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LINUX_BREAKPAD) 20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsCrashReporterEnabled()) { 20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f = CrashDumpManager::GetInstance()->CreateMinidumpFile(child_process_id); 21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (f == base::kInvalidPlatformFileValue) { 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to create file for minidump, crash reporting will " 21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "be disabled for this process."; 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidMinidumpDescriptor, 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileDescriptor(f, true))); 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(USE_LINUX_BREAKPAD) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int crash_signal_fd = GetCrashSignalFD(command_line); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crash_signal_fd >= 0) { 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kCrashDumpSignal, 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(crash_signal_fd, 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false))); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_ANDROID) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* ChromeContentBrowserClient::GetResourceDllName() { 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::kBrowserResourcesDll; 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::PreSpawnRenderer( 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy* policy, 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* success) { 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This code is duplicated in nacl_exe_win_64.cc. 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow the server side of a pipe restricted to the "chrome.nacl." 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // namespace so that it cannot impersonate other system or other chrome 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // service pipes. 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::ResultCode result = policy->AddRule( 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::SUBSYS_NAMED_PIPES, 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY, 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\\\\.\\pipe\\chrome.nacl.*"); 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != sandbox::SBOX_ALL_OK) { 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *success = false; 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Renderers need to send named pipe handles and shared memory 21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // segment handles to NaCl loader processes. 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_HANDLES, 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::HANDLES_DUP_ANY, 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"File"); 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != sandbox::SBOX_ALL_OK) { 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *success = false; 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crypto::CryptoModuleBlockingPasswordDelegate* 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetCryptoPasswordDelegate( 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::NewCryptoModuleBlockingDialogDelegate( 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kCryptoModulePasswordKeygen, url.host()); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SetApplicationLocale( 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& locale) { 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This object is guaranteed to outlive all threads so we don't have to 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // worry about the lack of refcounting and can just post as Unretained. 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The common case is that this function is called early in Chrome startup 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before any threads are created (it will also be called later if the user 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes the pref). In this case, there will be no threads created and 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // posting will fail. When there are no threads, we can just set the string 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // without worrying about threadsafety. 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ChromeContentBrowserClient::SetApplicationLocaleOnIOThread, 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), locale))) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread_application_locale_ = locale; 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SetApplicationLocaleOnIOThread( 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& locale) { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread_application_locale_ = locale; 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 2189