[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

rjw rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 05:56:01 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit f86b4454661d641dcf8067f897e3eec986dfc7bd
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Feb 21 01:48:12 2002 +0000

        Some groundwork to bring WebFoundation callbacks up to
        WebKit.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@648 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2002-12-03 b/WebCore/ChangeLog-2002-12-03
index e6a75d1..9a92d2c 100644
--- a/WebCore/ChangeLog-2002-12-03
+++ b/WebCore/ChangeLog-2002-12-03
@@ -1,3 +1,28 @@
+2002-02-20  Richard Williamson  <rjw at apple.com>
+
+    Some groundwork to bring WebFoundation callbacks up to 
+    WebKit.
+    
+	* src/kdelibs/khtml/misc/loader.h:
+	* src/kwq/KWQKHTMLPart.mm: (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidBeginLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidCancelLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidFinishLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandle:resourceDataDidBecomeAvailable:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandle:resourceDidFailLoadingWithResult:userData:]), (KHTMLPart::openURL),
+	(KHTMLPart::closeURL), (KHTMLPart::write), (KHTMLPart::checkCompleted):
+	* src/kwq/KWQKloader.mm: (CachedCSSStyleSheet::CachedCSSStyleSheet),
+	(CachedScript::CachedScript), (CachedImage::CachedImage), (-[URLLoadClient
+	initWithLoader:dataSource:]), (-[URLLoadClient
+	WCURLHandleResourceDidBeginLoading:userData:]), (-[URLLoadClient
+	WCURLHandleResourceDidCancelLoading:userData:]), (-[URLLoadClient
+	WCURLHandleResourceDidFinishLoading:userData:]), (-[URLLoadClient
+	WCURLHandle:resourceDataDidBecomeAvailable:userData:]), (-[URLLoadClient
+	WCURLHandle:resourceDidFailLoadingWithResult:userData:]), (Loader::load),
+	(Loader::servePendingRequests), (Cache::requestImage),
+	(Cache::requestStyleSheet), (Cache::requestScript):
+	* src/kwq/kio/jobclasses.h:
+
 2002-02-20  Maciej Stachowiak  <mjs at apple.com>
 
 	* src/kdelibs/kjs/kjs-test:
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index e6a75d1..9a92d2c 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,28 @@
+2002-02-20  Richard Williamson  <rjw at apple.com>
+
+    Some groundwork to bring WebFoundation callbacks up to 
+    WebKit.
+    
+	* src/kdelibs/khtml/misc/loader.h:
+	* src/kwq/KWQKHTMLPart.mm: (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidBeginLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidCancelLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidFinishLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandle:resourceDataDidBecomeAvailable:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandle:resourceDidFailLoadingWithResult:userData:]), (KHTMLPart::openURL),
+	(KHTMLPart::closeURL), (KHTMLPart::write), (KHTMLPart::checkCompleted):
+	* src/kwq/KWQKloader.mm: (CachedCSSStyleSheet::CachedCSSStyleSheet),
+	(CachedScript::CachedScript), (CachedImage::CachedImage), (-[URLLoadClient
+	initWithLoader:dataSource:]), (-[URLLoadClient
+	WCURLHandleResourceDidBeginLoading:userData:]), (-[URLLoadClient
+	WCURLHandleResourceDidCancelLoading:userData:]), (-[URLLoadClient
+	WCURLHandleResourceDidFinishLoading:userData:]), (-[URLLoadClient
+	WCURLHandle:resourceDataDidBecomeAvailable:userData:]), (-[URLLoadClient
+	WCURLHandle:resourceDidFailLoadingWithResult:userData:]), (Loader::load),
+	(Loader::servePendingRequests), (Cache::requestImage),
+	(Cache::requestStyleSheet), (Cache::requestScript):
+	* src/kwq/kio/jobclasses.h:
+
 2002-02-20  Maciej Stachowiak  <mjs at apple.com>
 
 	* src/kdelibs/kjs/kjs-test:
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index e6a75d1..9a92d2c 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,28 @@
+2002-02-20  Richard Williamson  <rjw at apple.com>
+
+    Some groundwork to bring WebFoundation callbacks up to 
+    WebKit.
+    
+	* src/kdelibs/khtml/misc/loader.h:
+	* src/kwq/KWQKHTMLPart.mm: (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidBeginLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidCancelLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandleResourceDidFinishLoading:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandle:resourceDataDidBecomeAvailable:userData:]), (-[KHTMLPartLoadClient
+	WCURLHandle:resourceDidFailLoadingWithResult:userData:]), (KHTMLPart::openURL),
+	(KHTMLPart::closeURL), (KHTMLPart::write), (KHTMLPart::checkCompleted):
+	* src/kwq/KWQKloader.mm: (CachedCSSStyleSheet::CachedCSSStyleSheet),
+	(CachedScript::CachedScript), (CachedImage::CachedImage), (-[URLLoadClient
+	initWithLoader:dataSource:]), (-[URLLoadClient
+	WCURLHandleResourceDidBeginLoading:userData:]), (-[URLLoadClient
+	WCURLHandleResourceDidCancelLoading:userData:]), (-[URLLoadClient
+	WCURLHandleResourceDidFinishLoading:userData:]), (-[URLLoadClient
+	WCURLHandle:resourceDataDidBecomeAvailable:userData:]), (-[URLLoadClient
+	WCURLHandle:resourceDidFailLoadingWithResult:userData:]), (Loader::load),
+	(Loader::servePendingRequests), (Cache::requestImage),
+	(Cache::requestStyleSheet), (Cache::requestScript):
+	* src/kwq/kio/jobclasses.h:
+
 2002-02-20  Maciej Stachowiak  <mjs at apple.com>
 
 	* src/kdelibs/kjs/kjs-test:
diff --git a/WebCore/khtml/misc/loader.h b/WebCore/khtml/misc/loader.h
index fd25e47..ec7edf0 100644
--- a/WebCore/khtml/misc/loader.h
+++ b/WebCore/khtml/misc/loader.h
@@ -67,6 +67,7 @@ namespace khtml
     class CachedObject;
     class Request;
     class LoaderPrivate;
+    class DocLoader;
 
     /**
      * @internal
@@ -95,8 +96,9 @@ namespace khtml
 	    Uncacheable   // to big to be cached,
 	};  	          // will be destroyed as soon as possible
 
-	CachedObject(const DOM::DOMString &url, Type type, bool _reload, int _expireDate)
+	CachedObject(const DocLoader *loader, const DOM::DOMString &url, Type type, bool _reload, int _expireDate)
 	{
+	    m_loader = loader;
 	    m_url = url;
 	    m_type = type;
 	    m_status = Pending;
@@ -105,12 +107,12 @@ namespace khtml
 	    m_reload = _reload;
 	    m_request = 0;
 	    m_expireDate = _expireDate;
-            m_deleted = false;
+        m_deleted = false;
 	}
 	virtual ~CachedObject() {
-            if(m_deleted) abort();
+        if(m_deleted) abort();
             m_deleted = true;
-        }
+    }
 
 	virtual void data( QBuffer &buffer, bool eof) = 0;
 	virtual void error( int err, const char *text ) = 0;
@@ -135,41 +137,47 @@ namespace khtml
 	 */
 	void finish();
 
-        /*
-         * Called by the cache if the object has been removed from the cache dict
-         * while still being referenced. This means the object should kill itself
-         * if its reference counter drops down to zero.
-         */
-        void setFree( bool b ) { m_free = b; }
-
-        bool reload() const { return m_reload; }
-
-        void setRequest(Request *_request);
-
-        bool canDelete() const { return (m_clients.count() == 0 && !m_request); }
+    /*
+     * Called by the cache if the object has been removed from the cache dict
+     * while still being referenced. This means the object should kill itself
+     * if its reference counter drops down to zero.
+     */
+    void setFree( bool b ) { m_free = b; }
+    
+    bool reload() const { return m_reload; }
+    
+    void setRequest(Request *_request);
+    
+    bool canDelete() const { return (m_clients.count() == 0 && !m_request); }
 
 	void setExpireDate(int _expireDate);
 
-        /*
-         * List of acceptable mimetypes seperated by ",". A mimetype may contain a wildcard.
-         */
-        // e.g. "text/*"
-        QString accept() const { return m_accept; }
-        void setAccept(const QString &_accept) { m_accept = _accept; }
+    /*
+     * List of acceptable mimetypes seperated by ",". A mimetype may contain a wildcard.
+     */
+    // e.g. "text/*"
+    QString accept() const { return m_accept; }
+    void setAccept(const QString &_accept) { m_accept = _accept; }
 
