Title: [91937] trunk/Source/WebKit2
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
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to