summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT Mozilla
diff options
context:
space:
mode:
authorGrant Gayed <grant_gayed@ca.ibm.com>2012-10-22 12:10:47 -0400
committerGrant Gayed <grant_gayed@ca.ibm.com>2012-10-22 12:10:47 -0400
commitb65d1559d4f29345d41604973c0059f6498c7e9f (patch)
treea993f3e942e608474bb7f23edb79ed47d45cd94c /bundles/org.eclipse.swt/Eclipse SWT Mozilla
parent0755ad6b8f1bc7ebe9cc94c048205406068d4ba2 (diff)
downloadeclipse.platform.swt-b65d1559d4f29345d41604973c0059f6498c7e9f.tar.gz
eclipse.platform.swt-b65d1559d4f29345d41604973c0059f6498c7e9f.tar.xz
eclipse.platform.swt-b65d1559d4f29345d41604973c0059f6498c7e9f.zip
Bug 392488 - [Browser] XULRunner 10 does not eat some traversals by
default
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Mozilla')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java58
1 files changed, 34 insertions, 24 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java
index 2df19cbdb8..7df2de4fd2 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java
@@ -175,33 +175,43 @@ void init () {
if (!Mozilla.IsPre_4) {
/*
* In XULRunner versions > 4, sending WM_GETDLGCODE to a WM_KEYDOWN's MSG hwnd answers 0
- * instead of the expected DLGC_WANTTAB or DLGC_WANTALLKEYS. As a result, Tab presses
- * always default to traversals out of the browser. The workaround for this is to add a
- * Traverse listener that vetos any tab traversals that are attempted while an element
- * in the browser has focus.
+ * instead of the expected DLGC_WANTALLKEYS. This causes the default traversal framework
+ * perform traversals outside of the Browser when it should not. Hook a Traverse listener
+ * to work around these problems.
*/
browser.addListener (SWT.Traverse, new Listener () {
public void handleEvent (Event event) {
- if ((event.detail & (SWT.TRAVERSE_TAB_NEXT | SWT.TRAVERSE_TAB_PREVIOUS)) == 0) return;
-
- long /*int*/[] result = new long /*int*/[1];
- int rc = XPCOM.NS_GetServiceManager (result);
- if (rc != XPCOM.NS_OK) Mozilla.error (rc);
- if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
- nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
- result[0] = 0;
- byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_FOCUSMANAGER_CONTRACTID, true);
- rc = serviceManager.GetServiceByContractID (aContractID, nsIFocusManager.NS_IFOCUSMANAGER_10_IID, result);
- serviceManager.Release ();
-
- if (rc == XPCOM.NS_OK && result[0] != 0) {
- nsIFocusManager focusManager = new nsIFocusManager (result[0]);
- result[0] = 0;
- rc = focusManager.GetFocusedElement (result);
- focusManager.Release ();
- event.doit = result[0] == 0;
- if (rc == XPCOM.NS_OK && result[0] != 0) {
- new nsISupports (result[0]).Release ();
+ switch (event.detail) {
+ case SWT.TRAVERSE_RETURN:
+ case SWT.TRAVERSE_ESCAPE: {
+ /* always veto the traversal */
+ event.doit = false;
+ break;
+ }
+ case SWT.TRAVERSE_TAB_NEXT:
+ case SWT.TRAVERSE_TAB_PREVIOUS: {
+ /* veto the traversal whenever an element in the browser has focus */
+ long /*int*/[] result = new long /*int*/[1];
+ int rc = XPCOM.NS_GetServiceManager (result);
+ if (rc != XPCOM.NS_OK) Mozilla.error (rc);
+ if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
+ nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
+ result[0] = 0;
+ byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_FOCUSMANAGER_CONTRACTID, true);
+ rc = serviceManager.GetServiceByContractID (aContractID, nsIFocusManager.NS_IFOCUSMANAGER_10_IID, result);
+ serviceManager.Release ();
+
+ if (rc == XPCOM.NS_OK && result[0] != 0) {
+ nsIFocusManager focusManager = new nsIFocusManager (result[0]);
+ result[0] = 0;
+ rc = focusManager.GetFocusedElement (result);
+ focusManager.Release ();
+ event.doit = result[0] == 0;
+ if (rc == XPCOM.NS_OK && result[0] != 0) {
+ new nsISupports (result[0]).Release ();
+ }
+ }
+ break;
}
}
}