Reviewed by Maciej.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 7 Oct 2006 00:36:13 +0000 (00:36 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 7 Oct 2006 00:36:13 +0000 (00:36 +0000)
        - moved firstLayoutDone BOOL from WebFrame to WebFrameLoader

        * Loader/WebFrameLoader.h:
        * Loader/WebFrameLoader.m:
        (-[WebFrameLoader didFirstLayout]):
        (-[WebFrameLoader provisionalLoadStarted]):
        (-[WebFrameLoader frameLoadCompleted]):
        (-[WebFrameLoader firstLayoutDone]):
        * WebCoreSupport/WebFrameBridge.m: (-[WebFrameBridge didFirstLayout]):
        * WebView/WebFrame.m:
        (-[WebFrame _firstLayoutDone]):
        (-[WebFrame _provisionalLoadStarted]):
        (-[WebFrame _frameLoadCompleted]):
        (-[WebFrame _restoreScrollPositionAndViewState]):
        * WebView/WebFrameInternal.h:

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

WebKit/ChangeLog
WebKit/Loader/WebFrameLoader.h
WebKit/Loader/WebFrameLoader.m
WebKit/WebCoreSupport/WebFrameBridge.m
WebKit/WebView/WebFrame.m
WebKit/WebView/WebFrameInternal.h

index 97033d638fc38513ea7f724c90a1de9b21d857c6..0cefcd3e4605595500380b478a860ea65bdb2473 100644 (file)
@@ -1,3 +1,23 @@
+2006-10-06  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
+        - moved firstLayoutDone BOOL from WebFrame to WebFrameLoader
+
+        * Loader/WebFrameLoader.h:
+        * Loader/WebFrameLoader.m:
+        (-[WebFrameLoader didFirstLayout]):
+        (-[WebFrameLoader provisionalLoadStarted]):
+        (-[WebFrameLoader frameLoadCompleted]):
+        (-[WebFrameLoader firstLayoutDone]):
+        * WebCoreSupport/WebFrameBridge.m: (-[WebFrameBridge didFirstLayout]):
+        * WebView/WebFrame.m:
+        (-[WebFrame _firstLayoutDone]):
+        (-[WebFrame _provisionalLoadStarted]):
+        (-[WebFrame _frameLoadCompleted]):
+        (-[WebFrame _restoreScrollPositionAndViewState]):
+        * WebView/WebFrameInternal.h:
+
 2006-10-06  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 4dc9fe33b64fb4b616441379872609e857cb4097..87815bfdeb6986b04cea48e75585a32c3af6412f 100644 (file)
@@ -88,6 +88,8 @@ typedef enum {
     BOOL delegateIsHandlingProvisionalLoadError;
     BOOL delegateIsDecidingNavigationPolicy;
     BOOL delegateIsHandlingUnimplementablePolicy;
+
+    BOOL firstLayoutDone;
 }
 
 - (id)initWithClient:(WebFrame <WebFrameLoaderClient> *)wf;
@@ -124,6 +126,8 @@ typedef enum {
 - (void)clearDataSource;
 - (void)setupForReplace;
 + (CFAbsoluteTime)timeOfLastCompletedLoad;
+- (void)provisionalLoadStarted;
+- (void)frameLoadCompleted;
 
 - (WebResource *)_archivedSubresourceForURL:(NSURL *)URL;
 - (BOOL)defersCallbacks;
@@ -208,4 +212,7 @@ typedef enum {
 - (void)loadDataSource:(WebDataSource *)newDataSource withLoadType:(WebFrameLoadType)loadType formState:(WebFormState *)formState;
 - (void)handleUnimplementablePolicyWithErrorCode:(int)code forURL:(NSURL *)URL;
 
+- (void)didFirstLayout;
+- (BOOL)firstLayoutDone;
+
 @end
index 57e06c14c41ac58410588e8fa43db6d12e3aa8b3..43c27bc7c15d2566aedb68ba98cc5fe6fa270f72 100644 (file)
@@ -1266,4 +1266,34 @@ static BOOL isCaseInsensitiveEqual(NSString *a, NSString *b)
     delegateIsHandlingProvisionalLoadError = is;
 }
 
+- (void)didFirstLayout
+{
+    if ([[client webView] backForwardList]) {
+        if (loadType == WebFrameLoadTypeForward || loadType == WebFrameLoadTypeBack || loadType == WebFrameLoadTypeIndexedBackForward)
+            [client _restoreScrollPositionAndViewState];
+    }
+    
+    firstLayoutDone = YES;
+
+    WebView *wv = [client webView];
+    [[wv _frameLoadDelegateForwarder] webView:wv didFirstLayoutInFrame:client];
+}
+
+- (void)provisionalLoadStarted
+{
+    firstLayoutDone = NO;
+}
+
+- (void)frameLoadCompleted
+{
+    // After a canceled provisional load, firstLayoutDone is NO. Reset it to YES if we're displaying a page.
+    if ([self dataSource])
+        firstLayoutDone = YES;
+}
+
+- (BOOL)firstLayoutDone
+{
+    return firstLayoutDone;
+}
+
 @end
index b10766261ddd87306cef648fdd70351142ae1e22..d972e8cd417f99302f4a54164053a7df96e84783 100644 (file)
@@ -1521,9 +1521,7 @@ static id <WebFormDelegate> formDelegate(WebFrameBridge *self)
 
 - (void)didFirstLayout
 {
-    [_frame _didFirstLayout];
-    WebView *wv = [self webView];
-    [[wv _frameLoadDelegateForwarder] webView:wv didFirstLayoutInFrame:_frame];
+    [[_frame _frameLoader] didFirstLayout];
 }
 
 - (BOOL)_compareDashboardRegions:(NSDictionary *)regions
index ebce0b6fb75b1375c1652cc0858435be1be0817f..7e2b72f2134fa5c59b6428716c1167cbc398a709 100644 (file)
@@ -109,7 +109,6 @@ NSString *WebPageCacheDocumentViewKey = @"WebPageCacheDocumentViewKey";
 - (NSDictionary *)_actionInformationForLoadType:(WebFrameLoadType)loadType isFormSubmission:(BOOL)isFormSubmission event:(NSEvent *)event originalURL:(NSURL *)URL;
 
 - (void)_saveScrollPositionAndViewStateToItem:(WebHistoryItem *)item;
-- (void)_restoreScrollPositionAndViewState;
 
 - (WebHistoryItem *)_createItem: (BOOL)useOriginal;
 - (WebHistoryItem *)_createItemTreeWithTargetFrame:(WebFrame *)targetFrame clippedAtTarget:(BOOL)doClip;
@@ -156,7 +155,6 @@ NSString *WebPageCacheDocumentViewKey = @"WebPageCacheDocumentViewKey";
     BOOL quickRedirectComing;
     BOOL sentRedirectNotification;
     BOOL isStoppingLoad;
-    BOOL firstLayoutDone;
 }
 
 - (void)setWebFrameView:(WebFrameView *)v;
@@ -1596,35 +1594,6 @@ exit:
     }
 }
 
