Reviewed by Adele.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Jun 2006 18:48:23 +0000 (18:48 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Jun 2006 18:48:23 +0000 (18:48 +0000)
        - start moving loading logic to new WebFrameLoader class; move management of WebLoaders there

        * Misc/WebIconLoader.h:
        * Misc/WebIconLoader.m:
        (-[WebIconLoader didFinishLoading]):
        * WebKit.xcodeproj/project.pbxproj:
        * WebView/WebDataSource.m:
        (-[WebDataSourcePrivate dealloc]):
        (-[WebDataSource _updateLoading]):
        (-[WebDataSource _loadIcon]):
        (-[WebDataSource _setPrimaryLoadComplete:]):
        (-[WebDataSource _stopLoading]):
        (-[WebDataSource _startLoading]):
        (-[WebDataSource _addSubresourceLoader:]):
        (-[WebDataSource _removeSubresourceLoader:]):
        (-[WebDataSource _addPlugInStreamLoader:]):
        (-[WebDataSource _removePlugInStreamLoader:]):
        (-[WebDataSource _iconLoaderReceivedPageIcon:]):
        (-[WebDataSource _defersCallbacksChanged]):
        (-[WebDataSource _stopLoadingWithError:]):
        (-[WebDataSource _setupForReplaceByMIMEType:]):
        (-[WebDataSource initWithRequest:]):
        (-[WebDataSource dealloc]):
        (-[WebDataSource finalize]):
        (-[WebDataSource data]):
        (-[WebDataSource isLoading]):
        * WebView/WebFrameLoader.h: Added.
        * WebView/WebFrameLoader.m: Added.
        (-[WebFrameLoader initWithDataSource:]):
        (-[WebFrameLoader dealloc]):
        (-[WebFrameLoader hasIconLoader]):
        (-[WebFrameLoader loadIconWithRequest:]):
        (-[WebFrameLoader stopLoadingIcon]):
        (-[WebFrameLoader addPlugInStreamLoader:]):
        (-[WebFrameLoader removePlugInStreamLoader:]):
        (-[WebFrameLoader setDefersCallbacks:]):
        (-[WebFrameLoader stopLoadingPlugIns]):
        (-[WebFrameLoader isLoadingMainResource]):
        (-[WebFrameLoader isLoadingSubresources]):
        (-[WebFrameLoader isLoading]):
        (-[WebFrameLoader stopLoadingSubresources]):
        (-[WebFrameLoader addSubresourceLoader:]):
        (-[WebFrameLoader removeSubresourceLoader:]):
        (-[WebFrameLoader mainResourceData]):
        (-[WebFrameLoader releaseMainResourceLoader]):
        (-[WebFrameLoader cancelMainResourceLoad]):
        (-[WebFrameLoader startLoadingMainResourceWithRequest:identifier:]):
        (-[WebFrameLoader stopLoadingWithError:]):

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

WebKit/ChangeLog
WebKit/Misc/WebIconLoader.h
WebKit/Misc/WebIconLoader.m
WebKit/WebKit.xcodeproj/project.pbxproj
WebKit/WebView/WebDataSource.m
WebKit/WebView/WebFrameLoader.h [new file with mode: 0644]
WebKit/WebView/WebFrameLoader.m [new file with mode: 0644]

index 4e0d9fe2d2900d0197bb3ec35d2df77e43e7b093..968d42d945b282ba3040aca63aacd2f80d676275 100644 (file)
@@ -1,3 +1,56 @@
+2006-06-22  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Adele.
+        
+        - start moving loading logic to new WebFrameLoader class; move management of WebLoaders there
+
+        * Misc/WebIconLoader.h:
+        * Misc/WebIconLoader.m:
+        (-[WebIconLoader didFinishLoading]):
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebView/WebDataSource.m:
+        (-[WebDataSourcePrivate dealloc]):
+        (-[WebDataSource _updateLoading]):
+        (-[WebDataSource _loadIcon]):
+        (-[WebDataSource _setPrimaryLoadComplete:]):
+        (-[WebDataSource _stopLoading]):
+        (-[WebDataSource _startLoading]):
+        (-[WebDataSource _addSubresourceLoader:]):
+        (-[WebDataSource _removeSubresourceLoader:]):
+        (-[WebDataSource _addPlugInStreamLoader:]):
+        (-[WebDataSource _removePlugInStreamLoader:]):
+        (-[WebDataSource _iconLoaderReceivedPageIcon:]):
+        (-[WebDataSource _defersCallbacksChanged]):
+        (-[WebDataSource _stopLoadingWithError:]):
+        (-[WebDataSource _setupForReplaceByMIMEType:]):
+        (-[WebDataSource initWithRequest:]):
+        (-[WebDataSource dealloc]):
+        (-[WebDataSource finalize]):
+        (-[WebDataSource data]):
+        (-[WebDataSource isLoading]):
+        * WebView/WebFrameLoader.h: Added.
+        * WebView/WebFrameLoader.m: Added.
+        (-[WebFrameLoader initWithDataSource:]):
+        (-[WebFrameLoader dealloc]):
+        (-[WebFrameLoader hasIconLoader]):
+        (-[WebFrameLoader loadIconWithRequest:]):
+        (-[WebFrameLoader stopLoadingIcon]):
+        (-[WebFrameLoader addPlugInStreamLoader:]):
+        (-[WebFrameLoader removePlugInStreamLoader:]):
+        (-[WebFrameLoader setDefersCallbacks:]):
+        (-[WebFrameLoader stopLoadingPlugIns]):
+        (-[WebFrameLoader isLoadingMainResource]):
+        (-[WebFrameLoader isLoadingSubresources]):
+        (-[WebFrameLoader isLoading]):
+        (-[WebFrameLoader stopLoadingSubresources]):
+        (-[WebFrameLoader addSubresourceLoader:]):
+        (-[WebFrameLoader removeSubresourceLoader:]):
+        (-[WebFrameLoader mainResourceData]):
+        (-[WebFrameLoader releaseMainResourceLoader]):
+        (-[WebFrameLoader cancelMainResourceLoad]):
+        (-[WebFrameLoader startLoadingMainResourceWithRequest:identifier:]):
+        (-[WebFrameLoader stopLoadingWithError:]):
+
 2006-06-21  Brady Eidson  <beidson@apple.com>
 
         Reviewed by Maciej
index 9a0c842891c2425d12ea4c7e632c037bc26a024b..3ba917823a74d12043a7df8e0eb2d47fe1d3afc4 100644 (file)
 */
 - (NSURL *)URL;
 
-/*!
-    @method delegate
-*/
-- (id)delegate;
-
-/*!
-    @method setDelegate:
-    @param delegate
-*/
-- (void)setDelegate:(id)delegate;
-
 /*!
     @method startLoading
 */
index a66d858e9d1ac2739b42c87a519c9e76b6a4d53d..de1e91089e154b07e80768e64402970596328368 100644 (file)
@@ -38,7 +38,6 @@
 @interface WebIconLoaderPrivate : NSObject
 {
 @public
-    id delegate;
     NSURLRequest *initialRequest;
 }
 
     return [_private->initialRequest URL];
 }
 
