- Revision
- 91937
- Author
- [email protected]
- Date
- 2011-07-28 10:24:47 -0700 (Thu, 28 Jul 2011)
Log Message
Pass the key_press_event or key_release_event to parent widget when it is not handled by Web Process.
(https://bugs.webkit.org/show_bug.cgi?id=64790)
Patch by Ravi Phaneendra Kasibhatla <[email protected]> on 2011-07-28
Reviewed by Martin Robinson.
* Shared/NativeWebKeyboardEvent.h:
(WebKit::NativeWebKeyboardEvent::nativeEvent): Return a GdkEvent* instead of const GdkEvent* (non-const).
* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::doneWithKeyEvent): Implemented for GTK port. Sets flag if the keyboard event
needs to be passed to the parent widget. Invoke gtk_main_do_event() if event needs to be passed to parent.
* UIProcess/API/gtk/PageClientImpl.h: Deleted obsolete functions didNotHandleKeyEvent & didNotHandleWheelEvent.
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkit_web_view_base_init): Initialize shouldForwardNextKeyEvent flag.
(webkitWebViewBaseKeyPressEvent): Pass event to parent widget depending on status from doneWithKeyEvent.
(webkitWebViewBaseKeyReleaseEvent): Pass event to parent widget depending on status from doneWithKeyEvent.
(webkitWebViewBaseForwardNextKeyEvent): API to set flag shouldForwardNextKeyEvent.
* UIProcess/API/gtk/WebKitWebViewBasePrivate.h: Added API to set shouldForwardNextKeyEvent flag.
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (91936 => 91937)
--- trunk/Source/WebKit2/ChangeLog 2011-07-28 16:57:32 UTC (rev 91936)
+++ trunk/Source/WebKit2/ChangeLog 2011-07-28 17:24:47 UTC (rev 91937)
@@ -1,3 +1,23 @@
+2011-07-28 Ravi Phaneendra Kasibhatla <[email protected]>
+
+ Pass the key_press_event or key_release_event to parent widget when it is not handled by Web Process.
+ (https://bugs.webkit.org/show_bug.cgi?id=64790)
+
+ Reviewed by Martin Robinson.
+
+ * Shared/NativeWebKeyboardEvent.h:
+ (WebKit::NativeWebKeyboardEvent::nativeEvent): Return a GdkEvent* instead of const GdkEvent* (non-const).
+ * UIProcess/API/gtk/PageClientImpl.cpp:
+ (WebKit::PageClientImpl::doneWithKeyEvent): Implemented for GTK port. Sets flag if the keyboard event
+ needs to be passed to the parent widget. Invoke gtk_main_do_event() if event needs to be passed to parent.
+ * UIProcess/API/gtk/PageClientImpl.h: Deleted obsolete functions didNotHandleKeyEvent & didNotHandleWheelEvent.
+ * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+ (webkit_web_view_base_init): Initialize shouldForwardNextKeyEvent flag.
+ (webkitWebViewBaseKeyPressEvent): Pass event to parent widget depending on status from doneWithKeyEvent.
+ (webkitWebViewBaseKeyReleaseEvent): Pass event to parent widget depending on status from doneWithKeyEvent.
+ (webkitWebViewBaseForwardNextKeyEvent): API to set flag shouldForwardNextKeyEvent.
+ * UIProcess/API/gtk/WebKitWebViewBasePrivate.h: Added API to set shouldForwardNextKeyEvent flag.
+
2011-07-28 Dan Bernstein <[email protected]>
<rdar://problem/9589433> Displaying Japanese dictionary contents in vertical orientation takes a couple of seconds
Modified: trunk/Source/WebKit2/Shared/NativeWebKeyboardEvent.h (91936 => 91937)
--- trunk/Source/WebKit2/Shared/NativeWebKeyboardEvent.h 2011-07-28 16:57:32 UTC (rev 91936)
+++ trunk/Source/WebKit2/Shared/NativeWebKeyboardEvent.h 2011-07-28 17:24:47 UTC (rev 91937)
@@ -67,7 +67,7 @@
#elif PLATFORM(QT)
const QKeyEvent* nativeEvent() const { return &m_nativeEvent; }
#elif PLATFORM(GTK)
- const GdkEvent* nativeEvent() const { return m_nativeEvent.get(); }
+ GdkEvent* nativeEvent() const { return m_nativeEvent.get(); }
#elif PLATFORM(EFL)
const void* nativeEvent() const { return m_nativeEvent; }
#endif
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (91936 => 91937)
--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp 2011-07-28 16:57:32 UTC (rev 91936)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp 2011-07-28 17:24:47 UTC (rev 91937)
@@ -205,21 +205,16 @@
return IntRect(convertWidgetPointToScreenPoint(m_viewWidget, rect.location()), rect.size());
}
-void PageClientImpl::doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled)
+void PageClientImpl::doneWithKeyEvent(const NativeWebKeyboardEvent& event, bool wasEventHandled)
{
- notImplemented();
-}
+ if (wasEventHandled)
+ return;
-void PageClientImpl::didNotHandleKeyEvent(const NativeWebKeyboardEvent& event)
-{
- notImplemented();
+ WebKitWebViewBase* webkitWebViewBase = WEBKIT_WEB_VIEW_BASE(m_viewWidget);
+ webkitWebViewBaseForwardNextKeyEvent(webkitWebViewBase);
+ gtk_main_do_event(event.nativeEvent());
}
-void PageClientImpl::didNotHandleWheelEvent(const NativeWebWheelEvent&)
-{
- notImplemented();
-}
-
PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy* page)
{
return WebPopupMenuProxyGtk::create(m_viewWidget, page);
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h (91936 => 91937)
--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h 2011-07-28 16:57:32 UTC (rev 91936)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h 2011-07-28 17:24:47 UTC (rev 91937)
@@ -79,8 +79,6 @@
virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&);
virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&);
virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled);
- virtual void didNotHandleKeyEvent(const NativeWebKeyboardEvent&);
- virtual void didNotHandleWheelEvent(const NativeWebWheelEvent&);
virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (91936 => 91937)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp 2011-07-28 16:57:32 UTC (rev 91936)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp 2011-07-28 17:24:47 UTC (rev 91937)
@@ -53,6 +53,7 @@
OwnPtr<PageClientImpl> pageClient;
RefPtr<WebPageProxy> pageProxy;
gboolean isPageActive;
+ gboolean shouldForwardNextKeyEvent;
GtkIMContext* imContext;
GtkClickCounter clickCounter;
CString tooltipText;
@@ -129,6 +130,7 @@
webkitWebViewBase->priv = priv;
priv->isPageActive = TRUE;
+ priv->shouldForwardNextKeyEvent = FALSE;
gtk_widget_set_double_buffered(GTK_WIDGET(webkitWebViewBase), FALSE);
gtk_widget_set_can_focus(GTK_WIDGET(webkitWebViewBase), TRUE);
@@ -200,9 +202,16 @@
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
WebKitWebViewBasePrivate* priv = webViewBase->priv;
+ // Since WebProcess key event handling is not synchronous, handle the event in two passes.
+ // When WebProcess processes the input event, it will call PageClientImpl::doneWithKeyEvent
+ // with event handled status which determines whether to pass the input event to parent or not
+ // using gtk_main_do_event().
+ if (priv->shouldForwardNextKeyEvent) {
+ priv->shouldForwardNextKeyEvent = FALSE;
+ return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_press_event(widget, event);
+ }
priv->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(reinterpret_cast<GdkEvent*>(event)));
-
- return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_press_event(widget, event);
+ return TRUE;
}
static gboolean webkitWebViewBaseKeyReleaseEvent(GtkWidget* widget, GdkEventKey* event)
@@ -213,9 +222,12 @@
if (gtk_im_context_filter_keypress(priv->imContext, event))
return TRUE;
+ if (priv->shouldForwardNextKeyEvent) {
+ priv->shouldForwardNextKeyEvent = FALSE;
+ return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_release_event(widget, event);
+ }
priv->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(reinterpret_cast<GdkEvent*>(event)));
-
- return GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->key_release_event(widget, event);
+ return TRUE;
}
static gboolean webkitWebViewBaseButtonPressEvent(GtkWidget* widget, GdkEventButton* buttonEvent)
@@ -343,4 +355,7 @@
gtk_widget_trigger_tooltip_query(GTK_WIDGET(webViewBase));
}
-
+void webkitWebViewBaseForwardNextKeyEvent(WebKitWebViewBase* webkitWebViewBase)
+{
+ webkitWebViewBase->priv->shouldForwardNextKeyEvent = TRUE;
+}
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h (91936 => 91937)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h 2011-07-28 16:57:32 UTC (rev 91936)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h 2011-07-28 17:24:47 UTC (rev 91937)
@@ -46,6 +46,8 @@
void webkitWebViewBaseSetTooltipText(WebKitWebViewBase*, const char*);
+void webkitWebViewBaseForwardNextKeyEvent(WebKitWebViewBase*);
+
G_END_DECLS
#endif // WebKitWebViewBasePrivate_h