Reviewed by John.
authorantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Jul 2007 08:10:16 +0000 (08:10 +0000)
committerantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Jul 2007 08:10:16 +0000 (08:10 +0000)
        Fix <rdar://problem/4570550>
        Hang in layout/layoutBlock/layoutBlockChildren preparing to print certain Mail messages

        When printing from Mail, WebHTMLView is a subview of the view that is actually printed and does not
        receive calls that would set it to printing mode. Method adjustPageHeightNew is called repeatedly (for each page) during
        printing and it enables printing mode temporarily for each call. This triggers two full style recalcs and layouts
        each time making printing at least O(n^2).

        Instead of enabling printing mode and resetting it back immediatly do the resetting asynchronously, after
        all adjustPageHeightNew calls are done. Normal Safari printing is not affected as adjustPageHeightNew is only
        called in case WebHTMLView is embedded in the view that is being printed.

        No automatic test possible, requires printing and non-Safari client.

        * WebView/WebHTMLView.mm:
        (-[WebHTMLView adjustPageHeightNew:top:bottom:limit:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@24186 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/WebView/WebHTMLView.mm

index ffacde4c6db959aef9aca5cb098a5d39b29f28e2..893efbd7f4d4b043f485953080fa23310b507eee 100644 (file)
@@ -1,3 +1,24 @@
+2007-07-10  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by John.
+        
+        Fix <rdar://problem/4570550>
+        Hang in layout/layoutBlock/layoutBlockChildren preparing to print certain Mail messages
+        
+        When printing from Mail, WebHTMLView is a subview of the view that is actually printed and does not 
+        receive calls that would set it to printing mode. Method adjustPageHeightNew is called repeatedly (for each page) during
+        printing and it enables printing mode temporarily for each call. This triggers two full style recalcs and layouts
+        each time making printing at least O(n^2). 
+
+        Instead of enabling printing mode and resetting it back immediatly do the resetting asynchronously, after
+        all adjustPageHeightNew calls are done. Normal Safari printing is not affected as adjustPageHeightNew is only
+        called in case WebHTMLView is embedded in the view that is being printed.
+        
+        No automatic test possible, requires printing and non-Safari client.
+        
+        * WebView/WebHTMLView.mm:
+        (-[WebHTMLView adjustPageHeightNew:top:bottom:limit:]):
+
 2007-07-10  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Maciej Stachowiak.
index 3b4ea18b49672649b9ed82b454bb4caa3d3a90a1..7da183aac006adf5af3ff6c7d602f7d05c657cac 100644 (file)
@@ -3075,8 +3075,15 @@ noPromisedData:
 
     [[self _bridge] adjustPageHeightNew:newBottom top:oldTop bottom:oldBottom limit:bottomLimit];
     
-    if (!wasInPrintingMode)
-        [self _setPrinting:NO minimumPageWidth:0.0f maximumPageWidth:0.0f adjustViewSize:NO];
+    if (!wasInPrintingMode) {
+        NSPrintOperation *currenPrintOperation = [NSPrintOperation currentOperation];
+        if (currenPrintOperation)
+            // delay _setPrinting:NO until back to main loop as this method may get called repeatedly
+            [self performSelector:@selector(_delayedEndPrintMode:) withObject:currenPrintOperation afterDelay:0];
+        else
+            // not sure if this is actually ever invoked, it probably shouldn't be
+            [self _setPrinting:NO minimumPageWidth:0.0f maximumPageWidth:0.0f adjustViewSize:NO];
+    }
 }
 
 - (float)_availablePaperWidthForPrintOperation:(NSPrintOperation *)printOperation