[OpenJDK 2D-Dev] [9] RFR: JDK-8066139, , Null return from PrintJob.getGraphics() running closed/java/awt/PrintJob/HighResTest/HighResTest.java
prasanta sadhukhan
prasanta.sadhukhan at oracle.com
Mon Mar 14 10:33:58 UTC 2016
Gentle reminder .
Regards
Prasanta
On 3/10/2016 4:04 PM, prasanta sadhukhan wrote:
> Hi Phil,
>
> Please find the modified webrev
> http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.02/
>
> I tested in Mac too but there it seems to be working (ie no NPE)
> without and with this fix.
> For issue seen on windows , I have raised a bug JDK-8151589
> <https://bugs.openjdk.java.net/browse/JDK-8151589> (strangely it is
> not seen in jdk1.8.0_76 but seen from 1.9.0-ea-b01 onwards, can you
> tell me what is the release version before b01?]
>
> Regards
> Prasanta
> On 3/8/2016 9:45 PM, Philip Race wrote:
>> > However, I am finding a strange issue with and without this fix
>> too. The "Center" string is not printed
>>
>> Sounds completely unrelated to anything to do with the NPE bug.
>>
>> It is probably appropriate to file that as a separate bug.
>> No big surprise that the behaviour is platform-specific as there
>> is a lot of difference in Windows vs Linux (or vs Mac) in the
>> printing code.
>>
>> -phil.
>>
>> On 3/8/16, 2:30 AM, prasanta sadhukhan wrote:
>>>
>>>
>>> On 3/8/2016 2:17 AM, Phil Race wrote:
>>>> I don't think starting a new thread can be right. That would re-invoke
>>>> printerJob.print() which even if you can reuse a PrinterJob
>>>> (something that
>>>> was never set out in spec.) you are surely getting a new spool job
>>>> .. not
>>>> a continuation. There a couple of other things I am not sure about
>>>> either.
>>>>
>>>> I've looked into this - only on Linux - and I believe the issue is that
>>>> the test program has decided up-front how many pages it is going to
>>>> print and it is paying no attention to the selected page ranges.
>>>> Not what the 'user' asked for but it is perfectly within its rights
>>>> to do so.
>>>>
>>>> However the 2D PrinterJob operates in a way where it calls back
>>>> asking for the specific pages it wants to be printed and there the
>>>> app. must comply. The PrinterJob terminates once it has done.
>>>>
>>>> In the case when the 2D PrinterJob is being used to 'run' a
>>>> PrintJob then it must *never* return until the application has
>>>> called "end" - or some exception occurs.
>>>>
>>>> So we need to remove the elements that will cause the job to exit.
>>>>
>>>> --- a/src/java.desktop/share/classes/sun/print/PrintJob2D.java
>>>> +++ b/src/java.desktop/share/classes/sun/print/PrintJob2D.java
>>>> @@ -995,6 +995,7 @@
>>>> public void run() {
>>>>
>>>> try {
>>>> + attributes.remove(PageRanges.class);
>>>> printerJob.print(attributes);
>>>> } catch (PrinterException e) {
>>>> //REMIND: need to store this away and not rethrow it.
>>>> diff --git
>>>> a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> --- a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> +++ b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> @@ -1172,6 +1172,7 @@
>>>> pageRangesAttr = (PageRanges)attributes.get(PageRanges.class);
>>>> if (!isSupportedValue(pageRangesAttr, attributes)) {
>>>> pageRangesAttr = null;
>>>> + setPageRange(-1, -1);
>>>> } else {
>>>> if
>>>> ((SunPageSelection)attributes.get(SunPageSelection.class)
>>>> == SunPageSelection.RANGE) {
>>>>
>>>>
>>>> This works for me on Linux although
>>>> a) I have not tried Windows)
>>> I tried on windows. The NPE is not seen and it prints 2 pages.
>>> However, I am finding a strange issue with and without this fix too.
>>> The "Center" string is not printed in the 1st page in both
>>> "Portrait" and "Landscape" mode (although the rectangles are
>>> printed) but is printed in the 2nd page.
>>> I do not find this issue in linux.
>>>
>>> Regards
>>> Prasanta
>>>> b) I have not verified if there are no negative consequences from
>>>> the 2nd change.
>>>>
>>>> -phil.
>>>>
>>>> On 03/01/2016 03:14 AM, prasanta sadhukhan wrote:
>>>>> Hi Phil,
>>>>>
>>>>> Please find an updated webrev:
>>>>> http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.01/
>>>>>
>>>>> It seems if printerJobThread finished printing, it will set
>>>>> graphicsToBeDrawn/graphicsDrawn ArrayList to null resulting in
>>>>> getGraphics() returning null in the 2nd iteration causing NPE so
>>>>> I have modified printerJobThread#run so that when it has finished
>>>>> printing, do not set the arrayList to null but set a flag. In
>>>>> getGraphics(), I check that flag and start a new printerJobThread
>>>>> to handle the next printing.
>>>>> I have tested "All" and "Pages" selection.
>>>>>
>>>>> Regards
>>>>> Prasanta
>>>>> On 2/22/2016 1:35 PM, Philip Race wrote:
>>>>>> > It seems this behaviour is same in linux too for this
>>>>>> HighResTest testcase.
>>>>>>
>>>>>> OK that is good information .. so is not really a regression from
>>>>>> 8061267 <https://bugs.openjdk.java.net/browse/JDK-8061267> as
>>>>>> that is not in
>>>>>> any way touching linux .. it is a pre-existing issue in a code
>>>>>> path that was not being tested.
>>>>>>
>>>>>> -phil.
>>>>>>
>>>>>> On 2/22/16, 11:59 AM, prasanta sadhukhan wrote:
>>>>>>> Hi Phil,
>>>>>>>
>>>>>>> >>Additionally, have you tried running the original test case
>>>>>>> provided with 8061267
>>>>>>> >> against your fix ?
>>>>>>> The 8061267 testcase behaves similarly before and after my fix.
>>>>>>>
>>>>>>> >> If I manually select it, (ie select that "Pages" radio
>>>>>>> button) then press print,
>>>>>>> >> then voila, the NPE is back!
>>>>>>> It seems this behaviour is same in linux too for this
>>>>>>> HighResTest testcase.
>>>>>>>
>>>>>>> Regards
>>>>>>> Prasanta
>>>>>>> On 2/20/2016 1:55 AM, Phil Race wrote:
>>>>>>>> I am having trouble building JDK 9 at the moment so i applied
>>>>>>>> 8061267 to jdk8u-dev
>>>>>>>> and was able to reproduce the regression and have a couple of
>>>>>>>> observations
>>>>>>>>
>>>>>>>> - I am now seeing the NPE after the first page as you did ..
>>>>>>>> puzzling.
>>>>>>>> - I next applied your fix but still see the NPE !
>>>>>>>>
>>>>>>>> It appears that all your fix did is stop the "PD_PAGENUMS"
>>>>>>>> flag being automatically
>>>>>>>> set. If I manually select it, (ie select that "Pages" radio
>>>>>>>> button) then press print,
>>>>>>>> then voila, the NPE is back!
>>>>>>>>
>>>>>>>> -phil.
>>>>>>>>
>>>>>>>>
>>>>>>>> On 02/19/2016 10:53 AM, Phil Race wrote:
>>>>>>>>> I am not sure I can be correctly understanding the fix as the
>>>>>>>>> ramification seems
>>>>>>>>> to be that if the users wants to print only Page 3 of a 10
>>>>>>>>> page document and so sets
>>>>>>>>> from page=3 and to page=3, that this request will be ignored
>>>>>>>>> and all pages will
>>>>>>>>> be printed .. can you test such a scenario.
>>>>>>>>>
>>>>>>>>> Additionally, have you tried running the original test case
>>>>>>>>> provided with 8061267
>>>>>>>>> against your fix ?
>>>>>>>>>
>>>>>>>>> Also when I ran the HighResTest on a current build I saw a
>>>>>>>>> null graphics on
>>>>>>>>> the very first call to getGraphics() which is different than
>>>>>>>>> what I interpret
>>>>>>>>> you as saying - you see the null *after* the first page is
>>>>>>>>> printed.
>>>>>>>>>
>>>>>>>>> -phil.
>>>>>>>>>
>>>>>>>>> On 02/19/2016 01:18 AM, prasanta sadhukhan wrote:
>>>>>>>>>> Hi Phil, All,
>>>>>>>>>>
>>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8066139
>>>>>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.00/
>>>>>>>>>>
>>>>>>>>>> It was seen after fix of JDK-8061267
>>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8061267>:
>>>>>>>>>> PrinterJob: Specified Page Ranges not displayed in Windows
>>>>>>>>>> Native Print Dialog
>>>>>>>>>> the closed/java/awt/PrintJob/HighResTest/HighResTest.java was
>>>>>>>>>> failing with NPE when PrinterJob.getGraphics() is called the
>>>>>>>>>> 2nd time before calling PrinterJob.end().
>>>>>>>>>>
>>>>>>>>>> The above fix caused this regression because it sets the
>>>>>>>>>> PD_PAGENUMS flag for windows PrintDlg struct which causes
>>>>>>>>>> *Pages* radio button to be selected in print dialog.
>>>>>>>>>> However, fromPage and toPage was both set to 1 so after the
>>>>>>>>>> 1st page is printed, RasterPrinterJob.print(attributes)
>>>>>>>>>> finishes and graphicsToBeDrawn.closeWhenEmpty() gets called
>>>>>>>>>> http://hg.openjdk.java.net/jdk9/client/jdk/file/d8def65c6c00/src/java.desktop/share/classes/sun/print/PrintJob2D.java#l1006
>>>>>>>>>>
>>>>>>>>>> which sets the queue to null so when
>>>>>>>>>> PrinterJob2D#getGraphics() calls graphicsToBeDrawn.pop() it
>>>>>>>>>> sees queue to be null and sets graphics object to be null so
>>>>>>>>>> PrinterJob.getGraphics() gets null and g.drawLine in testcase
>>>>>>>>>> causes NPE since g is null.
>>>>>>>>>>
>>>>>>>>>> Fix was done to set the PD_PAGENUMS flag only when toPage is
>>>>>>>>>> more than fromPage in which case, "All" will be selected in
>>>>>>>>>> printer dialog and RasterPrinterJob.print() will finish only
>>>>>>>>>> after printing all the pages.
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>> Prasanta
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/2d-dev/attachments/20160314/588b8db3/attachment.html>
More information about the 2d-dev
mailing list