Reviewed by Brady Eidson.
authortomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Sep 2006 01:35:04 +0000 (01:35 +0000)
committertomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Sep 2006 01:35:04 +0000 (01:35 +0000)
        Rolled out Maciej's code cleanup from 8/22.  It turns out that keeping the "loading" flag
        is a useful optimization, as it avoids many Objective-C method calls while polling resources
        for their load state.

        This fixes a 3-4% PLT performance regression (as measured on my MacBook Pro).

        * Loader/WebFrameLoader.m:
        (-[WebFrameLoader addPlugInStreamLoader:]):
        (-[WebFrameLoader removePlugInStreamLoader:]):
        (-[WebFrameLoader addSubresourceLoader:]):
        (-[WebFrameLoader removeSubresourceLoader:]):
        * WebView/WebDataSource.m:
        (-[WebDataSourcePrivate dealloc]):
        (-[WebDataSource _prepareForLoadStart]):
        (-[WebDataSource _setLoading:]):
        (-[WebDataSource _updateLoading]):
        (-[WebDataSource _startLoading]):
        (-[WebDataSource _stopLoading]):
        (-[WebDataSource _setPrimaryLoadComplete:]):
        (-[WebDataSource isLoading]):
        * WebView/WebDataSourceInternal.h:

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

WebKit/ChangeLog
WebKit/Loader/WebFrameLoader.m
WebKit/WebView/WebDataSource.m
WebKit/WebView/WebDataSourceInternal.h

index fc73663ed030192b74f6dfa361c35f0d5ed51041..a3081a93e5cd580b53990a314650c09a6f6094b4 100644 (file)
@@ -1,3 +1,29 @@
+2006-09-08  Tim Omernick  <timo@apple.com>
+
+        Reviewed by Brady Eidson.
+
+        Rolled out Maciej's code cleanup from 8/22.  It turns out that keeping the "loading" flag
+        is a useful optimization, as it avoids many Objective-C method calls while polling resources
+        for their load state.
+
+        This fixes a 3-4% PLT performance regression (as measured on my MacBook Pro).
+
+        * Loader/WebFrameLoader.m:
+        (-[WebFrameLoader addPlugInStreamLoader:]):
+        (-[WebFrameLoader removePlugInStreamLoader:]):
+        (-[WebFrameLoader addSubresourceLoader:]):
+        (-[WebFrameLoader removeSubresourceLoader:]):
+        * WebView/WebDataSource.m:
+        (-[WebDataSourcePrivate dealloc]):
+        (-[WebDataSource _prepareForLoadStart]):
+        (-[WebDataSource _setLoading:]):
+        (-[WebDataSource _updateLoading]):
+        (-[WebDataSource _startLoading]):
+        (-[WebDataSource _stopLoading]):
+        (-[WebDataSource _setPrimaryLoadComplete:]):
+        (-[WebDataSource isLoading]):
+        * WebView/WebDataSourceInternal.h:
+
 2006-09-07  Sam Weinig  <sam.weinig@gmail.com>
 
         Reviewed by Darin and Tim H.
index 1c32e3a565147fea46b6108b0ebf03cba10e7c62..ac3a2c4f7afce087b574f3d34b756f68b17a73d0 100644 (file)
     if (!plugInStreamLoaders)
         plugInStreamLoaders = [[NSMutableArray alloc] init];
     [plugInStreamLoaders addObject:loader];
+    [[self activeDataSource] _setLoading:YES];
 }
 
 - (void)removePlugInStreamLoader:(WebLoader *)loader
 {
     [plugInStreamLoaders removeObject:loader];
+    [[self activeDataSource] _updateLoading];
 }    
 
 - (void)setDefersCallbacks:(BOOL)defers
     if (subresourceLoaders == nil)
         subresourceLoaders = [[NSMutableArray alloc] init];
     [subresourceLoaders addObject:loader];
