From b65d1559d4f29345d41604973c0059f6498c7e9f Mon Sep 17 00:00:00 2001 From: Grant Gayed Date: Mon, 22 Oct 2012 12:10:47 -0400 Subject: Bug 392488 - [Browser] XULRunner 10 does not eat some traversals by default --- .../org/eclipse/swt/browser/MozillaDelegate.java | 58 +++++++++++++--------- 1 file 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; } } } -- cgit