diff options
| author | Leo Ufimtsev | 2017-12-13 17:51:35 +0000 |
|---|---|---|
| committer | Leo Ufimtsev | 2017-12-13 17:52:32 +0000 |
| commit | 9d7a45d4b63262879403c975d90a7bf11a261ef2 (patch) | |
| tree | 8757b0d965352879c26b5f89860ecc2ea14403b0 | |
| parent | fc22ad835b303358b44053dbf13b338315828ee6 (diff) | |
| download | eclipse.platform.swt-9d7a45d4b63262879403c975d90a7bf11a261ef2.tar.gz eclipse.platform.swt-9d7a45d4b63262879403c975d90a7bf11a261ef2.tar.xz eclipse.platform.swt-9d7a45d4b63262879403c975d90a7bf11a261ef2.zip | |
Bug 528549 – (webkit2MouseListener) [Webkit2] Fix listeners
- Webkit2 doesn't send 'mouseUp/Down' events, it swallows them up.
This patch propogates the events so that addMouseListener works.
This fixes the problem that fast-view doesn't close if a browser
is in the background. (caused by missing mouseDown event).
- Focus listener doesn't work on webkit1 and 2 because it was never
connected. Adding this logic but only for webkit2 because I don't
want to cause some weird regression on webkit1 as it has complicated
event handling logic.
Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=528549
Change-Id: I05d5bdc80447ff9b0aa2a2e0924625776c5ebc62
Signed-off-by: Leo Ufimtsev <lufimtse@redhat.com>
| -rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java | 57 | ||||
| -rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java | 4 |
2 files changed, 47 insertions, 14 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java index 1f8c0f5602..e840d42311 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java @@ -177,6 +177,10 @@ class WebKit extends WebBrowser { /** Webkit1 & Webkit2, Process key/mouse events from javascript. */ static Callback JSDOMEventProc; + /** Webkit2: We propograte some events to gtk */ + static long [] w2_passThroughSwtEvents = null; + + static { WebViewType = WebKitGTK.webkit_web_view_get_type (); Proc2 = new Callback (WebKit.class, "Proc", 2); //$NON-NLS-1$ @@ -606,9 +610,11 @@ static long /*int*/ JSDOMEventProc (long /*int*/ arg0, long /*int*/ event, long * in one or more WebKit instances (indicates that this instance may not be * receiving events from the DOM). This check is done up-front for performance. */ - if (DisabledJSCount > 0) { + if ((WEBKIT1 && DisabledJSCount > 0) || WEBKIT2){ final Browser browser = FindBrowser (arg0); - if (browser != null && !browser.webBrowser.jsEnabled) { + if (browser != null && + (WEBKIT1 && !browser.webBrowser.jsEnabled) + || (WEBKIT2 && Arrays.binarySearch(w2_passThroughSwtEvents, user_data) >= 0)){ /* this instance does need to use the GDK event to create an SWT event to send */ switch (OS.GDK_EVENT_TYPE (event)) { case OS.GDK_KEY_PRESS: { @@ -637,7 +643,15 @@ static long /*int*/ JSDOMEventProc (long /*int*/ arg0, long /*int*/ event, long if ((gdkEvent.state & OS.GDK_MOD1_MASK) != 0) keyEvent.stateMask |= SWT.ALT; if ((gdkEvent.state & OS.GDK_SHIFT_MASK) != 0) keyEvent.stateMask |= SWT.SHIFT; if ((gdkEvent.state & OS.GDK_CONTROL_MASK) != 0) keyEvent.stateMask |= SWT.CONTROL; + try { // to avoid deadlocks, evaluate() should not block during listener. See Bug 512001 + // I.e, evaluate() can be called and script will be executed, but no return value will be provided. + nonBlockingEvaluate++; browser.webBrowser.sendKeyEvent (keyEvent); + } catch (Exception e) { + throw e; + } finally { + nonBlockingEvaluate--; + } return 1; } } @@ -645,18 +659,25 @@ static long /*int*/ JSDOMEventProc (long /*int*/ arg0, long /*int*/ event, long break; } } - OS.gtk_widget_event (browser.handle, event); + if (WEBKIT1 || (WEBKIT2 && browser != null)) { + OS.gtk_widget_event (browser.handle, event); + } } } return 0; } - LONG webViewHandle = WindowMappings.get (new LONG (arg0)); - if (webViewHandle == null) return 0; - Browser browser = FindBrowser (webViewHandle.value); - if (browser == null) return 0; - WebKit webkit = (WebKit)browser.webBrowser; - return webkit.handleDOMEvent (event, (int)user_data) ? 0 : STOP_PROPOGATE; + if (WEBKIT1) { + LONG webViewHandle = WindowMappings.get (new LONG (arg0)); + if (webViewHandle == null) return 0; + Browser browser = FindBrowser (webViewHandle.value); + if (browser == null) return 0; + WebKit webkit = (WebKit)browser.webBrowser; + return webkit.handleDOMEvent (event, (int)user_data) ? 0 : STOP_PROPOGATE; + } + + // Webkit2 + return 0; } static long /*int*/ Proc (long /*int*/ handle, long /*int*/ user_data) { @@ -992,8 +1013,21 @@ public void create (Composite parent, int style) { OS.g_signal_connect (webView, WebKitGTK.notify_title, Proc3.getAddress (), NOTIFY_TITLE); /* Callback to get events before WebKit receives and consumes them */ - OS.g_signal_connect (webView, OS.button_press_event, JSDOMEventProc.getAddress (), 0); - OS.g_signal_connect (webView, OS.button_release_event, JSDOMEventProc.getAddress (), 0); + if (WEBKIT2) { + if (w2_passThroughSwtEvents == null) { + w2_passThroughSwtEvents = new long [] {SWT.MouseDown, SWT.MouseUp, SWT.FocusIn, SWT.FocusOut}; + Arrays.sort(w2_passThroughSwtEvents); + } + OS.g_signal_connect (webView, OS.button_press_event, JSDOMEventProc.getAddress (), SWT.MouseDown); + OS.g_signal_connect (webView, OS.button_release_event, JSDOMEventProc.getAddress (), SWT.MouseUp); + OS.g_signal_connect (webView, OS.focus_in_event, JSDOMEventProc.getAddress (), SWT.FocusIn); + OS.g_signal_connect (webView, OS.focus_out_event, JSDOMEventProc.getAddress (), SWT.FocusOut); + // if connecting any other special gtk event to webkit, add SWT.* to w2_passThroughSwtEvents above. + } + if (WEBKIT1) { + OS.g_signal_connect (webView, OS.button_press_event, JSDOMEventProc.getAddress (), 0); + OS.g_signal_connect (webView, OS.button_release_event, JSDOMEventProc.getAddress (), 0); + } OS.g_signal_connect (webView, OS.key_press_event, JSDOMEventProc.getAddress (), 0); OS.g_signal_connect (webView, OS.key_release_event, JSDOMEventProc.getAddress (), 0); OS.g_signal_connect (webView, OS.scroll_event, JSDOMEventProc.getAddress (), 0); @@ -2981,7 +3015,6 @@ long /*int*/ webkit_decide_policy (long /*int*/ web_view, long /*int*/ decision, if (newEvent.doit && !browser.isDisposed ()) { if (jsEnabled != jsEnabledOnNextPage) { jsEnabled = jsEnabledOnNextPage; - DisabledJSCount += !jsEnabled ? 1 : -1; webkit_settings_set(WebKitGTK.enable_javascript, jsEnabled ? 1 : 0); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java index bf24d29ea0..c45b902eae 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java @@ -29,8 +29,8 @@ public class WebKitGTK extends C { * Internal version of "Webkit glue code", used mainly during webkit2 port. * Used to make it easier to support users on bugzilla. Updated by hand. */ - public static final String swtWebkitGlueCodeVersion = " SWT Glue code version: 51.0"; - public static final String swtWebkitGlueCodeVersionInfo = " info: +BrowserFunction/GDBus, +WebkitExtension Folder versioning, +WebKitExtension OSGI support, -setUrl(..postData..), -setCookie(), -getCookie"; + public static final String swtWebkitGlueCodeVersion = " SWT Glue code version: 53.0"; + public static final String swtWebkitGlueCodeVersionInfo = " info: +BrowserFunction/GDBus, +WebkitExtension Folder versioning, +WebKitExtension OSGI support, +setUrl(..postData..), -setCookie(), -getCookie +mouseDown/Focus"; /** |
