- Add new call to OnKeyEvent() to allow handling of keyboard events before they're passed to the renderer (issue #406).

- Windows: only scroll with middle mouse button when the cursor is over the view (issue #410).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@356 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt
2011-11-04 18:19:14 +00:00
parent 6d8e46fb63
commit 058e9ef2f2
17 changed files with 166 additions and 84 deletions

View File

@ -1393,21 +1393,26 @@ public:
typedef cef_handler_keyevent_type_t KeyEventType; typedef cef_handler_keyevent_type_t KeyEventType;
/// ///
// Called when the browser component receives a keyboard event that has not // Called when the browser component receives a keyboard event. This method
// been intercepted via JavaScript. |type| is the type of keyboard event, // is called both before the event is passed to the renderer and after
// |code| is the windows scan-code for the event, |modifiers| is a set of bit- // JavaScript in the page has had a chance to handle the event. |type| is the
// flags describing any pressed modifier keys and |isSystemKey| is true if // type of keyboard event, |code| is the windows scan-code for the event,
// Windows considers this a 'system key' message (see // |modifiers| is a set of bit- flags describing any pressed modifier keys and
// http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx). Return // |isSystemKey| is true if Windows considers this a 'system key' message (see
// true if the keyboard event was handled or false to allow the browser // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx). If
// component to handle the event. // |isAfterJavaScript| is true then JavaScript in the page has had a chance
// to handle the event and has chosen not to. Only RAWKEYDOWN, KEYDOWN and
// CHAR events will be sent with |isAfterJavaScript| set to true. Return
// true if the keyboard event was handled or false to allow continued handling
// of the event by the renderer.
/// ///
/*--cef()--*/ /*--cef()--*/
virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser, virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser,
KeyEventType type, KeyEventType type,
int code, int code,
int modifiers, int modifiers,
bool isSystemKey) { return false; } bool isSystemKey,
bool isAfterJavaScript) { return false; }
}; };

View File

@ -1196,18 +1196,22 @@ typedef struct _cef_keyboard_handler_t
cef_base_t base; cef_base_t base;
/// ///
// Called when the browser component receives a keyboard event that has not // Called when the browser component receives a keyboard event. This function
// been intercepted via JavaScript. |type| is the type of keyboard event, // is called both before the event is passed to the renderer and after
// |code| is the windows scan-code for the event, |modifiers| is a set of bit- // JavaScript in the page has had a chance to handle the event. |type| is the
// flags describing any pressed modifier keys and |isSystemKey| is true (1) if // type of keyboard event, |code| is the windows scan-code for the event,
// Windows considers this a 'system key' message (see // |modifiers| is a set of bit- flags describing any pressed modifier keys and
// http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx). Return true // |isSystemKey| is true (1) if Windows considers this a 'system key' message
// (1) if the keyboard event was handled or false (0) to allow the browser // (see http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx). If
// component to handle the event. // |isAfterJavaScript| is true (1) then JavaScript in the page has had a
// chance to handle the event and has chosen not to. Only RAWKEYDOWN, KEYDOWN
// and CHAR events will be sent with |isAfterJavaScript| set to true (1).
// Return true (1) if the keyboard event was handled or false (0) to allow
// continued handling of the event by the renderer.
/// ///
int (CEF_CALLBACK *on_key_event)(struct _cef_keyboard_handler_t* self, int (CEF_CALLBACK *on_key_event)(struct _cef_keyboard_handler_t* self,
struct _cef_browser_t* browser, enum cef_handler_keyevent_type_t type, struct _cef_browser_t* browser, enum cef_handler_keyevent_type_t type,
int code, int modifiers, int isSystemKey); int code, int modifiers, int isSystemKey, int isAfterJavaScript);
} cef_keyboard_handler_t; } cef_keyboard_handler_t;

View File

