diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-04 21:49:41 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-04 21:49:41 +0000 |
commit | c379611739df5789ccd5e578c7281ecf5a517d2c (patch) | |
tree | 4b0bdfe876690029447ba305f121540839b18876 /chrome | |
parent | 83337270c01c66378d443f5c3d15926cac164747 (diff) | |
download | chromium_src-c379611739df5789ccd5e578c7281ecf5a517d2c.zip chromium_src-c379611739df5789ccd5e578c7281ecf5a517d2c.tar.gz chromium_src-c379611739df5789ccd5e578c7281ecf5a517d2c.tar.bz2 |
Disable input events when a JS dialog is showing.
Prior to this patch, you could still send input events and they
would get queued in the renderer to be handled after the JS
dialog was dismissed. This makes our behavior more like other
browsers.
This also works around a linux/mac bug where the hung renderer dialog would appear when an alert is showing.
BUG=12176
Review URL: http://codereview.chromium.org/160494
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@22415 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
4 files changed, 31 insertions, 1 deletions
diff --git a/chrome/browser/renderer_host/render_process_host.cc b/chrome/browser/renderer_host/render_process_host.cc index dc1f8b1..090ed91 100644 --- a/chrome/browser/renderer_host/render_process_host.cc +++ b/chrome/browser/renderer_host/render_process_host.cc @@ -84,7 +84,8 @@ RenderProcessHost::RenderProcessHost(Profile* profile) : max_page_id_(-1), pid_(-1), profile_(profile), - sudden_termination_allowed_(true) { + sudden_termination_allowed_(true), + ignore_input_events_(false) { all_hosts.set_check_on_null_data(true); } diff --git a/chrome/browser/renderer_host/render_process_host.h b/chrome/browser/renderer_host/render_process_host.h index c091e85..ec5d198 100644 --- a/chrome/browser/renderer_host/render_process_host.h +++ b/chrome/browser/renderer_host/render_process_host.h @@ -100,6 +100,13 @@ class RenderProcessHost : public IPC::Channel::Sender, // initialize a new renderer in place of the current one. void UpdateMaxPageID(int32 page_id); + void set_ignore_input_events(bool ignore_input_events) { + ignore_input_events_ = ignore_input_events; + } + bool ignore_input_events() { + return ignore_input_events_; + } + // Virtual interface --------------------------------------------------------- // Initialize the new renderer process, returning true on success. This must @@ -242,6 +249,10 @@ class RenderProcessHost : public IPC::Channel::Sender, // doesn't. bool sudden_termination_allowed_; + // Set to true if we shouldn't send input events. We actually do the + // filtering for this at the render widget level. + bool ignore_input_events_; + // See getter above. static bool run_renderer_in_process_; diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 2bbedce..ae1f1c8 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -561,6 +561,7 @@ void RenderViewHost::CaptureThumbnail() { void RenderViewHost::JavaScriptMessageBoxClosed(IPC::Message* reply_msg, bool success, const std::wstring& prompt) { + process()->set_ignore_input_events(false); if (is_waiting_for_unload_ack_) { if (are_javascript_messages_suppressed_) { delegate_->RendererUnresponsive(this, is_waiting_for_unload_ack_); @@ -1266,6 +1267,9 @@ void RenderViewHost::OnMsgRunJavaScriptMessage( const GURL& frame_url, const int flags, IPC::Message* reply_msg) { + // While a JS message dialog is showing, tabs in the same process shouldn't + // process input events. + process()->set_ignore_input_events(true); StopHangMonitorTimeout(); SignalModalDialogEvent(); delegate_->RunJavaScriptMessage(message, default_prompt, frame_url, flags, @@ -1276,6 +1280,9 @@ void RenderViewHost::OnMsgRunJavaScriptMessage( void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const GURL& frame_url, const std::wstring& message, IPC::Message* reply_msg) { + // While a JS before unload dialog is showing, tabs in the same process + // shouldn't process input events. + process()->set_ignore_input_events(true); StopHangMonitorTimeout(); SignalModalDialogEvent(); delegate_->RunBeforeUnloadConfirm(message, reply_msg); diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc index 8328d60..996f63f 100644 --- a/chrome/browser/renderer_host/render_widget_host.cc +++ b/chrome/browser/renderer_host/render_widget_host.cc @@ -345,6 +345,9 @@ void RenderWidgetHost::SystemThemeChanged() { } void RenderWidgetHost::ForwardMouseEvent(const WebMouseEvent& mouse_event) { + if (process_->ignore_input_events()) + return; + // Avoid spamming the renderer with mouse move events. It is important // to note that WM_MOUSEMOVE events are anyways synthetic, but since our // thread is able to rapidly consume WM_MOUSEMOVE events, we may get way @@ -364,11 +367,17 @@ void RenderWidgetHost::ForwardMouseEvent(const WebMouseEvent& mouse_event) { void RenderWidgetHost::ForwardWheelEvent( const WebMouseWheelEvent& wheel_event) { + if (process_->ignore_input_events()) + return; + ForwardInputEvent(wheel_event, sizeof(WebMouseWheelEvent)); } void RenderWidgetHost::ForwardKeyboardEvent( const NativeWebKeyboardEvent& key_event) { + if (process_->ignore_input_events()) + return; + if (key_event.type == WebKeyboardEvent::Char && (key_event.windowsKeyCode == base::VKEY_RETURN || key_event.windowsKeyCode == base::VKEY_SPACE)) { @@ -398,6 +407,8 @@ void RenderWidgetHost::ForwardInputEvent(const WebInputEvent& input_event, if (!process_->HasConnection()) return; + DCHECK(!process_->ignore_input_events()); + IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); message->WriteData( reinterpret_cast<const char*>(&input_event), event_size); |