Hi AWT, Swing teams,

Could you please review the fix to JDK-8046559 for jdk9:
    bug: https://bugs.openjdk.java.net/browse/JDK-8046559
    webrev: http://cr.openjdk.java.net/~aivanov/8046559/jdk9/webrev.00/

Problem description:
When changing Windows themes from a theme with visual styles (Windows Aero or Windows Basic) to a classic one, NullPointerException could be thrown from Swing code during component tree validation, or InternalError could be thrown during component painting.

Root cause:
Windows theme data are accessed via XPStyle and ThemeReader. When the theme is switched to a classic one, theme handles become unavailable, and theme data cannot be accessed any more. The change in theme is posted to EDT; at the same time, the UI often needs to repaint before the theme change is completely handled in Swing. This leads to NPE and InternalError as the code tries to access the data that has become unavailable.

The fix:
Windows desktop properties are updated right on Windows Toolkit thread, and the value of "win.xpstyle.themeActive" is stored in ThemeReader.xpStyleEnabled field. PropertyChangeEvents for desktop properties are delivered either synchronously on EDT or asynchronously via DesktopPropertyChangeSupport, as it used to be.

Getters in XPStyle class check for null values and return dummy defaults if ThemeReader returned null. SkinPainters also check whether theming is still available before asking ThemeReader to paint.

Access to XPStyle.xp instance is blocked as soon as user switches themes. The object will be cleaned when the corresponding PropertyChangeEvent is handled by Swing.


This new version of the fix addresses issues found with the initial submission of JDK-8039383 fix:
  - JDK-8046239: Build failure in 9-client on all non-Windows platforms
  - JDK-8046391: Hang displaying JFileChooser with Windows L&F

See also http://mail.openjdk.java.net/pipermail/awt-dev/2014-June/007975.html
and http://cr.openjdk.java.net/~aivanov/8039383/jdk9/webrev.03/


Regression test:
No regression test is provided due to its complexity. Whether NullPointerException or InternalError are thrown depends on the order of event handling, sometimes exceptions do not occur when changing theme of visual styles enabled theme to a classic theme.

I included regression test for hang in JFileChooser, JDK-8046391.


Thank you,
Alexey.

Reply via email to