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

mjs mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:17:54 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 822d6377acdd26cdcb23e0607fcdc023875e5bde
Author: mjs <mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Dec 11 04:55:47 2003 +0000

    WebCore:
    
            Reviewed by Richard.
    
    	<rdar://problem/3487160>: Implement synchronous loading for XMLHttpRequest
    
    	* khtml/ecma/xmlhttprequest.cpp:
            (KJS::XMLHttpRequest::XMLHttpRequest):
            (KJS::XMLHttpRequest::send):
            (KJS::XMLHttpRequest::abort):
            (KJS::XMLHttpRequest::processSyncLoadResults):
            (KJS::XMLHttpRequest::slotRedirection):
            (KJS::XMLHttpRequest::slotData):
            * khtml/ecma/xmlhttprequest.h:
            * kwq/KWQLoader.h:
            * kwq/KWQLoader.mm:
            (KWQHeaderStringFromDictionary):
            (KWQServeSynchronousRequest):
            (KWQResponseHeaderString):
            * kwq/WebCoreBridge.h:
    
    WebKit:
    
            Reviewed by Richard.
    
    	WebKit part of fix for:
    
    	<rdar://problem/3487160>: Implement synchronous loading for XMLHttpRequest
    
            * WebCoreSupport.subproj/WebBridge.m:
            (-[WebBridge syncLoadResourceWithURL:customHeaders:postData:finalURL:responseHeaders:statusCode:]):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@5754 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 025d5fe..8aba3cd 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,24 @@
+2003-12-10  Maciej Stachowiak  <mjs at apple.com>
+
+        Reviewed by Richard.
+
+	<rdar://problem/3487160>: Implement synchronous loading for XMLHttpRequest
+        
+	* khtml/ecma/xmlhttprequest.cpp:
+        (KJS::XMLHttpRequest::XMLHttpRequest):
+        (KJS::XMLHttpRequest::send):
+        (KJS::XMLHttpRequest::abort):
+        (KJS::XMLHttpRequest::processSyncLoadResults):
+        (KJS::XMLHttpRequest::slotRedirection):
+        (KJS::XMLHttpRequest::slotData):
+        * khtml/ecma/xmlhttprequest.h:
+        * kwq/KWQLoader.h:
+        * kwq/KWQLoader.mm:
+        (KWQHeaderStringFromDictionary):
+        (KWQServeSynchronousRequest):
+        (KWQResponseHeaderString):
+        * kwq/WebCoreBridge.h:
+
 2003-12-10  Darin Adler  <darin at apple.com>
 
         Reviewed by Maciej.
diff --git a/WebCore/khtml/ecma/xmlhttprequest.cpp b/WebCore/khtml/ecma/xmlhttprequest.cpp
index 2349369..1e119c5 100644
--- a/WebCore/khtml/ecma/xmlhttprequest.cpp
+++ b/WebCore/khtml/ecma/xmlhttprequest.cpp
@@ -211,7 +211,8 @@ XMLHttpRequest::XMLHttpRequest(ExecState *exec, const DOM::Document &d)
     onReadyStateChangeListener(0),
     onLoadListener(0),
     decoder(0),
-    createdDocument(false)
+    createdDocument(false),
+    aborted(false)
 {
 }
 
@@ -275,6 +276,14 @@ void XMLHttpRequest::open(const QString& _method, const KURL& _url, bool _async)
 
 void XMLHttpRequest::send(const QString& _body)
 {
+  aborted = false;
+
+#if !APPLE_CHANGES
+  if (!async) {
+    return;
+  }
+#endif
+
   if (method.lower() == "post" && (url.protocol().lower() == "http" || url.protocol().lower() == "https") ) {
       // FIXME: determine post encoding correctly by looking in headers for charset
       job = KIO::http_post( url, QCString(_body.utf8()), false );
@@ -287,6 +296,19 @@ void XMLHttpRequest::send(const QString& _body)
     job->addMetaData("customHTTPHeader", requestHeaders);
   }
 
+#if APPLE_CHANGES
+  if (!async) {
+    QByteArray data;
+    KURL finalURL;
+    QString headers;
+
+    data = KWQServeSynchronousRequest(khtml::Cache::loader(), doc->docLoader(), job, finalURL, headers);
+    job = 0;
+    processSyncLoadResults(data, finalURL, headers);
+    return;
+  }
+#endif
+
   qObject->connect( job, SIGNAL( result( KIO::Job* ) ),
 		    SLOT( slotFinished( KIO::Job* ) ) );
 #if APPLE_CHANGES
@@ -312,6 +334,7 @@ void XMLHttpRequest::abort()
     job->kill();
     job = 0;
   }