-- (id)delegate
-{
-    return _private->delegate;
-}
-
-- (void)setDelegate:(id)delegate
-{
-    _private->delegate = delegate;
-}
-
 - (void)startLoading
 {
     [self loadWithRequest:_private->initialRequest];
     } else {
         [[WebIconDatabase sharedIconDatabase] _setHaveNoIconForIconURL:[[self URL] _web_originalDataAsString]];
     }
-    [_private->delegate _iconLoaderReceivedPageIcon:self];    
+    [dataSource _iconLoaderReceivedPageIcon:self];    
     [icon release];
     
     [super didFinishLoading];
index fddaa87a624bca5eb43493786f2fc04cf37a3285..eccf3ad0f9564da3095f6b5f031bc0017f409418 100644 (file)
@@ -32,6 +32,8 @@
                650F74E409E488F70020118A /* WebUnarchivingState.h in Headers */ = {isa = PBXBuildFile; fileRef = 650F74E209E488F70020118A /* WebUnarchivingState.h */; };
                650F74E509E488F70020118A /* WebUnarchivingState.m in Sources */ = {isa = PBXBuildFile; fileRef = 650F74E309E488F70020118A /* WebUnarchivingState.m */; };
                651951E209974178003DFC65 /* WebLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 651951E109974178003DFC65 /* WebLoader.h */; };
