Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: chrome/browser/renderer_host/render_widget_host.h

Issue 235039: Fix conflicts between accelerator keys and HTML DOM accesskeys.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/renderer_host/render_widget_host.h
===================================================================
--- chrome/browser/renderer_host/render_widget_host.h (revision 29767)
+++ chrome/browser/renderer_host/render_widget_host.h (working copy)
@@ -5,7 +5,7 @@
#ifndef CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_
#define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_
-#include <queue>
+#include <deque>
#include "app/gfx/native_widget_types.h"
#include "base/process.h"
@@ -365,7 +365,10 @@
// Called when we an InputEvent was not processed by the renderer. This is
// overridden by RenderView to send upwards to its delegate.
- virtual void UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event) {}
+ // Returns true if the event was handled by its delegate.
+ virtual bool UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event) {
+ return false;
+ }
// Notification that the user has made some kind of input that could
// perform an action. The render view host overrides this to forward the
@@ -528,11 +531,12 @@
base::TimeTicks repaint_start_time_;
// Queue of keyboard events that we need to track.
- typedef std::queue<NativeWebKeyboardEvent> KeyQueue;
+ typedef std::deque<NativeWebKeyboardEvent> KeyQueue;
// A queue of keyboard events. We can't trust data from the renderer so we
// stuff key events into a queue and pop them out on ACK, feeding our copy
// back to whatever unhandled handler instead of the returned version.
+ // See the description of |pending_key_events_| below for more details.
KeyQueue key_queue_;
// Set when we update the text direction of the selected input element.
@@ -544,6 +548,42 @@
// NotifyTextDirection().
bool text_direction_canceled_;
+ // How many key events in |key_queue_| are not sent to the renderer yet,
+ // counted from the back of |key_queue_|.
+ // In order to suppress a Char event when necessary (see the description of
+ // |suppress_next_char_events_| below), we can't just send it to the
+ // renderer as soon as we get it. Instead, we need wait for the result of
+ // preceding RawKeyDown event back from the renderer, and then decide how to
+ // process the pending Char events according to the result.
+ // So if we get one or more Char events before receiving the result of
+ // preceding RawKeyDown event, we need keep them in |key_queue_|. And in
+ // order to keep the order the key events, all following key events must be
+ // pending until the pending Char events got processed.
+ size_t pending_key_events_;
+
+ // Indicates if the next sequence of Char events should be suppressed or not.
+ // System may translate a RawKeyDown event into zero or more Char events,
+ // usually we send them to the renderer directly in sequence. However, If a
+ // RawKeyDown event was not handled by the renderer but was handled by
+ // our UnhandledKeyboardEvent() method, eg. as an accelerator key, then we
+ // shall not send the following sequence of Char events, which was generated
+ // by this RawKeyDown event, to the renderer. Otherwise the renderer may
+ // handle the Char events and cause unexpected behavior.
+ // For example, pressing alt-2 may let the browser switch to the second tab,
+ // but the Char event generated by alt-2 may also activate a HTML element
+ // if its accesskey happens to be "2", then the user may get confused when
+ // switching back to the original tab, because the content may already be
+ // changed.
+ bool suppress_next_char_events_;
+
+ // During the call to some methods, eg. OnMsgInputEventAck, this
+ // RenderWidgetHost object may be destroyed before executing some code that
+ // still want to access this object. To avoid this situation, |death_flag_|
+ // shall be pointed to a local variable in the method, and then |*death_flag_|
+ // will be set to true when destroying this RenderWidgetHost object, then the
+ // method shall exit immediately when |*death_flag_| becomes true.
+ bool* death_flag_;
+
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHost);
};

Powered by Google App Engine
This is Rietveld 408576698