+    [[self activeDataSource] _setLoading:YES];
 }
 
 - (void)removeSubresourceLoader:(WebLoader *)loader
 {
     [subresourceLoaders removeObject:loader];
+    [[self activeDataSource] _updateLoading];
 }
 
 - (NSData *)mainResourceData
index 4b90eecf76a30e07c42de62fd64bfaf5cd7c1672..4886a5a8a7f7a19324e1b88fc03309e7c7d0d8ad 100644 (file)
     // Error associated with main document.
     NSError *mainDocumentError;
     
+    BOOL loading; // self and webView are retained while loading
+    
     BOOL gotFirstByte; // got first byte
     BOOL committed; // This data source has been committed
     BOOL representationFinishedLoading;
 
 - (void)dealloc
 {
+    ASSERT(!loading);
+
     [loadState release];
     
     [representation release];
     // Mark the start loading time.
     _private->loadingStartedTime = CFAbsoluteTimeGetCurrent();
     
+    [self _setLoading:YES];
     [[self _webView] _progressStarted:[self webFrame]];
     [[self _webView] _didStartProvisionalLoadForFrame:[self webFrame]];
     [[[self _webView] _frameLoadDelegateForwarder] webView:[self _webView]
@@ -624,6 +629,19 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     return [_private->unarchivingState archivedResourceForURL:URL];
 }
 
+- (void)_setLoading:(BOOL)loading
+{
+    _private->loading = loading;
+}
+
+- (void)_updateLoading
+{
+    WebFrameLoader *frameLoader = [_private->webFrame _frameLoader];
+    ASSERT(self == [frameLoader activeDataSource]);
+
+    [self _setLoading:[frameLoader isLoading]];
+}
+
 - (void)_startLoading
 {
     [self _prepareForLoadStart];
@@ -640,7 +658,8 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     else
         identifier = [[WebDefaultResourceLoadDelegate sharedResourceLoadDelegate] webView:[self _webView] identifierForInitialRequest:_private->originalRequest fromDataSource:self];
     
-    [[_private->webFrame _frameLoader] startLoadingMainResourceWithRequest:_private->request identifier:identifier];
+    if (![[_private->webFrame _frameLoader] startLoadingMainResourceWithRequest:_private->request identifier:identifier])
+        [self _updateLoading];
 }
 
 - (void)_stopRecordingResponses
@@ -807,7 +826,7 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     if (_private->committed)
         [[self _bridge] stopLoading];
     
-    if (![[_private->webFrame _frameLoader] isLoading])
+    if (!_private->loading)
         return;
     
     [self retain];
@@ -892,6 +911,8 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
             [[_private->webFrame _frameLoader] releaseMainResourceLoader];
         }
         
+        [self _updateLoading];
+
         if ([WebScriptDebugServer listenerCount])
             [[WebScriptDebugServer sharedScriptDebugServer] webView:[[self webFrame] webView] didLoadMainResourceForDataSource:self];
     }
@@ -1122,7 +1143,7 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     // Once a frame has loaded, we no longer need to consider subresources,
     // but we still need to consider subframes.
     if ([[[self webFrame] _frameLoader] state] != WebFrameStateComplete) {
-        if (!_private->primaryLoadComplete && [[_private->webFrame _frameLoader] isLoading])
+        if (!_private->primaryLoadComplete && _private->loading)
             return YES;
         if ([[_private->webFrame _frameLoader] isLoadingSubresources])
             return YES;
index 091194f6990f4f16f2f66dba144e636799d81b68..6059e75f6ef574294001bb1a67d7438471e05922 100644 (file)
 - (void)_setupForReplaceByMIMEType:(NSString *)mimeType;
 - (void)_mainReceivedError:(NSError *)error complete:(BOOL)isComplete;
 - (void)_decidePolicyForMIMEType:(NSString *)MIMEType decisionListener:(WebPolicyDecisionListener *)listener;
-
-
-
+- (void)_setLoading:(BOOL)loading;
+- (void)_updateLoading;
 @end