diff options
Diffstat (limited to 'chrome/browser')
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); |