diff options
author | Grant Gayed <grant_gayed@ca.ibm.com> | 2012-10-22 12:10:47 -0400 |
---|---|---|
committer | Grant Gayed <grant_gayed@ca.ibm.com> | 2012-10-22 12:10:47 -0400 |
commit | b65d1559d4f29345d41604973c0059f6498c7e9f (patch) | |
tree | a993f3e942e608474bb7f23edb79ed47d45cd94c /bundles/org.eclipse.swt/Eclipse SWT Mozilla | |
parent | 0755ad6b8f1bc7ebe9cc94c048205406068d4ba2 (diff) | |
download | eclipse.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.java | 58 |
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; } } } |