WebCore:
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Dec 2007 22:15:40 +0000 (22:15 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Dec 2007 22:15:40 +0000 (22:15 +0000)
        Reviewed by Sam.

        <rdar://problem/5132003>
        dumpResourceLoadCallbacks is not implemented in DRT on Windows.

        * platform/network/cf/ResourceErrorCF.cpp:
        (WebCore::ResourceError::unpackPlatformError):
        Handle kCFErrorDomainWinSock.

        * platform/network/cf/ResourceHandleCFNet.cpp:
        (WebCore::willSendRequest):
        Ignore willSendRequest calls where the redirect response is null, like we do in
        the Mac version.

WebKitTools:

        Reviewed by Sam.

        <rdar://problem/5132003>
        dumpResourceLoadCallbacks is not implemented in DRT on Windows.

        * DumpRenderTree/win/DumpRenderTree.cpp:
        (main):
        Set the resource load delegate.

        * DumpRenderTree/win/DumpRenderTree.vcproj:

        * DumpRenderTree/win/ResourceLoadDelegate.cpp: Added.
        * DumpRenderTree/win/ResourceLoadDelegate.h: Added.

LayoutTests:

        Reviewed by Sam.

        <rdar://problem/5132003>
        dumpResourceLoadCallbacks is not implemented in DRT on Windows.

        Remove now passing tests.

        * platform/win/Skipped:

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

LayoutTests/ChangeLog
LayoutTests/platform/win/Skipped
WebCore/ChangeLog
WebCore/platform/network/cf/ResourceErrorCF.cpp
WebCore/platform/network/cf/ResourceHandleCFNet.cpp
WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/win/DumpRenderTree.cpp
WebKitTools/DumpRenderTree/win/DumpRenderTree.vcproj
WebKitTools/DumpRenderTree/win/ResourceLoadDelegate.cpp [new file with mode: 0644]
WebKitTools/DumpRenderTree/win/ResourceLoadDelegate.h [new file with mode: 0644]

index 1912a8b..0cee1f6 100644 (file)
@@ -1,3 +1,14 @@
+2007-12-11  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Sam.
+
+        <rdar://problem/5132003>
+        dumpResourceLoadCallbacks is not implemented in DRT on Windows.
+
+        Remove now passing tests.
+        
+        * platform/win/Skipped:
+
 2007-12-12  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Adam Roben.
index 7e22122..a6da0a3 100644 (file)
@@ -258,11 +258,6 @@ http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain
 fast/dom/Window/setting-properties-on-closed-window.html
 svg/custom/use-events-crash.svg
 
-# dumpResourceLoadCallbacks is not implemented <rdar://5132003>
-http/tests/misc/window-dot-stop.html
-http/tests/xmlhttprequest/abort-should-cancel-load.html
-security/block-test.html
-
 # Pixel depth and color depth different on boomer <rdar://problem/5137719>
 fast/dom/Window/window-screen-properties.html
 
index 1790803..b1d196f 100644 (file)
@@ -1,3 +1,19 @@
+2007-12-12  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Sam.
+
+        <rdar://problem/5132003>
+        dumpResourceLoadCallbacks is not implemented in DRT on Windows.
+        
+        * platform/network/cf/ResourceErrorCF.cpp:
+        (WebCore::ResourceError::unpackPlatformError):
+        Handle kCFErrorDomainWinSock.
+        
+        * platform/network/cf/ResourceHandleCFNet.cpp:
+        (WebCore::willSendRequest):
+        Ignore willSendRequest calls where the redirect response is null, like we do in 
+        the Mac version.
+
 2007-12-12  Steve Falkenburg  <sfalken@apple.com>
 
         <rdar://problem/5643785> Fix iBench regression caused by mis-placed nested timer check.
index ce775b4..ff00ab6 100644 (file)
 
 #if USE(CFNETWORK)
 
-// FIXME: Once <rdar://problem/5050881> is fixed we can remove this extern "C"
-
-extern "C" {
 #include <CFNetwork/CFNetworkErrors.h>
-}
-
 #include <CoreFoundation/CFError.h>
 #include <WTF/RetainPtr.h>
 
@@ -76,6 +71,8 @@ void ResourceError::unpackPlatformError()
         m_domain = "NSPOSIXErrorDomain";
     else if (domain == kCFErrorDomainOSStatus)
         m_domain = "NSOSStatusErrorDomain";
+    else if (domain == kCFErrorDomainWinSock)
+        m_domain = "kCFErrorDomainWinSock";
 
     m_errorCode = CFErrorGetCode(m_platformError.get());
 
index dd66cb6..c352643 100644 (file)
@@ -62,6 +62,11 @@ CFURLRequestRef willSendRequest(CFURLConnectionRef conn, CFURLRequestRef cfReque
 {
     ResourceHandle* handle = (ResourceHandle*)clientInfo;
 
+    if (!cfRedirectResponse) {
+        CFRetain(cfRequest);
+        return cfRequest;
+    }
+
     LOG(Network, "CFNet - willSendRequest(conn=%p, handle=%p) (%s)", conn, handle, handle->request().url().string().utf8().data());
 
     ResourceRequest request(cfRequest);
index 62c67a7..0e8c891 100644 (file)
@@ -1,3 +1,19 @@
+2007-12-11  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Sam.
+
+        <rdar://problem/5132003>
+        dumpResourceLoadCallbacks is not implemented in DRT on Windows.
+
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (main):
+        Set the resource load delegate.
+        
+        * DumpRenderTree/win/DumpRenderTree.vcproj:
+        
+        * DumpRenderTree/win/ResourceLoadDelegate.cpp: Added.
+        * DumpRenderTree/win/ResourceLoadDelegate.h: Added.
+
 2007-12-12  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Adam Roben.
index d36c237..5f36c01 100644 (file)
@@ -33,6 +33,7 @@
 #include "LayoutTestController.h"
 #include "PixelDumpSupport.h"
 #include "PolicyDelegate.h"
+#include "ResourceLoadDelegate.h"
 #include "UIDelegate.h"
 #include "WorkQueueItem.h"
 #include "WorkQueue.h"
@@ -926,6 +927,10 @@ int main(int argc, char* argv[])
     if (FAILED(viewEditing->setEditingDelegate(editingDelegate.get())))
         return -1;
 
+    COMPtr<ResourceLoadDelegate> resourceLoadDelegate(AdoptCOM, new ResourceLoadDelegate);
+    if (FAILED(webView->setResourceLoadDelegate(resourceLoadDelegate.get())))
+        return -1;
+
     COMPtr<IWebPreferences> preferences;
     if (FAILED(webView->preferences(&preferences)))
         return -1;
index 27e500c..b1fb21f 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\ResourceLoadDelegate.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\ResourceLoadDelegate.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath=".\UIDelegate.cpp"\r
                                >\r
                        </File>\r
diff --git a/WebKitTools/DumpRenderTree/win/ResourceLoadDelegate.cpp b/WebKitTools/DumpRenderTree/win/ResourceLoadDelegate.cpp
new file mode 100644 (file)
index 0000000..688f033
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "DumpRenderTree.h"
+#include "ResourceLoadDelegate.h"
+
+#include "LayoutTestController.h"
+#include <wtf/HashMap.h>
+#include <wtf/Vector.h>
+#include <string>
+#include <sstream>
+
+using std::wstring;
+using std::wiostream;
+
+static inline wstring wstringFromBSTR(BSTR str)
+{
+    return wstring(str, ::SysStringLen(str));
+}
+
+static wstring urlSuitableForTestResult(const wstring& url)
+{
+    // FIXME: This should convert file:/// URLs like the Mac version does.
+    // It's currently not done because the only tests that use file:/// URLs 
+    // are the webarchive tests and we don't support those on Windows.
+    return url;
+}
+
+wstring wstringFromInt(int i)
+{
+    std::wostringstream ss;
+    ss << i;
+    return ss.str();
+}
+
+typedef HashMap<unsigned long, wstring> IdentifierMap;
+
+IdentifierMap& urlMap()
+{
+    static IdentifierMap urlMap;
+
+    return urlMap;
+}
+
+static wstring descriptionSuitableForTestResult(unsigned long identifier)
+{
+    IdentifierMap::iterator it = urlMap().find(identifier);
+    
+    if (it == urlMap().end())
+        return L"<unknown>";
+
+    return urlSuitableForTestResult(it->second);
+}
+
+static wstring descriptionSuitableForTestResult(IWebURLRequest* request)
+{
+    if (!request)
+        return L"(null)";
+
+    BSTR urlBSTR;
+    if (FAILED(request->URL(&urlBSTR)))
+        return wstring();
+    
+    wstring url = urlSuitableForTestResult(wstringFromBSTR(urlBSTR));
+    ::SysFreeString(urlBSTR);
+
+    return L"<NSURLRequest " + url + L">";
+}
+
+static wstring descriptionSuitableForTestResult(IWebURLResponse* response)
+{
+    if (!response)
+        return L"(null)";
+
+    BSTR urlBSTR;
+    if (FAILED(response->URL(&urlBSTR)))
+        return wstring();
+    
+    wstring url = urlSuitableForTestResult(wstringFromBSTR(urlBSTR));
+    ::SysFreeString(urlBSTR);
+
+    return L"<NSURLResponse " + url + L">";
+}
+
+static wstring descriptionSuitableForTestResult(IWebError* error, unsigned long identifier)
+{
+    wstring result = L"<NSError ";
+
+    BSTR domainSTR;
+    if (FAILED(error->domain(&domainSTR)))
+        return wstring();
+
+    wstring domain = wstringFromBSTR(domainSTR);
+    ::SysFreeString(domainSTR);
+
+    int code;
+    if (FAILED(error->code(&code)))
+        return wstring();
+
+    if (domain == L"CFURLErrorDomain") {
+        domain = L"NSURLErrorDomain";
+
+        // Convert kCFURLErrorUnknown to NSURLErrorUnknown
+        if (code == -998)
+            code = -1;
+    } else if (domain == L"kCFErrorDomainWinSock") {
+        domain = L"NSURLErrorDomain";
+
+        // Convert the winsock error code to an NSURLError code.
+        if (code == WSAEADDRNOTAVAIL)
+            code = -1004; // NSURLErrorCannotConnectToHose;
+    }
+
+    result += L"domain " + domain;
+    result += L", code " + wstringFromInt(code);
+
+    BSTR failingURLSTR;
+    if (FAILED(error->failingURL(&failingURLSTR)))
+        return wstring();
+
+    wstring failingURL;
+    
+    // If the error doesn't have a failing URL, we fake one by using the URL the resource had 
+    // at creation time. This seems to work fine for now.
+    // See <rdar://problem/5064234> CFErrors should have failingURL key.
+    if (failingURLSTR)
+        failingURL = wstringFromBSTR(failingURLSTR);
+    else
+        failingURL = descriptionSuitableForTestResult(identifier);
+
+    ::SysFreeString(failingURLSTR);
+
+    result += L", failing URL \"" + urlSuitableForTestResult(failingURL) + L"\">";
+
+    return result;
+}
+
+ResourceLoadDelegate::ResourceLoadDelegate()
+    : m_refCount(1)
+{
+}
+
+ResourceLoadDelegate::~ResourceLoadDelegate()
+{
+}
+
+HRESULT STDMETHODCALLTYPE ResourceLoadDelegate::QueryInterface(REFIID riid, void** ppvObject)
+{
+    *ppvObject = 0;
+    if (IsEqualGUID(riid, IID_IUnknown))
+        *ppvObject = static_cast<IWebResourceLoadDelegate*>(this);
+    else if (IsEqualGUID(riid, IID_IWebResourceLoadDelegate))
+        *ppvObject = static_cast<IWebResourceLoadDelegate*>(this);
+    else
+        return E_NOINTERFACE;
+
+    AddRef();
+    return S_OK;
+}
+
+ULONG STDMETHODCALLTYPE ResourceLoadDelegate::AddRef(void)
+{
+    return ++m_refCount;
+}
+
+ULONG STDMETHODCALLTYPE ResourceLoadDelegate::Release(void)
+{
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete(this);
+
+    return newRef;
+}
+
+HRESULT STDMETHODCALLTYPE ResourceLoadDelegate::identifierForInitialRequest( 
+    /* [in] */ IWebView* webView,
+    /* [in] */ IWebURLRequest* request,
+    /* [in] */ IWebDataSource* dataSource,
+    /* [in] */ unsigned long identifier)
+{ 
+    if (!done && layoutTestController->dumpResourceLoadCallbacks()) {
+        BSTR urlStr;
+        if (FAILED(request->URL(&urlStr)))
+            return E_FAIL;
+
+        urlMap().set(identifier, wstringFromBSTR(urlStr));
+    }
+
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE ResourceLoadDelegate::willSendRequest( 
+    /* [in] */ IWebView* webView,
+    /* [in] */ unsigned long identifier,
+    /* [in] */ IWebURLRequest* request,
+    /* [in] */ IWebURLResponse* redirectResponse,
+    /* [in] */ IWebDataSource* dataSource,
+    /* [retval][out] */ IWebURLRequest **newRequest)
+{
+    if (!done && layoutTestController->dumpResourceLoadCallbacks()) {
+        printf("%S - willSendRequest %S redirectResponse %S\n", 
+            descriptionSuitableForTestResult(identifier).c_str(),
+            descriptionSuitableForTestResult(request).c_str(),
+            descriptionSuitableForTestResult(redirectResponse).c_str());
+    }
+
+    request->AddRef();
+    *newRequest = request;
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE ResourceLoadDelegate::didFinishLoadingFromDataSource( 
+    /* [in] */ IWebView* webView,
+    /* [in] */ unsigned long identifier,
+    /* [in] */ IWebDataSource* dataSource)
+{
+    if (!done && layoutTestController->dumpResourceLoadCallbacks()) {
+        printf("%S - didFinishLoading\n",
+            descriptionSuitableForTestResult(identifier).c_str()),
+       urlMap().remove(identifier);
+    }
+
+   return S_OK;
+}
+        
+HRESULT STDMETHODCALLTYPE ResourceLoadDelegate::didFailLoadingWithError( 
+    /* [in] */ IWebView* webView,
+    /* [in] */ unsigned long identifier,
+    /* [in] */ IWebError* error,
+    /* [in] */ IWebDataSource* dataSource)
+{
+    if (!done && layoutTestController->dumpResourceLoadCallbacks()) {
+        printf("%S - didFailLoadingWithError: %S\n", 
+            descriptionSuitableForTestResult(identifier).c_str(),
+            descriptionSuitableForTestResult(error, identifier).c_str());
+        urlMap().remove(identifier);
+    }
+
+    return S_OK;
+}
diff --git a/WebKitTools/DumpRenderTree/win/ResourceLoadDelegate.h b/WebKitTools/DumpRenderTree/win/ResourceLoadDelegate.h
new file mode 100644 (file)
index 0000000..519ee64
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ResourceLoadDelegate_h
+#define ResourceLoadDelegate_h
+
+#include <WebKit/IWebResourceLoadDelegate.h>
+
+class ResourceLoadDelegate : public IWebResourceLoadDelegate {
+public:
+    ResourceLoadDelegate();
+    virtual ~ResourceLoadDelegate();
+
+    // IUnknown
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+    virtual ULONG STDMETHODCALLTYPE AddRef(void);
+    virtual ULONG STDMETHODCALLTYPE Release(void);
+
+    // IWebResourceLoadDelegate
+    virtual HRESULT STDMETHODCALLTYPE identifierForInitialRequest( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ IWebURLRequest *request,
+        /* [in] */ IWebDataSource *dataSource,
+        /* [in] */ unsigned long identifier);
+        
+    virtual HRESULT STDMETHODCALLTYPE willSendRequest( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ IWebURLRequest *request,
+        /* [in] */ IWebURLResponse *redirectResponse,
+        /* [in] */ IWebDataSource *dataSource,
+        /* [retval][out] */ IWebURLRequest **newRequest);
+        
+    virtual HRESULT STDMETHODCALLTYPE didReceiveAuthenticationChallenge( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ IWebURLAuthenticationChallenge *challenge,
+        /* [in] */ IWebDataSource *dataSource) { return E_NOTIMPL; }
+        
+    virtual HRESULT STDMETHODCALLTYPE didCancelAuthenticationChallenge( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ IWebURLAuthenticationChallenge *challenge,
+        /* [in] */ IWebDataSource *dataSource) { return E_NOTIMPL; }
+        
+    virtual HRESULT STDMETHODCALLTYPE didReceiveResponse( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ IWebURLResponse *response,
+        /* [in] */ IWebDataSource *dataSource) { return E_NOTIMPL; }
+        
+    virtual HRESULT STDMETHODCALLTYPE didReceiveContentLength( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ UINT length,
+        /* [in] */ IWebDataSource *dataSource) { return E_NOTIMPL; }
+        
+    virtual HRESULT STDMETHODCALLTYPE didFinishLoadingFromDataSource( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ IWebDataSource *dataSource);
+        
+    virtual HRESULT STDMETHODCALLTYPE didFailLoadingWithError( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ unsigned long identifier,
+        /* [in] */ IWebError *error,
+        /* [in] */ IWebDataSource *dataSource);
+        
+    virtual HRESULT STDMETHODCALLTYPE plugInFailedWithError( 
+        /* [in] */ IWebView *webView,
+        /* [in] */ IWebError *error,
+        /* [in] */ IWebDataSource *dataSource) { return E_NOTIMPL; }
+    
+protected:
+    ULONG m_refCount;
+};
+
+#endif // ResourceLoadDelegate_h