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