Mercurial > hg > release > icedtea7-forest-2.4 > jdk
changeset 7357:ae0e4cd74a2d
8042582: Test java/awt/KeyboardFocusmanager/ChangeKFMTest/ChangeKFMTest.html fails on Windows x64
Reviewed-by: pchelko, ant
author | anashaty |
---|---|
date | Tue, 13 May 2014 15:41:23 +0400 |
parents | e30bf0f9fa0d |
children | 5bc43002133c |
files | src/share/classes/java/awt/KeyboardFocusManager.java |
diffstat | 1 files changed, 41 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/awt/KeyboardFocusManager.java Tue Mar 25 14:11:22 2014 +0100 +++ b/src/share/classes/java/awt/KeyboardFocusManager.java Tue May 13 15:41:23 2014 +0400 @@ -248,15 +248,7 @@ public static void setCurrentKeyboardFocusManager( KeyboardFocusManager newManager) throws SecurityException { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - if (replaceKeyboardFocusManagerPermission == null) { - replaceKeyboardFocusManagerPermission = - new AWTPermission("replaceKeyboardFocusManager"); - } - security. - checkPermission(replaceKeyboardFocusManagerPermission); - } + checkReplaceKFMPermission(); KeyboardFocusManager oldManager = null; @@ -508,7 +500,7 @@ */ protected Component getGlobalFocusOwner() throws SecurityException { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); return focusOwner; } } @@ -543,7 +535,7 @@ if (focusOwner == null || focusOwner.isFocusable()) { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); oldFocusOwner = getFocusOwner(); @@ -595,7 +587,7 @@ */ public void clearGlobalFocusOwner() { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); } if (!GraphicsEnvironment.isHeadless()) { // Toolkit must be fully initialized, otherwise @@ -676,7 +668,7 @@ throws SecurityException { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); return permanentFocusOwner; } } @@ -712,7 +704,7 @@ if (permanentFocusOwner == null || permanentFocusOwner.isFocusable()) { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); oldPermanentFocusOwner = getPermanentFocusOwner(); @@ -779,7 +771,7 @@ */ protected Window getGlobalFocusedWindow() throws SecurityException { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); return focusedWindow; } } @@ -811,7 +803,7 @@ if (focusedWindow == null || focusedWindow.isFocusableWindow()) { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); oldFocusedWindow = getFocusedWindow(); @@ -879,7 +871,7 @@ */ protected Window getGlobalActiveWindow() throws SecurityException { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); return activeWindow; } } @@ -909,7 +901,7 @@ protected void setGlobalActiveWindow(Window activeWindow) { Window oldActiveWindow; synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); oldActiveWindow = getActiveWindow(); if (focusLog.isLoggable(PlatformLogger.FINER)) { @@ -1205,7 +1197,7 @@ throws SecurityException { synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); return currentFocusCycleRoot; } } @@ -1230,7 +1222,7 @@ Container oldFocusCycleRoot; synchronized (KeyboardFocusManager.class) { - checkCurrentKFMSecurity(); + checkKFMSecurity(); oldFocusCycleRoot = getCurrentFocusCycleRoot(); currentFocusCycleRoot = newFocusCycleRoot; @@ -3051,13 +3043,36 @@ } } - private void checkCurrentKFMSecurity() { + private static void checkReplaceKFMPermission() + throws SecurityException + { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + if (replaceKeyboardFocusManagerPermission == null) { + replaceKeyboardFocusManagerPermission = + new AWTPermission("replaceKeyboardFocusManager"); + } + security. + checkPermission(replaceKeyboardFocusManagerPermission); + } + } + + // Checks if this KeyboardFocusManager instance is the current KFM, + // or otherwise checks if the calling thread has "replaceKeyboardFocusManager" + // permission. Here's the reasoning to do so: + // + // A system KFM instance (which is the current KFM by default) may have no + // "replaceKFM" permission when a client code is on the call stack beneath, + // but still it should be able to execute the methods protected by this check + // due to the system KFM is trusted (and so it does like "privileged"). + // + // If this KFM instance is not the current KFM but the client code has all + // permissions we can't throw SecurityException because it would contradict + // the security concepts. In this case the trusted client code is responsible + // for calling the secured methods from KFM instance which is not current. + private void checkKFMSecurity() { if (this != getCurrentKeyboardFocusManager()) { - if (focusLog.isLoggable(PlatformLogger.FINER)) { - focusLog.finer("This manager is " + this + - ", current is " + getCurrentKeyboardFocusManager()); - } - throw new SecurityException(notPrivileged); + checkReplaceKFMPermission(); } } }