<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 13:58:03 UTC 2014
Hi Anthony, Petr,
Thank you for reviewing my fix.
Regards,
Alexey.
On 06.06.2014 15:19, Anthony Petrov wrote:
> +1
>
> --
> best regards,
> Anthony
>
> On 6/6/2014 3:20 PM, Petr Pchelko wrote:
>> Hello, Alexey.
>>
>> The final version still looks good.
>>
>> With best regards. Petr.
>>
>> On 06 июня 2014 г., at 15:02, Alexey Ivanov
>> <alexey.ivanov at oracle.com> wrote:
>>
>>> 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