[webkit-reviews] patch for webview bustage after trying to print invalid page range

John Sullivan sullivan at apple.com
Mon Jun 13 17:04:35 PDT 2005


Dave Harrison had a potential robustness enhancement that I'm going  
to try before I land this. I did test and verify that both formerly- 
working and formerly-failing cases work now.

John

On Jun 13, 2005, at 4:57 PM, Maciej Stachowiak wrote:

>
> Assuming you tested, r=me.
>
> On Jun 13, 2005, at 4:34 PM, John Sullivan wrote:
>
>> 2005-06-13  John Sullivan  <sullivan at apple.com>
>>
>>         Reviewed by NOBODY (OOPS!).
>>
>>         - fixed <rdar://problem/4145905> WebView: Attempting to  
>> print an invalid page range
>>         results in unusable window
>>
>>         * WebView.subproj/WebHTMLView.m:
>>         (-[WebHTMLView _endPrintMode:]):
>>         new method, extracted from identical code in beginDocument  
>> and endDocument. This method must be called
>>         once to counterbalance the code called from knowsPageRange  
>> that turns on "printing mode".
>>         (-[WebHTMLView knowsPageRange:]):
>>         after turning on "printing mode", queue up a delayed call  
>> to _endPrintMode:. If there's an early
>>         error in the print mechanism such that beginDocument is  
>> never called, this will cleanly end "printing
>>         mode" and make the webview usable again.
>>         (-[WebHTMLView beginDocument]):
>>         cancel any delayed call to _endPrintMode:. If we get this  
>> far along in printing, then we don't need
>>         the failsafe call to _endPrintMode: that was set up in  
>> knowsPageRange:. Also, call extracted method
>>         (-[WebHTMLView endDocument]):
>>         call extracted method
>>
>> Index: WebView.subproj/WebHTMLView.m
>> ===================================================================
>> RCS file: /cvs/root/WebKit/WebView.subproj/WebHTMLView.m,v
>> retrieving revision 1.449
>> diff -u -r1.449 WebHTMLView.m
>> --- WebView.subproj/WebHTMLView.m    13 Jun 2005 03:28:08 -0000     
>> 1.449
>> +++ WebView.subproj/WebHTMLView.m    13 Jun 2005 23:11:42 -0000
>> @@ -3148,6 +3148,11 @@
>>      [self _setPrinting:YES minimumPageWidth:pageWidth  
>> maximumPageWidth:pageWidth adjustViewSize:YES];
>> }
>> +- (void)_endPrintMode:(id)unused
>> +{
>> +    [self _setPrinting:NO minimumPageWidth:0.0 maximumPageWidth: 
>> 0.0 adjustViewSize:YES];
>> +    [[self window] setAutodisplay:YES];
>> +}
>> // Return the number of pages available for printing
>> - (BOOL)knowsPageRange:(NSRangePointer)range {
>> @@ -3166,6 +3171,11 @@
>>          maxLayoutWidth = paperWidth*PrintingMaximumShrinkFactor;
>>      }
>>      [self _setPrinting:YES minimumPageWidth:minLayoutWidth  
>> maximumPageWidth:maxLayoutWidth adjustViewSize:YES]; // will relayout
>> +    // Certain types of errors, including invalid page ranges,  
>> can cause beginDocument and
>> +    // endDocument to be skipped after we've put ourselves in  
>> print mode (see 4145905). In those cases
>> +    // we need to get out of print mode without relying on any  
>> more callbacks from the printing mechanism.
>> +    // If we get as far as beginDocument without trouble, then  
>> this delayed request will be cancelled.
>> +    [self performSelector:@selector(_endPrintMode:)  
>> withObject:nil afterDelay:0];
>>      [[self _webView] _adjustPrintingMarginsForHeaderAndFooter];
>>
>>      // There is a theoretical chance that someone could do some  
>> drawing between here and endDocument,
>> @@ -3207,12 +3217,16 @@
>> - (void)beginDocument
>> {
>>      NS_DURING
>> +        // From now on we'll get a chance to call _endPrintMode:  
>> in either beginDocument or
>> +        // endDocument, so we can cancel the "just in case"  
>> pending call.
>> +        [NSObject cancelPreviousPerformRequestsWithTarget:self
>> +                                                  
>> selector:@selector(_endPrintMode:)
>> +                                                   object:nil];
>>          [super beginDocument];
>>      NS_HANDLER
>>          // Exception during [super beginDocument] means that  
>> endDocument will not get called,
>>          // so we need to clean up our "print mode" here.
>> -        [self _setPrinting:NO minimumPageWidth:0.0  
>> maximumPageWidth:0.0 adjustViewSize:YES];
>> -        [[self window] setAutodisplay:YES];
>> +        [self _endPrintMode:nil];
>>      NS_ENDHANDLER
>> }
>> @@ -3220,8 +3234,7 @@
>> {
>>      [super endDocument];
>>      // Note sadly at this point [NSGraphicsContext  
>> currentContextDrawingToScreen] is still NO
>> -    [self _setPrinting:NO minimumPageWidth:0.0 maximumPageWidth: 
>> 0.0 adjustViewSize:YES];
>> -    [[self window] setAutodisplay:YES];
>> +    [self _endPrintMode:nil];
>> }
>> - (BOOL)_interceptEditingKeyEvent:(NSEvent *)event
>>
>> _______________________________________________
>> webkit-reviews mailing list
>> webkit-reviews at opendarwin.org
>> http://www.opendarwin.org/mailman/listinfo/webkit-reviews
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/webkit-reviews/attachments/20050613/4977bbdb/attachment.html


More information about the webkit-reviews mailing list