@ -268,40 +268,8 @@ bool BrowserWebViewDelegate::isSelectTrailingWhitespaceEnabled() {
} }
bool BrowserWebViewDelegate::handleCurrentKeyboardEvent() { bool BrowserWebViewDelegate::handleCurrentKeyboardEvent() {
bool handled = false; WebWidgetHost* host = GetWidgetHost();
if (host && OnKeyboardEvent(host->GetLastKeyEvent(), true))
CefRefPtr<CefClient> client = browser_->GetClient();
CefRefPtr<CefKeyboardHandler> handler;
if (client.get())
handler = client->GetKeyboardHandler();
if (handler.get()) {
WebWidgetHost* host = GetWidgetHost();
if (host) {
WebKeyboardEvent event = host->GetLastKeyEvent();
switch (event.type)
{
case WebKeyboardEvent::RawKeyDown:
handled = handler->OnKeyEvent(browser_,
KEYEVENT_RAWKEYDOWN, event.windowsKeyCode,
event.modifiers, event.isSystemKey?true:false);
break;
case WebKeyboardEvent::KeyUp:
handled = handler->OnKeyEvent(browser_,
KEYEVENT_KEYUP, event.windowsKeyCode,
event.modifiers, event.isSystemKey?true:false);
break;
case WebKeyboardEvent::Char:
handled = handler->OnKeyEvent(browser_,
KEYEVENT_CHAR, event.windowsKeyCode,
event.modifiers, event.isSystemKey?true:false);
break;
default:
break;
}
}
}
if (handled)
return true; return true;
if (edit_command_name_.empty()) if (edit_command_name_.empty())
@ -1039,6 +1007,38 @@ void BrowserWebViewDelegate::WaitForPolicyDelegate() {
// Private methods ----------------------------------------------------------- // Private methods -----------------------------------------------------------
bool BrowserWebViewDelegate::OnKeyboardEvent(
const WebKit::WebKeyboardEvent& event, bool isAfterJavaScript)
{
CefRefPtr<CefClient> client = browser_->GetClient();
CefRefPtr<CefKeyboardHandler> handler;
if (client.get())
handler = client->GetKeyboardHandler();
if (!handler.get())
return false;
CefKeyboardHandler::KeyEventType eventType;
switch (event.type) {
case WebKeyboardEvent::RawKeyDown:
eventType = KEYEVENT_RAWKEYDOWN;
break;
case WebKeyboardEvent::KeyDown:
eventType = KEYEVENT_KEYDOWN;
break;
case WebKeyboardEvent::KeyUp:
eventType = KEYEVENT_KEYUP;
break;
case WebKeyboardEvent::Char:
eventType = KEYEVENT_CHAR;
break;
default:
return false;
}
return handler->OnKeyEvent(browser_, eventType, event.windowsKeyCode,
event.modifiers, event.isSystemKey?true:false, isAfterJavaScript);
}
void BrowserWebViewDelegate::ShowStatus(const WebString& text, void BrowserWebViewDelegate::ShowStatus(const WebString& text,
cef_handler_statustype_t type) cef_handler_statustype_t type)
{ {

View File

@ -263,6 +263,9 @@ class BrowserWebViewDelegate : public WebKit::WebViewClient,
void HandleContextMenu(int selected_id); void HandleContextMenu(int selected_id);
#endif #endif
bool OnKeyboardEvent(const WebKit::WebKeyboardEvent& event,
bool isAfterJavaScript);
protected: protected:
// Default handling of JavaScript messages. // Default handling of JavaScript messages.
void ShowJavaScriptAlert(WebKit::WebFrame* webframe, void ShowJavaScriptAlert(WebKit::WebFrame* webframe,

View File

@ -4,7 +4,8 @@
#include "webview_host.h" #include "webview_host.h"
WebViewHost::WebViewHost() WebViewHost::WebViewHost(BrowserWebViewDelegate* delegate)
: delegate_(delegate)
{ {
} }

View File

@ -48,24 +48,31 @@ class WebViewHost : public WebWidgetHost {
webkit::npapi::GtkPluginContainerManager* plugin_container_manager() { webkit::npapi::GtkPluginContainerManager* plugin_container_manager() {
return &plugin_container_manager_; return &plugin_container_manager_;
} }
virtual void KeyEvent(GdkEventKey* event);
#elif defined(OS_MACOSX) #elif defined(OS_MACOSX)
void SetIsActive(bool active); void SetIsActive(bool active);
virtual void MouseEvent(NSEvent *); virtual void MouseEvent(NSEvent *);
virtual void KeyEvent(NSEvent *);
virtual void SetFocus(bool enable); virtual void SetFocus(bool enable);
#endif #endif
protected: protected:
WebViewHost(); WebViewHost(BrowserWebViewDelegate* delegate);
#if defined(OS_WIN) #if defined(OS_WIN)
virtual bool WndProc(UINT message, WPARAM wparam, LPARAM lparam); virtual bool WndProc(UINT message, WPARAM wparam, LPARAM lparam);
virtual void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam); virtual void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam);
virtual void KeyEvent(UINT message, WPARAM wparam, LPARAM lparam);
#endif #endif
#if defined(TOOLKIT_USES_GTK) #if defined(TOOLKIT_USES_GTK)
// Helper class that creates and moves plugin containers. // Helper class that creates and moves plugin containers.
webkit::npapi::GtkPluginContainerManager plugin_container_manager_; webkit::npapi::GtkPluginContainerManager plugin_container_manager_;
#endif #endif
// The delegate pointer will always outlive the WebViewHost object.
BrowserWebViewDelegate* delegate_;
}; };
#endif // _WEBVIEW_HOST_H #endif // _WEBVIEW_HOST_H

View File

@ -8,6 +8,8 @@
#include "browser_webview_delegate.h" #include "browser_webview_delegate.h"
#include "base/logging.h" #include "base/logging.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "ui/gfx/rect.h" #include "ui/gfx/rect.h"
#include "ui/gfx/size.h" #include "ui/gfx/size.h"
@ -15,6 +17,9 @@
#include "webkit/plugins/npapi/gtk_plugin_container.h" #include "webkit/plugins/npapi/gtk_plugin_container.h"
using WebKit::WebDevToolsAgentClient; using WebKit::WebDevToolsAgentClient;
using WebKit::WebKeyboardEvent;
using WebKit::WebInputEvent;
using WebKit::WebInputEventFactory;
using WebKit::WebView; using WebKit::WebView;
// static // static
@ -24,7 +29,7 @@ WebViewHost* WebViewHost::Create(GtkWidget* parent_view,
PaintDelegate* paint_delegate, PaintDelegate* paint_delegate,
WebDevToolsAgentClient* dev_tools_client, WebDevToolsAgentClient* dev_tools_client,
const WebPreferences& prefs) { const WebPreferences& prefs) {
WebViewHost* host = new WebViewHost(); WebViewHost* host = new WebViewHost(delegate);
host->view_ = WebWidgetHost::CreateWidget(parent_view, host); host->view_ = WebWidgetHost::CreateWidget(parent_view, host);
host->plugin_container_manager_.set_host_widget(host->view_); host->plugin_container_manager_.set_host_widget(host->view_);
@ -53,3 +58,11 @@ void WebViewHost::CreatePluginContainer(gfx::PluginWindowHandle id) {
void WebViewHost::DestroyPluginContainer(gfx::PluginWindowHandle id) { void WebViewHost::DestroyPluginContainer(gfx::PluginWindowHandle id) {
plugin_container_manager_.DestroyPluginContainer(id); plugin_container_manager_.DestroyPluginContainer(id);
} }
void WebViewHost::KeyEvent(GdkEventKey* event) {
WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event));
if (delegate_->OnKeyboardEvent(keyboard_event, false))
return;
WebWidgetHost::KeyEvent(event);
}

View File

@ -10,6 +10,8 @@
#include "cef_context.h" #include "cef_context.h"
#include "skia/ext/platform_canvas.h" #include "skia/ext/platform_canvas.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFactory.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "ui/gfx/rect.h" #include "ui/gfx/rect.h"
@ -17,6 +19,9 @@
#include "webkit/glue/webpreferences.h" #include "webkit/glue/webpreferences.h"
using WebKit::WebDevToolsAgentClient; using WebKit::WebDevToolsAgentClient;
using WebKit::WebKeyboardEvent;
using WebKit::WebInputEvent;
using WebKit::WebInputEventFactory;
using WebKit::WebSize; using WebKit::WebSize;
using WebKit::WebView; using WebKit::WebView;
@ -27,7 +32,7 @@ WebViewHost* WebViewHost::Create(NSView* parent_view,
PaintDelegate* paint_delegate, PaintDelegate* paint_delegate,
WebDevToolsAgentClient* dev_tools_client, WebDevToolsAgentClient* dev_tools_client,
const WebPreferences& prefs) { const WebPreferences& prefs) {
WebViewHost* host = new WebViewHost(); WebViewHost* host = new WebViewHost(delegate);
NSRect content_rect = {{rect.x(), rect.y()}, {rect.width(), rect.height()}}; NSRect content_rect = {{rect.x(), rect.y()}, {rect.width(), rect.height()}};
host->view_ = [[BrowserWebView alloc] initWithFrame:content_rect]; host->view_ = [[BrowserWebView alloc] initWithFrame:content_rect];
@ -68,6 +73,14 @@ void WebViewHost::MouseEvent(NSEvent* event) {
WebWidgetHost::MouseEvent(event); WebWidgetHost::MouseEvent(event);
} }
void WebViewHost::KeyEvent(NSEvent *event) {
WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event));
if (delegate_->OnKeyboardEvent(keyboard_event, false))
return;
WebWidgetHost::KeyEvent(event);
}
void WebViewHost::SetFocus(bool enable) { void WebViewHost::SetFocus(bool enable) {
if (enable) { if (enable) {
// Set the current WebViewHost in case a drag action is started before mouse // Set the current WebViewHost in case a drag action is started before mouse

View File

@ -6,13 +6,19 @@
#include "browser_webview_delegate.h" #include "browser_webview_delegate.h"
#include "cef_context.h" #include "cef_context.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h"
#include "ui/base/win/hwnd_util.h" #include "ui/base/win/hwnd_util.h"
#include "ui/gfx/rect.h" #include "ui/gfx/rect.h"
#include "ui/gfx/size.h" #include "ui/gfx/size.h"
#include "webkit/glue/webpreferences.h" #include "webkit/glue/webpreferences.h"
using namespace WebKit; using WebKit::WebDevToolsAgentClient;
using WebKit::WebKeyboardEvent;
using WebKit::WebInputEvent;
using WebKit::WebInputEventFactory;
using WebKit::WebView;
static const wchar_t kWindowClassName[] = L"WebViewHost"; static const wchar_t kWindowClassName[] = L"WebViewHost";
@ -23,7 +29,7 @@ WebViewHost* WebViewHost::Create(HWND parent_view,
PaintDelegate* paint_delegate, PaintDelegate* paint_delegate,
WebDevToolsAgentClient* dev_tools_client, WebDevToolsAgentClient* dev_tools_client,
const WebPreferences& prefs) { const WebPreferences& prefs) {
WebViewHost* host = new WebViewHost(); WebViewHost* host = new WebViewHost(delegate);
if (!paint_delegate) { if (!paint_delegate) {
static bool registered_class = false; static bool registered_class = false;
@ -79,3 +85,14 @@ void WebViewHost::MouseEvent(UINT message, WPARAM wparam, LPARAM lparam) {
_Context->set_current_webviewhost(this); _Context->set_current_webviewhost(this);
WebWidgetHost::MouseEvent(message, wparam, lparam); WebWidgetHost::MouseEvent(message, wparam, lparam);
} }
void WebViewHost::KeyEvent(UINT message, WPARAM wparam, LPARAM lparam) {
// Give the client a chance to handle keyboard events before they're passed
// to WebKit.
const WebKeyboardEvent& event = WebInputEventFactory::keyboardEvent(
view_, message, wparam, lparam);
if (delegate_->OnKeyboardEvent(event, false))
return;
WebWidgetHost::KeyEvent(message, wparam, lparam);
}

View File

@ -24,6 +24,10 @@
#include "ui/base/win/ime_input.h" #include "ui/base/win/ime_input.h"
#endif #endif
#if defined(TOOLKIT_USES_GTK)
#include <gtk/gtk.h>
#endif
namespace gfx { namespace gfx {
class Rect; class Rect;
class Size; class Size;
@ -130,7 +134,7 @@ class WebWidgetHost {
void Resize(LPARAM lparam); void Resize(LPARAM lparam);
virtual void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam); virtual void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam);
void WheelEvent(WPARAM wparam, LPARAM lparam); void WheelEvent(WPARAM wparam, LPARAM lparam);
void KeyEvent(UINT message, WPARAM wparam, LPARAM lparam); virtual void KeyEvent(UINT message, WPARAM wparam, LPARAM lparam);
void CaptureLostEvent(); void CaptureLostEvent();
void SetFocus(bool enable); void SetFocus(bool enable);
void OnNotify(WPARAM wparam, NMHDR* header); void OnNotify(WPARAM wparam, NMHDR* header);
@ -149,7 +153,7 @@ class WebWidgetHost {
void Resize(const gfx::Rect& rect); void Resize(const gfx::Rect& rect);
virtual void MouseEvent(NSEvent *); virtual void MouseEvent(NSEvent *);
void WheelEvent(NSEvent *); void WheelEvent(NSEvent *);
void KeyEvent(NSEvent *); virtual void KeyEvent(NSEvent *);
virtual void SetFocus(bool enable); virtual void SetFocus(bool enable);
protected: protected:
#elif defined(TOOLKIT_USES_GTK) #elif defined(TOOLKIT_USES_GTK)
@ -167,6 +171,7 @@ class WebWidgetHost {
WebWidgetHost* host); WebWidgetHost* host);
void WindowDestroyed(); void WindowDestroyed();
void Resize(const gfx::Size& size); void Resize(const gfx::Size& size);
virtual void KeyEvent(GdkEventKey* event);
#endif #endif
#if defined(OS_WIN) #if defined(OS_WIN)

View File

@ -168,21 +168,7 @@ class WebWidgetHostGtkWidget {
static gboolean HandleKeyPress(GtkWidget* widget, static gboolean HandleKeyPress(GtkWidget* widget,
GdkEventKey* event, GdkEventKey* event,
WebWidgetHost* host) { WebWidgetHost* host) {
host->webwidget()->handleInputEvent( host->KeyEvent(event);
WebInputEventFactory::keyboardEvent(event));
// In the browser we do a ton of work with IMEs. This is some minimal
// code to make basic text work in test_shell, but doesn't cover IME.
// This is a copy of the logic in ProcessUnfilteredKeyPressEvent in
// render_widget_host_view_gtk.cc .
if (event->type == GDK_KEY_PRESS) {
WebKeyboardEvent wke = WebInputEventFactory::keyboardEvent(event);
if (wke.text[0]) {
wke.type = WebKit::WebInputEvent::Char;
host->webwidget()->handleInputEvent(wke);
}
}
return FALSE; return FALSE;
} }
@ -523,3 +509,20 @@ void WebWidgetHost::ResetTooltip()
{ {
// TODO(port): Implement this method as part of tooltip support. // TODO(port): Implement this method as part of tooltip support.
} }
void WebWidgetHost::KeyEvent(GdkEventKey* event)
{
WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event));
last_key_event_ = keyboard_event;
webwidget()->handleInputEvent(keyboard_event);
// In the browser we do a ton of work with IMEs. This is some minimal
// code to make basic text work in test_shell, but doesn't cover IME.
// This is a copy of the logic in ProcessUnfilteredKeyPressEvent in
// render_widget_host_view_gtk.cc .
if (event->type == GDK_KEY_PRESS && keyboard_event.text[0]) {
keyboard_event.type = WebKit::WebInputEvent::Char;
last_key_event_ = keyboard_event;
webwidget()->handleInputEvent(keyboard_event);
}
}

View File

@ -156,7 +156,14 @@ LRESULT CALLBACK WebWidgetHost::WndProc(HWND hwnd, UINT message, WPARAM wparam,
break; break;
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
host->WheelEvent(wparam, lparam); {
// Only send mouse wheel events if the cursor is over the window.
POINT mousePt = { LOWORD(lparam), HIWORD(lparam) };
RECT wndRect;
GetWindowRect(hwnd, &wndRect);
if (PtInRect(&wndRect, mousePt))
host->WheelEvent(wparam, lparam);
}
break; break;
case WM_MOUSEACTIVATE: case WM_MOUSEACTIVATE:

View File

@ -19,7 +19,7 @@
int CEF_CALLBACK keyboard_handler_on_key_event( int CEF_CALLBACK keyboard_handler_on_key_event(
struct _cef_keyboard_handler_t* self, cef_browser_t* browser, struct _cef_keyboard_handler_t* self, cef_browser_t* browser,
enum cef_handler_keyevent_type_t type, int code, int modifiers, enum cef_handler_keyevent_type_t type, int code, int modifiers,
int isSystemKey) int isSystemKey, int isAfterJavaScript)
{ {
DCHECK(self); DCHECK(self);
DCHECK(browser); DCHECK(browser);
@ -28,7 +28,7 @@ int CEF_CALLBACK keyboard_handler_on_key_event(
return CefKeyboardHandlerCppToC::Get(self)->OnKeyEvent( return CefKeyboardHandlerCppToC::Get(self)->OnKeyEvent(
CefBrowserCToCpp::Wrap(browser), type, code, CefBrowserCToCpp::Wrap(browser), type, code,
modifiers, isSystemKey?true:false); modifiers, isSystemKey?true:false, isAfterJavaScript?true:false);
} }

View File

@ -17,13 +17,14 @@
// VIRTUAL METHODS - Body may be edited by hand. // VIRTUAL METHODS - Body may be edited by hand.
bool CefKeyboardHandlerCToCpp::OnKeyEvent(CefRefPtr<CefBrowser> browser, bool CefKeyboardHandlerCToCpp::OnKeyEvent(CefRefPtr<CefBrowser> browser,
KeyEventType type, int code, int modifiers, bool isSystemKey) KeyEventType type, int code, int modifiers, bool isSystemKey,
bool isAfterJavaScript)
{ {
if (CEF_MEMBER_MISSING(struct_, on_key_event)) if (CEF_MEMBER_MISSING(struct_, on_key_event))
return false; return false;
return struct_->on_key_event(struct_, CefBrowserCppToC::Wrap(browser), return struct_->on_key_event(struct_, CefBrowserCppToC::Wrap(browser),
type, code, modifiers, isSystemKey) ? true : false; type, code, modifiers, isSystemKey, isAfterJavaScript) ? true : false;
} }

View File

@ -34,7 +34,8 @@ public:
// CefKeyboardHandler methods // CefKeyboardHandler methods
virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser, KeyEventType type, virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser, KeyEventType type,
int code, int modifiers, bool isSystemKey) OVERRIDE; int code, int modifiers, bool isSystemKey,
bool isAfterJavaScript) OVERRIDE;
}; };
#endif // BUILDING_CEF_SHARED #endif // BUILDING_CEF_SHARED

View File

@ -216,11 +216,12 @@ bool ClientHandler::OnKeyEvent(CefRefPtr<CefBrowser> browser,
KeyEventType type, KeyEventType type,
int code, int code,
int modifiers, int modifiers,
bool isSystemKey) bool isSystemKey,
bool isAfterJavaScript)
{ {
REQUIRE_UI_THREAD(); REQUIRE_UI_THREAD();
if (!m_bFormElementHasFocus && code == 0x20) { if (isAfterJavaScript && !m_bFormElementHasFocus && code == 0x20) {
// Special handling for the space character if a form element does not have // Special handling for the space character if a form element does not have
// focus. // focus.
if (type == KEYEVENT_RAWKEYDOWN) { if (type == KEYEVENT_RAWKEYDOWN) {

View File

@ -113,7 +113,8 @@ public:
KeyEventType type, KeyEventType type,
int code, int code,
int modifiers, int modifiers,
bool isSystemKey) OVERRIDE; bool isSystemKey,
bool isAfterJavaScript) OVERRIDE;
// CefPrintHandler methods. // CefPrintHandler methods.
virtual bool GetPrintHeaderFooter(CefRefPtr<CefBrowser> browser, virtual bool GetPrintHeaderFooter(CefRefPtr<CefBrowser> browser,