<Swing Dev> [12] RFR JDK-8211703: JInternalFrame : java.lang.AssertionError: cannot find the internal frame
Prasanta Sadhukhan
prasanta.sadhukhan at oracle.com
Tue Nov 13 09:25:24 UTC 2018
Hi Sergey,
findInternalFrame() is called from paintButtonBackground(),
paintFrameBorder() and updateFrameGeometry()
but in paintButtonBackground() and paintFrameBorder()
updateFrameGeometry() is called before findInternalFrame() so basically
it is updateFrameGeometry()#findInternalFrame that is get called during
assertion.
During assertion,
paintButtonBackground() is called which calls updateFrameGeometry() with
comp=javax.swing.plaf.basic.BasicInternalFrameTitlePane$NoFocusButton[InternalFrameTitlePane.iconifyButton,240,3,18x18,alignmentX=0.0,alignmentY=0.5,border=,flags=290,maximumSize=,minimumSize=,
preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=java.awt.Insets[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=false,pressedIcon=,
rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=,defaultCapable=true]
and comp's parent is
javax.swing.plaf.synth.SynthInternalFrameTitlePane[InternalFrame.northPane,0,0,300x24,layout=com.sun.java.swing.plaf.gtk.Metacity$TitlePaneLayout,
alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder at 26e3b5d8,flags=8388610,maximumSize=,minimumSize=,preferredSize=]
so "comp.getParent() instanceof BasicInternalFrameTitlePane" check is
satisfied so "comp" becomes SynthInternalFrameTitlePane.
Since SynthInternalFrameTitlePane is not an instance of JInternalFrame
nor JInternalFrame.JDesktopIcon, it results in assertion, so as a fix I
extracted the internalframe from BasicInternalFrameTitlePane.
Regards
Prasanta
On 13-Nov-18 7:56 AM, Sergey Bylokhov wrote:
> Hi, Prasanta.
>
> Can you please provide more details on the hierarchy of components
> which trigger this assertion.
>
> This method is used in 3 places, in two places we try to find the
> child "InternalFrame.northPane"
> and pass it to the findInternalFrame(). But in one place we take a
> "button.getParent()", then pass
> it to the findInternalFrame(), and take the parent one more time:
> "comp.getParent() instanceof BasicInternalFrameTitlePane"
>
> Perhaps one call to "getParent()" is superfluous? What is the
> hierarchy of panes/buttons/internal frames?
>
>
> On 12/11/2018 03:21, Prasanta Sadhukhan wrote:
>> Thanks Muneer for the confirmation. Gentle reminder to review which
>> is pending for over a month now.
>>
>> http://cr.openjdk.java.net/~psadhukhan/8211703/webrev.1/
>>
>> Regards
>> Prasanta
>> On 24-Oct-18 3:13 PM, Muneer Kolarkunnu wrote:
>>> Hi Prasanta,
>>>
>>> I tested with provided binary and issue is resolved with this fix.
>>> Thanks for fixing this issue.
>>>
>>> Regards,
>>> Muneer
>>>
>>> -----Original Message-----
>>> From: Muneer Kolarkunnu
>>> Sent: Wednesday, October 24, 2018 12:00 PM
>>> To: Prasanta Sadhukhan <prasanta.sadhukhan at oracle.com>; Sergey
>>> Bylokhov <sergey.bylokhov at oracle.com>; swing-dev at openjdk.java.net
>>> Subject: Re: <Swing Dev> [12] RFR JDK-8211703: JInternalFrame :
>>> java.lang.AssertionError: cannot find the internal frame
>>>
>>> Hi Prasanta,
>>>
>>> I can verify it if you can share a binary with fix.
>>>
>>> Regards,
>>> Muneer
>>>
>>> -----Original Message-----
>>> From: Prasanta Sadhukhan
>>> Sent: Wednesday, October 24, 2018 11:41 AM
>>> To: Sergey Bylokhov <sergey.bylokhov at oracle.com>;
>>> swing-dev at openjdk.java.net; ABDUL.KOLARKUNNU
>>> <abdul.kolarkunnu at oracle.com>
>>> Subject: Re: <Swing Dev> [12] RFR JDK-8211703: JInternalFrame :
>>> java.lang.AssertionError: cannot find the internal frame
>>>
>>> Hi Muneer,
>>>
>>> Could you check (as a submitter) if the proposed fix works in your
>>> jemmy environment? It seems to work for me with the command line you
>>> gave in JBS.
>>>
>>> Regards
>>> Prasanta
>>> On 22-Oct-18 11:24 AM, Prasanta Sadhukhan wrote:
>>>> Gentle reminder...
>>>>
>>>> Regards
>>>> Prasanta
>>>> On 05-Oct-18 2:31 PM, Prasanta Sadhukhan wrote:
>>>>> Hi Sergey,
>>>>>
>>>>>
>>>>> On 04-Oct-18 11:03 PM, Prasanta Sadhukhan wrote:
>>>>>>
>>>>>> On 04-Oct-18 10:44 PM, Prasanta Sadhukhan wrote:
>>>>>>>
>>>>>>> On 04-Oct-18 10:29 PM, Sergey Bylokhov wrote:
>>>>>>>> On 04/10/2018 09:44, Prasanta Sadhukhan wrote:
>>>>>>>>> Hi Sergey,
>>>>>>>>>
>>>>>>>>> Yes, this method should return JInternalFrame but there is no way
>>>>>>>>> to get JinternalFrame object from BasicInternalFrameTitlePane
>>>>>>>>> currently.
>>>>>>>> But why it is not possible? The BasicInternalFrameTitlePane is a
>>>>>>>> title of the internalFrame and it looks like it should be located
>>>>>>>> somewhere inside the internalFrame, isn't it?
>>>>>>>>
>>>>>>> BasicInternalTitlePane has a protected variable of JInternalFrame
>>>>>>> object and there is no public method to access that so that's why I
>>>>>>> told it is not currently possible unless we add a public method in
>>>>>>> this Basic* class, if I understand it correctly. Let me know if it
>>>>>>> can be accessed some other way.
>>>>>>>
>>>>>> JInternalFrame.getUI().getNorthPane() probably might give
>>>>>> BasicInternalTitlePane object but I do not think we can get
>>>>>> viceversa, ie get JInternalFrame object from BasicInternalTitlePane.
>>>>> I have improved the code to get JInternalFrame from
>>>>> BasicInternalFrameTitlePane, as you have suggested
>>>>> http://cr.openjdk.java.net/~psadhukhan/8211703/webrev.1/
>>>>>
>>>>> Regards
>>>>> Prasanta
>>>>>>> Regards
>>>>>>> Prasanta
>>>>>>>> This Metacity class has the provision of accepting null value from
>>>>>>>> this method
>>>>>>>>> and this assertion problem is caused only when we ran with "esa"
>>>>>>>>> [to enable assertion]. The submitter has not mentioned there is
>>>>>>>>> any failure if we run the without esa, so I have only done away
>>>>>>>>> with the wrong assertion for BasicInternalFrameTitlePane.
>>>>>>>>>
>>>>>>>>> Regards
>>>>>>>>> Prasanta
>>>>>>>>> On 04-Oct-18 9:43 PM, Sergey Bylokhov wrote:
>>>>>>>>>> Hi, Prasanta.
>>>>>>>>>> Can you please clarify this code a little bit. As far as I
>>>>>>>>>> understand this method should return the JInternalFrame, which
>>>>>>>>>> should be accessed via the comp passed to this method. This
>>>>>>>>>> method already has this check:
>>>>>>>>>> if (comp.getParent() instanceof
>>>>>>>>>> BasicInternalFrameTitlePane) {
>>>>>>>>>> comp = comp.getParent();
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> So maybe we can improve it to fetch the JInternalFrame from the
>>>>>>>>>> BasicInternalFrameTitlePane or from another class passed to this
>>>>>>>>>> method?
>>>>>>>>>>
>>>>>>>>>> On 04/10/2018 07:35, Prasanta Sadhukhan wrote:
>>>>>>>>>>> Hi All,
>>>>>>>>>>>
>>>>>>>>>>> Please review a cleanup of the code where wrong assertion is
>>>>>>>>>>> used when Component is an instance of
>>>>>>>>>>> BasicInternalFrameTitlePane.
>>>>>>>>>>>
>>>>>>>>>>> Now, BasicInternalFrameTitlePane is extended from JComponent
>>>>>>>>>>> and not from JInternalFrame so it will never satisfy the
>>>>>>>>>>> if-else condition if "Component is instanceof
>>>>>>>>>>> BasicInternalFrameTitlePane", so proposed fix is to assert only
>>>>>>>>>>> if the component is not an instance of
>>>>>>>>>>> BasicInternalFrameTitlePane
>>>>>>>>>>>
>>>>>>>>>>> diff -r d96a607e9594
>>>>>>>>>>> src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/Meta
>>>>>>>>>>> city.java
>>>>>>>>>>>
>>>>>>>>>>> ---
>>>>>>>>>>> a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/Me
>>>>>>>>>>> tacity.java
>>>>>>>>>>> Tue Sep 18 18:32:03 2018 -0700
>>>>>>>>>>> +++
>>>>>>>>>>> b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/Me
>>>>>>>>>>> tacity.java
>>>>>>>>>>> Thu Oct 04 19:53:10 2018 +0530
>>>>>>>>>>> @@ -337,7 +337,9 @@
>>>>>>>>>>> } else if (comp instanceof
>>>>>>>>>>> JInternalFrame.JDesktopIcon) {
>>>>>>>>>>> return
>>>>>>>>>>> ((JInternalFrame.JDesktopIcon)comp).getInternalFrame();
>>>>>>>>>>> }
>>>>>>>>>>> - assert false : "cannot find the internal frame";
>>>>>>>>>>> + if (!(comp instanceof BasicInternalFrameTitlePane)) {
>>>>>>>>>>> + assert false : "cannot find the internal frame";
>>>>>>>>>>> + }
>>>>>>>>>>> return null;
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> Regards
>>>>>>>>>>> Prasanta
>>>>>>>>>>
>>>>>>>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20181113/2ebbdc53/attachment-0001.html>
More information about the swing-dev
mailing list