diff options
42 files changed, 733 insertions, 634 deletions
diff --git a/chrome/app/chrome_dll_main.cc b/chrome/app/chrome_dll_main.cc index 05fd8b7..48d5b21 100644 --- a/chrome/app/chrome_dll_main.cc +++ b/chrome/app/chrome_dll_main.cc @@ -27,7 +27,7 @@ #include "base/string_util.h" #if defined(OS_WIN) #include "base/win_util.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #endif #include "chrome/app/scoped_ole_initializer.h" #include "chrome/common/chrome_constants.h" diff --git a/chrome/browser/browser.scons b/chrome/browser/browser.scons index 156903b..0d26151 100644 --- a/chrome/browser/browser.scons +++ b/chrome/browser/browser.scons @@ -243,7 +243,6 @@ if env.Bit('windows'): 'printing/win_printing_context.cc', 'profile.cc', 'profile_manager.cc', - 'render_process_host.cc', 'render_view_context_menu.cc', 'render_view_context_menu_controller.cc', 'render_view_host.cc', @@ -251,6 +250,8 @@ if env.Bit('windows'): 'render_widget_helper.cc', 'render_widget_host.cc', 'renderer_host/cross_site_resource_handler.cc', + 'renderer_host/render_process_host.cc', + 'renderer_host/browser_render_process_host.cc', 'renderer_host/resource_dispatcher_host.cc', 'repost_form_warning_dialog.cc', 'resource_message_filter.cc', diff --git a/chrome/browser/browser.vcproj b/chrome/browser/browser.vcproj index 8d6da23..5cc8fe9 100644 --- a/chrome/browser/browser.vcproj +++ b/chrome/browser/browser.vcproj @@ -482,14 +482,6 @@ > </File> <File - RelativePath=".\render_process_host.cc" - > - </File> - <File - RelativePath=".\render_process_host.h" - > - </File> - <File RelativePath=".\render_view_host.cc" > </File> @@ -2044,6 +2036,14 @@ > </File> <File + RelativePath=".\renderer_host\browser_render_process_host.cc" + > + </File> + <File + RelativePath=".\renderer_host\browser_render_process_host.h" + > + </File> + <File RelativePath=".\renderer_host\buffered_resource_handler.cc" > </File> @@ -2076,26 +2076,16 @@ > </File> <File + RelativePath=".\renderer_host\render_process_host.cc" + > + </File> + <File + RelativePath=".\renderer_host\render_process_host.h" + > + </File> + <File RelativePath=".\renderer_host\resource_dispatcher_host.cc" > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)\$(InputName)1.obj" - XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - ObjectFile="$(IntDir)\$(InputName)1.obj" - XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" - /> - </FileConfiguration> </File> <File RelativePath=".\renderer_host\resource_dispatcher_host.h" diff --git a/chrome/browser/browser_about_handler.cc b/chrome/browser/browser_about_handler.cc index 0f4326b..68dd9b2 100644 --- a/chrome/browser/browser_about_handler.cc +++ b/chrome/browser/browser_about_handler.cc @@ -27,8 +27,8 @@ #include "chrome/browser/plugin_service.h" #include "chrome/browser/profile.h" #include "chrome/browser/profile_manager.h" -#include "chrome/browser/render_process_host.h" #include "chrome/browser/render_view_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/tab_contents/ipc_status_view.h" #include "chrome/common/jstemplate_builder.h" #include "chrome/common/l10n_util.h" diff --git a/chrome/browser/browser_accessibility_manager.cc b/chrome/browser/browser_accessibility_manager.cc index 1b533c2..0d46274 100644 --- a/chrome/browser/browser_accessibility_manager.cc +++ b/chrome/browser/browser_accessibility_manager.cc @@ -5,7 +5,7 @@ #include "chrome/browser/browser_accessibility_manager.h" #include "chrome/browser/browser_accessibility.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/render_widget_host.h" // The time in ms after which we give up and return an error when processing an diff --git a/chrome/browser/browser_accessibility_manager.h b/chrome/browser/browser_accessibility_manager.h index 4d837bf..8356bc4 100644 --- a/chrome/browser/browser_accessibility_manager.h +++ b/chrome/browser/browser_accessibility_manager.h @@ -16,21 +16,6 @@ class BrowserAccessibility; class RenderProcessHost; class RenderWidgetHost; -// Member variable structure, used in instance hashmap. -struct UniqueMembers { - RenderWidgetHost* render_widget_host_; - HWND parent_hwnd_; - - UniqueMembers(HWND parent_hwnd, RenderWidgetHost* render_widget_host) - : parent_hwnd_(parent_hwnd), - render_widget_host_(render_widget_host) { - } -}; - -typedef stdext::hash_map<int, UniqueMembers*> InstanceMap; -typedef stdext::hash_map<RenderProcessHost*, BrowserAccessibility*> - RenderProcessHostMap; - //////////////////////////////////////////////////////////////////////////////// // // BrowserAccessibilityManager @@ -91,6 +76,21 @@ class BrowserAccessibilityManager : public NotificationObserver { ~BrowserAccessibilityManager(); private: + // Member variable structure, used in instance hashmap. + struct UniqueMembers { + RenderWidgetHost* render_widget_host_; + HWND parent_hwnd_; + + UniqueMembers(HWND parent_hwnd, RenderWidgetHost* render_widget_host) + : parent_hwnd_(parent_hwnd), + render_widget_host_(render_widget_host) { + } + }; + + typedef stdext::hash_map<int, UniqueMembers*> InstanceMap; + typedef stdext::hash_map<RenderProcessHost*, BrowserAccessibility*> + RenderProcessHostMap; + // Caching of the unique member variables used to handle browser accessibility // requests from multiple processes. InstanceMap instance_map_; diff --git a/chrome/browser/browser_prefs.cc b/chrome/browser/browser_prefs.cc index 2cf949b..a33c68a 100644 --- a/chrome/browser/browser_prefs.cc +++ b/chrome/browser/browser_prefs.cc @@ -13,6 +13,7 @@ #include "chrome/browser/google_url_tracker.h" #include "chrome/browser/metrics/metrics_service.h" #include "chrome/browser/password_manager/password_manager.h" +#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/session_startup_pref.h" #include "chrome/browser/spellchecker.h" @@ -42,7 +43,7 @@ void RegisterAllPrefs(PrefService* user_prefs, PrefService* local_state) { MetricsLog::RegisterPrefs(local_state); MetricsService::RegisterPrefs(local_state); PageInfoWindow::RegisterPrefs(local_state); - RenderProcessHost::RegisterPrefs(local_state); + BrowserRenderProcessHost::RegisterPrefs(local_state); TaskManager::RegisterPrefs(local_state); ExternalProtocolHandler::RegisterPrefs(local_state); SafeBrowsingService::RegisterPrefs(local_state); diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h index adff28b..22b13d3 100644 --- a/chrome/browser/browser_process.h +++ b/chrome/browser/browser_process.h @@ -28,7 +28,6 @@ class MetricsService; class NotificationService; class PrefService; class ProfileManager; -class RenderProcessHost; class DebuggerWrapper; class ResourceDispatcherHost; class WebAppInstallerService; diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 8b98a41..20188cc1 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc @@ -19,7 +19,7 @@ #include "chrome/browser/plugin_service.h" #include "chrome/browser/printing/print_job_manager.h" #include "chrome/browser/profile_manager.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/debugger/debugger_wrapper.h" diff --git a/chrome/browser/browser_shutdown.cc b/chrome/browser/browser_shutdown.cc index 981737e..2815e78 100644 --- a/chrome/browser/browser_shutdown.cc +++ b/chrome/browser/browser_shutdown.cc @@ -16,7 +16,7 @@ #include "chrome/browser/metrics/metrics_service.h" #include "chrome/browser/plugin_process_host.h" #include "chrome/browser/plugin_service.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/render_view_host.h" #include "chrome/browser/render_widget_host.h" #include "chrome/common/chrome_paths.h" diff --git a/chrome/browser/cache_manager_host.cc b/chrome/browser/cache_manager_host.cc index cc0f2e3..c295eef 100644 --- a/chrome/browser/cache_manager_host.cc +++ b/chrome/browser/cache_manager_host.cc @@ -9,7 +9,7 @@ #include "base/sys_info.h" #include "base/time.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/pref_names.h" #include "chrome/common/pref_service.h" @@ -133,8 +133,7 @@ void CacheManagerHost::ObserveStats(int renderer_id, // See notification_types.h. NotificationService::current()-> Notify(NOTIFY_WEB_CACHE_STATS_OBSERVED, - Source<RenderProcessHost>( - RenderProcessHost::FromID(renderer_id)), + Source<RenderProcessHost>(RenderProcessHost::FromID(renderer_id)), Details<CacheManager::UsageStats>(&stats_details)); } diff --git a/chrome/browser/cache_manager_host.h b/chrome/browser/cache_manager_host.h index 5046624..d87cbf8 100644 --- a/chrome/browser/cache_manager_host.h +++ b/chrome/browser/cache_manager_host.h @@ -20,7 +20,6 @@ #include "webkit/glue/cache_manager.h" class PrefService; -class RenderProcessHost; class CacheManagerHost { // Unit tests are our friends. diff --git a/chrome/browser/debugger/debugger_node.cc b/chrome/browser/debugger/debugger_node.cc index 32e7afd..86587c5 100644 --- a/chrome/browser/debugger/debugger_node.cc +++ b/chrome/browser/debugger/debugger_node.cc @@ -9,7 +9,7 @@ #include "chrome/browser/browser.h" #include "chrome/browser/browser_list.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/render_view_host.h" #include "chrome/browser/tab_contents/web_contents.h" #include "chrome/browser/debugger/debugger_shell.h" diff --git a/chrome/browser/debugger/debugger_shell.cc b/chrome/browser/debugger/debugger_shell.cc index b64f083..21b1c7f 100644 --- a/chrome/browser/debugger/debugger_shell.cc +++ b/chrome/browser/debugger/debugger_shell.cc @@ -14,7 +14,7 @@ #include "chrome/browser/debugger/debugger_io.h" #include "chrome/browser/debugger/debugger_node.h" #include "chrome/browser/debugger/resources/debugger_resources.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/resource_bundle.h" diff --git a/chrome/browser/download/download_manager.cc b/chrome/browser/download/download_manager.cc index 1abfb87..d1ca5da 100644 --- a/chrome/browser/download/download_manager.cc +++ b/chrome/browser/download/download_manager.cc @@ -22,7 +22,7 @@ #include "chrome/browser/download/download_file.h" #include "chrome/browser/download/download_util.h" #include "chrome/browser/profile.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/render_view_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/tab_contents/tab_util.h" diff --git a/chrome/browser/download/save_package.cc b/chrome/browser/download/save_package.cc index c32c5ca..43096e0 100644 --- a/chrome/browser/download/save_package.cc +++ b/chrome/browser/download/save_package.cc @@ -18,7 +18,7 @@ #include "chrome/browser/download/save_file_manager.h" #include "chrome/browser/download/save_page_model.h" #include "chrome/browser/profile.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/render_view_host.h" #include "chrome/browser/render_view_host_delegate.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" diff --git a/chrome/browser/login_prompt.cc b/chrome/browser/login_prompt.cc index aaf2076..978d4dc 100644 --- a/chrome/browser/login_prompt.cc +++ b/chrome/browser/login_prompt.cc @@ -10,7 +10,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/controller.h" #include "chrome/browser/password_manager/password_manager.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/tab_contents/constrained_window.h" #include "chrome/browser/tab_contents/navigation_controller.h" diff --git a/chrome/browser/memory_details.cc b/chrome/browser/memory_details.cc index cc762f1..0a79f80 100644 --- a/chrome/browser/memory_details.cc +++ b/chrome/browser/memory_details.cc @@ -15,7 +15,7 @@ #include "chrome/browser/browser_trial.h" #include "chrome/browser/plugin_process_host.h" #include "chrome/browser/plugin_service.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/render_view_host.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/web_contents.h" diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc index 399db59..e7fefe5 100644 --- a/chrome/browser/metrics/metrics_service.cc +++ b/chrome/browser/metrics/metrics_service.cc @@ -172,7 +172,7 @@ #include "chrome/browser/plugin_process_info.h" #include "chrome/browser/plugin_service.h" #include "chrome/browser/profile.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/search_engines/template_url.h" #include "chrome/browser/search_engines/template_url_model.h" #include "chrome/common/chrome_paths.h" diff --git a/chrome/browser/plugin_process_host.cc b/chrome/browser/plugin_process_host.cc index 9249802..4607b2a 100644 --- a/chrome/browser/plugin_process_host.cc +++ b/chrome/browser/plugin_process_host.cc @@ -20,7 +20,8 @@ #include "chrome/browser/plugin_process_info.h" #include "chrome/browser/plugin_service.h" #include "chrome/browser/profile.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/browser_render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/sandbox_policy.h" #include "chrome/common/chrome_paths.h" diff --git a/chrome/browser/plugin_service.cc b/chrome/browser/plugin_service.cc index 235ccf4..f31dc68 100644 --- a/chrome/browser/plugin_service.cc +++ b/chrome/browser/plugin_service.cc @@ -10,7 +10,7 @@ #include "chrome/browser/chrome_plugin_host.h" #include "chrome/browser/chrome_thread.h" #include "chrome/browser/plugin_process_host.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/resource_message_filter.h" #include "chrome/common/chrome_plugin_lib.h" #include "chrome/common/logging_chrome.h" diff --git a/chrome/browser/profile.cc b/chrome/browser/profile.cc index 7d3a947..089dd9c 100644 --- a/chrome/browser/profile.cc +++ b/chrome/browser/profile.cc @@ -22,7 +22,7 @@ #include "chrome/browser/history/history.h" #include "chrome/browser/net/chrome_url_request_context.h" #include "chrome/browser/profile_manager.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/search_engines/template_url_fetcher.h" #include "chrome/browser/search_engines/template_url_model.h" #include "chrome/browser/sessions/session_service.h" diff --git a/chrome/browser/render_process_host.h b/chrome/browser/render_process_host.h deleted file mode 100644 index e4fea50..0000000 --- a/chrome/browser/render_process_host.h +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2006-2008 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_RENDER_PROCESS_HOST_H_ -#define CHROME_BROWSER_RENDER_PROCESS_HOST_H_ - -#include <limits> -#include <set> -#include <vector> -#include <windows.h> - -#include "base/id_map.h" -#include "base/object_watcher.h" -#include "base/process.h" -#include "base/rand_util.h" -#include "base/ref_counted.h" -#include "base/scoped_handle.h" -#include "base/scoped_ptr.h" -#include "chrome/common/ipc_sync_channel.h" -#include "chrome/common/notification_service.h" -#include "chrome/common/render_messages.h" - -class PrefService; -class Profile; -class RenderWidgetHelper; -class WebContents; - -namespace base { -class Thread; -} - -// 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 WebContents (browser) which -// are correlated with IDs. This way, the Views and the corresponding ViewHosts -// communicate through the two process objects. -class RenderProcessHost : public IPC::Channel::Listener, - public IPC::Channel::Sender, - public base::ObjectWatcher::Delegate, - public NotificationObserver { - public: - // Returns the RenderProcessHost given its ID. Returns NULL if the ID does - // not correspond to a live RenderProcessHost. - static RenderProcessHost* FromID(int render_process_id); - - explicit RenderProcessHost(Profile* profile); - ~RenderProcessHost(); - - // Flag to run the renderer in process. This is primarily - // for debugging purposes. When running "in process", the - // browser maintains a single RenderProcessHost which communicates - // to a RenderProcess which is instantiated in the same process - // with the Browser. All IPC between the Browser and the - // Renderer is the same, it's just not crossing a process boundary. - static bool run_renderer_in_process() { - return run_renderer_in_process_; - } - static void set_run_renderer_in_process(bool value) { - run_renderer_in_process_ = value; - } - - static void RegisterPrefs(PrefService* prefs); - - // If the a process has sent a message that cannot be decoded, it is deemed - // corrupted and thus needs to be terminated using this call. This function - // can be safely called from any thread. - static void BadMessageTerminateProcess(uint16 msg_type, HANDLE renderer); - - // Called when a received message cannot be decoded. - void ReceivedBadMessage(uint16 msg_type) { - BadMessageTerminateProcess(msg_type, process_.handle()); - } - - // Initialize the new renderer process, returning true on success. This must - // be called once before the object can be used, but can be called after - // that with no effect. Therefore, if the caller isn't sure about whether - // the process has been created, it should just call Init(). - bool Init(); - - // Used for refcounting, each holder of this object must Attach and Release - // just like it would for a COM object. This object should be allocated on - // the heap; when no listeners own it any more, it will delete itself. - void Attach(IPC::Channel::Listener* listener, int routing_id); - - // See Attach() - void Release(int listener_id); - - // Listeners should call this when they've sent a "Close" message and - // they're waiting for a "Close_ACK", so that if the renderer process - // goes away we'll know that it was intentional rather than a crash. - void ReportExpectingClose(int32 listener_id); - - // May return NULL if there is no connection. - IPC::SyncChannel* channel() { - return channel_.get(); - } - - const base::Process& process() const { - return process_; - } - - // Try to shutdown the associated renderer process as fast as possible. - // If this renderer has any RenderViews with unload handlers, then this - // function does nothing. The current implementation uses TerminateProcess. - // Returns True if it was able to do fast shutdown. - bool FastShutdownIfPossible(); - - IPC::Channel::Listener* GetListenerByID(int routing_id) { - return listeners_.Lookup(routing_id); - } - - // Called to inform the render process host of a new "max page id" for a - // render view host. The render process host computes the largest page id - // across all render view hosts and uses the value when it needs to - // initialize a new renderer in place of the current one. - void UpdateMaxPageID(int32 page_id); - - // Called to simulate a ClosePage_ACK message to the ResourceDispatcherHost. - // Necessary for a cross-site request, in the case that the original - // RenderViewHost is not live and thus cannot run an onunload handler. - void CrossSiteClosePageACK(int new_render_process_host_id, - int new_request_id); - - // IPC channel listener - virtual void OnMessageReceived(const IPC::Message& msg); - virtual void OnChannelConnected(int32 peer_pid); - - // ObjectWatcher::Delegate - virtual void OnObjectSignaled(HANDLE object); - - // IPC::Channel::Sender callback - virtual bool Send(IPC::Message* msg); - - // Allows iteration over all the RenderProcessHosts in the browser. Note - // that each host may not be active, and therefore may have NULL channels. - // This is just a standard STL iterator, so it is not valid if the list - // of RenderProcessHosts changes between iterations. - typedef IDMap<RenderProcessHost>::const_iterator iterator; - static iterator begin(); - static iterator end(); - static size_t size(); - - // Allows iteration over this RenderProcessHost's RenderViewHost listeners. - // Use from UI thread only. - typedef IDMap<IPC::Channel::Listener>::const_iterator listeners_iterator; - listeners_iterator listeners_begin() { - return listeners_.begin(); - } - listeners_iterator listeners_end() { - return listeners_.end(); - } - - // Returns true if the caller should attempt to use an existing - // RenderProcessHost rather than creating a new one. - static bool ShouldTryToUseExistingProcessHost(); - - // Get an existing RenderProcessHost associated with the given profile, if - // possible. The renderer process is chosen randomly from the - // processes associated with the given profile. - // Returns NULL if no suitable renderer process is available. - static RenderProcessHost* GetExistingProcessHost(Profile* profile); - - int host_id() const { return host_id_; } - - // Returns the user profile associated with this renderer process. - Profile* profile() const { return profile_; } - - RenderWidgetHelper* widget_helper() const { return widget_helper_; } - - // Track the count of visible widgets. Called by listeners - // to register/unregister visibility. - void WidgetRestored(); - void WidgetHidden(); - - // Add a word in the spellchecker. - void AddWord(const std::wstring& word); - - // NotificationObserver implementation. - virtual void Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details); - - private: - // control message handlers - void OnPageContents(const GURL& url, int32 page_id, - const std::wstring& contents); - // Clipboard messages - void OnClipboardWriteHTML(const std::wstring& markup, const GURL& src_url); - void OnClipboardWriteBookmark(const std::wstring& title, const GURL& url); - void OnClipboardWriteBitmap(base::SharedMemoryHandle bitmap, gfx::Size size); - void OnClipboardIsFormatAvailable(unsigned int format, bool* result); - void OnClipboardReadText(std::wstring* result); - void OnClipboardReadAsciiText(std::string* result); - void OnClipboardReadHTML(std::wstring* markup, GURL* src_url); - void OnUpdatedCacheStats(const CacheManager::UsageStats& stats); - - // 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(); - - // Sends the renderer process a new set of user scripts. - void SendUserScriptsUpdate(base::SharedMemory* shared_memory); - - // Gets a handle to the renderer process, normalizing the case where we were - // started with --single-process. - base::ProcessHandle GetRendererProcessHandle(); - - // Callers can reduce the RenderProcess' priority. - // Returns true if the priority is backgrounded; false otherwise. - void SetBackgrounded(bool boost); - - // Unregister this object from all globals that reference it. - // This would naturally be part of the destructor, but we destruct - // asynchronously. - void Unregister(); - - // the registered listeners. When this list is empty or all NULL, we should - // delete ourselves - IDMap<IPC::Channel::Listener> listeners_; - - // set of listeners that expect the renderer process to close - std::set<int> listeners_expecting_close_; - - // A proxy for our IPC::Channel that lives on the IO thread (see - // browser_process.h) - scoped_ptr<IPC::SyncChannel> channel_; - - // Our renderer process. - base::Process process_; - - // Used to watch the renderer process handle. - base::ObjectWatcher watcher_; - - // The profile associated with this renderer process. - Profile* profile_; - - // Our ID into the IDMap. - int host_id_; - - // The maximum page ID we've ever seen from the renderer process. - int32 max_page_id_; - - // 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_; - - // Whether we have notified that the process has terminated. - bool notified_termination_; - - static bool run_renderer_in_process_; - - DISALLOW_EVIL_CONSTRUCTORS(RenderProcessHost); -}; - -// Generates a unique channel name for a child renderer/plugin process. -// The "instance" pointer value is baked into the channel id. -inline std::wstring GenerateRandomChannelID(void* instance) { - // Note: the string must start with the current process id, this is how - // child processes determine the pid of the parent. - // Build the channel ID. This is composed of a unique identifier for the - // parent browser process, an identifier for the renderer/plugin instance, - // and a random component. We use a random component so that a hacked child - // process can't cause denial of service by causing future named pipe creation - // to fail. - return StringPrintf(L"%d.%x.%d", - GetCurrentProcessId(), instance, - base::RandInt(0, std::numeric_limits<int>::max())); -} - - -#endif // CHROME_BROWSER_RENDER_PROCESS_HOST_H_ - diff --git a/chrome/browser/render_view_host.cc b/chrome/browser/render_view_host.cc index 16afeb5..15bb6b4 100644 --- a/chrome/browser/render_view_host.cc +++ b/chrome/browser/render_view_host.cc @@ -14,8 +14,8 @@ #include "chrome/browser/cross_site_request_manager.h" #include "chrome/browser/debugger/debugger_wrapper.h" #include "chrome/browser/profile.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/metrics/user_metrics.h" -#include "chrome/browser/render_process_host.h" #include "chrome/browser/render_widget_host.h" #include "chrome/browser/render_widget_host_view.h" #include "chrome/browser/render_view_host_delegate.h" diff --git a/chrome/browser/render_widget_helper.cc b/chrome/browser/render_widget_helper.cc index 337f0dd..7542d27 100644 --- a/chrome/browser/render_widget_helper.cc +++ b/chrome/browser/render_widget_helper.cc @@ -6,7 +6,7 @@ #include "base/thread.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" using base::TimeDelta; diff --git a/chrome/browser/render_widget_helper.h b/chrome/browser/render_widget_helper.h index 70a09ba..fe2bf08 100644 --- a/chrome/browser/render_widget_helper.h +++ b/chrome/browser/render_widget_helper.h @@ -86,21 +86,14 @@ class RenderWidgetHelper : // UI THREAD ONLY ----------------------------------------------------------- - // Called on the UI thread to cancel any outstanding resource requests for - // the specified render widget. + // These three functions provide the backend implementation of the + // corresponding functions in RenderProcessHost. See those declarations + // for documentation. void CancelResourceRequests(int render_widget_id); - - // Called on the UI thread to simulate a ClosePage_ACK message to the - // ResourceDispatcherHost. Necessary for a cross-site request, in the case - // that the original RenderViewHost is not live and thus cannot run an - // onunload handler. void CrossSiteClosePageACK(int new_render_process_host_id, int new_request_id); - - // Called on the UI thread to wait for the next PaintRect message for the - // specified render widget. Returns true if successful, and the msg out- - // param will contain a copy of the received PaintRect message. - bool WaitForPaintMsg(int render_widget_id, const base::TimeDelta& max_delay, + bool WaitForPaintMsg(int render_widget_id, + const base::TimeDelta& max_delay, IPC::Message* msg); diff --git a/chrome/browser/render_widget_host.cc b/chrome/browser/render_widget_host.cc index 90aac3c..2823cba 100644 --- a/chrome/browser/render_widget_host.cc +++ b/chrome/browser/render_widget_host.cc @@ -7,10 +7,11 @@ #include "base/gfx/gdi_util.h" #include "base/message_loop.h" #include "chrome/app/chrome_dll_resource.h" -#include "chrome/browser/render_process_host.h" #include "chrome/browser/render_widget_helper.h" #include "chrome/browser/render_widget_host_view.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/common/mru_cache.h" +#include "chrome/common/notification_service.h" #include "chrome/common/win_util.h" #include "chrome/views/view.h" #include "webkit/glue/webcursor.h" @@ -267,7 +268,8 @@ RenderWidgetHost::BackingStoreManager::BackingStoreCache* /////////////////////////////////////////////////////////////////////////////// // RenderWidgetHost -RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, int routing_id) +RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, + int routing_id) : process_(process), routing_id_(routing_id), resize_ack_pending_(false), @@ -281,7 +283,7 @@ RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, int routing_id) view_being_painted_(false), repaint_ack_pending_(false) { if (routing_id_ == MSG_ROUTING_NONE) - routing_id_ = process_->widget_helper()->GetNextRoutingID(); + routing_id_ = process_->GetNextRoutingID(); process_->Attach(this, routing_id_); // Because the widget initializes as is_hidden_ == false, @@ -743,8 +745,7 @@ RenderWidgetHost::BackingStore* RenderWidgetHost::GetBackingStore() { if (resize_ack_pending_ || !backing_store) { IPC::Message msg; TimeDelta max_delay = TimeDelta::FromMilliseconds(kPaintMsgTimeoutMS); - if (process_->widget_helper()->WaitForPaintMsg(routing_id_, max_delay, - &msg)) { + if (process_->WaitForPaintMsg(routing_id_, max_delay, &msg)) { suppress_view_updating_ = true; ViewHostMsg_PaintRect::Dispatch( &msg, this, &RenderWidgetHost::OnMsgPaintRect); diff --git a/chrome/browser/render_widget_host_view_win.cc b/chrome/browser/render_widget_host_view_win.cc index 779d942..4fd0f18 100644 --- a/chrome/browser/render_widget_host_view_win.cc +++ b/chrome/browser/render_widget_host_view_win.cc @@ -12,7 +12,7 @@ #include "chrome/browser/browser_accessibility.h" #include "chrome/browser/browser_accessibility_manager.h" #include "chrome/browser/browser_trial.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" // TODO(beng): (Cleanup) we should not need to include this file... see comment // in |DidBecomeSelected|. #include "chrome/browser/render_view_host.h" diff --git a/chrome/browser/render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc index a0a8f8b..198d886 100644 --- a/chrome/browser/render_process_host.cc +++ b/chrome/browser/renderer_host/browser_render_process_host.cc @@ -2,13 +2,8 @@ // 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 "chrome/browser/render_process_host.h" - -#include <windows.h> -#include <wininet.h> #include <algorithm> #include <sstream> #include <vector> @@ -19,11 +14,9 @@ #include "base/logging.h" #include "base/path_service.h" #include "base/process_util.h" -#include "base/rand_util.h" #include "base/shared_memory.h" #include "base/singleton.h" #include "base/string_util.h" -#include "base/sys_info.h" #include "base/thread.h" #include "base/win_util.h" #include "chrome/app/result_codes.h" @@ -41,7 +34,6 @@ #include "chrome/browser/spellchecker.h" #include "chrome/browser/visitedlink_master.h" #include "chrome/browser/tab_contents/web_contents.h" -#include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/debug_flags.h" @@ -62,29 +54,6 @@ namespace { -unsigned int GetMaxRendererProcessCount() { - // Defines the maximum number of renderer processes according to the amount - // of installed memory as reported by the OS. The table values are calculated - // by assuming that you want the renderers to use half of the installed ram - // and assuming that each tab uses ~25MB. - static const int kMaxRenderersByRamTier[] = { - 4, // less than 256MB - 8, // 256MB - 12, // 512MB - 16, // 768MB - }; - - static unsigned int max_count = 0; - if (!max_count) { - int memory_tier = base::SysInfo::AmountOfPhysicalMemoryMB() / 256; - if (memory_tier >= arraysize(kMaxRenderersByRamTier)) - max_count = chrome::kMaxRendererProcessCount; - else - max_count = kMaxRenderersByRamTier[memory_tier]; - } - return max_count; -} - // ---------------------------------------------------------------------------- class RendererMainThread : public base::Thread { @@ -121,9 +90,6 @@ class RendererMainThread : public base::Thread { // Used for a View_ID where the renderer has not been attached yet const int32 kInvalidViewID = -1; -// the global list of all renderer processes -IDMap<RenderProcessHost> all_hosts; - // Get the path to the renderer executable, which is the same as the // current executable. bool GetRendererPath(std::wstring* cmd_line) { @@ -136,30 +102,20 @@ const wchar_t* const kDesktopName = L"ChromeRendererDesktop"; //------------------------------------------------------------------------------ -bool RenderProcessHost::run_renderer_in_process_ = false; - // static -void RenderProcessHost::RegisterPrefs(PrefService* prefs) { +void BrowserRenderProcessHost::RegisterPrefs(PrefService* prefs) { prefs->RegisterBooleanPref(prefs::kStartRenderersManually, false); } -// static -RenderProcessHost* RenderProcessHost::FromID(int render_process_id) { - return all_hosts.Lookup(render_process_id); -} - -RenderProcessHost::RenderProcessHost(Profile* profile) - : profile_(profile), - max_page_id_(-1), +BrowserRenderProcessHost::BrowserRenderProcessHost(Profile* profile) + : RenderProcessHost(profile), visible_widgets_(0), - backgrounded_(true), - notified_termination_(false) { - host_id_ = all_hosts.Add(this); - DCHECK(host_id_ >= 0); // We use a negative host_id_ in destruction. - widget_helper_ = new RenderWidgetHelper(host_id_); + backgrounded_(true) { + DCHECK(host_id() >= 0); // We use a negative host_id_ in destruction. + widget_helper_ = new RenderWidgetHelper(host_id()); - CacheManagerHost::GetInstance()->Add(host_id_); - RendererSecurityPolicy::GetInstance()->Add(host_id_); + CacheManagerHost::GetInstance()->Add(host_id()); + RendererSecurityPolicy::GetInstance()->Add(host_id()); PrefService* prefs = profile->GetPrefs(); prefs->AddPrefObserver(prefs::kBlockPopups, this); @@ -169,40 +125,31 @@ RenderProcessHost::RenderProcessHost(Profile* profile) NotificationService::current()->AddObserver(this, NOTIFY_USER_SCRIPTS_LOADED, NotificationService::AllSources()); - // Note: When we create the RenderProcessHost, it's technically backgrounded, + // 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. } -RenderProcessHost::~RenderProcessHost() { - // Some tests hold RenderProcessHost in a scoped_ptr, so we must call +BrowserRenderProcessHost::~BrowserRenderProcessHost() { + // Some tests hold BrowserRenderProcessHost in a scoped_ptr, so we must call // Unregister here as well as in response to Release(). Unregister(); // We may have some unsent messages at this point, but that's OK. channel_.reset(); - if (process_.handle() && !run_renderer_in_process_) { + if (process_.handle() && !run_renderer_in_process()) { watcher_.StopWatching(); ProcessWatcher::EnsureProcessTerminated(process_.handle()); } - profile_->GetPrefs()->RemovePrefObserver(prefs::kBlockPopups, this); + profile()->GetPrefs()->RemovePrefObserver(prefs::kBlockPopups, this); NotificationService::current()->RemoveObserver(this, NOTIFY_USER_SCRIPTS_LOADED, NotificationService::AllSources()); } -void RenderProcessHost::Unregister() { - if (host_id_ >= 0) { - CacheManagerHost::GetInstance()->Remove(host_id_); - RendererSecurityPolicy::GetInstance()->Remove(host_id_); - all_hosts.Remove(host_id_); - host_id_ = -1; - } -} - -bool RenderProcessHost::Init() { +bool BrowserRenderProcessHost::Init() { // 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()) @@ -215,10 +162,10 @@ bool RenderProcessHost::Init() { new ResourceMessageFilter(g_browser_process->resource_dispatcher_host(), PluginService::GetInstance(), g_browser_process->print_job_manager(), - host_id_, - profile_, + host_id(), + profile(), widget_helper_, - profile_->GetSpellChecker()); + profile()->GetSpellChecker()); CommandLine browser_command_line; @@ -316,7 +263,7 @@ bool RenderProcessHost::Init() { CommandLine::AppendSwitchWithValue(&cmd_line, switches::kUserDataDir, profile_path); - bool run_in_process = RenderProcessHost::run_renderer_in_process(); + bool run_in_process = run_renderer_in_process(); if (run_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 @@ -341,7 +288,7 @@ bool RenderProcessHost::Init() { std::wstring message = L"Please start a renderer process using:\n" + cmd_line; - // We don't know the owner window for RenderProcessHost and therefore we + // We don't know the owner window for BrowserRenderProcessHost and therefore we // pass a NULL HWND argument. win_util::MessageBox(NULL, message, @@ -391,7 +338,7 @@ bool RenderProcessHost::Init() { if (!AddDllEvictionPolicy(policy)) { NOTREACHED(); - return false; + return false; } result = broker_service->SpawnTarget(renderer_path.c_str(), @@ -407,7 +354,7 @@ bool RenderProcessHost::Init() { bool on_sandbox_desktop = (desktop != NULL); NotificationService::current()->Notify( - NOTIFY_RENDERER_PROCESS_IN_SBOX, Source<RenderProcessHost>(this), + NOTIFY_RENDERER_PROCESS_IN_SBOX, Source<BrowserRenderProcessHost>(this), Details<bool>(&on_sandbox_desktop)); ResumeThread(target.hThread); @@ -442,14 +389,68 @@ bool RenderProcessHost::Init() { return true; } -base::ProcessHandle RenderProcessHost::GetRendererProcessHandle() { - if (run_renderer_in_process_) +int BrowserRenderProcessHost::GetNextRoutingID() { + return widget_helper_->GetNextRoutingID(); +} + +void BrowserRenderProcessHost::CancelResourceRequests(int render_widget_id) { + widget_helper_->CancelResourceRequests(render_widget_id); +} + +void BrowserRenderProcessHost::CrossSiteClosePageACK( + int new_render_process_host_id, + int new_request_id) { + widget_helper_->CrossSiteClosePageACK(new_render_process_host_id, + new_request_id); +} + +bool BrowserRenderProcessHost::WaitForPaintMsg(int render_widget_id, + const base::TimeDelta& max_delay, + IPC::Message* msg) { + return widget_helper_->WaitForPaintMsg(render_widget_id, max_delay, msg); +} + +void BrowserRenderProcessHost::ReceivedBadMessage(uint16 msg_type) { + BadMessageTerminateProcess(msg_type, process_.handle()); +} + +void BrowserRenderProcessHost::WidgetRestored() { + // Verify we were properly backgrounded. + DCHECK(backgrounded_ == (visible_widgets_ == 0)); + visible_widgets_++; + SetBackgrounded(false); +} + +void BrowserRenderProcessHost::WidgetHidden() { + // On startup, the browser will call Hide + if (backgrounded_) + return; + + DCHECK(backgrounded_ == (visible_widgets_ == 0)); + visible_widgets_--; + DCHECK(visible_widgets_ >= 0); + if (visible_widgets_ == 0) { + DCHECK(!backgrounded_); + SetBackgrounded(true); + } +} + +void BrowserRenderProcessHost::AddWord(const std::wstring& word) { + base::Thread* io_thread = g_browser_process->io_thread(); + if (profile()->GetSpellChecker()) { + io_thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( + profile()->GetSpellChecker(), &SpellChecker::AddWord, word)); + } +} + +base::ProcessHandle BrowserRenderProcessHost::GetRendererProcessHandle() { + if (run_renderer_in_process()) return base::Process::Current().handle(); return process_.handle(); } -void RenderProcessHost::InitVisitedLinks() { - VisitedLinkMaster* visitedlink_master = profile_->GetVisitedLinkMaster(); +void BrowserRenderProcessHost::InitVisitedLinks() { + VisitedLinkMaster* visitedlink_master = profile()->GetVisitedLinkMaster(); if (!visitedlink_master) { return; } @@ -463,7 +464,7 @@ void RenderProcessHost::InitVisitedLinks() { } } -void RenderProcessHost::InitUserScripts() { +void BrowserRenderProcessHost::InitUserScripts() { CommandLine command_line; if (!command_line.HasSwitch(switches::kEnableUserScripts)) { return; @@ -475,7 +476,7 @@ void RenderProcessHost::InitUserScripts() { // - File IO should be asynchronous (see VisitedLinkMaster), but how do we // get scripts to the first renderer without blocking startup? Should we // cache some information across restarts? - UserScriptMaster* user_script_master = profile_->GetUserScriptMaster(); + UserScriptMaster* user_script_master = profile()->GetUserScriptMaster(); if (!user_script_master) { return; } @@ -489,7 +490,7 @@ void RenderProcessHost::InitUserScripts() { SendUserScriptsUpdate(user_script_master->GetSharedMemory()); } -void RenderProcessHost::SendUserScriptsUpdate( +void BrowserRenderProcessHost::SendUserScriptsUpdate( base::SharedMemory *shared_memory) { base::SharedMemoryHandle handle_for_process = NULL; shared_memory->ShareToProcess(GetRendererProcessHandle(), @@ -500,44 +501,14 @@ void RenderProcessHost::SendUserScriptsUpdate( } } -void RenderProcessHost::Attach(IPC::Channel::Listener* listener, - int routing_id) { - listeners_.AddWithID(listener, routing_id); -} - -void RenderProcessHost::Release(int listener_id) { - DCHECK(listeners_.Lookup(listener_id) != NULL); - listeners_.Remove(listener_id); - - // make sure that all associated resource requests are stopped. - widget_helper_->CancelResourceRequests(listener_id); - - // when no other owners of this object, we can delete ourselves - if (listeners_.IsEmpty()) { - if (!notified_termination_) { - bool close_expected = true; - NotificationService::current()->Notify(NOTIFY_RENDERER_PROCESS_TERMINATED, - Source<RenderProcessHost>(this), - Details<bool>(&close_expected)); - notified_termination_ = true; - } - Unregister(); - MessageLoop::current()->DeleteSoon(FROM_HERE, this); - } -} - -void RenderProcessHost::ReportExpectingClose(int32 listener_id) { - listeners_expecting_close_.insert(listener_id); -} - -bool RenderProcessHost::FastShutdownIfPossible() { +bool BrowserRenderProcessHost::FastShutdownIfPossible() { if (!process_.handle()) return false; // Render process is probably crashed. - if (RenderProcessHost::run_renderer_in_process()) + if (BrowserRenderProcessHost::run_renderer_in_process()) return false; // Since process mode can't do fast shutdown. // Test if there's an unload listener - RenderProcessHost::listeners_iterator iter; + BrowserRenderProcessHost::listeners_iterator iter; // NOTE: This is a bit dangerous. We know that for now, listeners are // always RenderWidgetHosts. But in theory, they don't have to be. for (iter = listeners_begin(); iter != listeners_end(); ++iter) { @@ -561,34 +532,19 @@ bool RenderProcessHost::FastShutdownIfPossible() { return true; } -// Static. This function can be called from the IO Thread or from the UI thread. -void RenderProcessHost::BadMessageTerminateProcess(uint16 msg_type, - HANDLE process) { - LOG(ERROR) << "bad message " << msg_type << " terminating renderer."; - if (RenderProcessHost::run_renderer_in_process()) { - // In single process mode it is better if we don't suicide but just crash. - CHECK(false); +bool BrowserRenderProcessHost::Send(IPC::Message* msg) { + if (!channel_.get()) { + delete msg; + return false; } - NOTREACHED(); - ::TerminateProcess(process, ResultCodes::KILLED_BAD_MESSAGE); -} - -void RenderProcessHost::UpdateMaxPageID(int32 page_id) { - if (page_id > max_page_id_) - max_page_id_ = page_id; -} - -void RenderProcessHost::CrossSiteClosePageACK(int new_render_process_host_id, - int new_request_id) { - widget_helper_->CrossSiteClosePageACK(new_render_process_host_id, - new_request_id); + return channel_->Send(msg); } -void RenderProcessHost::OnMessageReceived(const IPC::Message& msg) { +void BrowserRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { if (msg.routing_id() == MSG_ROUTING_CONTROL) { // dispatch control messages bool msg_is_ok = true; - IPC_BEGIN_MESSAGE_MAP_EX(RenderProcessHost, msg, msg_is_ok) + IPC_BEGIN_MESSAGE_MAP_EX(BrowserRenderProcessHost, msg, msg_is_ok) IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats, OnUpdatedCacheStats) @@ -604,7 +560,7 @@ void RenderProcessHost::OnMessageReceived(const IPC::Message& msg) { } // dispatch incoming messages to the appropriate TabContents - IPC::Channel::Listener* listener = listeners_.Lookup(msg.routing_id()); + 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 @@ -618,7 +574,7 @@ void RenderProcessHost::OnMessageReceived(const IPC::Message& msg) { listener->OnMessageReceived(msg); } -void RenderProcessHost::OnChannelConnected(int32 peer_pid) { +void BrowserRenderProcessHost::OnChannelConnected(int32 peer_pid) { // process_ is not NULL if we created the renderer process if (!process_.handle()) { if (GetCurrentProcessId() == peer_pid) { @@ -639,8 +595,20 @@ void RenderProcessHost::OnChannelConnected(int32 peer_pid) { } } +// Static. This function can be called from the IO Thread or from the UI thread. +void BrowserRenderProcessHost::BadMessageTerminateProcess(uint16 msg_type, + HANDLE process) { + LOG(ERROR) << "bad message " << msg_type << " terminating renderer."; + if (BrowserRenderProcessHost::run_renderer_in_process()) { + // In single process mode it is better if we don't suicide but just crash. + CHECK(false); + } + NOTREACHED(); + ::TerminateProcess(process, ResultCodes::KILLED_BAD_MESSAGE); +} + // indicates the renderer process has exited -void RenderProcessHost::OnObjectSignaled(HANDLE object) { +void BrowserRenderProcessHost::OnObjectSignaled(HANDLE object) { DCHECK(process_.handle()); DCHECK(channel_.get()); DCHECK_EQ(object, process_.handle()); @@ -671,16 +639,18 @@ void RenderProcessHost::OnObjectSignaled(HANDLE object) { // at this point, this object should be deleted } -// Used to send responses to resource requests -bool RenderProcessHost::Send(IPC::Message* msg) { - if (!channel_.get()) { - delete msg; - return false; +void BrowserRenderProcessHost::Unregister() { + // RenderProcessHost::Unregister will clean up the host_id_, so we must + // do our cleanup that uses that variable before we call it. + if (host_id() >= 0) { + CacheManagerHost::GetInstance()->Remove(host_id()); + RendererSecurityPolicy::GetInstance()->Remove(host_id()); } - return channel_->Send(msg); + + RenderProcessHost::Unregister(); } -void RenderProcessHost::OnPageContents(const GURL& url, +void BrowserRenderProcessHost::OnPageContents(const GURL& url, int32 page_id, const std::wstring& contents) { Profile* p = profile(); @@ -692,57 +662,12 @@ void RenderProcessHost::OnPageContents(const GURL& url, hs->SetPageContents(url, contents); } -void RenderProcessHost::OnUpdatedCacheStats( +void BrowserRenderProcessHost::OnUpdatedCacheStats( const CacheManager::UsageStats& stats) { CacheManagerHost::GetInstance()->ObserveStats(host_id(), stats); } -// static -RenderProcessHost::iterator RenderProcessHost::begin() { - return all_hosts.begin(); -} - -// static -RenderProcessHost::iterator RenderProcessHost::end() { - return all_hosts.end(); -} - -// static -size_t RenderProcessHost::size() { - return all_hosts.size(); -} - -// Returns true if the given host is suitable for launching a new view -// associated with the given profile. -// TODO(jabdelmalek): do we want to avoid processes with hung renderers -// or with a large memory consumption? -static bool IsSuitableHost(Profile* profile, RenderProcessHost* host) { - return host->profile() == profile; -} - -// static -RenderProcessHost* RenderProcessHost::GetExistingProcessHost(Profile* profile) { - // First figure out which existing renderers we can use - std::vector<RenderProcessHost*> suitable_renderers; - suitable_renderers.reserve(all_hosts.size()); - - for (IDMap<RenderProcessHost>::const_iterator iter = all_hosts.begin(); - iter != all_hosts.end(); ++iter) { - if (IsSuitableHost(profile, iter->second)) - suitable_renderers.push_back(iter->second); - } - - // Now pick a random suitable renderer, if we have any - if (!suitable_renderers.empty()) { - int suitable_count = static_cast<int>(suitable_renderers.size()); - int random_index = base::RandInt(0, suitable_count - 1); - return suitable_renderers[random_index]; - } - - return NULL; -} - -void RenderProcessHost::SetBackgrounded(bool backgrounded) { +void BrowserRenderProcessHost::SetBackgrounded(bool backgrounded) { // If the process_ is NULL, the process hasn't been created yet. if (process_.handle()) { bool rv = process_.SetProcessBackgrounded(backgrounded); @@ -772,39 +697,10 @@ void RenderProcessHost::SetBackgrounded(bool backgrounded) { backgrounded_ = backgrounded; } -void RenderProcessHost::WidgetRestored() { - // Verify we were properly backgrounded. - DCHECK(backgrounded_ == (visible_widgets_ == 0)); - visible_widgets_++; - SetBackgrounded(false); -} - -void RenderProcessHost::WidgetHidden() { - // On startup, the browser will call Hide - if (backgrounded_) - return; - - DCHECK(backgrounded_ == (visible_widgets_ == 0)); - visible_widgets_--; - DCHECK(visible_widgets_ >= 0); - if (visible_widgets_ == 0) { - DCHECK(!backgrounded_); - SetBackgrounded(true); - } -} - -void RenderProcessHost::AddWord(const std::wstring& word) { - base::Thread* io_thread = g_browser_process->io_thread(); - if (profile_->GetSpellChecker()) { - io_thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( - profile_->GetSpellChecker(), &SpellChecker::AddWord, word)); - } -} - // NotificationObserver implementation. -void RenderProcessHost::Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details) { +void BrowserRenderProcessHost::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { switch (type) { case NOTIFY_PREF_CHANGED: { std::wstring* pref_name_in = Details<std::wstring>(details).ptr(); @@ -832,19 +728,3 @@ void RenderProcessHost::Observe(NotificationType type, } } } - -// static -bool RenderProcessHost::ShouldTryToUseExistingProcessHost() { - unsigned int renderer_process_count = - static_cast<unsigned int>(all_hosts.size()); - - // NOTE: Sometimes it's necessary to create more render processes than - // GetMaxRendererProcessCount(), for instance when we want to create - // a renderer process for a profile that has no existing renderers. - // This is OK in moderation, since the GetMaxRendererProcessCount() - // is conservative. - - return run_renderer_in_process() || - (renderer_process_count >= GetMaxRendererProcessCount()); -} - diff --git a/chrome/browser/renderer_host/browser_render_process_host.h b/chrome/browser/renderer_host/browser_render_process_host.h new file mode 100644 index 0000000..2f766df --- /dev/null +++ b/chrome/browser/renderer_host/browser_render_process_host.h @@ -0,0 +1,160 @@ +// Copyright (c) 2006-2008 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_ + +#include <limits> +#include <set> +#include <vector> +#include <windows.h> + +#include "base/id_map.h" +#include "base/object_watcher.h" +#include "base/rand_util.h" +#include "base/ref_counted.h" +#include "base/scoped_handle.h" +#include "base/scoped_ptr.h" +#include "chrome/browser/renderer_host/render_process_host.h" +#include "chrome/common/notification_service.h" +#include "chrome/common/render_messages.h" + +class PrefService; +class RenderWidgetHelper; +class WebContents; + +namespace base { +class Thread; +} + +// 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 WebContents (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 base::ObjectWatcher::Delegate, + public NotificationObserver { + public: + explicit BrowserRenderProcessHost(Profile* profile); + ~BrowserRenderProcessHost(); + + // RenderProcessHost implementation (public portion). + virtual bool Init(); + virtual int GetNextRoutingID(); + virtual void CancelResourceRequests(int render_widget_id); + virtual void CrossSiteClosePageACK(int new_render_process_host_id, + int new_request_id); + virtual bool WaitForPaintMsg(int render_widget_id, + const base::TimeDelta& max_delay, + IPC::Message* msg); + virtual void ReceivedBadMessage(uint16 msg_type); + virtual void WidgetRestored(); + virtual void WidgetHidden(); + virtual void AddWord(const std::wstring& word); + virtual bool FastShutdownIfPossible(); + + // IPC::Channel::Sender via RenderProcessHost. + virtual bool Send(IPC::Message* msg); + + // IPC::Channel::Listener via RenderProcessHost. + virtual void OnMessageReceived(const IPC::Message& msg); + virtual void OnChannelConnected(int32 peer_pid); + + static void RegisterPrefs(PrefService* prefs); + + // If the a process has sent a message that cannot be decoded, it is deemed + // corrupted and thus needs to be terminated using this call. This function + // can be safely called from any thread. + static void BadMessageTerminateProcess(uint16 msg_type, HANDLE renderer); + + // ObjectWatcher::Delegate + virtual void OnObjectSignaled(HANDLE object); + + // NotificationObserver implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + private: + // RenderProcessHost implementation (protected portion). + virtual void Unregister(); + + // Control message handlers. + void OnPageContents(const GURL& url, int32 page_id, + const std::wstring& contents); + // Clipboard messages + void OnClipboardWriteHTML(const std::wstring& markup, const GURL& src_url); + void OnClipboardWriteBookmark(const std::wstring& title, const GURL& url); + void OnClipboardWriteBitmap(base::SharedMemoryHandle bitmap, gfx::Size size); + void OnClipboardIsFormatAvailable(unsigned int format, bool* result); + void OnClipboardReadText(std::wstring* result); + void OnClipboardReadAsciiText(std::string* result); + void OnClipboardReadHTML(std::wstring* markup, GURL* src_url); + void OnUpdatedCacheStats(const CacheManager::UsageStats& stats); + + // 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(); + + // Sends the renderer process a new set of user scripts. + void SendUserScriptsUpdate(base::SharedMemory* shared_memory); + + // Gets a handle to the renderer process, normalizing the case where we were + // started with --single-process. + base::ProcessHandle GetRendererProcessHandle(); + + // Callers can reduce the RenderProcess' priority. + // Returns true if the priority is backgrounded; false otherwise. + void SetBackgrounded(bool boost); + + // Used to watch the renderer process handle. + base::ObjectWatcher watcher_; + + // 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_; + + DISALLOW_COPY_AND_ASSIGN(BrowserRenderProcessHost); +}; + +// Generates a unique channel name for a child renderer/plugin process. +// The "instance" pointer value is baked into the channel id. +inline std::wstring GenerateRandomChannelID(void* instance) { + // Note: the string must start with the current process id, this is how + // child processes determine the pid of the parent. + // Build the channel ID. This is composed of a unique identifier for the + // parent browser process, an identifier for the renderer/plugin instance, + // and a random component. We use a random component so that a hacked child + // process can't cause denial of service by causing future named pipe creation + // to fail. + return StringPrintf(L"%d.%x.%d", + GetCurrentProcessId(), instance, + base::RandInt(0, std::numeric_limits<int>::max())); +} + + +#endif // CHROME_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_ + diff --git a/chrome/browser/renderer_host/render_process_host.cc b/chrome/browser/renderer_host/render_process_host.cc new file mode 100644 index 0000000..18323f4 --- /dev/null +++ b/chrome/browser/renderer_host/render_process_host.cc @@ -0,0 +1,159 @@ +// Copyright (c) 2009 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. + +#include "chrome/browser/renderer_host/render_process_host.h" + +#include "base/rand_util.h" +#include "base/sys_info.h" +#include "chrome/common/chrome_constants.h" +#include "chrome/common/notification_service.h" + +namespace { + +unsigned int GetMaxRendererProcessCount() { + // Defines the maximum number of renderer processes according to the amount + // of installed memory as reported by the OS. The table values are calculated + // by assuming that you want the renderers to use half of the installed ram + // and assuming that each tab uses ~25MB. + static const int kMaxRenderersByRamTier[] = { + 4, // less than 256MB + 8, // 256MB + 12, // 512MB + 16, // 768MB + }; + + static unsigned int max_count = 0; + if (!max_count) { + int memory_tier = base::SysInfo::AmountOfPhysicalMemoryMB() / 256; + if (memory_tier >= arraysize(kMaxRenderersByRamTier)) + max_count = chrome::kMaxRendererProcessCount; + else + max_count = kMaxRenderersByRamTier[memory_tier]; + } + return max_count; +} + +// Returns true if the given host is suitable for launching a new view +// associated with the given profile. +// TODO(jabdelmalek): do we want to avoid processes with hung renderers +// or with a large memory consumption? +static bool IsSuitableHost(Profile* profile, RenderProcessHost* host) { + return host->profile() == profile; +} + +// the global list of all renderer processes +IDMap<RenderProcessHost> all_hosts; + +} // namespace + +bool RenderProcessHost::run_renderer_in_process_ = false; + +RenderProcessHost::RenderProcessHost(Profile* profile) + : max_page_id_(-1), + notified_termination_(false), + profile_(profile) { + host_id_ = all_hosts.Add(this); +} + +RenderProcessHost::~RenderProcessHost() { +} + +void RenderProcessHost::Attach(IPC::Channel::Listener* listener, + int routing_id) { + listeners_.AddWithID(listener, routing_id); +} + +void RenderProcessHost::Release(int listener_id) { + DCHECK(listeners_.Lookup(listener_id) != NULL); + listeners_.Remove(listener_id); + + // Make sure that all associated resource requests are stopped. + CancelResourceRequests(listener_id); + + // When no other owners of this object, we can delete ourselves + if (listeners_.IsEmpty()) { + if (!notified_termination_) { + bool close_expected = true; + NotificationService::current()->Notify( + NOTIFY_RENDERER_PROCESS_TERMINATED, + Source<RenderProcessHost>(this), + Details<bool>(&close_expected)); + notified_termination_ = true; + } + Unregister(); + MessageLoop::current()->DeleteSoon(FROM_HERE, this); + } +} + +void RenderProcessHost::ReportExpectingClose(int32 listener_id) { + listeners_expecting_close_.insert(listener_id); +} + +void RenderProcessHost::UpdateMaxPageID(int32 page_id) { + if (page_id > max_page_id_) + max_page_id_ = page_id; +} + +// static +RenderProcessHost::iterator RenderProcessHost::begin() { + return all_hosts.begin(); +} + +// static +RenderProcessHost::iterator RenderProcessHost::end() { + return all_hosts.end(); +} + +// static +size_t RenderProcessHost::size() { + return all_hosts.size(); +} + +// static +RenderProcessHost* RenderProcessHost::FromID(int render_process_id) { + return all_hosts.Lookup(render_process_id); +} + +// static +bool RenderProcessHost::ShouldTryToUseExistingProcessHost() { + unsigned int renderer_process_count = + static_cast<unsigned int>(all_hosts.size()); + + // NOTE: Sometimes it's necessary to create more render processes than + // GetMaxRendererProcessCount(), for instance when we want to create + // a renderer process for a profile that has no existing renderers. + // This is OK in moderation, since the GetMaxRendererProcessCount() + // is conservative. + + return run_renderer_in_process() || + (renderer_process_count >= GetMaxRendererProcessCount()); +} + +// static +RenderProcessHost* RenderProcessHost::GetExistingProcessHost(Profile* profile) { + // First figure out which existing renderers we can use. + std::vector<RenderProcessHost*> suitable_renderers; + suitable_renderers.reserve(size()); + + for (iterator iter = begin(); iter != end(); ++iter) { + if (IsSuitableHost(profile, iter->second)) + suitable_renderers.push_back(iter->second); + } + + // Now pick a random suitable renderer, if we have any. + if (!suitable_renderers.empty()) { + int suitable_count = static_cast<int>(suitable_renderers.size()); + int random_index = base::RandInt(0, suitable_count - 1); + return suitable_renderers[random_index]; + } + + return NULL; +} + +void RenderProcessHost::Unregister() { + if (host_id_ >= 0) { + all_hosts.Remove(host_id_); + host_id_ = -1; + } +} diff --git a/chrome/browser/renderer_host/render_process_host.h b/chrome/browser/renderer_host/render_process_host.h new file mode 100644 index 0000000..46e1353 --- /dev/null +++ b/chrome/browser/renderer_host/render_process_host.h @@ -0,0 +1,203 @@ +// Copyright (c) 2009 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_RENDER_PROCESS_HOST_H_ +#define CHROME_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_H_ + +#include "base/basictypes.h" +#include "base/id_map.h" +#include "base/process.h" +#include "base/scoped_ptr.h" +#include "chrome/common/ipc_sync_channel.h" + +class Profile; + +// Virtual interface that represents the browser side of the browser <-> +// renderer communication channel. There will generally be one +// RenderProcessHost per renderer process. +// +// The concrete implementation of this class for normal use is the +// BrowserRenderProcessHost. It may also be implemented by a testing interface +// for mocking purposes. +class RenderProcessHost : public IPC::Channel::Sender, + public IPC::Channel::Listener { + public: + typedef IDMap<RenderProcessHost>::const_iterator iterator; + + RenderProcessHost(Profile* profile); + virtual ~RenderProcessHost(); + + // Returns the user profile associated with this renderer process. + Profile* profile() const { return profile_; } + + // Returns the unique identifier for this host. This can be used later in + // a call to FromID() to get back to this object (this is used to avoid + // sending non-threadsafe pointers to other threads). + int host_id() const { return host_id_; } + + // Returns the process object associated with the child process. In certain + // tests or single-process mode, this will actually represent the current + // process. + const base::Process& process() const { return process_; } + + // May return NULL if there is no connection. + IPC::SyncChannel* channel() { return channel_.get(); } + + // Used for refcounting, each holder of this object must Attach and Release + // just like it would for a COM object. This object should be allocated on + // the heap; when no listeners own it any more, it will delete itself. + void Attach(IPC::Channel::Listener* listener, int routing_id); + + // See Attach() + void Release(int listener_id); + + // Listeners should call this when they've sent a "Close" message and + // they're waiting for a "Close_ACK", so that if the renderer process + // goes away we'll know that it was intentional rather than a crash. + void ReportExpectingClose(int32 listener_id); + + // Allows iteration over this RenderProcessHost's RenderViewHost listeners. + // Use from UI thread only. + typedef IDMap<IPC::Channel::Listener>::const_iterator listeners_iterator; + listeners_iterator listeners_begin() { + return listeners_.begin(); + } + listeners_iterator listeners_end() { + return listeners_.end(); + } + + IPC::Channel::Listener* GetListenerByID(int routing_id) { + return listeners_.Lookup(routing_id); + } + + // Called to inform the render process host of a new "max page id" for a + // render view host. The render process host computes the largest page id + // across all render view hosts and uses the value when it needs to + // initialize a new renderer in place of the current one. + void UpdateMaxPageID(int32 page_id); + + // Virtual interface --------------------------------------------------------- + + // Initialize the new renderer process, returning true on success. This must + // be called once before the object can be used, but can be called after + // that with no effect. Therefore, if the caller isn't sure about whether + // the process has been created, it should just call Init(). + virtual bool Init() = 0; + + // Gets the next available routing id. + virtual int GetNextRoutingID() = 0; + + // Called on the UI thread to cancel any outstanding resource requests for + // the specified render widget. + virtual void CancelResourceRequests(int render_widget_id) = 0; + + // Called on the UI thread to simulate a ClosePage_ACK message to the + // ResourceDispatcherHost. Necessary for a cross-site request, in the case + // that the original RenderViewHost is not live and thus cannot run an + // onunload handler. + virtual void CrossSiteClosePageACK(int new_render_process_host_id, + int new_request_id) = 0; + + // Called on the UI thread to wait for the next PaintRect message for the + // specified render widget. Returns true if successful, and the msg out- + // param will contain a copy of the received PaintRect message. + virtual bool WaitForPaintMsg(int render_widget_id, + const base::TimeDelta& max_delay, + IPC::Message* msg) = 0; + + // Called when a received message cannot be decoded. + virtual void ReceivedBadMessage(uint16 msg_type) = 0; + + // Track the count of visible widgets. Called by listeners to register and + // unregister visibility. + virtual void WidgetRestored() = 0; + virtual void WidgetHidden() = 0; + + // Add a word in the spellchecker. + virtual void AddWord(const std::wstring& word) = 0; + + // Try to shutdown the associated renderer process as fast as possible. + // If this renderer has any RenderViews with unload handlers, then this + // function does nothing. The current implementation uses TerminateProcess. + // Returns True if it was able to do fast shutdown. + virtual bool FastShutdownIfPossible() = 0; + + // Static management functions ----------------------------------------------- + + // Flag to run the renderer in process. This is primarily + // for debugging purposes. When running "in process", the + // browser maintains a single RenderProcessHost which communicates + // to a RenderProcess which is instantiated in the same process + // with the Browser. All IPC between the Browser and the + // Renderer is the same, it's just not crossing a process boundary. + static bool run_renderer_in_process() { + return run_renderer_in_process_; + } + static void set_run_renderer_in_process(bool value) { + run_renderer_in_process_ = value; + } + + // Allows iteration over all the RenderProcessHosts in the browser. Note + // that each host may not be active, and therefore may have NULL channels. + // This is just a standard STL iterator, so it is not valid if the list + // of RenderProcessHosts changes between iterations. + static iterator begin(); + static iterator end(); + static size_t size(); // TODO(brettw) rename this, it's very unclear. + + // Returns the RenderProcessHost given its ID. Returns NULL if the ID does + // not correspond to a live RenderProcessHost. + static RenderProcessHost* FromID(int render_process_id); + + // Returns true if the caller should attempt to use an existing + // RenderProcessHost rather than creating a new one. + static bool ShouldTryToUseExistingProcessHost(); + + // Get an existing RenderProcessHost associated with the given profile, if + // possible. The renderer process is chosen randomly from the + // processes associated with the given profile. + // Returns NULL if no suitable renderer process is available. + static RenderProcessHost* GetExistingProcessHost(Profile* profile); + + protected: + // Unregister this object from all globals that reference it. + // This would naturally be part of the destructor, but we destruct + // asynchronously. + // + // This can be overridden by derived classes to add their own unregister code, + // but you should be sure to always call this one AT THE END of your own. + virtual void Unregister(); + + base::Process process_; + + // A proxy for our IPC::Channel that lives on the IO thread (see + // browser_process.h) + scoped_ptr<IPC::SyncChannel> channel_; + + // the registered listeners. When this list is empty or all NULL, we should + // delete ourselves + IDMap<IPC::Channel::Listener> listeners_; + + // The maximum page ID we've ever seen from the renderer process. + int32 max_page_id_; + + // Indicates whether we have notified that the process has terminated. We + // only want to send this out once. + bool notified_termination_; + + private: + int host_id_; + + Profile* profile_; + + // set of listeners that expect the renderer process to close + std::set<int> listeners_expecting_close_; + + // See getter above. + static bool run_renderer_in_process_; + + DISALLOW_COPY_AND_ASSIGN(RenderProcessHost); +}; + +#endif // CHROME_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_H_ diff --git a/chrome/browser/resource_message_filter.cc b/chrome/browser/resource_message_filter.cc index c15f4c1..5732ed9 100644 --- a/chrome/browser/resource_message_filter.cc +++ b/chrome/browser/resource_message_filter.cc @@ -14,7 +14,7 @@ #include "chrome/browser/printing/printer_query.h" #include "chrome/browser/profile.h" #include "chrome/browser/plugin_service.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/render_widget_helper.h" #include "chrome/browser/spellchecker.h" #include "chrome/common/chrome_plugin_lib.h" @@ -159,8 +159,8 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& message) { IPC_END_MESSAGE_MAP_EX() if (!msg_is_ok) { - RenderProcessHost::BadMessageTerminateProcess(message.type(), - render_handle_); + BrowserRenderProcessHost::BadMessageTerminateProcess(message.type(), + render_handle_); } return handled; diff --git a/chrome/browser/site_instance_unittest.cc b/chrome/browser/site_instance_unittest.cc index 16e6883..647a221 100644 --- a/chrome/browser/site_instance_unittest.cc +++ b/chrome/browser/site_instance_unittest.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/render_view_host.h" +#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "chrome/browser/tab_contents/navigation_entry.h" #include "chrome/browser/tab_contents/web_contents.h" #include "chrome/common/render_messages.h" @@ -175,8 +176,10 @@ TEST_F(SiteInstanceTest, UpdateMaxPageID) { TEST_F(SiteInstanceTest, GetProcess) { // Ensure that GetProcess returns the process based on its host id. scoped_ptr<TestingProfile> profile(new TestingProfile()); - scoped_ptr<RenderProcessHost> host1(new RenderProcessHost(profile.get())); - scoped_refptr<SiteInstance> instance(SiteInstance::CreateSiteInstance(profile.get())); + scoped_ptr<BrowserRenderProcessHost> host1( + new BrowserRenderProcessHost(profile.get())); + scoped_refptr<SiteInstance> instance( + SiteInstance::CreateSiteInstance(profile.get())); instance.get()->set_process_host_id(host1.get()->host_id()); EXPECT_EQ(host1.get(), instance.get()->GetProcess()); diff --git a/chrome/browser/tab_contents/navigation_entry.h b/chrome/browser/tab_contents/navigation_entry.h index 3ffbfdb..7e6b1f3 100644 --- a/chrome/browser/tab_contents/navigation_entry.h +++ b/chrome/browser/tab_contents/navigation_entry.h @@ -7,6 +7,7 @@ #include "base/basictypes.h" #include "base/scoped_ptr.h" +#include "base/string_util.h" #include "chrome/app/theme/theme_resources.h" #include "chrome/browser/security_style.h" #include "chrome/browser/tab_contents/site_instance.h" diff --git a/chrome/browser/tab_contents/site_instance.cc b/chrome/browser/tab_contents/site_instance.cc index a303f85..71a171e 100644 --- a/chrome/browser/tab_contents/site_instance.cc +++ b/chrome/browser/tab_contents/site_instance.cc @@ -4,6 +4,7 @@ #include "chrome/browser/tab_contents/site_instance.h" +#include "chrome/browser/renderer_host/browser_render_process_host.h" #include "net/base/registry_controlled_domain.h" SiteInstance::~SiteInstance() { @@ -28,7 +29,7 @@ RenderProcessHost* SiteInstance::GetProcess() { // Otherwise (or if that fails), create a new one. if (!process) - process = new RenderProcessHost(browsing_instance_->profile()); + process = new BrowserRenderProcessHost(browsing_instance_->profile()); // Update our host ID, so all pages in this SiteInstance will use // the correct process. diff --git a/chrome/browser/tab_contents/site_instance.h b/chrome/browser/tab_contents/site_instance.h index 6759fe3..b0aa3ed 100644 --- a/chrome/browser/tab_contents/site_instance.h +++ b/chrome/browser/tab_contents/site_instance.h @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_SITE_INSTANCE_H__ -#define CHROME_BROWSER_SITE_INSTANCE_H__ +#ifndef CHROME_BROWSER_SITE_INSTANCE_H_ +#define CHROME_BROWSER_SITE_INSTANCE_H_ #include "chrome/browser/browsing_instance.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "googleurl/src/gurl.h" /////////////////////////////////////////////////////////////////////////////// @@ -152,5 +152,4 @@ class SiteInstance : public base::RefCounted<SiteInstance> { DISALLOW_EVIL_CONSTRUCTORS(SiteInstance); }; -#endif // CHROME_BROWSER_SITE_INSTANCE_H__ - +#endif // CHROME_BROWSER_SITE_INSTANCE_H_ diff --git a/chrome/browser/tab_contents/tab_contents_factory.cc b/chrome/browser/tab_contents/tab_contents_factory.cc index 5151555..9a8aefe 100644 --- a/chrome/browser/tab_contents/tab_contents_factory.cc +++ b/chrome/browser/tab_contents/tab_contents_factory.cc @@ -9,7 +9,7 @@ #include "chrome/browser/dom_ui/html_dialog_contents.h" #include "chrome/browser/dom_ui/new_tab_ui.h" #include "chrome/browser/profile.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/debugger/debugger_contents.h" #include "chrome/browser/tab_contents/about_internets_status_view.h" #include "chrome/browser/tab_contents/ipc_status_view.h" diff --git a/chrome/browser/tab_contents/tab_util.cc b/chrome/browser/tab_contents/tab_util.cc index a1a2f4e..8cea595 100644 --- a/chrome/browser/tab_contents/tab_util.cc +++ b/chrome/browser/tab_contents/tab_util.cc @@ -5,7 +5,7 @@ #include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/render_view_host.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/tab_contents/web_contents.h" #include "net/url_request/url_request.h" diff --git a/chrome/browser/task_manager.cc b/chrome/browser/task_manager.cc index 31c28ca..878c734 100644 --- a/chrome/browser/task_manager.cc +++ b/chrome/browser/task_manager.cc @@ -10,7 +10,7 @@ #include "chrome/app/theme/theme_resources.h" #include "chrome/browser/browser_list.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/task_manager_resource_providers.h" #include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/views/standard_layout.h" diff --git a/chrome/browser/task_manager_resource_providers.cc b/chrome/browser/task_manager_resource_providers.cc index be0ed1f..50b55ac 100644 --- a/chrome/browser/task_manager_resource_providers.cc +++ b/chrome/browser/task_manager_resource_providers.cc @@ -14,7 +14,7 @@ #include "chrome/browser/browser_list.h" #include "chrome/browser/plugin_process_host.h" #include "chrome/browser/plugin_service.h" -#include "chrome/browser/render_process_host.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/resource_message_filter.h" #include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/tab_contents/web_contents.h" diff --git a/chrome/test/testing_profile.h b/chrome/test/testing_profile.h index 2d622a7..76fa86f 100644 --- a/chrome/test/testing_profile.h +++ b/chrome/test/testing_profile.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_TEST_TESTING_PROFILE_H__ -#define CHROME_TEST_TESTING_PROFILE_H__ +#ifndef CHROME_TEST_TESTING_PROFILE_H_ +#define CHROME_TEST_TESTING_PROFILE_H_ #include "base/base_paths.h" #include "base/path_service.h" @@ -207,4 +207,4 @@ class TestingProfile : public Profile { bool last_session_exited_cleanly_; }; -#endif // CHROME_TEST_TESTING_PROFILE_H__ +#endif // CHROME_TEST_TESTING_PROFILE_H_ |