-/*
-    There is a race condition between the layout and load completion that affects restoring the scroll position.
-    We try to restore the scroll position at both the first layout and upon load completion.
-
-    1) If first layout happens before the load completes, we want to restore the scroll position then so that the
-       first time we draw the page is already scrolled to the right place, instead of starting at the top and later
-       jumping down.  It is possible that the old scroll position is past the part of the doc laid out so far, in
-       which case the restore silent fails and we will fix it in when we try to restore on doc completion.
-    2) If the layout happens after the load completes, the attempt to restore at load completion time silently
-       fails.  We then successfully restore it when the layout happens.
- */
-
-- (void)_restoreScrollPositionAndViewState
-{
-    ASSERT([_private currentItem]);
-    NSView <WebDocumentView> *docView = [[self frameView] documentView];
-    NSPoint point = [[_private currentItem] scrollPoint];
-    if ([docView conformsToProtocol:@protocol(_WebDocumentViewState)]) {        
-        id state = [[_private currentItem] viewState];
-        if (state) {
-            [(id <_WebDocumentViewState>)docView setViewState:state];
-        }
-        
-        [(id <_WebDocumentViewState>)docView setScrollPoint:point];
-    } else {
-        [docView scrollPoint:point];
-    }
-}
-
 - (void)_defersCallbacksChanged
 {
     for (WebFrame *frame = self; frame; frame = [frame _traverseNextFrameStayWithin:self])
@@ -1821,7 +1790,7 @@ exit:
 
 - (BOOL)_firstLayoutDone
 {
-    return _private->firstLayoutDone;
+    return [_private->frameLoader firstLayoutDone];
 }
 
 @end
@@ -1986,22 +1955,6 @@ exit:
         [[frame _bridge] unmarkAllMisspellings];
 }
 
