<Swing Dev> <AWT Dev> [9] Review request for JDK-8039383: NPE when changing Windows Theme

Alexey Ivanov alexey.ivanov at oracle.com
Fri Jun 6 11:02:20 UTC 2014


Hi Anthony, Petr, AWT and Swing teams,

I've addressed Anthony's and Petr's comments in the updated webrev:
http://cr.openjdk.java.net/~aivanov/8039383/jdk9/webrev.04/

Thank you,
Alexey.

On 06.06.2014 12:16, Alexey Ivanov wrote:
> Hi Anthony,
>
> Thank you for your review.
>
> I've removed synchronized modifier from updateProperties() method 
> which protected access to wprops field. Now this field is accessed 
> from synchronized methods lazilyInitWProps() and getWProps(); 
> setDesktopProperty also has proper synchronization - that was my 
> reasoning for removing synchronized.
>
> But you're right, it was not the right decision as the update loop now 
> could execute simultaneously which is undesirable. I'll put 
> synchronized modifier to updateProperties() method.
>
> Regards,
> Alexey.
>
> On 06.06.2014 1:07, Anthony Petrov wrote:
>> Hi Alexey,
>>
>> In WToolkit.java you're removing the synchronized modifier from the 
>> private updateProperties() method. And it looks like the method 
>> itself does allow for calling from multiple threads. So I'm concerned 
>> about the lack of synchronization in this method. Was the removal 
>> intentional? How is the method supposed to work now when called from 
>> multiple threads?
>>
>> -- 
>> best regards,
>> Anthony
>>
>> On 6/5/2014 12:16 PM, Petr Pchelko wrote:
>>> Thank you for clarifications, I've been most interested in #2 
>>> obviously.
>>>
>>> The fix looks good to me.
>>>
>>> With best regards. Petr.
>>>
>>> On 05 июня 2014 г., at 11:57, Alexey Ivanov 
>>> <alexey.ivanov at oracle.com> wrote:
>>>
>>>> Hello Petr,
>>>>
>>>> Thank you for your comments.
>>>>
>>>> 1. Sure, I'll remove the comment before the change set is pushed.
>>>> 2. No, I didn't try stub XPStyle object. First of all, UI delegates 
>>>> decide what painting method to use depending on whether 
>>>> XPStyle.getXP() returns null or not. If XPStyle.getXP() always 
>>>> returns non-null value, we'll have re-implement all UI delegates 
>>>> for Windows plaf, and I believe it would result in larger 
>>>> changeset. Additionally, some classes fallback to inherited 
>>>> behavior where XPStyle.getXP() is not available.
>>>> Another reason is that UI delegates cache Skins: those objects 
>>>> shouldn't paint where theming is unavailable.
>>>> 3. No, I haven't filed any bugs yet. I'll file all the issues I've 
>>>> found in the nearest future.
>>>>
>>>> Regards,
>>>> Alexey.
>>>>
>>>> On 05.06.2014 11:08, Petr Pchelko wrote:
>>>>> Hello, Alexey.
>>>>>
>>>>> A couple of comments:
>>>>> 1. ThemeReader:64 - I suggest to remove that comment as it does 
>>>>> not add any value. The variable name is self explanatory.
>>>>> 2. XPStyle - did you try providing a stub XPStyle object instead 
>>>>> of changing many of it's methods? Do I understand correctly that this
>>>>> is not possible because XPstyle is cached in many place is our code?
>>>>> 3. In offline discussion you've mentioned that you've found 
>>>>> another related issue. Did you have a chance to file a bug about it?
>>>>>
>>>>> Thank you.
>>>>> With best regards. Petr.
>>>>>
>>>>> On 05 июня 2014 г., at 10:35, Alexey Ivanov 
>>>>> <alexey.ivanov at oracle.com> wrote:
>>>>>
>>>>>> Hi AWT and Swing teams,
>>>>>>
>>>>>> Could you please review the updated fix:
>>>>>> http://cr.openjdk.java.net/~aivanov/8039383/jdk9/webrev.03/
>>>>>>
>>>>>>
>>>>>> What has changed since version .02?
>>>>>>
>>>>>> During additional testing, I found another scenario where NPE was 
>>>>>> thrown. So the new version adds more checks to prevent access to 
>>>>>> XPStyle and ThemeReader where Windows visual styles become 
>>>>>> unavailable.
>>>>>>
>>>>>> As in previous version, getters in XPStyle class check for null 
>>>>>> values and return dummy defaults if ThemeReader returned null. 
>>>>>> Skin painters also check whether theming is still available 
>>>>>> before asking ThemeReader to paint.
>>>>>>
>>>>>> Access to XPStyle.xp instance is blocked as soon as user switched 
>>>>>> themes. The object will be cleaned when the corresponding 
>>>>>> PropertyChangeEvent is handled by Swing.
>>>>>>
>>>>>> Thank you,
>>>>>> Alexey.
>>>>>>
>>>>>> On 06.05.2014 12:14, Alexey Ivanov wrote:
>>>>>>> Hi AWT and Swing teams,
>>>>>>>
>>>>>>> Could you please review the updated fix:
>>>>>>> http://cr.openjdk.java.net/~dmarkov/8039383/jdk9/webrev.02/
>>>>>>>
>>>>>>>
>>>>>>> What has changed since version .01?
>>>>>>>
>>>>>>> The issue was still reproducible with the .01 version of the 
>>>>>>> fix, however it was harder to reproduce.
>>>>>>>
>>>>>>> So in version .02 I added checks for null where possible. If 
>>>>>>> theme becomes unavailable, a dummy value will be used; this way 
>>>>>>> applications will be more stable. As soon as the theme change 
>>>>>>> events are handled, the entire UI will update properly.
>>>>>>>
>>>>>>> Thank you,
>>>>>>> Alexey.
>>>>>>>
>>>>>>> On 24.04.2014 16:23, Alexey Ivanov wrote:
>>>>>>>> Hi Anthony, AWT and Swing teams,
>>>>>>>>
>>>>>>>> Here's the updated fix:
>>>>>>>> http://cr.openjdk.java.net/~dmarkov/8039383/jdk9/webrev.01/
>>>>>>>>
>>>>>>>> Description:
>>>>>>>> In the new version of the fix, I use a new xpstyleEnabled field 
>>>>>>>> of AtomicBoolean in WToolkit to track the current value of 
>>>>>>>> "win.xpstyle.themeActive" desktop property. Its value is 
>>>>>>>> updated in windowsSettingChange() and in updateProperties().
>>>>>>>> XPStyle.getXP() checks its cached value in themeActive and the 
>>>>>>>> current value in WToolkit; if the value changes, it schedules 
>>>>>>>> updateAllUIs and invalidates the current style right away, so 
>>>>>>>> that components would not access data from the theme that 
>>>>>>>> became unavailable.
>>>>>>>> Two functions in ThemeReader also check this special field from 
>>>>>>>> WToolkit which prevents throwing InternalError when paint is 
>>>>>>>> called before theme change is fully handled.
>>>>>>>>
>>>>>>>> Before updateAllUIs is invoked, it's possible that application 
>>>>>>>> will paint with some values cached from the previous theme. 
>>>>>>>> Usually it happens before "Theme change" dialog disappears from 
>>>>>>>> the screen, at least I noticed no UI glitches during normal 
>>>>>>>> theme change.
>>>>>>>>
>>>>>>>>
>>>>>>>> Regression test:
>>>>>>>> No regression test is provided due to its complexity. 
>>>>>>>> Additionally, 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.
>>>>>>>>
>>>>>>>>
>>>>>>>> Thank you,
>>>>>>>> Alexey.
>>>>>>>>
>>>>>>>> On 18.04.2014 18:52, Anthony Petrov wrote:
>>>>>>>>> Hi Alexey,
>>>>>>>>>
>>>>>>>>> No, unfortunately I don't have any suggestions right now.
>>>>>>>>>
>>>>>>>>> As for allowing executing user code on the toolkit thread, we 
>>>>>>>>> can't accept such a fix. Sorry about that.
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>> best regards,
>>>>>>>>> Anthony
>>>>>>>>>
>>>>>>>>> On 4/18/2014 6:48 PM, Alexey Ivanov wrote:
>>>>>>>>>> Hi Anthony,
>>>>>>>>>>
>>>>>>>>>> Thank you for your review.
>>>>>>>>>>
>>>>>>>>>> Yes, user code can install a property change listener... It 
>>>>>>>>>> was my
>>>>>>>>>> concern too, that's why I explicitly noted about this.
>>>>>>>>>>
>>>>>>>>>> Do you have any suggestion how this situation can be handled?
>>>>>>>>>> Is it a general rule that all desktop property change 
>>>>>>>>>> listeners must be
>>>>>>>>>> called on EDT?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Alexey.
>>>>>>>>>>
>>>>>>>>>> On 18.04.2014 16:02, Anthony Petrov wrote:
>>>>>>>>>>> Hi Alexey,
>>>>>>>>>>>
>>>>>>>>>>>> With this change, property "win.xpstyle.themeActive" change 
>>>>>>>>>>>> is fired
>>>>>>>>>>>> on the toolkit thread
>>>>>>>>>>> Is it possible to install a change listener for this 
>>>>>>>>>>> property from
>>>>>>>>>>> user code, and hence eventually allow executing some user 
>>>>>>>>>>> code on the
>>>>>>>>>>> toolkit thread with your fix?
>>>>>>>>>>>
>>>>>>>>>>> -- 
>>>>>>>>>>> best regards,
>>>>>>>>>>> Anthony
>>>>>>>>>>>
>>>>>>>>>>> On 4/18/2014 12:09 PM, Alexey Ivanov wrote:
>>>>>>>>>>>> Hello Swing and AWT teams,
>>>>>>>>>>>>
>>>>>>>>>>>> Could you please review the fix for jdk9:
>>>>>>>>>>>>      bug: https://bugs.openjdk.java.net/browse/JDK-8039383
>>>>>>>>>>>>      webrev: 
>>>>>>>>>>>> http://cr.openjdk.java.net/~dmarkov/8039383/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 "cached" in XPStyle object. When the 
>>>>>>>>>>>> theme is
>>>>>>>>>>>> switched to a classic one, HTHEME handle becomes 
>>>>>>>>>>>> unavailable and data
>>>>>>>>>>>> cannot be accessed from the theme any more. The change in 
>>>>>>>>>>>> theme in
>>>>>>>>>>>> posted to EDT via invokeLater. At the same time, the UI 
>>>>>>>>>>>> needs to repaint
>>>>>>>>>>>> itself as soon as Windows changed the theme, and paint code 
>>>>>>>>>>>> is often
>>>>>>>>>>>> called before the theme change is handled in Java. This 
>>>>>>>>>>>> leads to NPE and
>>>>>>>>>>>> InternalError as the code tries to access the data that has 
>>>>>>>>>>>> become
>>>>>>>>>>>> unavailable.
>>>>>>>>>>>>
>>>>>>>>>>>> The fix:
>>>>>>>>>>>> Update "win.xpstyle.themeActive" desktop property and 
>>>>>>>>>>>> invalidate the
>>>>>>>>>>>> cached XPStyle as soon as windowsSettingChange() is called 
>>>>>>>>>>>> from native
>>>>>>>>>>>> code. Thus when Swing code needs to access theme data, it 
>>>>>>>>>>>> will see no
>>>>>>>>>>>> theme is available and will fallback to classic painting.
>>>>>>>>>>>>
>>>>>>>>>>>> Note: Before the fix, PropertyChangeEvents for desktop 
>>>>>>>>>>>> properties in
>>>>>>>>>>>> Windows were fired on the Event Dispatch Thread. With this 
>>>>>>>>>>>> change,
>>>>>>>>>>>> property "win.xpstyle.themeActive" change is fired on the 
>>>>>>>>>>>> toolkit
>>>>>>>>>>>> thread; all other properties are changed on the EDT as before.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Regards,
>>>>>>>>>>>> Alexey.
>>>>
>>>
>




More information about the swing-dev mailing list