+               652357320A4B05C80046CA01 /* WebFrameLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 652357300A4B05C80046CA01 /* WebFrameLoader.h */; };
+               652357330A4B05C80046CA01 /* WebFrameLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 652357310A4B05C80046CA01 /* WebFrameLoader.m */; };
                65488DA1084FBCCB00831AD0 /* WebNSDictionaryExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 65488D9F084FBCCB00831AD0 /* WebNSDictionaryExtras.h */; };
                65488DA2084FBCCB00831AD0 /* WebNSDictionaryExtras.m in Sources */ = {isa = PBXBuildFile; fileRef = 65488DA0084FBCCB00831AD0 /* WebNSDictionaryExtras.m */; };
                6550B7C7099EFAE90090D781 /* WebArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6550B7C5099EFAE90090D781 /* WebArchiver.h */; };
                650F74E209E488F70020118A /* WebUnarchivingState.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebUnarchivingState.h; sourceTree = "<group>"; };
                650F74E309E488F70020118A /* WebUnarchivingState.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = WebUnarchivingState.m; sourceTree = "<group>"; };
                651951E109974178003DFC65 /* WebLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebLoader.h; sourceTree = "<group>"; };
+               652357300A4B05C80046CA01 /* WebFrameLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebFrameLoader.h; sourceTree = "<group>"; };
+               652357310A4B05C80046CA01 /* WebFrameLoader.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = WebFrameLoader.m; sourceTree = "<group>"; };
                65488D9F084FBCCB00831AD0 /* WebNSDictionaryExtras.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebNSDictionaryExtras.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                65488DA0084FBCCB00831AD0 /* WebNSDictionaryExtras.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebNSDictionaryExtras.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                6550B7C5099EFAE90090D781 /* WebArchiver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebArchiver.h; sourceTree = "<group>"; };
                                2D36FD5E03F78F9E00A80166 /* WebFormDelegatePrivate.h */,
                                39446074020F50ED0ECA1767 /* WebFrame.h */,
                                F5143A370221DCCE01A80181 /* WebFrame.m */,
+                               652357300A4B05C80046CA01 /* WebFrameLoader.h */,
+                               652357310A4B05C80046CA01 /* WebFrameLoader.m */,
                                930D02BD06275F710076701E /* WebFrameInternal.h */,
                                9CF0E249021361B00ECA16EA /* WebFramePrivate.h */,
                                51A8B52E04282B5900CA2D3A /* WebFrameView.h */,
                                DD7CDEE70A23BA9E00069928 /* WebTypesInternal.h in Headers */,
                                1C0706630A431E01001078F6 /* WebScriptDebugServer.h in Headers */,
                                1C07079A0A433E22001078F6 /* WebScriptDebugServerPrivate.h in Headers */,
+                               652357320A4B05C80046CA01 /* WebFrameLoader.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                650F74E509E488F70020118A /* WebUnarchivingState.m in Sources */,
                                93EB178D09F88D460091F8FF /* WebSystemInterface.m in Sources */,
                                1C07073D0A433BD8001078F6 /* WebScriptDebugServer.m in Sources */,
