<Swing Dev> [12] RFR JDK-8211703: JInternalFrame : java.lang.AssertionError: cannot find the internal frame
Prasanta Sadhukhan
prasanta.sadhukhan at oracle.com
Tue May 21 05:21:25 UTC 2019
PS: Since this is causing few tests to fail in headful nightly, I wish
to get this reviewed and committed soon.
Regards
Prasanta
On 20-May-19 3:19 PM, Prasanta Sadhukhan wrote:
> Hi Sergey,
>
> I have unified approach to get InternalFrame from button. Since
> updateFrameGeometry() was called with
> "javax.swing.plaf.basic.BasicInternalFrameTitlePane$NoFocusButton"
> component whose parent does not have internal frame,it was asserting
> so as done in paintButtonBackground(), updateFrameGeometry() is
> modified to check if the comp is JButton ,then extract the titlePane
> and use titlePane's parent to find internalFrame.
> http://cr.openjdk.java.net/~psadhukhan/8211703/webrev.2/
>
> Regards
> Prasanta
> On 14-Nov-18 2:01 AM, Sergey Bylokhov wrote:
>> On 13/11/2018 01:25, Prasanta Sadhukhan wrote:
>>> 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.
>>
>> But in these cases it is used in a little bit different ways, take a
>> look to the paintButtonBackground().
>>
>> - In first line we will call updateFrameGeometry(), and inside:
>> 1. We will call "comp = context.getComponent()"
>> 2. Then will try to find titlePane using findChild() - I guess it
>> will always fail for button.
>> 3. Then we pass the comp to the findInternalFrame
>> - After that we return to the paintButtonBackground and:
>> 1. We will call "button = context.getComponent()"
>> 2. We will take a "titlePane = (JComponent)button.getParent()";
>> NOTE: It is different that in "updateFrameGeometry"
>> 3. Then we will take titlePaneParent from the titlepane
>> 4. Then we pass the titlePaneParent to the findInternalFrame
>>
>> Note that context in both cases is the same, but we pass different
>> components to findInternalFrame.
>> I tried to move the call of findInternalFrame in the
>> paintButtonBackground before
>> updateFrameGeometry(to compare the second and first approaches) and
>> it is completes successfully. So it
>> seems we need to unify approach on how we get a InternalFrame from
>> the button.
>>
>> Can you please check this.
>>
>>
>>>
>>> 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
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>
More information about the swing-dev
mailing list