diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-26 20:52:26 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-26 20:52:26 +0000 |
commit | caea7cada9bdb9b025173d662ec6b1a85a0a1ce2 (patch) | |
tree | 19684bafa16e0163e1ec78a8ec1bbddfe785d428 /chrome/browser | |
parent | e1f934b58c6dc45ffd426f71346795f835d7013c (diff) | |
download | chromium_src-caea7cada9bdb9b025173d662ec6b1a85a0a1ce2.zip chromium_src-caea7cada9bdb9b025173d662ec6b1a85a0a1ce2.tar.gz chromium_src-caea7cada9bdb9b025173d662ec6b1a85a0a1ce2.tar.bz2 |
Make RenderWidgetHelper portable.
Review URL: http://codereview.chromium.org/18802
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8660 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/renderer_host/render_widget_helper.cc | 47 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_helper.h | 14 | ||||
-rw-r--r-- | chrome/browser/resource_message_filter.cc | 7 |
3 files changed, 43 insertions, 25 deletions
diff --git a/chrome/browser/renderer_host/render_widget_helper.cc b/chrome/browser/renderer_host/render_widget_helper.cc index 8d85d92..d92ff301 100644 --- a/chrome/browser/renderer_host/render_widget_helper.cc +++ b/chrome/browser/renderer_host/render_widget_helper.cc @@ -9,14 +9,11 @@ #include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" -using base::TimeDelta; -using base::TimeTicks; - // A Task used with InvokeLater that we hold a pointer to in pending_paints_. // Instances are deleted by MessageLoop after it calls their Run method. class RenderWidgetHelper::PaintMsgProxy : public Task { public: - explicit PaintMsgProxy(RenderWidgetHelper* h, const IPC::Message& m) + PaintMsgProxy(RenderWidgetHelper* h, const IPC::Message& m) : helper(h), message(m), cancelled(false) { @@ -40,7 +37,7 @@ class RenderWidgetHelper::PaintMsgProxy : public Task { IPC::Message message; bool cancelled; // If true, then the message will not be dispatched. - DISALLOW_EVIL_CONSTRUCTORS(PaintMsgProxy); + DISALLOW_COPY_AND_ASSIGN(PaintMsgProxy); }; RenderWidgetHelper::RenderWidgetHelper(int render_process_id) @@ -54,8 +51,6 @@ RenderWidgetHelper::~RenderWidgetHelper() { // The elements of pending_paints_ each hold an owning reference back to this // object, so we should not be destroyed unless pending_paints_ is empty! DCHECK(pending_paints_.empty()); - - CloseHandle(event_); } int RenderWidgetHelper::GetNextRoutingID() { @@ -63,29 +58,31 @@ int RenderWidgetHelper::GetNextRoutingID() { } void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { - if (g_browser_process->io_thread()) + if (g_browser_process->io_thread()) { g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(this, &RenderWidgetHelper::OnCancelResourceRequests, g_browser_process->resource_dispatcher_host(), render_widget_id)); + } } void RenderWidgetHelper::CrossSiteClosePageACK(int new_render_process_host_id, int new_request_id) { - if (g_browser_process->io_thread()) + if (g_browser_process->io_thread()) { g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(this, &RenderWidgetHelper::OnCrossSiteClosePageACK, g_browser_process->resource_dispatcher_host(), new_render_process_host_id, new_request_id)); + } } bool RenderWidgetHelper::WaitForPaintMsg(int render_widget_id, - const TimeDelta& max_delay, + const base::TimeDelta& max_delay, IPC::Message* msg) { - TimeTicks time_start = TimeTicks::Now(); + base::TimeTicks time_start = base::TimeTicks::Now(); for (;;) { PaintMsgProxy* proxy = NULL; @@ -111,13 +108,12 @@ bool RenderWidgetHelper::WaitForPaintMsg(int render_widget_id, } // Calculate the maximum amount of time that we are willing to sleep. - TimeDelta max_sleep_time = - max_delay - (TimeTicks::Now() - time_start); - if (max_sleep_time <= TimeDelta::FromMilliseconds(0)) + base::TimeDelta max_sleep_time = + max_delay - (base::TimeTicks::Now() - time_start); + if (max_sleep_time <= base::TimeDelta::FromMilliseconds(0)) break; - WaitForSingleObject(event_, - static_cast<DWORD>(max_sleep_time.InMilliseconds())); + event_.TimedWait(max_sleep_time); } return false; @@ -147,7 +143,7 @@ void RenderWidgetHelper::DidReceivePaintMsg(const IPC::Message& msg) { // Notify anyone waiting on the UI thread that there is a new entry in the // proxy map. If they don't find the entry they are looking for, then they // will just continue waiting. - SetEvent(event_); + event_.Signal(); // The proxy will be deleted when it is run as a task. ui_loop_->PostTask(FROM_HERE, proxy); @@ -192,9 +188,13 @@ void RenderWidgetHelper::OnCrossSiteClosePageACK( void RenderWidgetHelper::CreateNewWindow(int opener_id, bool user_gesture, - int* route_id, - HANDLE* modal_dialog_event, - HANDLE render_process) { + base::ProcessHandle render_process, + int* route_id +#if defined(OS_WIN) + , HANDLE* modal_dialog_event) { +#else + ) { +#endif if (!user_gesture && block_popups_) { *route_id = MSG_ROUTING_NONE; *modal_dialog_event = NULL; @@ -202,6 +202,8 @@ void RenderWidgetHelper::CreateNewWindow(int opener_id, } *route_id = GetNextRoutingID(); + +#if defined(OS_WIN) HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL); BOOL result = DuplicateHandle(GetCurrentProcess(), event, @@ -214,6 +216,11 @@ void RenderWidgetHelper::CreateNewWindow(int opener_id, // The easiest way to reach RenderViewHost is just to send a routed message. ViewHostMsg_CreateWindowWithRoute msg(opener_id, *route_id, event); +#else + // TODO(port) figure out how the modal dialog event should work. + ViewHostMsg_CreateWindowWithRoute msg(opener_id, *route_id); +#endif + ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); } diff --git a/chrome/browser/renderer_host/render_widget_helper.h b/chrome/browser/renderer_host/render_widget_helper.h index aca3644..b73ce03 100644 --- a/chrome/browser/renderer_host/render_widget_helper.h +++ b/chrome/browser/renderer_host/render_widget_helper.h @@ -8,8 +8,10 @@ #include "base/atomic_sequence_num.h" #include "base/hash_tables.h" +#include "base/process.h" #include "base/ref_counted.h" #include "base/lock.h" +#include "base/waitable_event.h" namespace IPC { class Message; @@ -104,8 +106,14 @@ class RenderWidgetHelper : MessageLoop* ui_loop() { return ui_loop_; } - void CreateNewWindow(int opener_id, bool user_gesture, int* route_id, - HANDLE* modal_dialog_event, HANDLE render_process); + void CreateNewWindow(int opener_id, + bool user_gesture, + base::ProcessHandle render_process, + int* route_id +#if defined(OS_WIN) + , HANDLE* modal_dialog_event +#endif + ); void CreateNewWidget(int opener_id, bool activatable, int* route_id); private: @@ -145,7 +153,7 @@ class RenderWidgetHelper : MessageLoop* ui_loop_; // Event used to implement WaitForPaintMsg. - HANDLE event_; + base::WaitableEvent event_; // The next routing id to use. base::AtomicSequenceNumber next_routing_id_; diff --git a/chrome/browser/resource_message_filter.cc b/chrome/browser/resource_message_filter.cc index 8dfb47a..e97c46c 100644 --- a/chrome/browser/resource_message_filter.cc +++ b/chrome/browser/resource_message_filter.cc @@ -248,8 +248,11 @@ void ResourceMessageFilter::OnMsgCreateWindow(int opener_id, bool user_gesture, int* route_id, HANDLE* modal_dialog_event) { - render_widget_helper_->CreateNewWindow(opener_id, user_gesture, route_id, - modal_dialog_event, render_handle_); + render_widget_helper_->CreateNewWindow(opener_id, + user_gesture, + render_handle_, + route_id, + modal_dialog_event); } void ResourceMessageFilter::OnMsgCreateWidget(int opener_id, |