diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-19 00:44:14 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-19 00:44:14 +0000 |
commit | 05fcf98bd3e7c462917996fb1c601793dd6345c9 (patch) | |
tree | 6e343997968c711f9d7a336e27b133bd14dfaf6b /chrome | |
parent | 0e194cc6261463902915398c3d975d4de64852ff (diff) | |
download | chromium_src-05fcf98bd3e7c462917996fb1c601793dd6345c9.zip chromium_src-05fcf98bd3e7c462917996fb1c601793dd6345c9.tar.gz chromium_src-05fcf98bd3e7c462917996fb1c601793dd6345c9.tar.bz2 |
Move BrowserRenderProcessHost to content. It should have been moved earlier.
Review URL: http://codereview.chromium.org/6877019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82037 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/automation/automation_util.cc | 2 | ||||
-rw-r--r-- | chrome/browser/chrome_content_browser_client.cc | 21 | ||||
-rw-r--r-- | chrome/browser/chrome_content_browser_client.h | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/isolated_app_apitest.cc | 2 | ||||
-rw-r--r-- | chrome/browser/notifications/balloon_host.cc | 2 | ||||
-rw-r--r-- | chrome/browser/prefs/browser_prefs.cc | 2 | ||||
-rw-r--r-- | chrome/browser/renderer_host/browser_render_process_host.cc | 1329 | ||||
-rw-r--r-- | chrome/browser/renderer_host/browser_render_process_host.h | 226 | ||||
-rw-r--r-- | chrome/browser/sidebar/sidebar_container.cc | 2 | ||||
-rw-r--r-- | chrome/browser/visitedlink/visitedlink_unittest.cc | 2 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 |
12 files changed, 27 insertions, 1566 deletions
diff --git a/chrome/browser/automation/automation_util.cc b/chrome/browser/automation/automation_util.cc index 268fe44..98c9c6f 100644 --- a/chrome/browser/automation/automation_util.cc +++ b/chrome/browser/automation/automation_util.cc @@ -12,11 +12,11 @@ #include "chrome/browser/automation/automation_provider.h" #include "chrome/browser/automation/automation_provider_json.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser.h" #include "content/browser/browser_thread.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/tab_contents/tab_contents.h" #include "net/base/cookie_monster.h" diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index d0d45cc..0ba282b 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -6,11 +6,15 @@ #include "chrome/browser/debugger/devtools_handler.h" #include "chrome/browser/desktop_notification_handler.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/extensions/extension_message_handler.h" #include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" +#include "chrome/browser/printing/printing_message_filter.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/renderer_host/chrome_render_message_filter.h" +#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h" +#include "chrome/browser/spellcheck_message_filter.h" #include "chrome/browser/ui/webui/chrome_web_ui_factory.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" namespace chrome { @@ -38,6 +42,19 @@ void ChromeContentBrowserClient::PreCreateRenderView( } } +void ChromeContentBrowserClient::BrowserRenderProcessHostCreated( + BrowserRenderProcessHost* host) { + host->channel()->AddFilter(new ChromeRenderMessageFilter( + host->id(), + host->profile(), + host->profile()->GetRequestContextForPossibleApp( + host->installed_app()))); + host->channel()->AddFilter(new PrintingMessageFilter()); + host->channel()->AddFilter( + new SearchProviderInstallStateMessageFilter(host->id(), host->profile())); + host->channel()->AddFilter(new SpellCheckMessageFilter()); +} + content::WebUIFactory* ChromeContentBrowserClient::GetWebUIFactory() { return ChromeWebUIFactory::GetInstance(); } diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index d170ef1..6e69a4a 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h @@ -16,6 +16,7 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { virtual void PreCreateRenderView(RenderViewHost* render_view_host, Profile* profile, const GURL& url); + virtual void BrowserRenderProcessHostCreated(BrowserRenderProcessHost* host); virtual content::WebUIFactory* GetWebUIFactory(); virtual GURL GetEffectiveURL(Profile* profile, const GURL& url); }; diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 142a559..50e13c4 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -16,7 +16,6 @@ #include "chrome/browser/file_select_helper.h" #include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/renderer_preferences_util.h" #include "chrome/browser/tab_contents/popup_menu_helper_mac.h" #include "chrome/browser/ui/app_modal_dialogs/message_box_handler.h" @@ -31,6 +30,7 @@ #include "chrome/common/url_constants.h" #include "chrome/common/view_types.h" #include "content/browser/browsing_instance.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/renderer_host/render_widget_host.h" diff --git a/chrome/browser/extensions/isolated_app_apitest.cc b/chrome/browser/extensions/isolated_app_apitest.cc index 1d0c5da..bc9e221 100644 --- a/chrome/browser/extensions/isolated_app_apitest.cc +++ b/chrome/browser/extensions/isolated_app_apitest.cc @@ -7,10 +7,10 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_host.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/ui_test_utils.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/tab_contents/tab_contents.h" #include "net/base/mock_host_resolver.h" diff --git a/chrome/browser/notifications/balloon_host.cc b/chrome/browser/notifications/balloon_host.cc index 9ac175f..3ff9344 100644 --- a/chrome/browser/notifications/balloon_host.cc +++ b/chrome/browser/notifications/balloon_host.cc @@ -8,12 +8,12 @@ #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/renderer_preferences_util.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/webui/chrome_web_ui_factory.h" #include "chrome/common/render_messages.h" #include "chrome/common/url_constants.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/site_instance.h" #include "content/common/bindings_policy.h" diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 2a88964..39d55fe9 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc @@ -37,7 +37,6 @@ #include "chrome/browser/policy/cloud_policy_subsystem.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile_impl.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/renderer_host/web_cache_manager.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/search_engines/template_url_model.h" @@ -57,6 +56,7 @@ #include "chrome/browser/web_resource/promo_resource_service.h" #include "chrome/common/pref_names.h" #include "content/browser/host_zoom_map.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #if defined(TOOLKIT_VIEWS) // TODO(port): whittle this down as we port #include "chrome/browser/ui/views/browser_actions_container.h" diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc deleted file mode 100644 index 41d4b97..0000000 --- a/chrome/browser/renderer_host/browser_render_process_host.cc +++ /dev/null @@ -1,1329 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Represents the browser side of the browser <--> renderer communication -// channel. There will be one RenderProcessHost per renderer process. - -#include "chrome/browser/renderer_host/browser_render_process_host.h" - -#include <algorithm> -#include <limits> -#include <vector> - -#if defined(OS_POSIX) -#include <utility> // for pair<> -#endif - -#include "base/callback.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "base/metrics/field_trial.h" -#include "base/metrics/histogram.h" -#include "base/path_service.h" -#include "base/platform_file.h" -#include "base/stl_util-inl.h" -#include "base/string_util.h" -#include "base/threading/thread.h" -#include "base/threading/thread_restrictions.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/extensions/extension_event_router.h" -#include "chrome/browser/extensions/extension_function_dispatcher.h" -#include "chrome/browser/extensions/extension_message_service.h" -#include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/user_script_master.h" -#include "chrome/browser/gpu_data_manager.h" -#include "chrome/browser/history/history.h" -#include "chrome/browser/io_thread.h" -#include "chrome/browser/metrics/user_metrics.h" -#include "chrome/browser/net/resolve_proxy_msg_helper.h" -#include "chrome/browser/platform_util.h" -#include "chrome/browser/printing/printing_message_filter.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/renderer_host/chrome_render_message_filter.h" -#include "chrome/browser/renderer_host/web_cache_manager.h" -#include "chrome/browser/safe_browsing/client_side_detection_service.h" -#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h" -#include "chrome/browser/spellcheck_host.h" -#include "chrome/browser/spellcheck_message_filter.h" -#include "chrome/browser/metrics/user_metrics.h" -#include "chrome/browser/visitedlink/visitedlink_master.h" -#include "chrome/common/chrome_paths.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/common/extensions/extension.h" -#include "chrome/common/extensions/extension_icon_set.h" -#include "chrome/common/extensions/extension_messages.h" -#include "chrome/common/logging_chrome.h" -#include "chrome/common/pref_names.h" -#include "chrome/common/render_messages.h" -#include "chrome/common/safe_browsing/safebrowsing_messages.h" -#include "chrome/common/spellcheck_messages.h" -#include "content/browser/appcache/appcache_dispatcher_host.h" -#include "content/browser/browser_child_process_host.h" -#include "content/browser/child_process_security_policy.h" -#include "content/browser/device_orientation/message_filter.h" -#include "content/browser/geolocation/geolocation_dispatcher_host.h" -#include "content/browser/gpu_process_host.h" -#include "content/browser/in_process_webkit/dom_storage_message_filter.h" -#include "content/browser/in_process_webkit/indexed_db_dispatcher_host.h" -#include "content/browser/file_system/file_system_dispatcher_host.h" -#include "content/browser/mime_registry_message_filter.h" -#include "content/browser/plugin_service.h" -#include "content/browser/renderer_host/audio_input_renderer_host.h" -#include "content/browser/renderer_host/audio_renderer_host.h" -#include "content/browser/renderer_host/blob_message_filter.h" -#include "content/browser/renderer_host/clipboard_message_filter.h" -#include "content/browser/renderer_host/database_message_filter.h" -#include "content/browser/renderer_host/file_utilities_message_filter.h" -#include "content/browser/renderer_host/gpu_message_filter.h" -#include "content/browser/renderer_host/p2p/socket_dispatcher_host.h" -#include "content/browser/renderer_host/pepper_file_message_filter.h" -#include "content/browser/renderer_host/pepper_message_filter.h" -#include "content/browser/renderer_host/quota_dispatcher_host.h" -#include "content/browser/renderer_host/render_message_filter.h" -#include "content/browser/renderer_host/render_view_host.h" -#include "content/browser/renderer_host/render_view_host_delegate.h" -#include "content/browser/renderer_host/render_widget_helper.h" -#include "content/browser/renderer_host/render_widget_host.h" -#include "content/browser/renderer_host/resource_message_filter.h" -#include "content/browser/renderer_host/socket_stream_dispatcher_host.h" -#include "content/browser/speech/speech_input_dispatcher_host.h" -#include "content/browser/trace_message_filter.h" -#include "content/browser/worker_host/worker_message_filter.h" -#include "content/common/child_process_info.h" -#include "content/common/child_process_messages.h" -#include "content/common/gpu_messages.h" -#include "content/common/notification_service.h" -#include "content/common/process_watcher.h" -#include "content/common/resource_messages.h" -#include "content/common/result_codes.h" -#include "content/common/view_messages.h" -#include "content/renderer/render_process_impl.h" -#include "content/renderer/render_thread.h" -#include "grit/generated_resources.h" -#include "ipc/ipc_logging.h" -#include "ipc/ipc_platform_file.h" -#include "ipc/ipc_switches.h" -#include "media/base/media_switches.h" -#include "net/url_request/url_request_context_getter.h" -#include "ui/base/ui_base_switches.h" -#include "ui/gfx/gl/gl_switches.h" -#include "webkit/fileapi/file_system_path_manager.h" -#include "webkit/fileapi/sandbox_mount_point_provider.h" -#include "webkit/glue/resource_type.h" -#include "webkit/plugins/plugin_switches.h" - -#if defined(OS_WIN) -#include <objbase.h> -#include "content/common/section_util_win.h" -#endif - -using WebKit::WebCache; - -#include "third_party/skia/include/core/SkBitmap.h" - -// TODO(mpcomplete): Remove this after fixing -// http://code.google.com/p/chromium/issues/detail?id=53991 -bool g_log_bug53991 = false; - -// This class creates the IO thread for the renderer when running in -// single-process mode. It's not used in multi-process mode. -class RendererMainThread : public base::Thread { - public: - explicit RendererMainThread(const std::string& channel_id) - : base::Thread("Chrome_InProcRendererThread"), - channel_id_(channel_id), - render_process_(NULL) { - } - - ~RendererMainThread() { - Stop(); - } - - protected: - virtual void Init() { -#if defined(OS_WIN) - CoInitialize(NULL); -#endif - - render_process_ = new RenderProcessImpl(); - render_process_->set_main_thread(new RenderThread(channel_id_)); - // It's a little lame to manually set this flag. But the single process - // RendererThread will receive the WM_QUIT. We don't need to assert on - // this thread, so just force the flag manually. - // If we want to avoid this, we could create the InProcRendererThread - // directly with _beginthreadex() rather than using the Thread class. - base::Thread::SetThreadWasQuitProperly(true); - } - - virtual void CleanUp() { - delete render_process_; - -#if defined(OS_WIN) - CoUninitialize(); -#endif - } - - private: - std::string channel_id_; - // Deleted in CleanUp() on the renderer thread, so don't use a smart pointer. - RenderProcess* render_process_; -}; - - -// Size of the buffer after which individual link updates deemed not warranted -// and the overall update should be used instead. -static const unsigned kVisitedLinkBufferThreshold = 50; - -// This class manages buffering and sending visited link hashes (fingerprints) -// to renderer based on widget visibility. -// As opposed to the VisitedLinkEventListener in profile.cc, which coalesces to -// reduce the rate of messages being sent to render processes, this class -// ensures that the updates occur only when explicitly requested. This is -// used by BrowserRenderProcessHost to only send Add/Reset link events to the -// renderers when their tabs are visible and the corresponding RenderViews are -// created. -class VisitedLinkUpdater { - public: - VisitedLinkUpdater() : reset_needed_(false), has_receiver_(false) {} - - // Buffers |links| to update, but doesn't actually relay them. - void AddLinks(const VisitedLinkCommon::Fingerprints& links) { - if (reset_needed_) - return; - - if (pending_.size() + links.size() > kVisitedLinkBufferThreshold) { - // Once the threshold is reached, there's no need to store pending visited - // link updates -- we opt for resetting the state for all links. - AddReset(); - return; - } - - pending_.insert(pending_.end(), links.begin(), links.end()); - } - - // Tells the updater that sending individual link updates is no longer - // necessary and the visited state for all links should be reset. - void AddReset() { - reset_needed_ = true; - pending_.clear(); - } - - // Sends visited link update messages: a list of links whose visited state - // changed or reset of visited state for all links. - void Update(IPC::Channel::Sender* sender) { - DCHECK(sender); - - if (!has_receiver_) - return; - - if (reset_needed_) { - sender->Send(new ViewMsg_VisitedLink_Reset()); - reset_needed_ = false; - return; - } - - if (pending_.empty()) - return; - - sender->Send(new ViewMsg_VisitedLink_Add(pending_)); - - pending_.clear(); - } - - // Notifies the updater that it is now safe to send visited state updates. - void ReceiverReady(IPC::Channel::Sender* sender) { - has_receiver_ = true; - // Go ahead and send whatever we already have buffered up. - Update(sender); - } - - private: - bool reset_needed_; - bool has_receiver_; - VisitedLinkCommon::Fingerprints pending_; -}; - -namespace { - -// Helper class that we pass to ResourceMessageFilter so that it can find the -// right net::URLRequestContext for a request. -class RendererURLRequestContextSelector - : public ResourceMessageFilter::URLRequestContextSelector { - public: - RendererURLRequestContextSelector(Profile* profile, - const Extension* installed_app) - : request_context_(profile->GetRequestContextForPossibleApp( - installed_app)), - media_request_context_(profile->GetRequestContextForMedia()) { - } - - virtual net::URLRequestContext* GetRequestContext( - ResourceType::Type resource_type) { - net::URLRequestContextGetter* request_context = request_context_; - // If the request has resource type of ResourceType::MEDIA, we use a request - // context specific to media for handling it because these resources have - // specific needs for caching. - if (resource_type == ResourceType::MEDIA) - request_context = media_request_context_; - return request_context->GetURLRequestContext(); - } - - private: - virtual ~RendererURLRequestContextSelector() {} - - scoped_refptr<net::URLRequestContextGetter> request_context_; - scoped_refptr<net::URLRequestContextGetter> media_request_context_; -}; - -} // namespace - -BrowserRenderProcessHost::BrowserRenderProcessHost(Profile* profile) - : RenderProcessHost(profile), - visible_widgets_(0), - backgrounded_(true), - ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_( - base::TimeDelta::FromSeconds(5), - this, &BrowserRenderProcessHost::ClearTransportDIBCache)), - accessibility_enabled_(false), - extension_process_(false), - callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { - widget_helper_ = new RenderWidgetHelper(); - - registrar_.Add(this, NotificationType::USER_SCRIPTS_UPDATED, - Source<Profile>(profile->GetOriginalProfile())); - registrar_.Add(this, NotificationType::EXTENSION_LOADED, - Source<Profile>(profile->GetOriginalProfile())); - registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, - Source<Profile>(profile->GetOriginalProfile())); - registrar_.Add(this, NotificationType::SPELLCHECK_HOST_REINITIALIZED, - NotificationService::AllSources()); - registrar_.Add(this, NotificationType::SPELLCHECK_WORD_ADDED, - NotificationService::AllSources()); - registrar_.Add(this, NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED, - NotificationService::AllSources()); - - visited_link_updater_.reset(new VisitedLinkUpdater()); - - WebCacheManager::GetInstance()->Add(id()); - ChildProcessSecurityPolicy::GetInstance()->Add(id()); - - // Grant most file permissions to this renderer. - // PLATFORM_FILE_TEMPORARY, PLATFORM_FILE_HIDDEN and - // PLATFORM_FILE_DELETE_ON_CLOSE are not granted, because no existing API - // requests them. - ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( - id(), profile->GetPath().Append( - fileapi::SandboxMountPointProvider::kFileSystemDirectory), - base::PLATFORM_FILE_OPEN | - base::PLATFORM_FILE_CREATE | - base::PLATFORM_FILE_OPEN_ALWAYS | - base::PLATFORM_FILE_CREATE_ALWAYS | - base::PLATFORM_FILE_READ | - base::PLATFORM_FILE_WRITE | - base::PLATFORM_FILE_EXCLUSIVE_READ | - base::PLATFORM_FILE_EXCLUSIVE_WRITE | - base::PLATFORM_FILE_ASYNC | - base::PLATFORM_FILE_TRUNCATE | - base::PLATFORM_FILE_WRITE_ATTRIBUTES); - - // Note: When we create the BrowserRenderProcessHost, it's technically - // backgrounded, because it has no visible listeners. But the process - // doesn't actually exist yet, so we'll Background it later, after - // creation. -} - -BrowserRenderProcessHost::~BrowserRenderProcessHost() { - VLOG_IF(1, g_log_bug53991) << "~BrowserRenderProcessHost: " << this; - - WebCacheManager::GetInstance()->Remove(id()); - ChildProcessSecurityPolicy::GetInstance()->Remove(id()); - - // We may have some unsent messages at this point, but that's OK. - channel_.reset(); - while (!queued_messages_.empty()) { - delete queued_messages_.front(); - queued_messages_.pop(); - } - - ClearTransportDIBCache(); -} - -bool BrowserRenderProcessHost::Init( - bool is_accessibility_enabled, bool is_extensions_process) { - // calling Init() more than once does nothing, this makes it more convenient - // for the view host which may not be sure in some cases - if (channel_.get()) - return true; - - accessibility_enabled_ = is_accessibility_enabled; - - // It is possible for an extension process to be reused for non-extension - // content, e.g. if an extension calls window.open. - extension_process_ = extension_process_ || is_extensions_process; - - // run the IPC channel on the shared IO thread. - base::Thread* io_thread = g_browser_process->io_thread(); - - CommandLine::StringType renderer_prefix; -#if defined(OS_POSIX) - // A command prefix is something prepended to the command line of the spawned - // process. It is supported only on POSIX systems. - const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); - renderer_prefix = - browser_command_line.GetSwitchValueNative(switches::kRendererCmdPrefix); -#endif // defined(OS_POSIX) - - // Find the renderer before creating the channel so if this fails early we - // return without creating the channel. - FilePath renderer_path = - ChildProcessHost::GetChildPath(renderer_prefix.empty()); - if (renderer_path.empty()) - return false; - - // Setup the IPC channel. - const std::string channel_id = - ChildProcessInfo::GenerateRandomChannelID(this); - channel_.reset( - new IPC::SyncChannel(channel_id, IPC::Channel::MODE_SERVER, this, - io_thread->message_loop(), true, - g_browser_process->shutdown_event())); - // As a preventive mesure, we DCHECK if someone sends a synchronous message - // with no time-out, which in the context of the browser process we should not - // be doing. - channel_->set_sync_messages_with_no_timeout_allowed(false); - - CreateMessageFilters(); - - if (run_renderer_in_process()) { - // Crank up a thread and run the initialization there. With the way that - // messages flow between the browser and renderer, this thread is required - // to prevent a deadlock in single-process mode. Since the primordial - // thread in the renderer process runs the WebKit code and can sometimes - // make blocking calls to the UI thread (i.e. this thread), they need to run - // on separate threads. - in_process_renderer_.reset(new RendererMainThread(channel_id)); - - base::Thread::Options options; -#if !defined(TOOLKIT_USES_GTK) - // In-process plugins require this to be a UI message loop. - options.message_loop_type = MessageLoop::TYPE_UI; -#else - // We can't have multiple UI loops on GTK, so we don't support - // in-process plugins. - options.message_loop_type = MessageLoop::TYPE_DEFAULT; -#endif - in_process_renderer_->StartWithOptions(options); - - OnProcessLaunched(); // Fake a callback that the process is ready. - } else { - // Build command line for renderer. We call AppendRendererCommandLine() - // first so the process type argument will appear first. - CommandLine* cmd_line = new CommandLine(renderer_path); - if (!renderer_prefix.empty()) - cmd_line->PrependWrapper(renderer_prefix); - AppendRendererCommandLine(cmd_line); - cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); - - // Spawn the child process asynchronously to avoid blocking the UI thread. - // As long as there's no renderer prefix, we can use the zygote process - // at this stage. - child_process_.reset(new ChildProcessLauncher( -#if defined(OS_WIN) - FilePath(), -#elif defined(POSIX) - renderer_prefix.empty(), - base::environment_vector(), - channel_->GetClientFileDescriptor(), -#endif - cmd_line, - this)); - - fast_shutdown_started_ = false; - } - - return true; -} - -void BrowserRenderProcessHost::CreateMessageFilters() { - scoped_refptr<RenderMessageFilter> render_message_filter( - new RenderMessageFilter(id(), - PluginService::GetInstance(), - profile(), - profile()->GetRequestContextForPossibleApp( - installed_app_), - widget_helper_)); - channel_->AddFilter(render_message_filter); - - channel_->AddFilter(new ChromeRenderMessageFilter( - id(), - profile(), - profile()->GetRequestContextForPossibleApp(installed_app_))); - - ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter( - id(), ChildProcessInfo::RENDER_PROCESS, - &profile()->GetResourceContext(), - new RendererURLRequestContextSelector(profile(), installed_app_), - g_browser_process->resource_dispatcher_host()); - - channel_->AddFilter(resource_message_filter); - channel_->AddFilter(new AudioInputRendererHost()); - channel_->AddFilter(new AudioRendererHost()); - channel_->AddFilter( - new AppCacheDispatcherHost(profile()->GetRequestContext(), id())); - channel_->AddFilter(new ClipboardMessageFilter()); - channel_->AddFilter( - new DOMStorageMessageFilter(id(), profile()->GetWebKitContext(), - profile()->GetHostContentSettingsMap())); - channel_->AddFilter( - new IndexedDBDispatcherHost(id(), profile()->GetWebKitContext(), - profile()->GetHostContentSettingsMap())); - channel_->AddFilter( - GeolocationDispatcherHost::New( - id(), profile()->GetGeolocationPermissionContext())); - channel_->AddFilter(new GpuMessageFilter(id())); - channel_->AddFilter(new PepperFileMessageFilter(id(), profile())); - channel_->AddFilter(new PepperMessageFilter(profile())); - channel_->AddFilter(new PrintingMessageFilter()); - channel_->AddFilter(new speech_input::SpeechInputDispatcherHost(id())); - channel_->AddFilter( - new SearchProviderInstallStateMessageFilter(id(), profile())); - channel_->AddFilter(new FileSystemDispatcherHost(profile())); - channel_->AddFilter(new device_orientation::MessageFilter()); - channel_->AddFilter( - new BlobMessageFilter(id(), profile()->GetBlobStorageContext())); - channel_->AddFilter(new FileUtilitiesMessageFilter(id())); - channel_->AddFilter(new MimeRegistryMessageFilter()); - channel_->AddFilter(new DatabaseMessageFilter( - profile()->GetDatabaseTracker(), profile()->GetHostContentSettingsMap())); - - SocketStreamDispatcherHost* socket_stream_dispatcher_host = - new SocketStreamDispatcherHost( - new RendererURLRequestContextSelector(profile(), installed_app_)); - channel_->AddFilter(socket_stream_dispatcher_host); - - channel_->AddFilter(new SpellCheckMessageFilter()); - channel_->AddFilter( - new WorkerMessageFilter( - id(), - profile()->GetRequestContext(), - &profile()->GetResourceContext(), - g_browser_process->resource_dispatcher_host(), - NewCallbackWithReturnValue( - widget_helper_.get(), &RenderWidgetHelper::GetNextRoutingID))); - - if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableP2PApi)) - channel_->AddFilter(new P2PSocketDispatcherHost()); - - channel_->AddFilter(new TraceMessageFilter()); - channel_->AddFilter(new ResolveProxyMsgHelper(NULL)); - channel_->AddFilter(new QuotaDispatcherHost()); -} - -int BrowserRenderProcessHost::GetNextRoutingID() { - return widget_helper_->GetNextRoutingID(); -} - -void BrowserRenderProcessHost::CancelResourceRequests(int render_widget_id) { - widget_helper_->CancelResourceRequests(render_widget_id); -} - -void BrowserRenderProcessHost::CrossSiteClosePageACK( - const ViewMsg_ClosePage_Params& params) { - widget_helper_->CrossSiteClosePageACK(params); -} - -bool BrowserRenderProcessHost::WaitForUpdateMsg( - int render_widget_id, - const base::TimeDelta& max_delay, - IPC::Message* msg) { - // The post task to this thread with the process id could be in queue, and we - // don't want to dispatch a message before then since it will need the handle. - if (child_process_.get() && child_process_->IsStarting()) - return false; - - return widget_helper_->WaitForUpdateMsg(render_widget_id, max_delay, msg); -} - -void BrowserRenderProcessHost::ReceivedBadMessage() { - if (run_renderer_in_process()) { - // In single process mode it is better if we don't suicide but just - // crash. - CHECK(false); - } - NOTREACHED(); - base::KillProcess(GetHandle(), ResultCodes::KILLED_BAD_MESSAGE, false); -} - -void BrowserRenderProcessHost::ViewCreated() { - visited_link_updater_->ReceiverReady(this); -} - -void BrowserRenderProcessHost::WidgetRestored() { - // Verify we were properly backgrounded. - DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); - visible_widgets_++; - visited_link_updater_->Update(this); - SetBackgrounded(false); -} - -void BrowserRenderProcessHost::WidgetHidden() { - // On startup, the browser will call Hide - if (backgrounded_) - return; - - DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); - visible_widgets_--; - DCHECK_GE(visible_widgets_, 0); - if (visible_widgets_ == 0) { - DCHECK(!backgrounded_); - SetBackgrounded(true); - } -} - -void BrowserRenderProcessHost::SendVisitedLinkTable( - base::SharedMemory* table_memory) { - // Check if the process is still starting and we don't have a handle for it - // yet, in which case this will happen later when InitVisitedLinks is called. - if (!run_renderer_in_process() && - (!child_process_.get() || child_process_->IsStarting())) { - return; - } - - base::SharedMemoryHandle handle_for_process; - table_memory->ShareToProcess(GetHandle(), &handle_for_process); - if (base::SharedMemory::IsHandleValid(handle_for_process)) - Send(new ViewMsg_VisitedLink_NewTable(handle_for_process)); -} - -void BrowserRenderProcessHost::AddVisitedLinks( - const VisitedLinkCommon::Fingerprints& links) { - visited_link_updater_->AddLinks(links); - if (visible_widgets_ == 0) - return; - - visited_link_updater_->Update(this); -} - -void BrowserRenderProcessHost::ResetVisitedLinks() { - visited_link_updater_->AddReset(); - if (visible_widgets_ == 0) - return; - - visited_link_updater_->Update(this); -} - -void BrowserRenderProcessHost::AppendRendererCommandLine( - CommandLine* command_line) const { - // Pass the process type first, so it shows first in process listings. - // Extensions use a special pseudo-process type to make them distinguishable, - // even though they're just renderers. - command_line->AppendSwitchASCII(switches::kProcessType, - extension_process_ ? switches::kExtensionProcess : - switches::kRendererProcess); - - if (logging::DialogsAreSuppressed()) - command_line->AppendSwitch(switches::kNoErrorDialogs); - - if (accessibility_enabled_) - command_line->AppendSwitch(switches::kEnableAccessibility); - - // Now send any options from our own command line we want to propagate. - const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); - PropagateBrowserCommandLineToRenderer(browser_command_line, command_line); - - // Pass on the browser locale. - const std::string locale = g_browser_process->GetApplicationLocale(); - command_line->AppendSwitchASCII(switches::kLang, locale); - - // If we run base::FieldTrials, we want to pass to their state to the - // renderer so that it can act in accordance with each state, or record - // histograms relating to the base::FieldTrial states. - std::string field_trial_states; - base::FieldTrialList::StatesToString(&field_trial_states); - if (!field_trial_states.empty()) { - command_line->AppendSwitchASCII(switches::kForceFieldTestNameAndValue, - field_trial_states); - } - - BrowserChildProcessHost::SetCrashReporterCommandLine(command_line); - - FilePath user_data_dir = - browser_command_line.GetSwitchValuePath(switches::kUserDataDir); - if (!user_data_dir.empty()) - command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); -#if defined(OS_CHROMEOS) - const std::string& login_profile = - browser_command_line.GetSwitchValueASCII(switches::kLoginProfile); - if (!login_profile.empty()) - command_line->AppendSwitchASCII(switches::kLoginProfile, login_profile); -#endif - - PrefService* prefs = profile()->GetPrefs(); - // Currently this pref is only registered if applied via a policy. - if (prefs->HasPrefPath(prefs::kDisable3DAPIs) && - prefs->GetBoolean(prefs::kDisable3DAPIs)) { - // Turn this policy into a command line switch. - command_line->AppendSwitch(switches::kDisable3DAPIs); - } - - // Appending disable-gpu-feature switches due to software rendering list. - GpuDataManager* gpu_data_manager = GpuDataManager::GetInstance(); - DCHECK(gpu_data_manager); - gpu_data_manager->AppendRendererCommandLine(command_line); -} - -void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer( - const CommandLine& browser_cmd, - CommandLine* renderer_cmd) const { - // Propagate the following switches to the renderer command line (along - // with any associated values) if present in the browser command line. - static const char* const kSwitchNames[] = { - switches::kAllowHTTPBackgroundPage, - switches::kAllowScriptingGallery, - switches::kAlwaysAuthorizePlugins, - switches::kAppsCheckoutURL, - switches::kAppsGalleryURL, - // We propagate the Chrome Frame command line here as well in case the - // renderer is not run in the sandbox. - switches::kChromeFrame, - switches::kDebugPrint, - switches::kDisable3DAPIs, - switches::kDisableAcceleratedCompositing, - switches::kDisableApplicationCache, - switches::kDisableAudio, - switches::kDisableBreakpad, - switches::kDisableDataTransferItems, - switches::kDisableDatabases, - switches::kDisableDesktopNotifications, - switches::kDisableDeviceOrientation, - switches::kDisableFileSystem, - switches::kDisableGeolocation, - switches::kDisableGLMultisampling, - switches::kDisableGLSLTranslator, - switches::kDisableIndexedDatabase, - switches::kDisableJavaScriptI18NAPI, - switches::kDisableLocalStorage, - switches::kDisableLogging, - switches::kDisableSeccompSandbox, - switches::kDisableSessionStorage, - switches::kDisableSharedWorkers, - switches::kDisableSpeechInput, - switches::kDisableWebSockets, - switches::kDomAutomationController, - switches::kDumpHistogramsOnExit, - switches::kEnableAcceleratedDecoding, - switches::kEnableAdaptive, - switches::kEnableBenchmarking, - switches::kEnableClickToPlay, - switches::kEnableCrxlessWebApps, - switches::kEnableDCHECK, - switches::kEnableExperimentalExtensionApis, - switches::kEnableInBrowserThumbnailing, - switches::kEnableLogging, - switches::kEnableNaCl, - switches::kEnableOpenMax, - switches::kEnableP2PApi, - switches::kEnablePepperTesting, - switches::kEnablePrintPreview, - switches::kEnableRemoting, - switches::kEnableResourceContentSettings, -#if defined(OS_MACOSX) - // Allow this to be set when invoking the browser and relayed along. - switches::kEnableSandboxLogging, -#endif - switches::kEnableSearchProviderApiV2, - switches::kEnableSeccompSandbox, - switches::kEnableStatsTable, - switches::kEnableVideoFullscreen, - switches::kEnableVideoLogging, - switches::kEnableWatchdog, - switches::kEnableWebAudio, - switches::kExperimentalSpellcheckerFeatures, - switches::kFullMemoryCrashReport, -#if !defined (GOOGLE_CHROME_BUILD) - // These are unsupported and not fully tested modes, so don't enable them - // for official Google Chrome builds. - switches::kInProcessPlugins, -#endif // GOOGLE_CHROME_BUILD - switches::kInProcessWebGL, - switches::kJavaScriptFlags, - switches::kLoggingLevel, - switches::kMemoryProfiling, - switches::kMessageLoopHistogrammer, - switches::kNoJsRandomness, - switches::kNoReferrers, - switches::kNoSandbox, - switches::kPlaybackMode, - switches::kPpapiFlashInProcess, - switches::kPpapiFlashPath, - switches::kPpapiFlashVersion, - switches::kPpapiOutOfProcess, - switches::kProfilingAtStart, - switches::kProfilingFile, - switches::kProfilingFlush, - switches::kRecordMode, - switches::kRegisterPepperPlugins, - switches::kRemoteShellPort, - switches::kRendererAssertTest, -#if !defined(OFFICIAL_BUILD) - switches::kRendererCheckFalseTest, -#endif // !defined(OFFICIAL_BUILD) - switches::kRendererCrashTest, - switches::kRendererStartupDialog, - switches::kShowPaintRects, - switches::kSilentDumpOnDCHECK, - switches::kSimpleDataSource, - switches::kTestSandbox, - // This flag needs to be propagated to the renderer process for - // --in-process-webgl. - switches::kUseGL, - switches::kUserAgent, - switches::kV, - switches::kVideoThreads, - switches::kVModule, - switches::kWebCoreLogChannels, - }; - renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames, - arraysize(kSwitchNames)); - - // Disable databases in incognito mode. - if (profile()->IsOffTheRecord() && - !browser_cmd.HasSwitch(switches::kDisableDatabases)) { - renderer_cmd->AppendSwitch(switches::kDisableDatabases); - } - - // Disable client-side phishing detection in the renderer if it is disabled - // in the browser process. - if (!g_browser_process->safe_browsing_detection_service()) { - renderer_cmd->AppendSwitch(switches::kDisableClientSidePhishingDetection); - } -} - -base::ProcessHandle BrowserRenderProcessHost::GetHandle() { - // child_process_ is null either because we're in single process mode, we have - // done fast termination, or the process has crashed. - if (run_renderer_in_process() || !child_process_.get()) - return base::Process::Current().handle(); - - if (child_process_->IsStarting()) - return base::kNullProcessHandle; - - return child_process_->GetHandle(); -} - -void BrowserRenderProcessHost::InitVisitedLinks() { - VisitedLinkMaster* visitedlink_master = profile()->GetVisitedLinkMaster(); - if (!visitedlink_master) - return; - - SendVisitedLinkTable(visitedlink_master->shared_memory()); -} - -void BrowserRenderProcessHost::InitUserScripts() { - UserScriptMaster* user_script_master = profile()->GetUserScriptMaster(); - - // Incognito profiles won't have user scripts. - if (!user_script_master) - return; - - if (!user_script_master->ScriptsReady()) { - // No scripts ready. :( - return; - } - - // Update the renderer process with the current scripts. - SendUserScriptsUpdate(user_script_master->GetSharedMemory()); -} - -void BrowserRenderProcessHost::InitExtensions() { - // Valid extension function names, used to setup bindings in renderer. - std::vector<std::string> function_names; - ExtensionFunctionDispatcher::GetAllFunctionNames(&function_names); - Send(new ExtensionMsg_SetFunctionNames(function_names)); - - // Scripting whitelist. This is modified by tests and must be communicated to - // renderers. - Send(new ExtensionMsg_SetScriptingWhitelist( - *Extension::GetScriptingWhitelist())); - - // Loaded extensions. - ExtensionService* service = profile()->GetExtensionService(); - if (service) { - for (size_t i = 0; i < service->extensions()->size(); ++i) { - Send(new ExtensionMsg_Loaded( - ExtensionMsg_Loaded_Params(service->extensions()->at(i)))); - } - } -} - -void BrowserRenderProcessHost::SendUserScriptsUpdate( - base::SharedMemory *shared_memory) { - // Process is being started asynchronously. We'll end up calling - // InitUserScripts when it's created which will call this again. - if (child_process_.get() && child_process_->IsStarting()) - return; - - base::SharedMemoryHandle handle_for_process; - if (!shared_memory->ShareToProcess(GetHandle(), &handle_for_process)) { - // This can legitimately fail if the renderer asserts at startup. - return; - } - - if (base::SharedMemory::IsHandleValid(handle_for_process)) { - Send(new ExtensionMsg_UpdateUserScripts(handle_for_process)); - } -} - -bool BrowserRenderProcessHost::FastShutdownIfPossible() { - if (run_renderer_in_process()) - return false; // Single process mode can't do fast shutdown. - - if (!child_process_.get() || child_process_->IsStarting() || !GetHandle()) - return false; // Render process hasn't started or is probably crashed. - - // Test if there's an unload listener. - // NOTE: It's possible that an onunload listener may be installed - // while we're shutting down, so there's a small race here. Given that - // the window is small, it's unlikely that the web page has much - // state that will be lost by not calling its unload handlers properly. - if (!sudden_termination_allowed()) - return false; - - // Check for any external tab containers, since they may still be running even - // though this window closed. - listeners_iterator iter(ListenersIterator()); - while (!iter.IsAtEnd()) { - // NOTE: This is a bit dangerous. We know that for now, listeners are - // always RenderWidgetHosts. But in theory, they don't have to be. - const RenderWidgetHost* widget = - static_cast<const RenderWidgetHost*>(iter.GetCurrentValue()); - DCHECK(widget); - if (widget && widget->IsRenderView()) { - const RenderViewHost* rvh = static_cast<const RenderViewHost*>(widget); - if (rvh->delegate()->IsExternalTabContainer()) - return false; - } - - iter.Advance(); - } - - child_process_.reset(); - fast_shutdown_started_ = true; - return true; -} - -bool BrowserRenderProcessHost::SendWithTimeout(IPC::Message* msg, - int timeout_ms) { - if (!channel_.get()) { - delete msg; - return false; - } - return channel_->SendWithTimeout(msg, timeout_ms); -} - -// This is a platform specific function for mapping a transport DIB given its id -TransportDIB* BrowserRenderProcessHost::MapTransportDIB( - TransportDIB::Id dib_id) { -#if defined(OS_WIN) - // On Windows we need to duplicate the handle from the remote process - HANDLE section = chrome::GetSectionFromProcess( - dib_id.handle, GetHandle(), false /* read write */); - return TransportDIB::Map(section); -#elif defined(OS_MACOSX) - // On OSX, the browser allocates all DIBs and keeps a file descriptor around - // for each. - return widget_helper_->MapTransportDIB(dib_id); -#elif defined(OS_POSIX) - return TransportDIB::Map(dib_id.shmkey); -#endif // defined(OS_POSIX) -} - -TransportDIB* BrowserRenderProcessHost::GetTransportDIB( - TransportDIB::Id dib_id) { - if (!TransportDIB::is_valid_id(dib_id)) - return NULL; - - const std::map<TransportDIB::Id, TransportDIB*>::iterator - i = cached_dibs_.find(dib_id); - if (i != cached_dibs_.end()) { - cached_dibs_cleaner_.Reset(); - return i->second; - } - - TransportDIB* dib = MapTransportDIB(dib_id); - if (!dib) - return NULL; - - if (cached_dibs_.size() >= MAX_MAPPED_TRANSPORT_DIBS) { - // Clean a single entry from the cache - std::map<TransportDIB::Id, TransportDIB*>::iterator smallest_iterator; - size_t smallest_size = std::numeric_limits<size_t>::max(); - - for (std::map<TransportDIB::Id, TransportDIB*>::iterator - i = cached_dibs_.begin(); i != cached_dibs_.end(); ++i) { - if (i->second->size() <= smallest_size) { - smallest_iterator = i; - smallest_size = i->second->size(); - } - } - - delete smallest_iterator->second; - cached_dibs_.erase(smallest_iterator); - } - - cached_dibs_[dib_id] = dib; - cached_dibs_cleaner_.Reset(); - return dib; -} - -void BrowserRenderProcessHost::ClearTransportDIBCache() { - STLDeleteContainerPairSecondPointers( - cached_dibs_.begin(), cached_dibs_.end()); - cached_dibs_.clear(); -} - -bool BrowserRenderProcessHost::Send(IPC::Message* msg) { - if (!channel_.get()) { - delete msg; - return false; - } - - if (child_process_.get() && child_process_->IsStarting()) { - queued_messages_.push(msg); - return true; - } - - return channel_->Send(msg); -} - -bool BrowserRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { - // If we're about to be deleted, we can no longer trust that our profile is - // valid, so we ignore incoming messages. - if (deleting_soon_) - return false; - - mark_child_process_activity_time(); - if (msg.routing_id() == MSG_ROUTING_CONTROL) { - // Dispatch control messages. - bool msg_is_ok = true; - IPC_BEGIN_MESSAGE_MAP_EX(BrowserRenderProcessHost, msg, msg_is_ok) - IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats, - OnUpdatedCacheStats) - IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, - SuddenTerminationChanged); - IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddListener, OnExtensionAddListener) - IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveListener, - OnExtensionRemoveListener) - IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseChannel, - OnExtensionCloseChannel) - IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, - OnUserMetricsRecordAction) - IPC_MESSAGE_HANDLER(SpellCheckHostMsg_RequestDictionary, - OnSpellCheckerRequestDictionary) - IPC_MESSAGE_UNHANDLED_ERROR() - IPC_END_MESSAGE_MAP_EX() - - if (!msg_is_ok) { - // The message had a handler, but its de-serialization failed. - // We consider this a capital crime. Kill the renderer if we have one. - LOG(ERROR) << "bad message " << msg.type() << " terminating renderer."; - UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_BRPH")); - ReceivedBadMessage(); - } - return true; - } - - // Dispatch incoming messages to the appropriate RenderView/WidgetHost. - IPC::Channel::Listener* listener = GetListenerByID(msg.routing_id()); - if (!listener) { - if (msg.is_sync()) { - // The listener has gone away, so we must respond or else the caller will - // hang waiting for a reply. - IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); - reply->set_reply_error(); - Send(reply); - } - return true; - } - return listener->OnMessageReceived(msg); -} - -void BrowserRenderProcessHost::OnChannelConnected(int32 peer_pid) { -#if defined(IPC_MESSAGE_LOG_ENABLED) - Send(new ChildProcessMsg_SetIPCLoggingEnabled( - IPC::Logging::GetInstance()->Enabled())); -#endif -} - -void BrowserRenderProcessHost::OnChannelError() { - // Our child process has died. If we didn't expect it, it's a crash. - // In any case, we need to let everyone know it's gone. - // The OnChannelError notification can fire multiple times due to nested sync - // calls to a renderer. If we don't have a valid channel here it means we - // already handled the error. - if (!channel_.get()) - return; - - // child_process_ can be NULL in single process mode or if fast - // termination happened. - int exit_code = 0; - base::TerminationStatus status = - child_process_.get() ? - child_process_->GetChildTerminationStatus(&exit_code) : - base::TERMINATION_STATUS_NORMAL_TERMINATION; - - if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || - status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { - UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", - extension_process_ ? 2 : 1); - } - - if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { - UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", - extension_process_ ? 2 : 1); - } - - RendererClosedDetails details(status, exit_code, extension_process_); - NotificationService::current()->Notify( - NotificationType::RENDERER_PROCESS_CLOSED, - Source<RenderProcessHost>(this), - Details<RendererClosedDetails>(&details)); - - WebCacheManager::GetInstance()->Remove(id()); - child_process_.reset(); - channel_.reset(); - - IDMap<IPC::Channel::Listener>::iterator iter(&listeners_); - while (!iter.IsAtEnd()) { - iter.GetCurrentValue()->OnMessageReceived( - ViewHostMsg_RenderViewGone(iter.GetCurrentKey(), - static_cast<int>(status), - exit_code)); - iter.Advance(); - } - - ClearTransportDIBCache(); - - // this object is not deleted at this point and may be reused later. - // TODO(darin): clean this up -} - -void BrowserRenderProcessHost::OnUpdatedCacheStats( - const WebCache::UsageStats& stats) { - WebCacheManager::GetInstance()->ObserveStats(id(), stats); -} - -void BrowserRenderProcessHost::SuddenTerminationChanged(bool enabled) { - set_sudden_termination_allowed(enabled); -} - -void BrowserRenderProcessHost::SetBackgrounded(bool backgrounded) { - // Note: we always set the backgrounded_ value. If the process is NULL - // (and hence hasn't been created yet), we will set the process priority - // later when we create the process. - backgrounded_ = backgrounded; - if (!child_process_.get() || child_process_->IsStarting()) - return; - -#if defined(OS_WIN) - // The cbstext.dll loads as a global GetMessage hook in the browser process - // and intercepts/unintercepts the kernel32 API SetPriorityClass in a - // background thread. If the UI thread invokes this API just when it is - // intercepted the stack is messed up on return from the interceptor - // which causes random crashes in the browser process. Our hack for now - // is to not invoke the SetPriorityClass API if the dll is loaded. - if (GetModuleHandle(L"cbstext.dll")) - return; -#endif // OS_WIN - - child_process_->SetProcessBackgrounded(backgrounded); -} - -void BrowserRenderProcessHost::Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details) { - switch (type.value) { - case NotificationType::USER_SCRIPTS_UPDATED: { - base::SharedMemory* shared_memory = - Details<base::SharedMemory>(details).ptr(); - if (shared_memory) { - SendUserScriptsUpdate(shared_memory); - } - break; - } - case NotificationType::EXTENSION_LOADED: { - Send(new ExtensionMsg_Loaded( - ExtensionMsg_Loaded_Params(Details<const Extension>(details).ptr()))); - break; - } - case NotificationType::EXTENSION_UNLOADED: { - Send(new ExtensionMsg_Unloaded( - Details<UnloadedExtensionInfo>(details).ptr()->extension->id())); - break; - } - case NotificationType::SPELLCHECK_HOST_REINITIALIZED: { - InitSpellChecker(); - break; - } - case NotificationType::SPELLCHECK_WORD_ADDED: { - AddSpellCheckWord( - reinterpret_cast<const Source<SpellCheckHost>*>(&source)-> - ptr()->GetLastAddedFile()); - break; - } - case NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED: { - PrefService* prefs = profile()->GetPrefs(); - EnableAutoSpellCorrect( - prefs->GetBoolean(prefs::kEnableAutoSpellCorrect)); - break; - } - default: { - NOTREACHED(); - break; - } - } -} - -void BrowserRenderProcessHost::OnProcessLaunched() { - if (child_process_.get()) - child_process_->SetProcessBackgrounded(backgrounded_); - - Send(new ViewMsg_SetIsIncognitoProcess(profile()->IsOffTheRecord())); - - InitVisitedLinks(); - InitUserScripts(); - InitExtensions(); - - // We don't want to initialize the spellchecker unless SpellCheckHost has been - // created. In InitSpellChecker(), we know if GetSpellCheckHost() is NULL - // then the spellchecker has been turned off, but here, we don't know if - // it's been turned off or just not loaded yet. - if (profile()->GetSpellCheckHost()) - InitSpellChecker(); - - InitClientSidePhishingDetection(); - - if (max_page_id_ != -1) - Send(new ViewMsg_SetNextPageID(max_page_id_ + 1)); - - while (!queued_messages_.empty()) { - Send(queued_messages_.front()); - queued_messages_.pop(); - } - - NotificationService::current()->Notify( - NotificationType::RENDERER_PROCESS_CREATED, - Source<RenderProcessHost>(this), NotificationService::NoDetails()); -} - -void BrowserRenderProcessHost::OnExtensionAddListener( - const std::string& extension_id, - const std::string& event_name) { - if (profile()->GetExtensionEventRouter()) { - profile()->GetExtensionEventRouter()->AddEventListener( - event_name, this, extension_id); - } -} - -void BrowserRenderProcessHost::OnExtensionRemoveListener( - const std::string& extension_id, - const std::string& event_name) { - if (profile()->GetExtensionEventRouter()) { - profile()->GetExtensionEventRouter()->RemoveEventListener( - event_name, this, extension_id); - } -} - -void BrowserRenderProcessHost::OnExtensionCloseChannel(int port_id) { - if (profile()->GetExtensionMessageService()) { - profile()->GetExtensionMessageService()->CloseChannel(port_id); - } -} - -void BrowserRenderProcessHost::OnUserMetricsRecordAction( - const std::string& action) { - UserMetrics::RecordComputedAction(action, profile()); -} - -void BrowserRenderProcessHost::OnSpellCheckerRequestDictionary() { - if (profile()->GetSpellCheckHost()) { - // The spellchecker initialization already started and finished; just send - // it to the renderer. - InitSpellChecker(); - } else { - // We may have gotten multiple requests from different renderers. We don't - // want to initialize multiple times in this case, so we set |force| to - // false. - profile()->ReinitializeSpellCheckHost(false); - } -} - -void BrowserRenderProcessHost::AddSpellCheckWord(const std::string& word) { - Send(new SpellCheckMsg_WordAdded(word)); -} - -void BrowserRenderProcessHost::InitSpellChecker() { - SpellCheckHost* spellcheck_host = profile()->GetSpellCheckHost(); - if (spellcheck_host) { - PrefService* prefs = profile()->GetPrefs(); - IPC::PlatformFileForTransit file; - - if (spellcheck_host->GetDictionaryFile() != - base::kInvalidPlatformFileValue) { -#if defined(OS_POSIX) - file = base::FileDescriptor(spellcheck_host->GetDictionaryFile(), false); -#elif defined(OS_WIN) - ::DuplicateHandle(::GetCurrentProcess(), - spellcheck_host->GetDictionaryFile(), - GetHandle(), - &file, - 0, - false, - DUPLICATE_SAME_ACCESS); -#endif - } - - Send(new SpellCheckMsg_Init( - file, - spellcheck_host->GetCustomWords(), - spellcheck_host->GetLanguage(), - prefs->GetBoolean(prefs::kEnableAutoSpellCorrect))); - } else { - Send(new SpellCheckMsg_Init( - IPC::InvalidPlatformFileForTransit(), - std::vector<std::string>(), - std::string(), - false)); - } -} - -void BrowserRenderProcessHost::EnableAutoSpellCorrect(bool enable) { - Send(new SpellCheckMsg_EnableAutoSpellCorrect(enable)); -} - -void BrowserRenderProcessHost::InitClientSidePhishingDetection() { - if (g_browser_process->safe_browsing_detection_service()) { - // The BrowserRenderProcessHost object might get deleted before the - // safe browsing client-side detection service class is done with opening - // the model file. To avoid crashing we use the callback factory which will - // cancel the callback if |this| is destroyed. - g_browser_process->safe_browsing_detection_service()->GetModelFile( - callback_factory_.NewCallback( - &BrowserRenderProcessHost::OpenPhishingModelDone)); - } -} - -void BrowserRenderProcessHost::OpenPhishingModelDone( - base::PlatformFile model_file) { - if (model_file != base::kInvalidPlatformFileValue) { - IPC::PlatformFileForTransit file; -#if defined(OS_POSIX) - file = base::FileDescriptor(model_file, false); -#elif defined(OS_WIN) - ::DuplicateHandle(::GetCurrentProcess(), model_file, GetHandle(), &file, 0, - false, DUPLICATE_SAME_ACCESS); -#endif - Send(new SafeBrowsingMsg_SetPhishingModel(file)); - } -} diff --git a/chrome/browser/renderer_host/browser_render_process_host.h b/chrome/browser/renderer_host/browser_render_process_host.h deleted file mode 100644 index 9de0b0c..0000000 --- a/chrome/browser/renderer_host/browser_render_process_host.h +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_ -#define CHROME_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_ -#pragma once - -#include <map> -#include <queue> -#include <string> - -#include "base/memory/scoped_callback_factory.h" -#include "base/memory/scoped_ptr.h" -#include "base/platform_file.h" -#include "base/process.h" -#include "base/timer.h" -#include "chrome/common/extensions/extension.h" -#include "content/browser/child_process_launcher.h" -#include "content/browser/renderer_host/render_process_host.h" -#include "content/common/notification_observer.h" -#include "content/common/notification_registrar.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h" -#include "ui/gfx/surface/transport_dib.h" - -class CommandLine; -class RendererMainThread; -class RenderWidgetHelper; -class VisitedLinkUpdater; - -namespace base { -class SharedMemory; -} - -// Implements a concrete RenderProcessHost for the browser process for talking -// to actual renderer processes (as opposed to mocks). -// -// Represents the browser side of the browser <--> renderer communication -// channel. There will be one RenderProcessHost per renderer process. -// -// This object is refcounted so that it can release its resources when all -// hosts using it go away. -// -// This object communicates back and forth with the RenderProcess object -// running in the renderer process. Each RenderProcessHost and RenderProcess -// keeps a list of RenderView (renderer) and TabContents (browser) which -// are correlated with IDs. This way, the Views and the corresponding ViewHosts -// communicate through the two process objects. -class BrowserRenderProcessHost : public RenderProcessHost, - public NotificationObserver, - public ChildProcessLauncher::Client { - public: - explicit BrowserRenderProcessHost(Profile* profile); - ~BrowserRenderProcessHost(); - - // Whether this process is associated with an installed app. - const Extension* installed_app() const { return installed_app_; } - void set_installed_app(const Extension* installed_app) { - installed_app_ = installed_app; - } - - // RenderProcessHost implementation (public portion). - virtual bool Init(bool is_accessibility_enabled, bool is_extensions_process); - virtual int GetNextRoutingID(); - virtual void CancelResourceRequests(int render_widget_id); - virtual void CrossSiteClosePageACK(const ViewMsg_ClosePage_Params& params); - virtual bool WaitForUpdateMsg(int render_widget_id, - const base::TimeDelta& max_delay, - IPC::Message* msg); - virtual void ReceivedBadMessage(); - virtual void WidgetRestored(); - virtual void WidgetHidden(); - virtual void ViewCreated(); - virtual void SendVisitedLinkTable(base::SharedMemory* table_memory); - virtual void AddVisitedLinks(const VisitedLinkCommon::Fingerprints& links); - virtual void ResetVisitedLinks(); - virtual bool FastShutdownIfPossible(); - virtual bool SendWithTimeout(IPC::Message* msg, int timeout_ms); - virtual base::ProcessHandle GetHandle(); - virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id); - - // IPC::Channel::Sender via RenderProcessHost. - virtual bool Send(IPC::Message* msg); - - // IPC::Channel::Listener via RenderProcessHost. - virtual bool OnMessageReceived(const IPC::Message& msg); - virtual void OnChannelConnected(int32 peer_pid); - virtual void OnChannelError(); - - // NotificationObserver implementation. - virtual void Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details); - - // ChildProcessLauncher::Client implementation. - virtual void OnProcessLaunched(); - - private: - friend class VisitRelayingRenderProcessHost; - - // Creates and adds the IO thread message filters. - void CreateMessageFilters(); - - // Control message handlers. - void OnUpdatedCacheStats(const WebKit::WebCache::UsageStats& stats); - void SuddenTerminationChanged(bool enabled); - void OnExtensionAddListener(const std::string& extension_id, - const std::string& event_name); - void OnExtensionRemoveListener(const std::string& extension_id, - const std::string& event_name); - void OnExtensionCloseChannel(int port_id); - void OnUserMetricsRecordAction(const std::string& action); - - // Initialize support for visited links. Send the renderer process its initial - // set of visited links. - void InitVisitedLinks(); - - // Initialize support for user scripts. Send the renderer process its initial - // set of scripts and listen for updates to scripts. - void InitUserScripts(); - - // Initialize support for extension APIs. Send the list of registered API - // functions to thre renderer process. - void InitExtensions(); - - // Sends the renderer process a new set of user scripts. - void SendUserScriptsUpdate(base::SharedMemory* shared_memory); - - // Generates a command line to be used to spawn a renderer and appends the - // results to |*command_line|. - void AppendRendererCommandLine(CommandLine* command_line) const; - - // Copies applicable command line switches from the given |browser_cmd| line - // flags to the output |renderer_cmd| line flags. Not all switches will be - // copied over. - void PropagateBrowserCommandLineToRenderer(const CommandLine& browser_cmd, - CommandLine* renderer_cmd) const; - - // Callers can reduce the RenderProcess' priority. - void SetBackgrounded(bool backgrounded); - - // The renderer has requested that we initialize its spellchecker. This should - // generally only be called once per session, as after the first call, all - // future renderers will be passed the initialization information on startup - // (or when the dictionary changes in some way). - void OnSpellCheckerRequestDictionary(); - - // Tell the renderer of a new word that has been added to the custom - // dictionary. - void AddSpellCheckWord(const std::string& word); - - // Pass the renderer some basic intialization information. Note that the - // renderer will not load Hunspell until it needs to. - void InitSpellChecker(); - - // Tell the renderer that auto spell correction has been enabled/disabled. - void EnableAutoSpellCorrect(bool enable); - - // Initializes client-side phishing detection. Starts reading the phishing - // model from the client-side detection service class. Once the model is read - // OpenPhishingModelDone() is invoked. - void InitClientSidePhishingDetection(); - - // Called once the client-side detection service class is done with opening - // the model file. - void OpenPhishingModelDone(base::PlatformFile model_file); - - NotificationRegistrar registrar_; - - // The count of currently visible widgets. Since the host can be a container - // for multiple widgets, it uses this count to determine when it should be - // backgrounded. - int32 visible_widgets_; - - // Does this process have backgrounded priority. - bool backgrounded_; - - // Used to allow a RenderWidgetHost to intercept various messages on the - // IO thread. - scoped_refptr<RenderWidgetHelper> widget_helper_; - - // A map of transport DIB ids to cached TransportDIBs - std::map<TransportDIB::Id, TransportDIB*> cached_dibs_; - enum { - // This is the maximum size of |cached_dibs_| - MAX_MAPPED_TRANSPORT_DIBS = 3, - }; - - // Map a transport DIB from its Id and return it. Returns NULL on error. - TransportDIB* MapTransportDIB(TransportDIB::Id dib_id); - - void ClearTransportDIBCache(); - // This is used to clear our cache five seconds after the last use. - base::DelayTimer<BrowserRenderProcessHost> cached_dibs_cleaner_; - - // Used in single-process mode. - scoped_ptr<RendererMainThread> in_process_renderer_; - - // Buffer visited links and send them to to renderer. - scoped_ptr<VisitedLinkUpdater> visited_link_updater_; - - // True if this prcoess should have accessibility enabled; - bool accessibility_enabled_; - - // True iff this process is being used as an extension process. Not valid - // when running in single-process mode. - bool extension_process_; - - // The Extension for the hosted or packaged app if any, NULL otherwise. - scoped_refptr<const Extension> installed_app_; - - // Used to launch and terminate the process without blocking the UI thread. - scoped_ptr<ChildProcessLauncher> child_process_; - - // Messages we queue while waiting for the process handle. We queue them here - // instead of in the channel so that we ensure they're sent after init related - // messages that are sent once the process handle is available. This is - // because the queued messages may have dependencies on the init messages. - std::queue<IPC::Message*> queued_messages_; - - base::ScopedCallbackFactory<BrowserRenderProcessHost> callback_factory_; - - DISALLOW_COPY_AND_ASSIGN(BrowserRenderProcessHost); -}; - -#endif // CHROME_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_ diff --git a/chrome/browser/sidebar/sidebar_container.cc b/chrome/browser/sidebar/sidebar_container.cc index c673906..1c1c2ac 100644 --- a/chrome/browser/sidebar/sidebar_container.cc +++ b/chrome/browser/sidebar/sidebar_container.cc @@ -6,11 +6,11 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_resource.h" #include "chrome/common/extensions/extension_sidebar_defaults.h" #include "chrome/common/extensions/extension_sidebar_utils.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/tab_contents/navigation_controller.h" #include "content/browser/tab_contents/navigation_entry.h" diff --git a/chrome/browser/visitedlink/visitedlink_unittest.cc b/chrome/browser/visitedlink/visitedlink_unittest.cc index 88acc78..66834ea 100644 --- a/chrome/browser/visitedlink/visitedlink_unittest.cc +++ b/chrome/browser/visitedlink/visitedlink_unittest.cc @@ -12,13 +12,13 @@ #include "base/process_util.h" #include "base/shared_memory.h" #include "base/string_util.h" -#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/visitedlink/visitedlink_master.h" #include "chrome/browser/visitedlink/visitedlink_event_listener.h" #include "chrome/common/render_messages.h" #include "chrome/renderer/visitedlink_slave.h" #include "chrome/test/testing_profile.h" #include "content/browser/browser_thread.h" +#include "content/browser/renderer_host/browser_render_process_host.h" #include "content/browser/renderer_host/test_render_view_host.h" #include "googleurl/src/gurl.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 04057ac..5a638d5 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1710,8 +1710,6 @@ 'browser/remoting/setup_flow_start_host_step.cc', 'browser/remoting/setup_flow_start_host_step.h', 'browser/remove_rows_table_model.h', - 'browser/renderer_host/browser_render_process_host.cc', - 'browser/renderer_host/browser_render_process_host.h', 'browser/renderer_host/chrome_render_message_filter.cc', 'browser/renderer_host/chrome_render_message_filter.h', 'browser/renderer_host/download_resource_handler.cc', |