+  aborted = true;
 }
 
 void XMLHttpRequest::setRequestHeader(const QString& name, const QString &value)
@@ -404,7 +427,34 @@ Value XMLHttpRequest::getStatusText() const
   
   return String(firstLine);
 }
-   
+
+#if APPLE_CHANGES   
+void XMLHttpRequest::processSyncLoadResults(const QByteArray &data, const KURL &finalURL, const QString &headers)
+{
+  if (!urlMatchesDocumentDomain(finalURL)) {
+    abort();
+    return;
+  }
+  
+  responseHeaders = headers;
+  changeState(Loaded);
+  if (aborted) {
+    return;
+  }
+  
+  const char *bytes = (const char *)data.data();
+  int len = (int)data.size();
+
+  slotData(0, bytes, len);
+
+  if (aborted) {
+    return;
+  }
+
+  slotFinished(0);
+}
+#endif
+
 void XMLHttpRequest::slotFinished(KIO::Job *)
 {
   if (decoder) {
@@ -423,8 +473,7 @@ void XMLHttpRequest::slotFinished(KIO::Job *)
 void XMLHttpRequest::slotRedirection(KIO::Job*, const KURL& url)
 {
   if (!urlMatchesDocumentDomain(url)) {
-    job->kill();
-    job = 0;
+    abort();
   }
 }
 
@@ -462,7 +511,7 @@ void XMLHttpRequest::slotData(KIO::Job*, const QByteArray &_data)
 
   response += decoded;
 
-  if (job != 0) {
+  if (!aborted) {
     changeState(Interactive);
   }
 }
diff --git a/WebCore/khtml/ecma/xmlhttprequest.h b/WebCore/khtml/ecma/xmlhttprequest.h
index 6351699..cab43d3 100644
--- a/WebCore/khtml/ecma/xmlhttprequest.h
+++ b/WebCore/khtml/ecma/xmlhttprequest.h
@@ -80,6 +80,10 @@ namespace KJS {
     void slotFinished( KIO::Job* );
     void slotRedirection( KIO::Job*, const KURL& );
 
+#if APPLE_CHANGES
+    void processSyncLoadResults(const QByteArray &data, const KURL &finalURL, const QString &headers);
+#endif
+
     void open(const QString& _method, const KURL& _url, bool _async);
     void send(const QString& _body);
     void abort();
@@ -109,6 +113,8 @@ namespace KJS {
     QString response;
     mutable bool createdDocument;
     mutable DOM::Document responseXML;
+
+    bool aborted;
   };
 
 
diff --git a/WebCore/kwq/KWQLoader.h b/WebCore/kwq/KWQLoader.h
index b0aabf8..0653d8b 100644
--- a/WebCore/kwq/KWQLoader.h
+++ b/WebCore/kwq/KWQLoader.h
@@ -24,6 +24,7 @@
  */
 
 #include "KWQSignal.h"
+#include "QCString.h"
 
 namespace khtml {
     class CachedObject;
@@ -38,6 +39,9 @@ namespace KIO {
 
 bool KWQServeRequest(khtml::Loader *, khtml::Request *, KIO::TransferJob *);
 bool KWQServeRequest(khtml::Loader *, khtml::DocLoader *, KIO::TransferJob *);
+
+QByteArray KWQServeSynchronousRequest(khtml::Loader *, khtml::DocLoader *, KIO::TransferJob *, KURL &finalURL, QString &headers);
+
 void KWQCheckCacheObjectStatus(khtml::DocLoader *, khtml::CachedObject *);
 bool KWQCheckIfReloading(khtml::DocLoader *loader);
 void KWQRetainResponse(void *response);
diff --git a/WebCore/kwq/KWQLoader.mm b/WebCore/kwq/KWQLoader.mm
index 49361bd..07fa3d8 100644
--- a/WebCore/kwq/KWQLoader.mm
+++ b/WebCore/kwq/KWQLoader.mm
@@ -137,6 +137,74 @@ bool KWQServeRequest(Loader *loader, DocLoader *docLoader, TransferJob *job)
     return true;
 }
 
+static NSString *KWQHeaderStringFromDictionary(NSDictionary *headers, int statusCode)
+{
+    NSMutableString *headerString = [[NSMutableString alloc] init];
+    [headerString appendString:[NSString stringWithFormat:@"HTTP/1.0 %d OK\n", statusCode]];
+    
+    NSEnumerator *e = [headers keyEnumerator];
+    NSString *key;
+    
+    bool first = true;
+    
+    while ((key = [e nextObject]) != nil) {
+	if (first) {
+	    first = false;
+	} else {
+	    [headerString appendString:@"\n"];
+	}
+	[headerString appendString:key];
+	[headerString appendString:@": "];
+	[headerString appendString:[headers objectForKey:key]];
+    }
+	
+    return headerString;
+}
+
+QByteArray KWQServeSynchronousRequest(Loader *loader, DocLoader *docLoader, TransferJob *job, KURL &finalURL, QString &responseHeaders)
+{
+    KWQKHTMLPart *part = static_cast<KWQKHTMLPart *>(docLoader->part());
+    WebCoreBridge *bridge = part->bridge();
+
+    part->didTellBridgeAboutLoad(job->url().url());
+
+    KWQ_BLOCK_EXCEPTIONS;
+
+    NSDictionary *headerDict = nil;
+    QString headerString = job->queryMetaData("customHTTPHeader");
+
+    if (!headerString.isEmpty()) {
+	headerDict = [[NSDictionary alloc] _webcore_initWithHeaderString:headerString.getNSString()];
+    }
+
+    NSData *postData = nil;
+    
+
+    if (job->method() == "POST") {
+	postData = [NSData dataWithBytesNoCopy:job->postData().data() length:job->postData().size() freeWhenDone:NO];
+    }
+
+    NSURL *finalNSURL = nil;
+    NSDictionary *responseHeaderDict = nil;
+    int statusCode = 0;
+    NSData *resultData = [bridge syncLoadResourceWithURL:job->url().getNSURL() customHeaders:headerDict postData:postData finalURL:&finalNSURL responseHeaders:&responseHeaderDict statusCode:&statusCode];
+    
+    job->kill();
+
+    finalURL = finalNSURL;
+    responseHeaders = QString::fromNSString(KWQHeaderStringFromDictionary(responseHeaderDict, statusCode));
+
+    QByteArray results([resultData length]);
+
+    memcpy( results.data(), [resultData bytes], [resultData length] );
+
+    return results;
+
+    KWQ_UNBLOCK_EXCEPTIONS;
+
+    return QByteArray();
+}
+
 int KWQNumberOfPendingOrLoadingRequests(khtml::DocLoader *dl)
 {
     return Cache::loader()->numRequests(dl);
@@ -218,27 +286,9 @@ void *KWQResponseHeaderString(void *response)
     NSURLResponse *nsResponse = (NSURLResponse *)response;
     if ([nsResponse isKindOfClass:[NSHTTPURLResponse class]]) {
 	NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)nsResponse;
-	NSMutableString *headerString = [[NSMutableString alloc] init];
-	[headerString appendString:[NSString stringWithFormat:@"HTTP/1.0 %d OK\n", [httpResponse statusCode]]];
 	NSDictionary *headers = [httpResponse allHeaderFields];
 
-	NSEnumerator *e = [headers keyEnumerator];
-	NSString *key;
-	
-	bool first = true;
-	
-	while ((key = [e nextObject]) != nil) {
-	    if (first) {
-		first = false;
-	    } else {
-		[headerString appendString:@"\n"];
-	    }
-	    [headerString appendString:key];
-	    [headerString appendString:@": "];
-	    [headerString appendString:[headers objectForKey:key]];
-	}
-	
-	return headerString;
+	return KWQHeaderStringFromDictionary(headers, [httpResponse statusCode]);
     }
 
     KWQ_UNBLOCK_EXCEPTIONS;
diff --git a/WebCore/kwq/WebCoreBridge.h b/WebCore/kwq/WebCoreBridge.h
index 10836d5..76b948c 100644
--- a/WebCore/kwq/WebCoreBridge.h
+++ b/WebCore/kwq/WebCoreBridge.h
@@ -299,6 +299,9 @@ typedef enum {
 - (id <WebCoreResourceHandle>)startLoadingResource:(id <WebCoreResourceLoader>)loader withURL:(NSURL *)URL customHeaders:(NSDictionary *)customHeaders;
 - (id <WebCoreResourceHandle>)startLoadingResource:(id <WebCoreResourceLoader>)loader withURL:(NSURL *)URL customHeaders:(NSDictionary *)customHeaders postData:(NSData *)data;
 - (void)objectLoadedFromCacheWithURL:(NSURL *)URL response:(id)response size:(unsigned)bytes;
+
+- (NSData *)syncLoadResourceWithURL:(NSURL *)URL customHeaders:(NSDictionary *)requestHeaders postData:(NSData *)postData finalURL:(NSURL **)finalNSURL responseHeaders:(NSDictionary **)responseHeaderDict statusCode:(int *)statusCode;
+
 - (BOOL)isReloading;
 
 - (void)reportClientRedirectToURL:(NSURL *)URL delay:(NSTimeInterval)seconds fireDate:(NSDate *)date lockHistory:(BOOL)lockHistory isJavaScriptFormAction:(BOOL)isJavaScriptFormAction;
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 4124405..fb5feb0 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,14 @@
+2003-12-10  Maciej Stachowiak  <mjs at apple.com>
+
+        Reviewed by Richard.
+
+	WebKit part of fix for:
+
+	<rdar://problem/3487160>: Implement synchronous loading for XMLHttpRequest
+
+        * WebCoreSupport.subproj/WebBridge.m:
+        (-[WebBridge syncLoadResourceWithURL:customHeaders:postData:finalURL:responseHeaders:statusCode:]):
+
 2003-12-10  Richard Williamson   <rjw at apple.com>
 
 	Added method to get to the bridge from a view.  This is
diff --git a/WebKit/WebCoreSupport.subproj/WebBridge.m b/WebKit/WebCoreSupport.subproj/WebBridge.m
index da4cfa8..036fba2 100644
--- a/WebKit/WebCoreSupport.subproj/WebBridge.m
+++ b/WebKit/WebCoreSupport.subproj/WebBridge.m
@@ -430,6 +430,54 @@
     [request release];
 }
 
+- (NSData *)syncLoadResourceWithURL:(NSURL *)URL customHeaders:(NSDictionary *)requestHeaders postData:(NSData *)postData finalURL:(NSURL **)finalURL responseHeaders:(NSDictionary **)responseHeaderDict statusCode:(int *)statusCode
+{
+    NSMutableURLRequest *newRequest = [[NSMutableURLRequest alloc] initWithURL:URL];
+
+    if (postData) {
+	[newRequest setHTTPMethod:@"POST"];
+	[newRequest setHTTPBody:postData];
+    }
+
+    NSEnumerator *e = [requestHeaders keyEnumerator];
+    NSString *key;
+    while ((key = (NSString *)[e nextObject]) != nil) {
+	[newRequest addValue:[requestHeaders objectForKey:key] forHTTPHeaderField:key];
+    }
+
+    [newRequest setCachePolicy:[[[self dataSource] request] cachePolicy]];
+    [newRequest setHTTPReferrer:[self referrer]];
+    
+    WebView *webView = [_frame webView];
+    [newRequest setMainDocumentURL:[[[[webView mainFrame] dataSource] request] URL]];
+    [newRequest setHTTPUserAgent:[webView userAgentForURL:[newRequest URL]]];
+
+    NSURLResponse *response = nil;
+    NSError *error = nil;
+    NSData *result = [NSURLConnection sendSynchronousRequest:newRequest returningResponse:&response error:&error];
+
+    if (error == nil) {
+	*finalURL = [response URL];
+	if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
+	    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
+	    *responseHeaderDict = [httpResponse allHeaderFields];
+	    *statusCode = [httpResponse statusCode];
+	} else {
+	    *responseHeaderDict = [NSDictionary dictionary];
+	    *statusCode = 200;
+	}
+    } else {
+	*finalURL = URL;
+	*responseHeaderDict = [NSDictionary dictionary];
+	*statusCode = 404;
+    }
+
+    // notify the delegates
+    [self objectLoadedFromCacheWithURL:URL response:response size:[result length]];
+
+    return result;
+}
+
 - (BOOL)isReloading
 {
     return [[[self dataSource] request] cachePolicy] == NSURLRequestReloadIgnoringCacheData;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list