summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/renderer_host/render_process_host.cc3
-rw-r--r--chrome/browser/renderer_host/render_process_host.h11
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc7
-rw-r--r--chrome/browser/renderer_host/render_widget_host.cc11
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);