[webkit-reviews] patch for webview bustage after trying to print
invalid page range
John Sullivan
sullivan at apple.com
Mon Jun 13 16:34:19 PDT 2005
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/webkit-reviews/attachments/20050613/6d159f48/attachment.html
More information about the webkit-reviews
mailing list