From 867125a08f77a22b770f197d90519a8672af83aa Mon Sep 17 00:00:00 2001 From: "suzhe@chromium.org" Date: Thu, 10 Dec 2009 06:01:48 +0000 Subject: Refactor the keyboard events handling code related to RenderViewHostDelegate::View and TabContentsDelegate interfaces. Significant changes made by this CL: 1. The keyboard event handling code has been moved from TabContentsView implementation classes into BrowserWindow implementation classes. Please refer to this discussion thread: http://groups.google.com/group/chromium-dev/browse_thread/thread/e6e0b5cc105659b7/9953c4308bb0000c This change makes the keyboard event flow comply with the relationship between TabContents/TabContentsView and TabContentsDelegate/BrowserWindow. Besides it, the code is also simplified a lot, for example, the keyboard event handling code in chrome/browser/views/tab_contents/tab_contents_view_{gtk,win}.cc are now merged into one copy and moved into chrome/browser/views/frame/browser_view.cc. 2. A pre-handle phrase has been added into the keyboard event handling flow. A keyboard event will be first sent to the browser for pre-handling before being sent to the renderer. Then if the event was not handled by the renderer, it'll be sent to the browser again for post-handling. 3. The keyboard accelerator handling code of Windows and Linux ports have been optimized to get rid off extra command lookup. 4. The keyboard event message flow between the browser and the renderer is changed back to full async mode, all complex logics introduced by revision 29857 are removed. BUG=24479, 26054, 26131, 28839 TEST=See bug reports. Review URL: http://codereview.chromium.org/400012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34234 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/renderer/render_widget.cc | 26 ++++++++++++++++++++------ chrome/renderer/render_widget.h | 3 +++ 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'chrome/renderer') diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index fd60468..14c7a7d 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -67,7 +67,8 @@ RenderWidget::RenderWidget(RenderThreadBase* render_thread, bool activatable) ime_control_updated_(false), ime_control_busy_(false), activatable_(activatable), - pending_window_rect_count_(0) { + pending_window_rect_count_(0), + suppress_next_char_events_(false) { RenderProcess::current()->AddRefProcess(); DCHECK(render_thread_); } @@ -304,9 +305,24 @@ void RenderWidget::OnHandleInputEvent(const IPC::Message& message) { const WebInputEvent* input_event = reinterpret_cast(data); + + bool is_keyboard_shortcut = false; + // is_keyboard_shortcut flag is only available for RawKeyDown events. + if (input_event->type == WebInputEvent::RawKeyDown) + message.ReadBool(&iter, &is_keyboard_shortcut); + bool processed = false; - if (webwidget_) - processed = webwidget_->handleInputEvent(*input_event); + if (input_event->type != WebInputEvent::Char || !suppress_next_char_events_) { + suppress_next_char_events_ = false; + if (webwidget_) + processed = webwidget_->handleInputEvent(*input_event); + } + + // If this RawKeyDown event corresponds to a browser keyboard shortcut and + // it's not processed by webkit, then we need to suppress the upcoming Char + // events. + if (!processed && is_keyboard_shortcut) + suppress_next_char_events_ = true; IPC::Message* response = new ViewHostMsg_HandleInputEvent_ACK(routing_id_); response->WriteInt(input_event->type); @@ -323,9 +339,7 @@ void RenderWidget::OnHandleInputEvent(const IPC::Message& message) { handling_input_event_ = false; - WebInputEvent::Type type = input_event->type; - if (type == WebInputEvent::RawKeyDown || type == WebInputEvent::KeyDown || - type == WebInputEvent::KeyUp || type == WebInputEvent::Char) + if (WebInputEvent::isKeyboardEventType(input_event->type)) DidHandleKeyEvent(); } diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h index 0dcc98a..c25c99a 100644 --- a/chrome/renderer/render_widget.h +++ b/chrome/renderer/render_widget.h @@ -316,6 +316,9 @@ class RenderWidget : public IPC::Channel::Listener, scoped_ptr pending_input_event_ack_; + // Indicates if the next sequence of Char events should be suppressed or not. + bool suppress_next_char_events_; + DISALLOW_COPY_AND_ASSIGN(RenderWidget); }; -- cgit v1.1