Fixed <rdar://problem/3781001>: redirection of URL via resource load delegate does...
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 4 Sep 2004 01:38:09 +0000 (01:38 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 4 Sep 2004 01:38:09 +0000 (01:38 +0000)
Ensure that stylesheets have the correct URL when request
is redirected.

        Reviewed by Maciej.

        * khtml/misc/loader.cpp:
        (CachedCSSStyleSheet::checkNotify):
        * kwq/KWQLoader.h:
        * kwq/KWQLoader.mm:
        (KWQIsResponseURLEqualToURL):
        (KWQResponseURL):

        * khtml/ecma/kjs_html.cpp:
        (KJS::Context2DFunction::tryCall):
Compare parameter count with == instead of <=.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/kjs_html.cpp
WebCore/khtml/misc/loader.cpp
WebCore/kwq/KWQLoader.h
WebCore/kwq/KWQLoader.mm

index 34c76997f85d4ff859ecc859fddf275b1cbaf656..6cc974cd35db0db3e2c343a708fc07301d1dfc28 100644 (file)
@@ -1,3 +1,23 @@
+2004-09-03  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/3781001>: redirection of URL via resource load delegate does not correctly set base URL for subsequent loads
+
+       Ensure that stylesheets have the correct URL when request
+       is redirected.
+
+        Reviewed by Maciej.
+
+        * khtml/misc/loader.cpp:
+        (CachedCSSStyleSheet::checkNotify):
+        * kwq/KWQLoader.h:
+        * kwq/KWQLoader.mm:
+        (KWQIsResponseURLEqualToURL):
+        (KWQResponseURL):
+
+        * khtml/ecma/kjs_html.cpp:
+        (KJS::Context2DFunction::tryCall):
+       Compare parameter count with == instead of <=.
+
 2004-09-03  David Hyatt  <hyatt@apple.com>
 
        Fix for 3779083, deleting large amount of text is really slow.  Don't use NodeLists in editing remove commands.
index 5c9eceb787033b05a2ff4c35670dedfe6a22c577..6fc424b9df17c03f405d5c4da89a73f3a92f4ec7 100644 (file)
@@ -4024,17 +4024,17 @@ Value KJS::Context2DFunction::tryCall(ExecState *exec, Object &thisObj, const Li
             float dx, dy, dw = w, dh = h;
             float sx = 0.f, sy = 0.f, sw = w, sh = h;
             
-            if (args.size() <= 3) {
+            if (args.size() == 3) {
                 dx = args[1].toNumber(exec);
                 dy = args[2].toNumber(exec);
             }
-            else if (args.size() <= 5) {
+            else if (args.size() == 5) {
                 dx = args[1].toNumber(exec);
                 dy = args[2].toNumber(exec);
                 dw = args[3].toNumber(exec);
                 dh = args[4].toNumber(exec);
             }
-            else if (args.size() <= 9) {
+            else if (args.size() == 9) {
                 sx = args[1].toNumber(exec);
                 sy = args[2].toNumber(exec);
                 sw = args[3].toNumber(exec);
index b0193b0209a9150dd32ad3b060a17b6f249a1ccc..c0bf58bdcf97585cf4de318672229e1898889bf7 100644 (file)
@@ -251,8 +251,12 @@ void CachedCSSStyleSheet::checkNotify()
 #endif
 
     CachedObjectClientWalker w(m_clients);
-    while (CachedObjectClient *c = w.next())
-        c->setStyleSheet(m_url, m_sheet);
+    while (CachedObjectClient *c = w.next()) {
+        if (m_response && !KWQIsResponseURLEqualToURL(m_response,m_url))
+            c->setStyleSheet(DOMString (KWQResponseURL(m_response)), m_sheet);
+        else
+            c->setStyleSheet(m_url, m_sheet);
+    }
 }
 
 
index df3f3ae7b666e2378a397660642f19edf2b1d4bc..5893ee2dd1cc4cf17a2931a06d2d342360ba6719 100644 (file)
@@ -37,6 +37,10 @@ namespace KIO {
     class TransferJob;
 }
 
+namespace DOM {
+    class DOMString;
+}
+
 bool KWQServeRequest(khtml::Loader *, khtml::Request *, KIO::TransferJob *);
 bool KWQServeRequest(khtml::Loader *, khtml::DocLoader *, KIO::TransferJob *);
 
@@ -46,6 +50,8 @@ void KWQCheckCacheObjectStatus(khtml::DocLoader *, khtml::CachedObject *);
 bool KWQCheckIfReloading(khtml::DocLoader *loader);
 void KWQRetainResponse(void *response);
 void KWQReleaseResponse(void *response);
+bool KWQIsResponseURLEqualToURL(void *response, const DOM::DOMString &m_url);
+QString KWQResponseURL(void *response);
 void *KWQResponseMIMEType(void *response);
 void *KWQResponseTextEncodingName(void *response);
 void *KWQResponseHeaderString(void *response);
index 846a631c979661f8dd46bef1a6555019cbac66c8..22a004bad685464f422fec5fff8328badc0c0c93 100644 (file)
@@ -271,6 +271,55 @@ void KWQReleaseResponse(void *response)
     KWQ_UNBLOCK_EXCEPTIONS;
 }
 
+#define LOCAL_STRING_BUFFER_SIZE 1024
+
+bool KWQIsResponseURLEqualToURL(void *response, const DOM::DOMString &m_url)
+{
+    unichar _buffer[LOCAL_STRING_BUFFER_SIZE];
+    unichar *urlStringCharacters;
+    
+    NSURL *responseURL = [(NSURLResponse *)response URL];
+    NSString *urlString = [responseURL absoluteString];
+
+    if (m_url.length() != [urlString length])
+        return false;
+        
+    // Nasty hack to directly compare strings buffers of NSString
+    // and DOMString.  We do this for speed.
+    if ([urlString length] > LOCAL_STRING_BUFFER_SIZE) {
+        urlStringCharacters = (unichar *)malloc (sizeof(unichar)*[urlString length]);
+    }
+    else {
+        urlStringCharacters = _buffer;
+    }
+    [urlString getCharacters:urlStringCharacters];
+    
+    bool ret = false;
+    if(!memcmp(urlStringCharacters, m_url.unicode(), m_url.length()*sizeof(QChar)))
+       ret = true;
+    
+    if (urlStringCharacters != _buffer)
+        free (urlStringCharacters);
+        
+    return ret;
+}
+
+QString KWQResponseURL(void *response)
+{
+    KWQ_BLOCK_EXCEPTIONS;
+
+    NSURL *responseURL = [(NSURLResponse *)response URL];
+    NSString *urlString = [responseURL absoluteString];
+    
+    QString string;
+    string.setBufferFromCFString((CFStringRef)urlString);
+    return string;
+
+    KWQ_UNBLOCK_EXCEPTIONS;
+    
+    return NULL;
+}
+
 void *KWQResponseMIMEType(void *response)
 {
     KWQ_BLOCK_EXCEPTIONS;