WebUrlLoaderClient.h revision eec5cd31a627a9d05aefe27fe25ff9df92ad1a53
1f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen/* 2f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * Copyright 2010, The Android Open Source Project 3f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * 4f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * Redistribution and use in source and binary forms, with or without 5f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * modification, are permitted provided that the following conditions 6f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * are met: 7f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * * Redistributions of source code must retain the above copyright 8f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * notice, this list of conditions and the following disclaimer. 9f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * * Redistributions in binary form must reproduce the above copyright 10f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * notice, this list of conditions and the following disclaimer in the 11f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * documentation and/or other materials provided with the distribution. 12f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * 13f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen */ 25f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 26f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#ifndef WebUrlLoaderClient_h 27f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#define WebUrlLoaderClient_h 28f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 29bdcebcb37eb20e212451130aee402c1927ad0e14Kristian Monsen#include "ChromiumIncludes.h" 30f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#include "RefCounted.h" 319de447de54fcb62a01a3338bb4d2f4d1716f522dKristian Monsen#include "WebResponse.h" 32f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#include "WebUrlLoader.h" 33f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 34f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#include <string> 35a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick#include <deque> 36d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick#include <string> 37d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick#include <vector> 38a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick 39f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 40f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsennamespace base { 41f5c16878840c58e6e0b1622e0cd950fe27ae7832Kristian Monsenclass ConditionVariable; 42f5c16878840c58e6e0b1622e0cd950fe27ae7832Kristian Monsenclass Lock; 43f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsenclass Thread; 44f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen} 45f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 46f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsennamespace net { 47f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsenclass IOBuffer; 48d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrickclass AuthChallengeInfo; 49f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen} 50f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 51f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsennamespace android { 52f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 53021eb475906bf08d90d93e6a3434fe2439e42cf0Kristian Monsenclass WebFrame; 54f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsenclass WebRequest; 55b84030fc8163cde1f8f055973ef63d3e1670bf52Steve Blockclass WebRequestContext; 56f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 57f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// This class handles communication between the IO thread where loading happens 58f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// and the webkit main thread. 59f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// TODO: 60f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// - Implement didFail 61f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// - Implement sync requests 62f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// - Implement downloadFile 63f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen// - Implement pauseLoad 64d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrickclass WebUrlLoaderClient : public base::RefCountedThreadSafe<WebUrlLoaderClient> { 65f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsenpublic: 66021eb475906bf08d90d93e6a3434fe2439e42cf0Kristian Monsen WebUrlLoaderClient(WebFrame*, WebCore::ResourceHandle*, const WebCore::ResourceRequest&); 67f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 68f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen // Called from WebCore, will be forwarded to the IO thread 69990373e4c55ba4f0312b5ab7974388d717d1907cHuahui Wu bool start(bool isMainResource, bool isMainFrame, bool sync, WebRequestContext*); 70f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen void cancel(); 71f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen void downloadFile(); 729813d91feab65e2257bcaae80146dc9fb77cb75dKristian Monsen void pauseLoad(bool pause); 73d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick void setAuth(const std::string& username, const std::string& password); 74d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick void cancelAuth(); 751f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu void proceedSslCertError(); 761f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu void cancelSslCertError(int cert_error); 77eec5cd31a627a9d05aefe27fe25ff9df92ad1a53Brian Carlstrom void sslClientCert(EVP_PKEY* pkey, net::X509Certificate* chain); 78f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 79a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick typedef void CallbackFunction(void*); 80a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick 81a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick // This is called from the IO thread, and dispatches the callback to the main thread. 82a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick // (For asynchronous calls, we just delegate to WebKit's callOnMainThread.) 83d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void maybeCallOnMainThread(Task* task); 84a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick 85a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick // Called by WebRequest (using maybeCallOnMainThread), should be forwarded to WebCore. 86d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void didReceiveResponse(PassOwnPtr<WebResponse>); 87d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void didReceiveData(scoped_refptr<net::IOBuffer>, int size); 88d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void didReceiveDataUrl(PassOwnPtr<std::string>); 89d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void didReceiveAndroidFileData(PassOwnPtr<std::vector<char> >); 90d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void didFinishLoading(); 91d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void didFail(PassOwnPtr<WebResponse>); 92d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick void willSendRequest(PassOwnPtr<WebResponse>); 93664dabb9afbb1d233a9b16a8f80f944cc01d4e7fIain Merrick void authRequired(scoped_refptr<net::AuthChallengeInfo>, bool firstTime); 941f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu void reportSslCertError(int cert_error, net::X509Certificate* cert); 95eec5cd31a627a9d05aefe27fe25ff9df92ad1a53Brian Carlstrom void requestClientCert(net::SSLCertRequestInfo* cert); 96f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 97d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch // Handle to the chrome IO thread 98d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch static base::Thread* ioThread(); 99d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch 100f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsenprivate: 101d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick friend class base::RefCountedThreadSafe<WebUrlLoaderClient>; 102d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick virtual ~WebUrlLoaderClient(); 103d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick 104f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen void finish(); 105d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick 106d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick WebFrame* m_webFrame; 107f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen RefPtr<WebCore::ResourceHandle> m_resourceHandle; 108e777e7663bb6cecc72754dbf56e068f5b6ea30d5Iain Merrick bool m_isMainResource; 109990373e4c55ba4f0312b5ab7974388d717d1907cHuahui Wu bool m_isMainFrame; 1108576680967155ccad63175f913367b0682c8d43eHuahui Wu bool m_isCertMimeType; 111f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen bool m_cancelling; 112a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick bool m_sync; 113a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick volatile bool m_finished; 114f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 115d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick scoped_refptr<WebRequest> m_request; 1167d2f6c10941c9083e9ec30fb08444a5755ff8bc9Iain Merrick OwnPtr<WebResponse> m_response; // NULL until didReceiveResponse is called. 117f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 1185ceb0fecb9c6e4cb97ca46e0e75b56fbb5cbabdaKristian Monsen // Check if a request is active 1195ceb0fecb9c6e4cb97ca46e0e75b56fbb5cbabdaKristian Monsen bool isActive() const; 120a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick 121a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick // Mutex and condition variable used for synchronous requests. 122a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick // Note that these are static. This works because there's only one main thread. 123f5c16878840c58e6e0b1622e0cd950fe27ae7832Kristian Monsen static base::Lock* syncLock(); 124f5c16878840c58e6e0b1622e0cd950fe27ae7832Kristian Monsen static base::ConditionVariable* syncCondition(); 125a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick 126a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick // Queue of callbacks to be executed by the main thread. Must only be accessed inside mutex. 127d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick std::deque<Task*> m_queue; 128f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen}; 129f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 130f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen} // namespace android 131f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen 132f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#endif 133