+                               652357330A4B05C80046CA01 /* WebFrameLoader.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index 368fba51aeed146b9d83d8439dea5ea564f7ff8a..82cf5e5920554ffdbd71e835bf6bff209ceace46 100644 (file)
@@ -38,6 +38,7 @@
 #import "WebDownloadInternal.h"
 #import "WebFrameBridge.h"
 #import "WebFrameInternal.h"
+#import "WebFrameLoader.h"
 #import "WebFrameLoadDelegate.h"
 #import "WebFrameView.h"
 #import "WebHTMLRepresentation.h"
 #import "WebHistory.h"
 #import "WebHistoryItemPrivate.h"
 #import "WebIconDatabasePrivate.h"
-#import "WebIconLoader.h"
 #import "WebKitErrorsPrivate.h"
 #import "WebKitLogging.h"
 #import "WebKitNSStringExtras.h"
 #import "WebKitStatisticsPrivate.h"
-#import "WebMainResourceLoader.h"
 #import "WebNSObjectExtras.h"
 #import "WebNSURLExtras.h"
 #import "WebNSURLRequestExtras.h"
     
     NSURLResponse *response;
     
-    // Client for main resource.
-    WebMainResourceLoader *mainResourceLoader;
-    
-    // Clients for other resources.
-    NSMutableArray *subresourceLoaders;
-    NSMutableArray *plugInStreamLoaders;
-    
     // The time when the data source was told to start loading.
     double loadingStartedTime;
     
     BOOL defersCallbacks;
     
     NSURL *iconURL;
-    WebIconLoader *iconLoader;
     
     // The action that triggered loading of this data source -
     // we keep this around for the benefit of the various policy
     WebUnarchivingState *unarchivingState;
     
     BOOL supportsMultipartContent;
+
+    WebFrameLoader *frameLoader;
 }
 
 @end
     [request release];
     [originalRequest release];
     [originalRequestCopy release];
-    [mainResourceLoader release];
-    [subresourceLoaders release];
-    [plugInStreamLoaders release];
     [pageTitle release];
     [response release];
     [mainDocumentError release];
-    [iconLoader release];
     [iconURL release];
     [triggeringAction release];
     [lastCheckedRequest release];
     [responses release];
     [webFrame release];
     [unarchivingState release];
+    [frameLoader release];
 
     [super dealloc];
 }
 
 - (void)_updateLoading
 {
-    [self _setLoading:_private->mainResourceLoader || [_private->subresourceLoaders count]];
+    [self _setLoading:[_private->frameLoader isLoading]];
 }
 
 - (void)_setData:(NSData *)data
 
 - (void)_loadIcon
 {
-    // Don't load an icon if 1) this is not the main frame 2) we ended in error 3) we already did 4) they aren't save by the DB.
-    if ([self webFrame] != [[self _webView] mainFrame] || _private->mainDocumentError || _private->iconLoader ||
+    // Don't load an icon if 1) this is not the main frame 2) we ended in error
+    // 3) we already did 4) they aren't saved by the DB.
+    if ([self webFrame] != [[self _webView] mainFrame] || _private->mainDocumentError || [_private->frameLoader hasIconLoader] ||
         ![[WebIconDatabase sharedIconDatabase] _isEnabled]) {
         return;
     }
     
-    if(!_private->iconURL){
+    if (!_private->iconURL) {
         // No icon URL from the LINK tag so try the server's root.
         // This is only really a feature of http or https, so don't try this with other protocols.
         NSString *scheme = [[self _URL] scheme];
         }
     }
     
-    if(_private->iconURL != nil){
-        if([[WebIconDatabase sharedIconDatabase] _hasIconForIconURL:[_private->iconURL _web_originalDataAsString]]){
+    if (_private->iconURL != nil) {
+        if ([[WebIconDatabase sharedIconDatabase] _hasIconForIconURL:[_private->iconURL _web_originalDataAsString]]) {
             [self _updateIconDatabaseWithURL:_private->iconURL];
-        }else{
-            ASSERT(!_private->iconLoader);
+        } else {
             NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:_private->iconURL];
             [[self webFrame] _addExtraFieldsToRequest:request mainResource:YES alwaysFromRequest:NO];
-            _private->iconLoader = [[WebIconLoader alloc] initWithRequest:request];
+            [_private->frameLoader loadIconWithRequest:request];
             [request release];
-            [_private->iconLoader setDelegate:self];
-            [_private->iconLoader setDataSource:self];
-            [_private->iconLoader startLoading];
         }
     }
 }
         // there's no callback for that.
         [self _loadIcon];
 
-        if (_private->mainResourceLoader != nil) {
-            [self _setData:[_private->mainResourceLoader resourceData]];
-            [_private->mainResourceLoader release];
-            _private->mainResourceLoader = nil;
-        }
+        [self _setData:[_private->frameLoader mainResourceData]];
+        [_private->frameLoader releaseMainResourceLoader];
         
         [self _updateLoading];
     }
 {
     // Always attempt to stop the icon loader because it may still be loading after the data source
     // is done loading and not stopping it can cause a world leak.
-    [_private->iconLoader stopLoading];
-
+    [_private->frameLoader stopLoadingIcon];
+    
     // The same goes for the bridge/part, which may still be parsing.
     if (_private->committed)
         [[self _bridge] stopLoading];
 
     _private->stopping = YES;
     
-    if (_private->mainResourceLoader) {
+    if ([_private->frameLoader isLoadingMainResource]) {
         // Stop the main resource loader and let it send the cancelled message.
-        [_private->mainResourceLoader cancel];
-    } else if ([_private->subresourceLoaders count] > 0) {
+        [_private->frameLoader cancelMainResourceLoad];
+    } else if ([_private->frameLoader isLoadingSubresources]) {
         // The main resource loader already finished loading. Set the cancelled error on the 
         // document and let the subresourceLoaders send individual cancelled messages below.
         [self _setMainDocumentError:[self _cancelledError]];
         [self _mainReceivedError:[self _cancelledError] complete:YES];
     }
     
-    NSArray *loaders = [_private->subresourceLoaders copy];
-    [loaders makeObjectsPerformSelector:@selector(cancel)];
-    [loaders release];
-
+    [_private->frameLoader stopLoadingSubresources];
+    // FIXME: why not stop loading plugins here?
+    
     _private->stopping = NO;
     
     [self release];
 {
     [self _prepareForLoadStart];
 
-    if (_private->mainResourceLoader)
+    if ([_private->frameLoader isLoadingMainResource])
         return;
 
     _private->loadingFromPageCache = NO;
     else
         identifier = [[WebDefaultResourceLoadDelegate sharedResourceLoadDelegate] webView:[self _webView] identifierForInitialRequest:_private->originalRequest fromDataSource:self];
     
-    _private->mainResourceLoader = [[WebMainResourceLoader alloc] initWithDataSource:self];
-    
-    [_private->mainResourceLoader setIdentifier: identifier];
-    [[self webFrame] _addExtraFieldsToRequest:_private->request mainResource:YES alwaysFromRequest:NO];
-    if (![_private->mainResourceLoader loadWithRequest:_private->request]) {
-        // FIXME: if this should really be caught, we should just ASSERT this doesn't happen;
-        // should it be caught by other parts of WebKit or other parts of the app?
-        LOG_ERROR("could not create WebResourceHandle for URL %@ -- should be caught by policy handler level", [_private->request URL]);
-        [_private->mainResourceLoader release];
-        _private->mainResourceLoader = nil;
+    if (![_private->frameLoader startLoadingMainResourceWithRequest:_private->request identifier:identifier])
         [self _updateLoading];
-    }
 }
 
 - (void)_addSubresourceLoader:(WebLoader *)loader
 {
-    if (_private->subresourceLoaders == nil) {
-        _private->subresourceLoaders = [[NSMutableArray alloc] init];
-    }
-    [_private->subresourceLoaders addObject:loader];
+    [_private->frameLoader addSubresourceLoader:loader];
     [self _setLoading:YES];
 }
 
 - (void)_removeSubresourceLoader:(WebLoader *)loader
 {
-    [_private->subresourceLoaders removeObject:loader];
+    [_private->frameLoader removeSubresourceLoader:loader];
     [self _updateLoading];
 }
 
 - (void)_addPlugInStreamLoader:(WebLoader *)loader
 {
-    if (_private->plugInStreamLoaders == nil) {
-        _private->plugInStreamLoaders = [[NSMutableArray alloc] init];
-    }
-    [_private->plugInStreamLoaders addObject:loader];
+    [_private->frameLoader addPlugInStreamLoader:loader];
     [self _setLoading:YES];
 }
 
 - (void)_removePlugInStreamLoader:(WebLoader *)loader
 {
-    [_private->plugInStreamLoaders removeObject:loader];
+    [_private->frameLoader removePlugInStreamLoader:loader];
     [self _updateLoading];
 }
 
@@ -816,7 +783,7 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
 
 - (void)_iconLoaderReceivedPageIcon:(WebIconLoader *)iconLoader
 {
-    [self _updateIconDatabaseWithURL:[iconLoader URL]];
+    [self _updateIconDatabaseWithURL:_private->iconURL];
 }
 
 - (void)_setIconURL:(NSURL *)URL
@@ -844,17 +811,7 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     }
 
     _private->defersCallbacks = defers;
-    [_private->mainResourceLoader setDefersCallbacks:defers];
-
-    NSEnumerator *e = [_private->subresourceLoaders objectEnumerator];
-    WebLoader *loader;
-    while ((loader = [e nextObject])) {
-        [loader setDefersCallbacks:defers];
-    }
-    e = [_private->plugInStreamLoaders objectEnumerator];
-    while ((loader = [e nextObject])) {
-        [loader setDefersCallbacks:defers];
-    }
+    [_private->frameLoader setDefersCallbacks:defers];
 }
 
 - (BOOL)_defersCallbacks
@@ -1027,7 +984,7 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
 
 - (void)_stopLoadingWithError:(NSError *)error
 {
-    [_private->mainResourceLoader cancelWithError:error];
+    [_private->frameLoader stopLoadingWithError:error];
 }
 
 - (void)_setWebFrame:(WebFrame *)frame
@@ -1088,10 +1045,8 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     if ([self _doesProgressiveLoadWithMIMEType:newMIMEType])
         [self _revertToProvisionalState];
 
-    [_private->subresourceLoaders makeObjectsPerformSelector:@selector(cancel)];
-    [_private->subresourceLoaders removeAllObjects];
-    [_private->plugInStreamLoaders makeObjectsPerformSelector:@selector(cancel)];
-    [_private->plugInStreamLoaders removeAllObjects];
+    [_private->frameLoader stopLoadingSubresources];
+    [_private->frameLoader stopLoadingPlugIns];
     [_private->unarchivingState release];
 }
 
@@ -1119,6 +1074,8 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     _private->request = [_private->originalRequest mutableCopy];
     _private->supportsMultipartContent = WKSupportsMultipartXMixedReplace(_private->request);
 
+    _private->frameLoader = [[WebFrameLoader alloc] initWithDataSource:self];
+    
     ++WebDataSourceCount;
     
     return self;
@@ -1128,7 +1085,6 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
 {
     --WebDataSourceCount;
     
-    [_private->iconLoader setDelegate:nil];
     [_private release];
     
     [super dealloc];
@@ -1138,14 +1094,12 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
 {
     --WebDataSourceCount;
 
-    [_private->iconLoader setDelegate:nil];
-
     [super finalize];
 }
 
 - (NSData *)data
 {
-    return _private->resourceData != nil ? _private->resourceData : [_private->mainResourceLoader resourceData];
+    return _private->resourceData != nil ? _private->resourceData : [_private->frameLoader mainResourceData];
 }
 
 - (id <WebDocumentRepresentation>)representation
@@ -1197,7 +1151,7 @@ static inline void addTypesFromClass(NSMutableDictionary *allTypes, Class class,
     if ([[self webFrame] _state] != WebFrameStateComplete) {
         if (!_private->primaryLoadComplete && _private->loading)
             return YES;
-        if ([_private->subresourceLoaders count])
+        if ([_private->frameLoader isLoadingSubresources])
             return YES;
         if (![[[self webFrame] _bridge] doneProcessingData])
             return YES;
diff --git a/WebKit/WebView/WebFrameLoader.h b/WebKit/WebView/WebFrameLoader.h
new file mode 100644 (file)
index 0000000..f503837
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@class WebDataSource;
+@class WebMainResourceLoader;
+@class WebIconLoader;
+@class WebLoader;
+
+@interface WebFrameLoader : NSObject
+{
+@public
+    // Client for main resource.
+    WebMainResourceLoader *mainResourceLoader;
+    
+    // Clients for other resources.
+    NSMutableArray *subresourceLoaders;
+    NSMutableArray *plugInStreamLoaders;
+    WebIconLoader *iconLoader;
+    
+    WebDataSource *dataSource;
+}
+
+- (id)initWithDataSource:(WebDataSource *)ds;
+// FIXME: should really split isLoadingIcon from hasLoadedIcon, no?
+- (BOOL)hasIconLoader;
+- (void)loadIconWithRequest:(NSURLRequest *)request;
+- (void)stopLoadingIcon;
+- (void)addPlugInStreamLoader:(WebLoader *)loader;
+- (void)removePlugInStreamLoader:(WebLoader *)loader;
+- (void)setDefersCallbacks:(BOOL)defers;
+- (void)stopLoadingPlugIns;
+- (BOOL)isLoadingMainResource;
+- (BOOL)isLoadingSubresources;
+- (BOOL)isLoading;
+- (void)stopLoadingSubresources;
+- (void)addSubresourceLoader:(WebLoader *)loader;
+- (void)removeSubresourceLoader:(WebLoader *)loader;
+- (NSData *)mainResourceData;
+- (void)releaseMainResourceLoader;
+- (void)cancelMainResourceLoad;
+- (BOOL)startLoadingMainResourceWithRequest:(NSMutableURLRequest *)request identifier:(id)identifier;
+- (void)stopLoadingWithError:(NSError *)error;
+
+@end
diff --git a/WebKit/WebView/WebFrameLoader.m b/WebKit/WebView/WebFrameLoader.m
new file mode 100644 (file)
index 0000000..aea328e
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <WebKit/WebFrameLoader.h>
+
+#import <WebKit/WebAssertions.h>
+#import <WebKit/WebDataSource.h>
+#import <WebKit/WebFrameInternal.h>
+#import <WebKit/WebIconLoader.h>
+
+@implementation WebFrameLoader
+
+- (id)initWithDataSource:(WebDataSource *)ds
+{
+    self = [super init];
+    if (self)
+        dataSource = ds;
+    return self;    
+}
+
+- (void)dealloc
+{
+    // FIXME: should these even exist?
+    [mainResourceLoader release];
+    [subresourceLoaders release];
+    [plugInStreamLoaders release];
+    [iconLoader release];
+    [super dealloc];
+}
+
+- (BOOL)hasIconLoader
+{
+    return iconLoader != nil;
+}
+
+- (void)loadIconWithRequest:(NSURLRequest *)request
+{
+    ASSERT(!iconLoader);
+    iconLoader = [[WebIconLoader alloc] initWithRequest:request];
+    [iconLoader setDataSource:dataSource];
+    [iconLoader loadWithRequest:request];
+}
+
+- (void)stopLoadingIcon
+{
+    [iconLoader stopLoading];
+}
+
+- (void)addPlugInStreamLoader:(WebLoader *)loader
+{
+    if (!plugInStreamLoaders)
+        plugInStreamLoaders = [[NSMutableArray alloc] init];
+    [plugInStreamLoaders addObject:loader];
+}
+
+- (void)removePlugInStreamLoader:(WebLoader *)loader
+{
+    [plugInStreamLoaders removeObject:loader];
+}    
+
+- (void)setDefersCallbacks:(BOOL)defers
+{
+    [mainResourceLoader setDefersCallbacks:defers];
+    
+    NSEnumerator *e = [subresourceLoaders objectEnumerator];
+    WebLoader *loader;
+    while ((loader = [e nextObject]))
+        [loader setDefersCallbacks:defers];
+    
+    e = [plugInStreamLoaders objectEnumerator];
+    while ((loader = [e nextObject]))
+        [loader setDefersCallbacks:defers];
+}
+
+- (void)stopLoadingPlugIns
+{
+    [plugInStreamLoaders makeObjectsPerformSelector:@selector(cancel)];
+    [plugInStreamLoaders removeAllObjects];   
+}
+
+- (BOOL)isLoadingMainResource
+{
+    return mainResourceLoader != nil;
+}
+
+- (BOOL)isLoadingSubresources
+{
+    return [subresourceLoaders count];
+}
+
+- (BOOL)isLoading
+{
+    return [self isLoadingMainResource] || [self isLoadingSubresources];
+}
+
+- (void)stopLoadingSubresources
+{
+    NSArray *loaders = [subresourceLoaders copy];
+    [loaders makeObjectsPerformSelector:@selector(cancel)];
+    [loaders release];
+    [subresourceLoaders removeAllObjects];
+}
+
+- (void)addSubresourceLoader:(WebLoader *)loader
+{
+    if (subresourceLoaders == nil)
+        subresourceLoaders = [[NSMutableArray alloc] init];
+    [subresourceLoaders addObject:loader];
+}
+
+- (void)removeSubresourceLoader:(WebLoader *)loader
+{
+    [subresourceLoaders removeObject:loader];
+}
+
+- (NSData *)mainResourceData
+{
+    return [mainResourceLoader resourceData];
+}
+
+- (void)releaseMainResourceLoader
+{
+    [mainResourceLoader release];
+    mainResourceLoader = nil;
+}
+
+- (void)cancelMainResourceLoad
+{
+    [mainResourceLoader cancel];
+}
+
+- (BOOL)startLoadingMainResourceWithRequest:(NSMutableURLRequest *)request identifier:(id)identifier
+{
+    mainResourceLoader = [[WebMainResourceLoader alloc] initWithDataSource:dataSource];
+    
+    [mainResourceLoader setIdentifier:identifier];
+    [[dataSource webFrame] _addExtraFieldsToRequest:request mainResource:YES alwaysFromRequest:NO];
+    if (![mainResourceLoader loadWithRequest:request]) {
+        // FIXME: if this should really be caught, we should just ASSERT this doesn't happen;
+        // should it be caught by other parts of WebKit or other parts of the app?
+        LOG_ERROR("could not create WebResourceHandle for URL %@ -- should be caught by policy handler level", [request URL]);
+        [mainResourceLoader release];
+        mainResourceLoader = nil;
+        return NO;
+    }
+    
+    return YES;
+}
+
+- (void)stopLoadingWithError:(NSError *)error
+{
+    [mainResourceLoader cancelWithError:error];
+}
+
+@end