--- old/src/macosx/classes/com/apple/laf/ScreenPopupFactory.java 2014-05-26 14:45:02.000000000 +0400 +++ new/src/macosx/classes/com/apple/laf/ScreenPopupFactory.java 2014-05-26 14:45:02.000000000 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,9 @@ import java.awt.*; import javax.swing.*; +import sun.awt.EmbeddedFrame; import sun.lwawt.macosx.CPlatformWindow; +import sun.swing.SwingAccessor; class ScreenPopupFactory extends PopupFactory { static { @@ -76,6 +78,10 @@ popup = super.getPopup(comp, invoker, x, y); } + if (EmbeddedFrame.getAppletIfAncestorOf(comp) != null) { + SwingAccessor.getPopupFactoryAccessor().setHeavyWeightPopupCacheEnabled(popup, false); + } + // Make the popup semi-translucent if it is a heavy weight // see JPopupMenus have incorrect background final Window w = getWindow(invoker); --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2014-05-26 14:45:03.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2014-05-26 14:45:03.000000000 +0400 @@ -119,6 +119,7 @@ static final int NONACTIVATING = 1 << 24; static final int IS_DIALOG = 1 << 25; static final int IS_MODAL = 1 << 26; + static final int IS_POPUP = 1 << 27; static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE; @@ -318,6 +319,7 @@ styleBits = SET(styleBits, TEXTURED, false); // Popups in applets don't activate applet's process styleBits = SET(styleBits, NONACTIVATING, true); + styleBits = SET(styleBits, IS_POPUP, true); } if (Window.Type.UTILITY.equals(target.getType())) { --- old/src/macosx/native/sun/awt/AWTWindow.m 2014-05-26 14:45:04.000000000 +0400 +++ new/src/macosx/native/sun/awt/AWTWindow.m 2014-05-26 14:45:04.000000000 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -252,6 +252,10 @@ self.ownerWindow = owner; [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)]; + if (IS(self.styleBits, IS_POPUP)) { + [self.nsWindow setCollectionBehavior:(1 << 8) /*NSWindowCollectionBehaviorFullScreenAuxiliary*/]; + } + return self; } --- old/src/share/classes/javax/swing/PopupFactory.java 2014-05-26 14:45:05.000000000 +0400 +++ new/src/share/classes/javax/swing/PopupFactory.java 2014-05-26 14:45:05.000000000 +0400 @@ -25,6 +25,8 @@ package javax.swing; +import sun.swing.SwingAccessor; + import java.applet.Applet; import java.awt.*; import java.awt.event.WindowAdapter; @@ -294,6 +296,8 @@ private static final Object heavyWeightPopupCacheKey = new StringBuffer("PopupFactory.heavyWeightPopupCache"); + private volatile boolean isCacheEnabled = true; + /** * Returns either a new or recycled Popup containing * the specified children. @@ -448,12 +452,23 @@ } } + /** + * Enables or disables cache for current object. + */ + void setCacheEnabled(boolean enable) { + isCacheEnabled = enable; + } + // // Popup methods // public void hide() { super.hide(); - recycleHeavyWeightPopup(this); + if (isCacheEnabled) { + recycleHeavyWeightPopup(this); + } else { + this._dispose(); + } } /** @@ -949,4 +964,14 @@ } } } + + static { + SwingAccessor.setPopupFactoryAccessor(new SwingAccessor.PopupFactoryAccessor() { + public void setHeavyWeightPopupCacheEnabled(Popup popup, boolean enable) { + if (popup instanceof HeavyWeightPopup) { + ((HeavyWeightPopup)popup).setCacheEnabled(enable); + } + } + }); + } } --- old/src/share/classes/sun/swing/SwingAccessor.java 2014-05-26 14:45:06.000000000 +0400 +++ new/src/share/classes/sun/swing/SwingAccessor.java 2014-05-26 14:45:06.000000000 +0400 @@ -29,6 +29,8 @@ import java.awt.Point; import javax.swing.RepaintManager; +import javax.swing.Popup; +import javax.swing.PopupFactory; import javax.swing.text.JTextComponent; import javax.swing.TransferHandler; @@ -91,6 +93,17 @@ } /** + * An accessor for the PopupFctory class. + */ + public interface PopupFactoryAccessor { + /** + * Enables or disables HeavyWeightPopup cache. If the popup is not + * HeavyWeightPopup, the method does nothing. + */ + void setHeavyWeightPopupCacheEnabled(Popup popup, boolean enable); + } + + /** * The javax.swing.text.JTextComponent class accessor object. */ private static JTextComponentAccessor jtextComponentAccessor; @@ -156,4 +169,24 @@ } return repaintManagerAccessor; } + + /** + * The PopupFactory class accessor object. + */ + private static PopupFactoryAccessor popupFactoryAccessor; + + /** + * Set an accessor object for the PopupFactory class. + */ + public static void setPopupFactoryAccessor(PopupFactoryAccessor accessor) { popupFactoryAccessor = accessor; } + + /** + * Retrive the accessor object for the PopupFactory class. + */ + public static PopupFactoryAccessor getPopupFactoryAccessor() { + if (popupFactoryAccessor == null) { + unsafe.ensureClassInitialized(PopupFactory.class); + } + return popupFactoryAccessor; + } }