-- (void)_didFirstLayout
-{
-    if ([[self webView] backForwardList]) {
-        WebFrameLoadType loadType = [_private->frameLoader loadType];
-        if (loadType == WebFrameLoadTypeForward ||
-            loadType == WebFrameLoadTypeBack ||
-            loadType == WebFrameLoadTypeIndexedBackForward)
-        {
-            [self _restoreScrollPositionAndViewState];
-        }
-    }
-    
-    _private->firstLayoutDone = YES;
-}
-
-
 - (BOOL)_hasSelection
 {
     id documentView = [[self frameView] documentView];    
@@ -2153,7 +2106,7 @@ exit:
 
 - (void)_provisionalLoadStarted
 {
-    _private->firstLayoutDone = NO;
+    [_private->frameLoader provisionalLoadStarted];
     [_private->bridge provisionalLoadStarted];
     
     // FIXME: This is OK as long as no one resizes the window,
@@ -2169,17 +2122,16 @@ exit:
     WebHistoryItem *item = [_private currentItem];
     WebFrameLoadType loadType = [_private->frameLoader loadType];
     if ([self _canCachePage]
-        && [_private->bridge canCachePage]
-    && item
-    && !_private->quickRedirectComing
-    && loadType != WebFrameLoadTypeReload 
-    && loadType != WebFrameLoadTypeReloadAllowingStaleData
-    && loadType != WebFrameLoadTypeSame
-    && ![[self dataSource] isLoading]
-    && ![[_private->frameLoader documentLoadState] isStopping]) {
+            && [_private->bridge canCachePage]
+            && item
+            && !_private->quickRedirectComing
+            && loadType != WebFrameLoadTypeReload 
+            && loadType != WebFrameLoadTypeReloadAllowingStaleData
+            && loadType != WebFrameLoadTypeSame
+            && ![[self dataSource] isLoading]
+            && ![[_private->frameLoader documentLoadState] isStopping]) {
         if ([[[self dataSource] representation] isKindOfClass: [WebHTMLRepresentation class]]) {
             if (![item pageCache]){
-                
                 // Add the items to this page's cache.
                 if ([self _createPageCacheForItem:item]) {
                     LOG(PageCache, "Saving page to back/forward cache, %@\n", [[self dataSource] _URL]);
@@ -2235,9 +2187,7 @@ exit:
     if ([[self webView] drawsBackground])
         [sv setDrawsBackground:YES];
     [_private setPreviousItem:nil];
-    // After a canceled provisional load, firstLayoutDone is NO. Reset it to YES if we're displaying a page.
-    if ([_private->frameLoader dataSource])
-        _private->firstLayoutDone = YES;
+    [_private->frameLoader frameLoadCompleted];
 }
 
 - (WebDataSource *)_dataSourceForDocumentLoadState:(WebDocumentLoadState *)loadState
@@ -2256,6 +2206,35 @@ exit:
     return loadState;
 }
 
+/*
+    There is a race condition between the layout and load completion that affects restoring the scroll position.
+    We try to restore the scroll position at both the first layout and upon load completion.
+
+    1) If first layout happens before the load completes, we want to restore the scroll position then so that the
+       first time we draw the page is already scrolled to the right place, instead of starting at the top and later
+       jumping down.  It is possible that the old scroll position is past the part of the doc laid out so far, in
+       which case the restore silent fails and we will fix it in when we try to restore on doc completion.
+    2) If the layout happens after the load completes, the attempt to restore at load completion time silently
+       fails.  We then successfully restore it when the layout happens.
+ */
+
+- (void)_restoreScrollPositionAndViewState
+{
+    ASSERT([_private currentItem]);
+    NSView <WebDocumentView> *docView = [[self frameView] documentView];
+    NSPoint point = [[_private currentItem] scrollPoint];
+    if ([docView conformsToProtocol:@protocol(_WebDocumentViewState)]) {        
+        id state = [[_private currentItem] viewState];
+        if (state) {
+            [(id <_WebDocumentViewState>)docView setViewState:state];
+        }
+        
+        [(id <_WebDocumentViewState>)docView setScrollPoint:point];
+    } else {
+        [docView scrollPoint:point];
+    }
+}
+
 @end
 
 @implementation WebFormState : NSObject
index ef4fca541ef7e336dbb53948e225b066b0d7b352..423b2a2b48b22c0bc044b2b04f29b0e2a096df8b 100644 (file)
@@ -56,7 +56,6 @@
 - (void)_setInternalLoadDelegate:(id)internalLoadDelegate;
 - (id)_internalLoadDelegate;
 - (void)_unmarkAllMisspellings;
-- (void)_didFirstLayout;
 // Note that callers should not perform any ops on these views that could change the set of frames
 - (NSArray *)_documentViews;
 
@@ -91,6 +90,8 @@
 - (WebDocumentLoadState *)_createDocumentLoadStateWithRequest:(NSURLRequest *)request;
 - (void)_didReceiveServerRedirectForProvisionalLoadForFrame;
 
+- (void)_restoreScrollPositionAndViewState;
+
 @end
 
 @interface NSObject (WebInternalFrameLoadDelegate)