1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2007 Apple Inc.  All rights reserved.
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met:
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1.  Redistributions of source code must retain the above copyright
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer.
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2.  Redistributions in binary form must reproduce the above copyright
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer in the
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     documentation and/or other materials provided with the distribution.
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     its contributors may be used to endorse or promote products derived
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     from this software without specific prior written permission.
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "config.h"
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "ResourceLoadDelegate.h"
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "DumpRenderTree.h"
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "LayoutTestController.h"
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <WebKit/WebKitCOMAPI.h>
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <comutil.h>
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <sstream>
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <tchar.h>
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <wtf/Vector.h>
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace std;
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic inline wstring wstringFromBSTR(BSTR str)
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return wstring(str, ::SysStringLen(str));
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline wstring wstringFromInt(int i)
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wostringstream ss;
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ss << i;
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return ss.str();
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline BSTR BSTRFromString(const string& str)
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int length = ::MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), 0, 0);
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BSTR result = ::SysAllocStringLen(0, length);
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ::MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), result, length);
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuwstring ResourceLoadDelegate::descriptionSuitableForTestResult(unsigned long identifier) const
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    IdentifierMap::const_iterator it = m_urlMap.find(identifier);
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (it == m_urlMap.end())
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return L"<unknown>";
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return urlSuitableForTestResult(it->second);
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuwstring ResourceLoadDelegate::descriptionSuitableForTestResult(IWebURLRequest* request)
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!request)
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return L"(null)";
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR urlBSTR;
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(request->URL(&urlBSTR)))
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return wstring();
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring url = urlSuitableForTestResult(wstringFromBSTR(urlBSTR));
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::SysFreeString(urlBSTR);
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR mainDocumentURLBSTR;
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(request->mainDocumentURL(&mainDocumentURLBSTR)))
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return wstring();
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring mainDocumentURL = urlSuitableForTestResult(wstringFromBSTR(mainDocumentURLBSTR));
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::SysFreeString(mainDocumentURLBSTR);
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BSTR httpMethodBSTR;
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (FAILED(request->HTTPMethod(&httpMethodBSTR)))
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return wstring();
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    wstring httpMethod = wstringFromBSTR(httpMethodBSTR);
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ::SysFreeString(httpMethodBSTR);
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return L"<NSURLRequest URL " + url + L", main document URL " + mainDocumentURL + L", http method " + httpMethod + L">";
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
10128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuwstring ResourceLoadDelegate::descriptionSuitableForTestResult(IWebURLResponse* response)
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!response)
104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return L"(null)";
105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR urlBSTR;
107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(response->URL(&urlBSTR)))
108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return wstring();
109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring url = urlSuitableForTestResult(wstringFromBSTR(urlBSTR));
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::SysFreeString(urlBSTR);
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int statusCode = 0;
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    COMPtr<IWebHTTPURLResponse> httpResponse;
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (response && SUCCEEDED(response->QueryInterface(&httpResponse)))
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        httpResponse->statusCode(&statusCode);
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return L"<NSURLResponse " + url + L", http status code " + wstringFromInt(statusCode) + L">";
119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
12128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuwstring ResourceLoadDelegate::descriptionSuitableForTestResult(IWebError* error, unsigned long identifier) const
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring result = L"<NSError ";
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR domainSTR;
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(error->domain(&domainSTR)))
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return wstring();
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring domain = wstringFromBSTR(domainSTR);
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::SysFreeString(domainSTR);
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    int code;
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(error->code(&code)))
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return wstring();
135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (domain == L"CFURLErrorDomain") {
137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        domain = L"NSURLErrorDomain";
138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Convert kCFURLErrorUnknown to NSURLErrorUnknown
140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (code == -998)
141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            code = -1;
142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else if (domain == L"kCFErrorDomainWinSock") {
143563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        domain = L"NSURLErrorDomain";
144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Convert the winsock error code to an NSURLError code.
146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (code == WSAEADDRNOTAVAIL)
147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            code = -1004; // NSURLErrorCannotConnectToHose;
148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    result += L"domain " + domain;
151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    result += L", code " + wstringFromInt(code);
152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BSTR failingURLSTR;
154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (FAILED(error->failingURL(&failingURLSTR)))
155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return wstring();
156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    wstring failingURL;
158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // If the error doesn't have a failing URL, we fake one by using the URL the resource had
160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // at creation time. This seems to work fine for now.
161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // See <rdar://problem/5064234> CFErrors should have failingURL key.
162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (failingURLSTR)
163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        failingURL = wstringFromBSTR(failingURLSTR);
164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
165563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        failingURL = descriptionSuitableForTestResult(identifier);
166563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ::SysFreeString(failingURLSTR);
168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    result += L", failing URL \"" + urlSuitableForTestResult(failingURL) + L"\">";
170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return result;
172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
174563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkResourceLoadDelegate::ResourceLoadDelegate()
175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    : m_refCount(1)
176563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
177563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
178563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
179563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkResourceLoadDelegate::~ResourceLoadDelegate()
180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
183563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::QueryInterface(REFIID riid, void** ppvObject)
184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    *ppvObject = 0;
186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (IsEqualGUID(riid, IID_IUnknown))
187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        *ppvObject = static_cast<IWebResourceLoadDelegate*>(this);
188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else if (IsEqualGUID(riid, IID_IWebResourceLoadDelegate))
189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        *ppvObject = static_cast<IWebResourceLoadDelegate*>(this);
19028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    else if (IsEqualGUID(riid, IID_IWebResourceLoadDelegatePrivate2))
19128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        *ppvObject = static_cast<IWebResourceLoadDelegatePrivate2*>(this);
192563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
193563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return E_NOINTERFACE;
194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    AddRef();
196563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return S_OK;
197563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
198563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
199563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkULONG STDMETHODCALLTYPE ResourceLoadDelegate::AddRef(void)
200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return ++m_refCount;
202563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
203563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
204563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkULONG STDMETHODCALLTYPE ResourceLoadDelegate::Release(void)
205563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ULONG newRef = --m_refCount;
207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!newRef)
208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        delete(this);
209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return newRef;
211563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
212563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
213563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::identifierForInitialRequest(
214563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebView* webView,
215563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebURLRequest* request,
216563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebDataSource* dataSource,
217563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ unsigned long identifier)
218563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!done && gLayoutTestController->dumpResourceLoadCallbacks()) {
220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        BSTR urlStr;
221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (FAILED(request->URL(&urlStr)))
222563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return E_FAIL;
223563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
22428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        ASSERT(!urlMap().contains(identifier));
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        urlMap().set(identifier, wstringFromBSTR(urlStr));
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return S_OK;
229563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
23128040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::removeIdentifierForRequest(
23228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    /* [in] */ IWebView* webView,
23328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    /* [in] */ unsigned long identifier)
23428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
23528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    urlMap().remove(identifier);
23628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
23728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return S_OK;
23828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
23928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
240563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::willSendRequest(
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebView* webView,
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ unsigned long identifier,
243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebURLRequest* request,
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebURLResponse* redirectResponse,
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebDataSource* dataSource,
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [retval][out] */ IWebURLRequest **newRequest)
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!done && gLayoutTestController->dumpResourceLoadCallbacks()) {
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("%S - willSendRequest %S redirectResponse %S\n",
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            descriptionSuitableForTestResult(identifier).c_str(),
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            descriptionSuitableForTestResult(request).c_str(),
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            descriptionSuitableForTestResult(redirectResponse).c_str());
253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
255967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!done && !gLayoutTestController->deferMainResourceDataLoad()) {
256967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        COMPtr<IWebDataSourcePrivate> dataSourcePrivate(Query, dataSource);
257967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (!dataSourcePrivate)
258967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            return E_FAIL;
259967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        dataSourcePrivate->setDeferMainResourceDataLoad(FALSE);
260967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
261967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
262d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!done && gLayoutTestController->willSendRequestReturnsNull()) {
263d0825bca7fe65beaee391d30da42e937db621564Steve Block        *newRequest = 0;
264d0825bca7fe65beaee391d30da42e937db621564Steve Block        return S_OK;
265d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
266d0825bca7fe65beaee391d30da42e937db621564Steve Block
2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!done && gLayoutTestController->willSendRequestReturnsNullOnRedirect() && redirectResponse) {
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("Returning null for this redirect\n");
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        *newRequest = 0;
2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return S_OK;
2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    IWebMutableURLRequest* requestCopy = 0;
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    request->mutableCopy(&requestCopy);
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const set<string>& clearHeaders = gLayoutTestController->willSendRequestClearHeaders();
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (set<string>::const_iterator header = clearHeaders.begin(); header != clearHeaders.end(); ++header) {
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      BSTR bstrHeader = BSTRFromString(*header);
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      requestCopy->setValue(0, bstrHeader);
279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      SysFreeString(bstrHeader);
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *newRequest = requestCopy;
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return S_OK;
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::didReceiveAuthenticationChallenge(
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    /* [in] */ IWebView *webView,
288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    /* [in] */ unsigned long identifier,
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    /* [in] */ IWebURLAuthenticationChallenge *challenge,
290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    /* [in] */ IWebDataSource *dataSource)
291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
292e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    COMPtr<IWebURLAuthenticationChallengeSender> sender;
293e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!challenge || FAILED(challenge->sender(&sender)))
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return E_FAIL;
295e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
296e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!gLayoutTestController->handlesAuthenticationChallenges()) {
297967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        printf("%S - didReceiveAuthenticationChallenge - Simulating cancelled authentication sheet\n", descriptionSuitableForTestResult(identifier).c_str());
298e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        sender->continueWithoutCredentialForAuthenticationChallenge(challenge);
299e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return S_OK;
300e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
301231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
302231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    const char* user = gLayoutTestController->authenticationUsername().c_str();
303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    const char* password = gLayoutTestController->authenticationPassword().c_str();
304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
305231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    printf("%S - didReceiveAuthenticationChallenge - Responding with %s:%s\n", descriptionSuitableForTestResult(identifier).c_str(), user, password);
306e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
307231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    COMPtr<IWebURLCredential> credential;
308231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (FAILED(WebKitCreateInstance(CLSID_WebURLCredential, 0, IID_IWebURLCredential, (void**)&credential)))
309231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return E_FAIL;
310231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    credential->initWithUser(_bstr_t(user), _bstr_t(password), WebURLCredentialPersistenceForSession);
311231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
312231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    sender->useCredential(credential.get(), challenge);
313231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return S_OK;
314231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
315231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::didReceiveResponse(
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* [in] */ IWebView* webView,
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* [in] */ unsigned long identifier,
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* [in] */ IWebURLResponse* response,
3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* [in] */ IWebDataSource* dataSource)
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!done && gLayoutTestController->dumpResourceLoadCallbacks()) {
3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("%S - didReceiveResponse %S\n",
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            descriptionSuitableForTestResult(identifier).c_str(),
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            descriptionSuitableForTestResult(response).c_str());
3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!done && gLayoutTestController->dumpResourceResponseMIMETypes()) {
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BSTR mimeTypeBSTR;
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (FAILED(response->MIMEType(&mimeTypeBSTR)))
3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            E_FAIL;
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        wstring mimeType = wstringFromBSTR(mimeTypeBSTR);
3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ::SysFreeString(mimeTypeBSTR);
3340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BSTR urlBSTR;
3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (FAILED(response->URL(&urlBSTR)))
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            E_FAIL;
3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
339967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        wstring url = wstringFromBSTR(urlBSTR);
3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ::SysFreeString(urlBSTR);
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
342967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        printf("%S has MIME type %S\n", lastPathComponent(url).c_str(), mimeType.c_str());
3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return S_OK;
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
349563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::didFinishLoadingFromDataSource(
350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebView* webView,
351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ unsigned long identifier,
352563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebDataSource* dataSource)
353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!done && gLayoutTestController->dumpResourceLoadCallbacks()) {
355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("%S - didFinishLoading\n",
35628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            descriptionSuitableForTestResult(identifier).c_str());
357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
35928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    removeIdentifierForRequest(webView, identifier);
36028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
36128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return S_OK;
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
364563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkHRESULT STDMETHODCALLTYPE ResourceLoadDelegate::didFailLoadingWithError(
365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebView* webView,
366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ unsigned long identifier,
367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebError* error,
368563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    /* [in] */ IWebDataSource* dataSource)
369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!done && gLayoutTestController->dumpResourceLoadCallbacks()) {
371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        printf("%S - didFailLoadingWithError: %S\n",
372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            descriptionSuitableForTestResult(identifier).c_str(),
373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            descriptionSuitableForTestResult(error, identifier).c_str());
374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
37628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    removeIdentifierForRequest(webView, identifier);
37728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
378563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return S_OK;
379563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
380