+
+    const DocLoader *loader() { return m_loader; }
+    
     protected:
-        QList<CachedObjectClient> m_clients;
+
+    const DocLoader *m_loader;
+    
+    QList<CachedObjectClient> m_clients;
         
 	DOM::DOMString m_url;
-        QString m_accept;
-        Request *m_request;
+    QString m_accept;
+    Request *m_request;
 	Type m_type;
 	Status m_status;
 	int m_size;
 	int m_expireDate;
-        bool m_free;
-        bool m_reload;
-        bool m_deleted;
+    bool m_free;
+    bool m_reload;
+    bool m_deleted;
     };
 
 
@@ -179,7 +187,7 @@ namespace khtml
     class CachedCSSStyleSheet : public CachedObject
     {
     public:
-	CachedCSSStyleSheet(const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
+	CachedCSSStyleSheet(const DocLoader *loader, const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
 	virtual ~CachedCSSStyleSheet();
 
 	const DOM::DOMString &sheet() const { return m_sheet; }
@@ -204,7 +212,7 @@ namespace khtml
     class CachedScript : public CachedObject
     {
     public:
-	CachedScript(const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
+	CachedScript(const DocLoader *loader, const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
 	virtual ~CachedScript();
 
 	const DOM::DOMString &script() const { return m_script; }
@@ -232,7 +240,7 @@ namespace khtml
     {
 	Q_OBJECT
     public:
-	CachedImage(const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate);
+	CachedImage(const DocLoader *loader, const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate);
 	virtual ~CachedImage();
 
 	const QPixmap &pixmap() const;
@@ -314,6 +322,7 @@ namespace khtml
         void setReloading( bool );
         void setShowAnimations( bool );
         void removeCachedObject( CachedObject*) const;
+        const KHTMLPart *part() { return m_part; }
 
     private:
         friend class Cache;
@@ -340,6 +349,9 @@ namespace khtml
 	QBuffer m_buffer;
 	CachedObject *object;
 	DOM::DOMString m_baseURL;
+#ifdef _KWQ_
+    void *client;
+#endif
     };
 
     /**
diff --git a/WebCore/kwq/KWQKHTMLPart.mm b/WebCore/kwq/KWQKHTMLPart.mm
index c6a5359..98441bc 100644
--- a/WebCore/kwq/KWQKHTMLPart.mm
+++ b/WebCore/kwq/KWQKHTMLPart.mm
@@ -139,19 +139,23 @@ static void recursive(const DOM::Node &pNode, const DOM::Node &node)
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
     m_part->closeURL();
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
+    KWQDEBUGLEVEL3 (0x2000, "userData = 0x%08x, data = 0x%08x, length %d\n", userData, data, [data length]);
     if (!m_data) {
         m_data = [data retain];
     }
@@ -160,6 +164,7 @@ static void recursive(const DOM::Node &pNode, const DOM::Node &node)
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KWQDEBUGLEVEL2 (0x2000, "result = %d, userData = 0x%08x\n", result, userData);
 }
 
 
@@ -395,7 +400,7 @@ bool KHTMLPart::openURL( const KURL &url )
     urlString = [NSString stringWithCString:d->m_workingURL.url().latin1()];
     // FIXME: temporary hack to make file: URLs work right
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
 
     if ([urlString hasSuffix:@"/"]) {
@@ -426,7 +431,7 @@ bool KHTMLPart::closeURL()
     
     urlString = [NSString stringWithCString:d->m_url.url().latin1()];
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
 
     if ([urlString hasSuffix:@"/"]) {
@@ -581,8 +586,6 @@ bool KHTMLPart::onlyLocalReferences() const
 }
 
 
-
-
 void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset)
 {
     //d->m_referrer = url.url();
@@ -683,7 +686,9 @@ void KHTMLPart::write(const char *str, int len)
     double start = CFAbsoluteTimeGetCurrent();
 #endif
     
-    // FIX ME:  This is very expensive.
+    // FIX ME:  This is very expensive.  We should using the IFMutableData
+    // that represents the document, and only constructing the complete
+    // string when requested.
     d->m_documentSource += QString(str, len);
 
     QString decoded;
@@ -699,6 +704,8 @@ void KHTMLPart::write(const char *str, int len)
 
     d->m_decodingStarted = 1;
         
+    // Transition from provisional to committed data source at this point.
+    
     d->m_doc->applyChanges(true, true);
     
     // end lines added in lieu of big fixme
@@ -1782,11 +1789,11 @@ void KHTMLPart::checkCompleted()
     NSString *urlString;
     urlString = [NSString stringWithCString:d->m_url.url().latin1()];
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
     
     if ([urlString hasSuffix:@"/"]) {
-	urlString = [urlString substringToIndex:([urlString length] - 1)];
+	    urlString = [urlString substringToIndex:([urlString length] - 1)];
     }
     
     // Still waiting for images/scripts from the loader ?
diff --git a/WebCore/kwq/KWQKHTMLPartImpl.mm b/WebCore/kwq/KWQKHTMLPartImpl.mm
index c6a5359..98441bc 100644
--- a/WebCore/kwq/KWQKHTMLPartImpl.mm
+++ b/WebCore/kwq/KWQKHTMLPartImpl.mm
@@ -139,19 +139,23 @@ static void recursive(const DOM::Node &pNode, const DOM::Node &node)
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
     m_part->closeURL();
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
+    KWQDEBUGLEVEL3 (0x2000, "userData = 0x%08x, data = 0x%08x, length %d\n", userData, data, [data length]);
     if (!m_data) {
         m_data = [data retain];
     }
@@ -160,6 +164,7 @@ static void recursive(const DOM::Node &pNode, const DOM::Node &node)
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KWQDEBUGLEVEL2 (0x2000, "result = %d, userData = 0x%08x\n", result, userData);
 }
 
 
@@ -395,7 +400,7 @@ bool KHTMLPart::openURL( const KURL &url )
     urlString = [NSString stringWithCString:d->m_workingURL.url().latin1()];
     // FIXME: temporary hack to make file: URLs work right
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
 
     if ([urlString hasSuffix:@"/"]) {
@@ -426,7 +431,7 @@ bool KHTMLPart::closeURL()
     
     urlString = [NSString stringWithCString:d->m_url.url().latin1()];
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
 
     if ([urlString hasSuffix:@"/"]) {
@@ -581,8 +586,6 @@ bool KHTMLPart::onlyLocalReferences() const
 }
 
 
-
-
 void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset)
 {
     //d->m_referrer = url.url();
@@ -683,7 +686,9 @@ void KHTMLPart::write(const char *str, int len)
     double start = CFAbsoluteTimeGetCurrent();
 #endif
     
-    // FIX ME:  This is very expensive.
+    // FIX ME:  This is very expensive.  We should using the IFMutableData
+    // that represents the document, and only constructing the complete
+    // string when requested.
     d->m_documentSource += QString(str, len);
 
     QString decoded;
@@ -699,6 +704,8 @@ void KHTMLPart::write(const char *str, int len)
 
     d->m_decodingStarted = 1;
         
+    // Transition from provisional to committed data source at this point.
+    
     d->m_doc->applyChanges(true, true);
     
     // end lines added in lieu of big fixme
@@ -1782,11 +1789,11 @@ void KHTMLPart::checkCompleted()
     NSString *urlString;
     urlString = [NSString stringWithCString:d->m_url.url().latin1()];
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
     
     if ([urlString hasSuffix:@"/"]) {
-	urlString = [urlString substringToIndex:([urlString length] - 1)];
+	    urlString = [urlString substringToIndex:([urlString length] - 1)];
     }
     
     // Still waiting for images/scripts from the loader ?
diff --git a/WebCore/kwq/KWQKJobClasses.h b/WebCore/kwq/KWQKJobClasses.h
index 169bee3..bd1069f 100644
--- a/WebCore/kwq/KWQKJobClasses.h
+++ b/WebCore/kwq/KWQKJobClasses.h
@@ -172,8 +172,10 @@ public:
 #else
     void begin(void *requestor, void *userData);
 #endif
+    KURL url() { return _url; }
 #endif
 
+    
     // operators ---------------------------------------------------------------
 
 // protected -------------------------------------------------------------------
diff --git a/WebCore/kwq/KWQKloader.mm b/WebCore/kwq/KWQKloader.mm
index f576eef..b30632b 100644
--- a/WebCore/kwq/KWQKloader.mm
+++ b/WebCore/kwq/KWQKloader.mm
@@ -101,8 +101,8 @@ void CachedObject::setRequest(Request *_request)
 
 // -------------------------------------------------------------------------------------------
 
-CachedCSSStyleSheet::CachedCSSStyleSheet(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, CSSStyleSheet, reload, _expireDate)
+CachedCSSStyleSheet::CachedCSSStyleSheet(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, CSSStyleSheet, reload, _expireDate)
 {
     // It's css we want.
     setAccept( QString::fromLatin1("text/css") );
@@ -167,8 +167,8 @@ void CachedCSSStyleSheet::error( int /*err*/, const char */*text*/ )
 
 // -------------------------------------------------------------------------------------------
 
-CachedScript::CachedScript(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, Script, reload, _expireDate)
+CachedScript::CachedScript(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, Script, reload, _expireDate)
 {
     // It's javascript we want.
     setAccept( QString::fromLatin1("application/x-javascript") );
@@ -381,8 +381,8 @@ static QString buildAcceptHeader()
 
 // -------------------------------------------------------------------------------------
 
-CachedImage::CachedImage(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
-    : QObject(), CachedObject(url, Image, reload, _expireDate)
+CachedImage::CachedImage(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
+    : QObject(), CachedObject(loader, url, Image, reload, _expireDate)
 {
     static const QString &acceptHeader = KGlobal::staticQString( buildAcceptHeader() );
 
@@ -906,21 +906,50 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 {
     @public
     Loader *m_loader;
-    NSData *m_data;
+    id m_dataSource;
 }
 
--(id)initWithLoader:(Loader *)loader;
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource;
 
 @end
 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
+{
+    int bytesSoFar;	// 0 if this is the start of load
+    int totalToLoad;	// -1 if this is not known.
+                        // bytesSoFar == totalLoaded when complete
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
+}
+- init;
+ at end
+
+ at class IFError;
+
+ at protocol  IFLoadHandler
+- (void)receivedProgress: (IFLoadProgress *)progress forResource: (NSString *)resourceDescription fromDataSource: (IFWebDataSource *)dataSource;
+
+- (void)receivedError: (IFError *)error forResource: (NSString *)resourceDescription partialProgress: (IFLoadProgress *)progress fromDataSource: (IFWebDataSource *)dataSource;
+
+ at end
+
+ at interface IFWebDataSource
+- controller;
+ at end
+
 @implementation URLLoadClient
 
--(id)initWithLoader:(Loader *)loader
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource
 {
     if ((self = [super init])) {
         m_loader = loader;
-        m_data = nil;
-    
+        m_dataSource = dataSource;
         return self;
     }
     
@@ -929,38 +958,57 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, urlString.latin1());
     m_loader->slotFinished(job);
+    
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = 0;
+    loadProgress->bytesSoFar = 0;
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
-    if (!m_data) {
-        m_data = [data retain];
-    }
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+    
+    KWQDEBUGLEVEL4 (0x2000, "dataSource = 0x%08x for URL %s data at 0x%08x, length %d\n", m_dataSource, urlString.latin1(), data, [data length]);
 
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
     m_loader->slotData(job, (const char *)[data bytes], [data length]);    
+
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = -1;
+    loadProgress->bytesSoFar = [data length];
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
--(void)dealloc
-{
-    [m_data release];
-    
-    [super dealloc];
-}
 
 @end
 
@@ -973,17 +1021,17 @@ public:
     LoaderPrivate(Loader *parent)
     {
         _parent = parent;
-        m_recv = [[URLLoadClient alloc] initWithLoader:parent];
+        //m_recv = [[URLLoadClient alloc] initWithLoader:parent dataSource: nil];
     } 
     
     ~LoaderPrivate()
     {
-        [m_recv autorelease];
+        //[m_recv autorelease];
     }       
 
 private:
     Loader *_parent;
-    URLLoadClient *m_recv;
+    //URLLoadClient *m_recv;
 };
 
 } // namespace khtml
@@ -1000,9 +1048,30 @@ Loader::~Loader()
     delete d;
 }
 
+// FIXME!  Clients need to be released when document is completely loaded.
+static NSMutableDictionary *clientForDocument = 0;
+
 void Loader::load(CachedObject *object, const DOMString &baseURL, bool incremental)
 {
+    // All loads associated with a particular baseURL should share the same
+    // URLHandleClient.
+    id client;
+    
+    if (clientForDocument == 0)
+        clientForDocument = [[NSMutableDictionary alloc] init];
+    
+    // FIXME!  We need to remove cached clients when data source goes away.
+    id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+    NSNumber *key = [NSNumber numberWithUnsignedInt: (unsigned int)dataSource];
+    client = [clientForDocument objectForKey: key];
+    if (client == nil){
+        KWQDEBUGLEVEL2 (0x2000, "Creating client for dataSource 0x%08x, url %s\n", dataSource, baseURL.string().latin1());
+        client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
+        [clientForDocument setObject: client forKey: key];
+    }
+    
     Request *req = new Request(object, baseURL, incremental);
+    req->client = client;
     m_requestsPending.append(req);
 
     servePendingRequests();
@@ -1021,9 +1090,15 @@ void Loader::servePendingRequests()
 #endif
 
 #ifdef _KWQ_
+    KWQDEBUGLEVEL2 (0x2000, "Serving request for base %s, url %s\n", 
+                req->m_baseURL.string().latin1(), req->object->url().string().latin1());
+
     KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
     m_requestsLoading.insert(job, req);
-    job->begin(d->m_recv, job);
+
+    //job->begin(d->m_recv, job);
+    job->begin((URLLoadClient *)req->client, job);
+
 #else
   KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
 
@@ -1275,7 +1350,7 @@ CachedImage *Cache::requestImage( const DocLoader* dl, const DOMString & url, co
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedImage *im = new CachedImage(kurl.url(), baseUrl, reload, _expireDate);
+        CachedImage *im = new CachedImage(dl, kurl.url(), baseUrl, reload, _expireDate);
         if ( dl && dl->autoloadImages() ) Cache::loader()->load(im, im->baseURL(), true);
         cache->insert( kurl.url(), im );
         lru->append( kurl.url() );
@@ -1324,7 +1399,7 @@ CachedCSSStyleSheet *Cache::requestStyleSheet( const DocLoader* dl, const DOMStr
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), sheet );
         lru->append( kurl.url() );
         flush();
@@ -1372,7 +1447,7 @@ CachedScript *Cache::requestScript( const DocLoader* dl, const DOM::DOMString &u
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedScript *script = new CachedScript(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedScript *script = new CachedScript(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), script );
         lru->append( kurl.url() );
         flush();
diff --git a/WebCore/kwq/KWQLoader.mm b/WebCore/kwq/KWQLoader.mm
index f576eef..b30632b 100644
--- a/WebCore/kwq/KWQLoader.mm
+++ b/WebCore/kwq/KWQLoader.mm
@@ -101,8 +101,8 @@ void CachedObject::setRequest(Request *_request)
 
 // -------------------------------------------------------------------------------------------
 
-CachedCSSStyleSheet::CachedCSSStyleSheet(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, CSSStyleSheet, reload, _expireDate)
+CachedCSSStyleSheet::CachedCSSStyleSheet(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, CSSStyleSheet, reload, _expireDate)
 {
     // It's css we want.
     setAccept( QString::fromLatin1("text/css") );
@@ -167,8 +167,8 @@ void CachedCSSStyleSheet::error( int /*err*/, const char */*text*/ )
 
 // -------------------------------------------------------------------------------------------
 
-CachedScript::CachedScript(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, Script, reload, _expireDate)
+CachedScript::CachedScript(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, Script, reload, _expireDate)
 {
     // It's javascript we want.
     setAccept( QString::fromLatin1("application/x-javascript") );
@@ -381,8 +381,8 @@ static QString buildAcceptHeader()
 
 // -------------------------------------------------------------------------------------
 
-CachedImage::CachedImage(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
-    : QObject(), CachedObject(url, Image, reload, _expireDate)
+CachedImage::CachedImage(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
+    : QObject(), CachedObject(loader, url, Image, reload, _expireDate)
 {
     static const QString &acceptHeader = KGlobal::staticQString( buildAcceptHeader() );
 
@@ -906,21 +906,50 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 {
     @public
     Loader *m_loader;
-    NSData *m_data;
+    id m_dataSource;
 }
 
--(id)initWithLoader:(Loader *)loader;
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource;
 
 @end
 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
+{
+    int bytesSoFar;	// 0 if this is the start of load
+    int totalToLoad;	// -1 if this is not known.
+                        // bytesSoFar == totalLoaded when complete
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
+}
+- init;
+ at end
+
+ at class IFError;
+
+ at protocol  IFLoadHandler
+- (void)receivedProgress: (IFLoadProgress *)progress forResource: (NSString *)resourceDescription fromDataSource: (IFWebDataSource *)dataSource;
+
+- (void)receivedError: (IFError *)error forResource: (NSString *)resourceDescription partialProgress: (IFLoadProgress *)progress fromDataSource: (IFWebDataSource *)dataSource;
+
+ at end
+
+ at interface IFWebDataSource
+- controller;
+ at end
+
 @implementation URLLoadClient
 
--(id)initWithLoader:(Loader *)loader
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource
 {
     if ((self = [super init])) {
         m_loader = loader;
-        m_data = nil;
-    
+        m_dataSource = dataSource;
         return self;
     }
     
@@ -929,38 +958,57 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, urlString.latin1());
     m_loader->slotFinished(job);
+    
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = 0;
+    loadProgress->bytesSoFar = 0;
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
-    if (!m_data) {
-        m_data = [data retain];
-    }
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+    
+    KWQDEBUGLEVEL4 (0x2000, "dataSource = 0x%08x for URL %s data at 0x%08x, length %d\n", m_dataSource, urlString.latin1(), data, [data length]);
 
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
     m_loader->slotData(job, (const char *)[data bytes], [data length]);    
+
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = -1;
+    loadProgress->bytesSoFar = [data length];
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
--(void)dealloc
-{
-    [m_data release];
-    
-    [super dealloc];
-}
 
 @end
 
@@ -973,17 +1021,17 @@ public:
     LoaderPrivate(Loader *parent)
     {
         _parent = parent;
-        m_recv = [[URLLoadClient alloc] initWithLoader:parent];
+        //m_recv = [[URLLoadClient alloc] initWithLoader:parent dataSource: nil];
     } 
     
     ~LoaderPrivate()
     {
-        [m_recv autorelease];
+        //[m_recv autorelease];
     }       
 
 private:
     Loader *_parent;
-    URLLoadClient *m_recv;
+    //URLLoadClient *m_recv;
 };
 
 } // namespace khtml
@@ -1000,9 +1048,30 @@ Loader::~Loader()
     delete d;
 }
 
+// FIXME!  Clients need to be released when document is completely loaded.
+static NSMutableDictionary *clientForDocument = 0;
+
 void Loader::load(CachedObject *object, const DOMString &baseURL, bool incremental)
 {
+    // All loads associated with a particular baseURL should share the same
+    // URLHandleClient.
+    id client;
+    
+    if (clientForDocument == 0)
+        clientForDocument = [[NSMutableDictionary alloc] init];
+    
+    // FIXME!  We need to remove cached clients when data source goes away.
+    id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+    NSNumber *key = [NSNumber numberWithUnsignedInt: (unsigned int)dataSource];
+    client = [clientForDocument objectForKey: key];
+    if (client == nil){
+        KWQDEBUGLEVEL2 (0x2000, "Creating client for dataSource 0x%08x, url %s\n", dataSource, baseURL.string().latin1());
+        client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
+        [clientForDocument setObject: client forKey: key];
+    }
+    
     Request *req = new Request(object, baseURL, incremental);
+    req->client = client;
     m_requestsPending.append(req);
 
     servePendingRequests();
@@ -1021,9 +1090,15 @@ void Loader::servePendingRequests()
 #endif
 
 #ifdef _KWQ_
+    KWQDEBUGLEVEL2 (0x2000, "Serving request for base %s, url %s\n", 
+                req->m_baseURL.string().latin1(), req->object->url().string().latin1());
+
     KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
     m_requestsLoading.insert(job, req);
-    job->begin(d->m_recv, job);
+
+    //job->begin(d->m_recv, job);
+    job->begin((URLLoadClient *)req->client, job);
+
 #else
   KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
 
@@ -1275,7 +1350,7 @@ CachedImage *Cache::requestImage( const DocLoader* dl, const DOMString & url, co
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedImage *im = new CachedImage(kurl.url(), baseUrl, reload, _expireDate);
+        CachedImage *im = new CachedImage(dl, kurl.url(), baseUrl, reload, _expireDate);
         if ( dl && dl->autoloadImages() ) Cache::loader()->load(im, im->baseURL(), true);
         cache->insert( kurl.url(), im );
         lru->append( kurl.url() );
@@ -1324,7 +1399,7 @@ CachedCSSStyleSheet *Cache::requestStyleSheet( const DocLoader* dl, const DOMStr
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), sheet );
         lru->append( kurl.url() );
         flush();
@@ -1372,7 +1447,7 @@ CachedScript *Cache::requestScript( const DocLoader* dl, const DOM::DOMString &u
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedScript *script = new CachedScript(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedScript *script = new CachedScript(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), script );
         lru->append( kurl.url() );
         flush();
diff --git a/WebCore/kwq/KWQLoaderImpl.mm b/WebCore/kwq/KWQLoaderImpl.mm
index f576eef..b30632b 100644
--- a/WebCore/kwq/KWQLoaderImpl.mm
+++ b/WebCore/kwq/KWQLoaderImpl.mm
@@ -101,8 +101,8 @@ void CachedObject::setRequest(Request *_request)
 
 // -------------------------------------------------------------------------------------------
 
-CachedCSSStyleSheet::CachedCSSStyleSheet(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, CSSStyleSheet, reload, _expireDate)
+CachedCSSStyleSheet::CachedCSSStyleSheet(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, CSSStyleSheet, reload, _expireDate)
 {
     // It's css we want.
     setAccept( QString::fromLatin1("text/css") );
@@ -167,8 +167,8 @@ void CachedCSSStyleSheet::error( int /*err*/, const char */*text*/ )
 
 // -------------------------------------------------------------------------------------------
 
-CachedScript::CachedScript(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, Script, reload, _expireDate)
+CachedScript::CachedScript(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, Script, reload, _expireDate)
 {
     // It's javascript we want.
     setAccept( QString::fromLatin1("application/x-javascript") );
@@ -381,8 +381,8 @@ static QString buildAcceptHeader()
 
 // -------------------------------------------------------------------------------------
 
-CachedImage::CachedImage(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
-    : QObject(), CachedObject(url, Image, reload, _expireDate)
+CachedImage::CachedImage(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
+    : QObject(), CachedObject(loader, url, Image, reload, _expireDate)
 {
     static const QString &acceptHeader = KGlobal::staticQString( buildAcceptHeader() );
 
@@ -906,21 +906,50 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 {
     @public
     Loader *m_loader;
-    NSData *m_data;
+    id m_dataSource;
 }
 
--(id)initWithLoader:(Loader *)loader;
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource;
 
 @end
 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
+{
+    int bytesSoFar;	// 0 if this is the start of load
+    int totalToLoad;	// -1 if this is not known.
+                        // bytesSoFar == totalLoaded when complete
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
+}
+- init;
+ at end
+
+ at class IFError;
+
+ at protocol  IFLoadHandler
+- (void)receivedProgress: (IFLoadProgress *)progress forResource: (NSString *)resourceDescription fromDataSource: (IFWebDataSource *)dataSource;
+
+- (void)receivedError: (IFError *)error forResource: (NSString *)resourceDescription partialProgress: (IFLoadProgress *)progress fromDataSource: (IFWebDataSource *)dataSource;
+
+ at end
+
+ at interface IFWebDataSource
+- controller;
+ at end
+
 @implementation URLLoadClient
 
--(id)initWithLoader:(Loader *)loader
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource
 {
     if ((self = [super init])) {
         m_loader = loader;
-        m_data = nil;
-    
+        m_dataSource = dataSource;
         return self;
     }
     
@@ -929,38 +958,57 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, urlString.latin1());
     m_loader->slotFinished(job);
+    
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = 0;
+    loadProgress->bytesSoFar = 0;
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
-    if (!m_data) {
-        m_data = [data retain];
-    }
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+    
+    KWQDEBUGLEVEL4 (0x2000, "dataSource = 0x%08x for URL %s data at 0x%08x, length %d\n", m_dataSource, urlString.latin1(), data, [data length]);
 
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
     m_loader->slotData(job, (const char *)[data bytes], [data length]);    
+
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = -1;
+    loadProgress->bytesSoFar = [data length];
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
--(void)dealloc
-{
-    [m_data release];
-    
-    [super dealloc];
-}
 
 @end
 
@@ -973,17 +1021,17 @@ public:
     LoaderPrivate(Loader *parent)
     {
         _parent = parent;
-        m_recv = [[URLLoadClient alloc] initWithLoader:parent];
+        //m_recv = [[URLLoadClient alloc] initWithLoader:parent dataSource: nil];
     } 
     
     ~LoaderPrivate()
     {
-        [m_recv autorelease];
+        //[m_recv autorelease];
     }       
 
 private:
     Loader *_parent;
-    URLLoadClient *m_recv;
+    //URLLoadClient *m_recv;
 };
 
 } // namespace khtml
@@ -1000,9 +1048,30 @@ Loader::~Loader()
     delete d;
 }
 
+// FIXME!  Clients need to be released when document is completely loaded.
+static NSMutableDictionary *clientForDocument = 0;
+
 void Loader::load(CachedObject *object, const DOMString &baseURL, bool incremental)
 {
+    // All loads associated with a particular baseURL should share the same
+    // URLHandleClient.
+    id client;
+    
+    if (clientForDocument == 0)
+        clientForDocument = [[NSMutableDictionary alloc] init];
+    
+    // FIXME!  We need to remove cached clients when data source goes away.
+    id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+    NSNumber *key = [NSNumber numberWithUnsignedInt: (unsigned int)dataSource];
+    client = [clientForDocument objectForKey: key];
+    if (client == nil){
+        KWQDEBUGLEVEL2 (0x2000, "Creating client for dataSource 0x%08x, url %s\n", dataSource, baseURL.string().latin1());
+        client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
+        [clientForDocument setObject: client forKey: key];
+    }
+    
     Request *req = new Request(object, baseURL, incremental);
+    req->client = client;
     m_requestsPending.append(req);
 
     servePendingRequests();
@@ -1021,9 +1090,15 @@ void Loader::servePendingRequests()
 #endif
 
 #ifdef _KWQ_
+    KWQDEBUGLEVEL2 (0x2000, "Serving request for base %s, url %s\n", 
+                req->m_baseURL.string().latin1(), req->object->url().string().latin1());
+
     KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
     m_requestsLoading.insert(job, req);
-    job->begin(d->m_recv, job);
+
+    //job->begin(d->m_recv, job);
+    job->begin((URLLoadClient *)req->client, job);
+
 #else
   KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
 
@@ -1275,7 +1350,7 @@ CachedImage *Cache::requestImage( const DocLoader* dl, const DOMString & url, co
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedImage *im = new CachedImage(kurl.url(), baseUrl, reload, _expireDate);
+        CachedImage *im = new CachedImage(dl, kurl.url(), baseUrl, reload, _expireDate);
         if ( dl && dl->autoloadImages() ) Cache::loader()->load(im, im->baseURL(), true);
         cache->insert( kurl.url(), im );
         lru->append( kurl.url() );
@@ -1324,7 +1399,7 @@ CachedCSSStyleSheet *Cache::requestStyleSheet( const DocLoader* dl, const DOMStr
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), sheet );
         lru->append( kurl.url() );
         flush();
@@ -1372,7 +1447,7 @@ CachedScript *Cache::requestScript( const DocLoader* dl, const DOM::DOMString &u
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedScript *script = new CachedScript(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedScript *script = new CachedScript(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), script );
         lru->append( kurl.url() );
         flush();
diff --git a/WebCore/kwq/kio/jobclasses.h b/WebCore/kwq/kio/jobclasses.h
index 169bee3..bd1069f 100644
--- a/WebCore/kwq/kio/jobclasses.h
+++ b/WebCore/kwq/kio/jobclasses.h
@@ -172,8 +172,10 @@ public:
 #else
     void begin(void *requestor, void *userData);
 #endif
+    KURL url() { return _url; }
 #endif
 
+    
     // operators ---------------------------------------------------------------
 
 // protected -------------------------------------------------------------------
diff --git a/WebCore/src/kdelibs/khtml/misc/loader.h b/WebCore/src/kdelibs/khtml/misc/loader.h
index fd25e47..ec7edf0 100644
--- a/WebCore/src/kdelibs/khtml/misc/loader.h
+++ b/WebCore/src/kdelibs/khtml/misc/loader.h
@@ -67,6 +67,7 @@ namespace khtml
     class CachedObject;
     class Request;
     class LoaderPrivate;
+    class DocLoader;
 
     /**
      * @internal
@@ -95,8 +96,9 @@ namespace khtml
 	    Uncacheable   // to big to be cached,
 	};  	          // will be destroyed as soon as possible
 
-	CachedObject(const DOM::DOMString &url, Type type, bool _reload, int _expireDate)
+	CachedObject(const DocLoader *loader, const DOM::DOMString &url, Type type, bool _reload, int _expireDate)
 	{
+	    m_loader = loader;
 	    m_url = url;
 	    m_type = type;
 	    m_status = Pending;
@@ -105,12 +107,12 @@ namespace khtml
 	    m_reload = _reload;
 	    m_request = 0;
 	    m_expireDate = _expireDate;
-            m_deleted = false;
+        m_deleted = false;
 	}
 	virtual ~CachedObject() {
-            if(m_deleted) abort();
+        if(m_deleted) abort();
             m_deleted = true;
-        }
+    }
 
 	virtual void data( QBuffer &buffer, bool eof) = 0;
 	virtual void error( int err, const char *text ) = 0;
@@ -135,41 +137,47 @@ namespace khtml
 	 */
 	void finish();
 
-        /*
-         * Called by the cache if the object has been removed from the cache dict
-         * while still being referenced. This means the object should kill itself
-         * if its reference counter drops down to zero.
-         */
-        void setFree( bool b ) { m_free = b; }
-
-        bool reload() const { return m_reload; }
-
-        void setRequest(Request *_request);
-
-        bool canDelete() const { return (m_clients.count() == 0 && !m_request); }
+    /*
+     * Called by the cache if the object has been removed from the cache dict
+     * while still being referenced. This means the object should kill itself
+     * if its reference counter drops down to zero.
+     */
+    void setFree( bool b ) { m_free = b; }
+    
+    bool reload() const { return m_reload; }
+    
+    void setRequest(Request *_request);
+    
+    bool canDelete() const { return (m_clients.count() == 0 && !m_request); }
 
 	void setExpireDate(int _expireDate);
 
-        /*
-         * List of acceptable mimetypes seperated by ",". A mimetype may contain a wildcard.
-         */
-        // e.g. "text/*"
-        QString accept() const { return m_accept; }
-        void setAccept(const QString &_accept) { m_accept = _accept; }
+    /*
+     * List of acceptable mimetypes seperated by ",". A mimetype may contain a wildcard.
+     */
+    // e.g. "text/*"
+    QString accept() const { return m_accept; }
+    void setAccept(const QString &_accept) { m_accept = _accept; }
 
+
+    const DocLoader *loader() { return m_loader; }
+    
     protected:
-        QList<CachedObjectClient> m_clients;
+
+    const DocLoader *m_loader;
+    
+    QList<CachedObjectClient> m_clients;
         
 	DOM::DOMString m_url;
-        QString m_accept;
-        Request *m_request;
+    QString m_accept;
+    Request *m_request;
 	Type m_type;
 	Status m_status;
 	int m_size;
 	int m_expireDate;
-        bool m_free;
-        bool m_reload;
-        bool m_deleted;
+    bool m_free;
+    bool m_reload;
+    bool m_deleted;
     };
 
 
@@ -179,7 +187,7 @@ namespace khtml
     class CachedCSSStyleSheet : public CachedObject
     {
     public:
-	CachedCSSStyleSheet(const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
+	CachedCSSStyleSheet(const DocLoader *loader, const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
 	virtual ~CachedCSSStyleSheet();
 
 	const DOM::DOMString &sheet() const { return m_sheet; }
@@ -204,7 +212,7 @@ namespace khtml
     class CachedScript : public CachedObject
     {
     public:
-	CachedScript(const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
+	CachedScript(const DocLoader *loader, const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate, const QString& charset);
 	virtual ~CachedScript();
 
 	const DOM::DOMString &script() const { return m_script; }
@@ -232,7 +240,7 @@ namespace khtml
     {
 	Q_OBJECT
     public:
-	CachedImage(const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate);
+	CachedImage(const DocLoader *loader, const DOM::DOMString &url, const DOM::DOMString &baseURL, bool reload, int _expireDate);
 	virtual ~CachedImage();
 
 	const QPixmap &pixmap() const;
@@ -314,6 +322,7 @@ namespace khtml
         void setReloading( bool );
         void setShowAnimations( bool );
         void removeCachedObject( CachedObject*) const;
+        const KHTMLPart *part() { return m_part; }
 
     private:
         friend class Cache;
@@ -340,6 +349,9 @@ namespace khtml
 	QBuffer m_buffer;
 	CachedObject *object;
 	DOM::DOMString m_baseURL;
+#ifdef _KWQ_
+    void *client;
+#endif
     };
 
     /**
diff --git a/WebCore/src/kwq/KWQKHTMLPart.mm b/WebCore/src/kwq/KWQKHTMLPart.mm
index c6a5359..98441bc 100644
--- a/WebCore/src/kwq/KWQKHTMLPart.mm
+++ b/WebCore/src/kwq/KWQKHTMLPart.mm
@@ -139,19 +139,23 @@ static void recursive(const DOM::Node &pNode, const DOM::Node &node)
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
+    KWQDEBUGLEVEL1 (0x2000, "userData = 0x%08x\n", userData);
     m_part->closeURL();
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
+    KWQDEBUGLEVEL3 (0x2000, "userData = 0x%08x, data = 0x%08x, length %d\n", userData, data, [data length]);
     if (!m_data) {
         m_data = [data retain];
     }
@@ -160,6 +164,7 @@ static void recursive(const DOM::Node &pNode, const DOM::Node &node)
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KWQDEBUGLEVEL2 (0x2000, "result = %d, userData = 0x%08x\n", result, userData);
 }
 
 
@@ -395,7 +400,7 @@ bool KHTMLPart::openURL( const KURL &url )
     urlString = [NSString stringWithCString:d->m_workingURL.url().latin1()];
     // FIXME: temporary hack to make file: URLs work right
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
 
     if ([urlString hasSuffix:@"/"]) {
@@ -426,7 +431,7 @@ bool KHTMLPart::closeURL()
     
     urlString = [NSString stringWithCString:d->m_url.url().latin1()];
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
 
     if ([urlString hasSuffix:@"/"]) {
@@ -581,8 +586,6 @@ bool KHTMLPart::onlyLocalReferences() const
 }
 
 
-
-
 void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset)
 {
     //d->m_referrer = url.url();
@@ -683,7 +686,9 @@ void KHTMLPart::write(const char *str, int len)
     double start = CFAbsoluteTimeGetCurrent();
 #endif
     
-    // FIX ME:  This is very expensive.
+    // FIX ME:  This is very expensive.  We should using the IFMutableData
+    // that represents the document, and only constructing the complete
+    // string when requested.
     d->m_documentSource += QString(str, len);
 
     QString decoded;
@@ -699,6 +704,8 @@ void KHTMLPart::write(const char *str, int len)
 
     d->m_decodingStarted = 1;
         
+    // Transition from provisional to committed data source at this point.
+    
     d->m_doc->applyChanges(true, true);
     
     // end lines added in lieu of big fixme
@@ -1782,11 +1789,11 @@ void KHTMLPart::checkCompleted()
     NSString *urlString;
     urlString = [NSString stringWithCString:d->m_url.url().latin1()];
     if ([urlString hasPrefix:@"file:/"] && [urlString characterAtIndex:6] != '/') {
-	urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
+	    urlString = [@"file:///" stringByAppendingString:[urlString substringFromIndex:6]];
     }
     
     if ([urlString hasSuffix:@"/"]) {
-	urlString = [urlString substringToIndex:([urlString length] - 1)];
+	    urlString = [urlString substringToIndex:([urlString length] - 1)];
     }
     
     // Still waiting for images/scripts from the loader ?
diff --git a/WebCore/src/kwq/KWQKloader.mm b/WebCore/src/kwq/KWQKloader.mm
index f576eef..b30632b 100644
--- a/WebCore/src/kwq/KWQKloader.mm
+++ b/WebCore/src/kwq/KWQKloader.mm
@@ -101,8 +101,8 @@ void CachedObject::setRequest(Request *_request)
 
 // -------------------------------------------------------------------------------------------
 
-CachedCSSStyleSheet::CachedCSSStyleSheet(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, CSSStyleSheet, reload, _expireDate)
+CachedCSSStyleSheet::CachedCSSStyleSheet(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, CSSStyleSheet, reload, _expireDate)
 {
     // It's css we want.
     setAccept( QString::fromLatin1("text/css") );
@@ -167,8 +167,8 @@ void CachedCSSStyleSheet::error( int /*err*/, const char */*text*/ )
 
 // -------------------------------------------------------------------------------------------
 
-CachedScript::CachedScript(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
-    : CachedObject(url, Script, reload, _expireDate)
+CachedScript::CachedScript(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate, const QString& charset)
+    : CachedObject(loader, url, Script, reload, _expireDate)
 {
     // It's javascript we want.
     setAccept( QString::fromLatin1("application/x-javascript") );
@@ -381,8 +381,8 @@ static QString buildAcceptHeader()
 
 // -------------------------------------------------------------------------------------
 
-CachedImage::CachedImage(const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
-    : QObject(), CachedObject(url, Image, reload, _expireDate)
+CachedImage::CachedImage(const DocLoader *loader, const DOMString &url, const DOMString &baseURL, bool reload, int _expireDate)
+    : QObject(), CachedObject(loader, url, Image, reload, _expireDate)
 {
     static const QString &acceptHeader = KGlobal::staticQString( buildAcceptHeader() );
 
@@ -906,21 +906,50 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 {
     @public
     Loader *m_loader;
-    NSData *m_data;
+    id m_dataSource;
 }
 
--(id)initWithLoader:(Loader *)loader;
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource;
 
 @end
 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
+{
+    int bytesSoFar;	// 0 if this is the start of load
+    int totalToLoad;	// -1 if this is not known.
+                        // bytesSoFar == totalLoaded when complete
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
+}
+- init;
+ at end
+
+ at class IFError;
+
+ at protocol  IFLoadHandler
+- (void)receivedProgress: (IFLoadProgress *)progress forResource: (NSString *)resourceDescription fromDataSource: (IFWebDataSource *)dataSource;
+
+- (void)receivedError: (IFError *)error forResource: (NSString *)resourceDescription partialProgress: (IFLoadProgress *)progress fromDataSource: (IFWebDataSource *)dataSource;
+
+ at end
+
+ at interface IFWebDataSource
+- controller;
+ at end
+
 @implementation URLLoadClient
 
--(id)initWithLoader:(Loader *)loader
+-(id)initWithLoader:(Loader *)loader dataSource: dataSource
 {
     if ((self = [super init])) {
         m_loader = loader;
-        m_data = nil;
-    
+        m_dataSource = dataSource;
         return self;
     }
     
@@ -929,38 +958,57 @@ void DocLoader::removeCachedObject( CachedObject* o ) const
 
 - (void)WCURLHandleResourceDidBeginLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidCancelLoading:(id)sender userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
 - (void)WCURLHandleResourceDidFinishLoading:(id)sender userData:(void *)userData
 {
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, urlString.latin1());
     m_loader->slotFinished(job);
+    
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = 0;
+    loadProgress->bytesSoFar = 0;
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDataDidBecomeAvailable:(NSData *)data userData:(void *)userData
 {
-    if (!m_data) {
-        m_data = [data retain];
-    }
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    QString urlString = job->url().url();
+    
+    KWQDEBUGLEVEL4 (0x2000, "dataSource = 0x%08x for URL %s data at 0x%08x, length %d\n", m_dataSource, urlString.latin1(), data, [data length]);
 
-    KIO::Job *job = static_cast<KIO::Job *>(userData);
     m_loader->slotData(job, (const char *)[data bytes], [data length]);    
+
+    id <IFLoadHandler> controller;
+    
+    controller = [m_dataSource controller];
+    IFLoadProgress *loadProgress = [[[IFLoadProgress alloc] init] autorelease];
+    loadProgress->totalToLoad = -1;
+    loadProgress->bytesSoFar = [data length];
+    [controller receivedProgress: (IFLoadProgress *)loadProgress forResource: QSTRING_TO_NSSTRING(urlString) fromDataSource: m_dataSource];
 }
 
 - (void)WCURLHandle:(id)sender resourceDidFailLoadingWithResult:(int)result userData:(void *)userData
 {
+    KIO::TransferJob *job = static_cast<KIO::TransferJob *>(userData);
+    KWQDEBUGLEVEL2 (0x2000, "dataSource = 0x%08x for URL %s\n", m_dataSource, job->url().url().latin1());
 }
 
--(void)dealloc
-{
-    [m_data release];
-    
-    [super dealloc];
-}
 
 @end
 
@@ -973,17 +1021,17 @@ public:
     LoaderPrivate(Loader *parent)
     {
         _parent = parent;
-        m_recv = [[URLLoadClient alloc] initWithLoader:parent];
+        //m_recv = [[URLLoadClient alloc] initWithLoader:parent dataSource: nil];
     } 
     
     ~LoaderPrivate()
     {
-        [m_recv autorelease];
+        //[m_recv autorelease];
     }       
 
 private:
     Loader *_parent;
-    URLLoadClient *m_recv;
+    //URLLoadClient *m_recv;
 };
 
 } // namespace khtml
@@ -1000,9 +1048,30 @@ Loader::~Loader()
     delete d;
 }
 
+// FIXME!  Clients need to be released when document is completely loaded.
+static NSMutableDictionary *clientForDocument = 0;
+
 void Loader::load(CachedObject *object, const DOMString &baseURL, bool incremental)
 {
+    // All loads associated with a particular baseURL should share the same
+    // URLHandleClient.
+    id client;
+    
+    if (clientForDocument == 0)
+        clientForDocument = [[NSMutableDictionary alloc] init];
+    
+    // FIXME!  We need to remove cached clients when data source goes away.
+    id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+    NSNumber *key = [NSNumber numberWithUnsignedInt: (unsigned int)dataSource];
+    client = [clientForDocument objectForKey: key];
+    if (client == nil){
+        KWQDEBUGLEVEL2 (0x2000, "Creating client for dataSource 0x%08x, url %s\n", dataSource, baseURL.string().latin1());
+        client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
+        [clientForDocument setObject: client forKey: key];
+    }
+    
     Request *req = new Request(object, baseURL, incremental);
+    req->client = client;
     m_requestsPending.append(req);
 
     servePendingRequests();
@@ -1021,9 +1090,15 @@ void Loader::servePendingRequests()
 #endif
 
 #ifdef _KWQ_
+    KWQDEBUGLEVEL2 (0x2000, "Serving request for base %s, url %s\n", 
+                req->m_baseURL.string().latin1(), req->object->url().string().latin1());
+
     KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
     m_requestsLoading.insert(job, req);
-    job->begin(d->m_recv, job);
+
+    //job->begin(d->m_recv, job);
+    job->begin((URLLoadClient *)req->client, job);
+
 #else
   KIO::TransferJob* job = KIO::get( req->object->url().string(), req->object->reload(), false /*no GUI*/);
 
@@ -1275,7 +1350,7 @@ CachedImage *Cache::requestImage( const DocLoader* dl, const DOMString & url, co
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedImage *im = new CachedImage(kurl.url(), baseUrl, reload, _expireDate);
+        CachedImage *im = new CachedImage(dl, kurl.url(), baseUrl, reload, _expireDate);
         if ( dl && dl->autoloadImages() ) Cache::loader()->load(im, im->baseURL(), true);
         cache->insert( kurl.url(), im );
         lru->append( kurl.url() );
@@ -1324,7 +1399,7 @@ CachedCSSStyleSheet *Cache::requestStyleSheet( const DocLoader* dl, const DOMStr
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), sheet );
         lru->append( kurl.url() );
         flush();
@@ -1372,7 +1447,7 @@ CachedScript *Cache::requestScript( const DocLoader* dl, const DOM::DOMString &u
 #ifdef CACHE_DEBUG
         kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
 #endif
-        CachedScript *script = new CachedScript(kurl.url(), baseUrl, reload, _expireDate, charset);
+        CachedScript *script = new CachedScript(dl, kurl.url(), baseUrl, reload, _expireDate, charset);
         cache->insert( kurl.url(), script );
         lru->append( kurl.url() );
         flush();
diff --git a/WebCore/src/kwq/kio/jobclasses.h b/WebCore/src/kwq/kio/jobclasses.h
index 169bee3..bd1069f 100644
--- a/WebCore/src/kwq/kio/jobclasses.h
+++ b/WebCore/src/kwq/kio/jobclasses.h
@@ -172,8 +172,10 @@ public:
 #else
     void begin(void *requestor, void *userData);
 #endif
+    KURL url() { return _url; }
 #endif
 
+    
     // operators ---------------------------------------------------------------
 
 // protected -------------------------------------------------------------------
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 4141aef..da814cf 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,20 @@
+2002-02-20  Richard Williamson  <rjw at apple.com>
+
+    Some groundwork to bring WebFoundation callbacks up to 
+    WebKit.
+    
+	* WebView.subproj/IFBaseWebController.mm: (-[IFLoadProgress init]),
+	(-[IFBaseWebController receivedProgress:forResource:fromDataSource:]),
+	(-[IFBaseWebController
+	receivedError:forResource:partialProgress:fromDataSource:]),
+	(-[IFBaseWebController _changeFrame:dataSource:]):
+	* WebView.subproj/IFWebController.h:
+	* WebView.subproj/IFWebDataSource.mm: (-[IFWebDataSource stopLoading]):
+	* WebView.subproj/IFWebFrame.h:
+	* WebView.subproj/IFWebFramePrivate.h:
+	* WebView.subproj/IFWebFramePrivate.mm: (-[IFWebFramePrivate
+	setProvisionalDataSource:]):
+
 2002-02-20  Maciej Stachowiak  <mjs at apple.com>
 
 	* WebView.subproj/IFWebController.h: Fix my WebController screw-up.
diff --git a/WebKit/ChangeLog-2002-12-03 b/WebKit/ChangeLog-2002-12-03
index 4141aef..da814cf 100644
--- a/WebKit/ChangeLog-2002-12-03
+++ b/WebKit/ChangeLog-2002-12-03
@@ -1,3 +1,20 @@
+2002-02-20  Richard Williamson  <rjw at apple.com>
+
+    Some groundwork to bring WebFoundation callbacks up to 
+    WebKit.
+    
+	* WebView.subproj/IFBaseWebController.mm: (-[IFLoadProgress init]),
+	(-[IFBaseWebController receivedProgress:forResource:fromDataSource:]),
+	(-[IFBaseWebController
+	receivedError:forResource:partialProgress:fromDataSource:]),
+	(-[IFBaseWebController _changeFrame:dataSource:]):
+	* WebView.subproj/IFWebController.h:
+	* WebView.subproj/IFWebDataSource.mm: (-[IFWebDataSource stopLoading]):
+	* WebView.subproj/IFWebFrame.h:
+	* WebView.subproj/IFWebFramePrivate.h:
+	* WebView.subproj/IFWebFramePrivate.mm: (-[IFWebFramePrivate
+	setProvisionalDataSource:]):
+
 2002-02-20  Maciej Stachowiak  <mjs at apple.com>
 
 	* WebView.subproj/IFWebController.h: Fix my WebController screw-up.
diff --git a/WebKit/WebView.subproj/IFBaseWebController.mm b/WebKit/WebView.subproj/IFBaseWebController.mm
index 558552e..a19c848 100644
--- a/WebKit/WebView.subproj/IFBaseWebController.mm
+++ b/WebKit/WebView.subproj/IFBaseWebController.mm
@@ -68,6 +68,14 @@
 
 @end
 
+ at implementation IFLoadProgress
+- init
+{
+    return [super init];
+}
+
+ at end
+
 
 @implementation IFBaseWebController
 
@@ -227,13 +235,14 @@
 // ---------------------------------------------------------------------
 - (void)receivedProgress: (IFLoadProgress *)progress forResource: (NSString *)resourceDescription fromDataSource: (IFWebDataSource *)dataSource
 {
-    [NSException raise:IFMethodNotYetImplemented format:@"IFBaseWebController::receivedProgress:forResource:fromDataSource: is not implemented"];
+    // Do nothing.
 }
 
 
+
 - (void)receivedError: (IFError *)error forResource: (NSString *)resourceDescription partialProgress: (IFLoadProgress *)progress fromDataSource: (IFWebDataSource *)dataSource
 {
-    [NSException raise:IFMethodNotYetImplemented format:@"IFBaseWebController::receivedError:forResource:partialProgress:fromDataSource: is not implemented"];
+    // FIXME?
 }
 
 
@@ -272,6 +281,8 @@
     [newDataSource _setController: self];
     [frame setDataSource: newDataSource];
     
+    // dataSourceChanged: will reset the view and begin trying to
+    // display the new new datasource.
     [[frame view] dataSourceChanged: newDataSource];
 
     // This introduces a nasty dependency on the view.
diff --git a/WebKit/WebView.subproj/IFWebController.h b/WebKit/WebView.subproj/IFWebController.h
index 7ab880a..80bbb54 100644
--- a/WebKit/WebView.subproj/IFWebController.h
+++ b/WebKit/WebView.subproj/IFWebController.h
@@ -121,14 +121,19 @@
     A IFLoadProgress capture the state associated with a load progress
     indication.  Should we use a struct?
 */
- at interface IFLoadProgress 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
 {
     int bytesSoFar;	// 0 if this is the start of load
     int totalToLoad;	// -1 if this is not known.
                         // bytesSoFar == totalLoaded when complete
-#ifdef TENTATIVE_API
-    IF_LOAD_TYPES type;	// load types, either image, css, jscript, or html
-#endif
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
 }
 @end
 
diff --git a/WebKit/WebView.subproj/IFWebDataSource.mm b/WebKit/WebView.subproj/IFWebDataSource.mm
index 9a8577a..b5f5278 100644
--- a/WebKit/WebView.subproj/IFWebDataSource.mm
+++ b/WebKit/WebView.subproj/IFWebDataSource.mm
@@ -231,7 +231,7 @@
 // Returns NO if the data source is not currently loading.
 - (void)stopLoading
 {
-    [NSException raise:IFMethodNotYetImplemented format:@"IFWebDataSource::stopLoading is not implemented"];
+    [self _part]->closeURL ();
 }
 
 
diff --git a/WebKit/WebView.subproj/IFWebFrame.h b/WebKit/WebView.subproj/IFWebFrame.h
index 049e8f2..5bfb9d2 100644
--- a/WebKit/WebView.subproj/IFWebFrame.h
+++ b/WebKit/WebView.subproj/IFWebFrame.h
@@ -19,9 +19,19 @@
 - (NSString *)name;
 - (void)setView: view;
 - view;
+
+/*
+    Sets the frame's data source.  Note that the data source will be
+    considered 'provisional' until it has been loaded, and at least
+    ~some~ data has been received.
+*/
 - (void)setDataSource: (IFWebDataSource *)ds;
 - (IFWebDataSource *)dataSource;
 
+- (IFWebDataSource *)provisionalDataSource;
+
+
+
 - (void)reset;
 
 // private
diff --git a/WebKit/WebView.subproj/IFWebFramePrivate.h b/WebKit/WebView.subproj/IFWebFramePrivate.h
index a43ae5e..2b1f93b 100644
--- a/WebKit/WebView.subproj/IFWebFramePrivate.h
+++ b/WebKit/WebView.subproj/IFWebFramePrivate.h
@@ -15,6 +15,7 @@
     NSString *name;
     id view;
     IFWebDataSource *dataSource;
+    IFWebDataSource *provisionalDataSource;
     void *renderFramePart;
 }
 
diff --git a/WebKit/WebView.subproj/IFWebFramePrivate.mm b/WebKit/WebView.subproj/IFWebFramePrivate.mm
index c197c37..73c2a8d 100644
--- a/WebKit/WebView.subproj/IFWebFramePrivate.mm
+++ b/WebKit/WebView.subproj/IFWebFramePrivate.mm
@@ -39,6 +39,14 @@
 }
 
 
+- (IFWebDataSource *)provisionalDataSource { return provisionalDataSource; }
+- (void)setProvisionalDataSource: (IFWebDataSource *)d
+{ 
+    [provisionalDataSource autorelease];
+    provisionalDataSource = [d retain];
+}
+
+
 - (void *)renderFramePart { return renderFramePart; }
 - (void)setRenderFramePart: (void *)p 
 {
diff --git a/WebKit/WebView.subproj/WebController.h b/WebKit/WebView.subproj/WebController.h
index 7ab880a..80bbb54 100644
--- a/WebKit/WebView.subproj/WebController.h
+++ b/WebKit/WebView.subproj/WebController.h
@@ -121,14 +121,19 @@
     A IFLoadProgress capture the state associated with a load progress
     indication.  Should we use a struct?
 */
- at interface IFLoadProgress 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
 {
     int bytesSoFar;	// 0 if this is the start of load
     int totalToLoad;	// -1 if this is not known.
                         // bytesSoFar == totalLoaded when complete
-#ifdef TENTATIVE_API
-    IF_LOAD_TYPES type;	// load types, either image, css, jscript, or html
-#endif
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
 }
 @end
 
diff --git a/WebKit/WebView.subproj/WebDataSource.m b/WebKit/WebView.subproj/WebDataSource.m
index 9a8577a..b5f5278 100644
--- a/WebKit/WebView.subproj/WebDataSource.m
+++ b/WebKit/WebView.subproj/WebDataSource.m
@@ -231,7 +231,7 @@
 // Returns NO if the data source is not currently loading.
 - (void)stopLoading
 {
-    [NSException raise:IFMethodNotYetImplemented format:@"IFWebDataSource::stopLoading is not implemented"];
+    [self _part]->closeURL ();
 }
 
 
diff --git a/WebKit/WebView.subproj/WebFrame.h b/WebKit/WebView.subproj/WebFrame.h
index 049e8f2..5bfb9d2 100644
--- a/WebKit/WebView.subproj/WebFrame.h
+++ b/WebKit/WebView.subproj/WebFrame.h
@@ -19,9 +19,19 @@
 - (NSString *)name;
 - (void)setView: view;
 - view;
+
+/*
+    Sets the frame's data source.  Note that the data source will be
+    considered 'provisional' until it has been loaded, and at least
+    ~some~ data has been received.
+*/
 - (void)setDataSource: (IFWebDataSource *)ds;
 - (IFWebDataSource *)dataSource;
 
+- (IFWebDataSource *)provisionalDataSource;
+
+
+
 - (void)reset;
 
 // private
diff --git a/WebKit/WebView.subproj/WebFramePrivate.h b/WebKit/WebView.subproj/WebFramePrivate.h
index a43ae5e..2b1f93b 100644
--- a/WebKit/WebView.subproj/WebFramePrivate.h
+++ b/WebKit/WebView.subproj/WebFramePrivate.h
@@ -15,6 +15,7 @@
     NSString *name;
     id view;
     IFWebDataSource *dataSource;
+    IFWebDataSource *provisionalDataSource;
     void *renderFramePart;
 }
 
diff --git a/WebKit/WebView.subproj/WebFramePrivate.m b/WebKit/WebView.subproj/WebFramePrivate.m
index c197c37..73c2a8d 100644
--- a/WebKit/WebView.subproj/WebFramePrivate.m
+++ b/WebKit/WebView.subproj/WebFramePrivate.m
@@ -39,6 +39,14 @@
 }
 
 
+- (IFWebDataSource *)provisionalDataSource { return provisionalDataSource; }
+- (void)setProvisionalDataSource: (IFWebDataSource *)d
+{ 
+    [provisionalDataSource autorelease];
+    provisionalDataSource = [d retain];
+}
+
+
 - (void *)renderFramePart { return renderFramePart; }
 - (void)setRenderFramePart: (void *)p 
 {
diff --git a/WebKit/WebView.subproj/WebView.h b/WebKit/WebView.subproj/WebView.h
index 7ab880a..80bbb54 100644
--- a/WebKit/WebView.subproj/WebView.h
+++ b/WebKit/WebView.subproj/WebView.h
@@ -121,14 +121,19 @@
     A IFLoadProgress capture the state associated with a load progress
     indication.  Should we use a struct?
 */
- at interface IFLoadProgress 
+typedef enum {
+    IF_LOAD_TYPE_CSS    = 1,
+    IF_LOAD_TYPE_IMAGE  = 2,
+    IF_LOAD_TYPE_SCRIPT = 3
+} IF_LOAD_TYPE;
+
+
+ at interface IFLoadProgress : NSObject
 {
     int bytesSoFar;	// 0 if this is the start of load
     int totalToLoad;	// -1 if this is not known.
                         // bytesSoFar == totalLoaded when complete
-#ifdef TENTATIVE_API
-    IF_LOAD_TYPES type;	// load types, either image, css, jscript, or html
-#endif
+    IF_LOAD_TYPE type;	// load types, either image, css, or jscript
 }
 @end
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list