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.iva...@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.iva...@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.
> 

Reply via email to