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);
77f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen
78a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    typedef void CallbackFunction(void*);
79a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick
80a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    // This is called from the IO thread, and dispatches the callback to the main thread.
81a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    // (For asynchronous calls, we just delegate to WebKit's callOnMainThread.)
82d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void maybeCallOnMainThread(Task* task);
83a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick
84a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    // Called by WebRequest (using maybeCallOnMainThread), should be forwarded to WebCore.
85d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void didReceiveResponse(PassOwnPtr<WebResponse>);
86d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void didReceiveData(scoped_refptr<net::IOBuffer>, int size);
87d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void didReceiveDataUrl(PassOwnPtr<std::string>);
88d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void didReceiveAndroidFileData(PassOwnPtr<std::vector<char> >);
89d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void didFinishLoading();
90d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void didFail(PassOwnPtr<WebResponse>);
91d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    void willSendRequest(PassOwnPtr<WebResponse>);
92b03ba594dfb7cae54557397a2a86b0a926da4685Ben Murdoch    void authRequired(scoped_refptr<net::AuthChallengeInfo>, bool firstTime, bool suppressDialog);
931f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu    void reportSslCertError(int cert_error, net::X509Certificate* cert);
94432a3b5a08c1dff5693d7b804b9e9cf19ad92a2eSelim Gurun
95432a3b5a08c1dff5693d7b804b9e9cf19ad92a2eSelim Gurun    void sslClientCert(EVP_PKEY* pkey, net::X509Certificate* chain);
96eec5cd31a627a9d05aefe27fe25ff9df92ad1a53Brian Carlstrom    void requestClientCert(net::SSLCertRequestInfo* cert);
97f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen
98d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch    // Handle to the chrome IO thread
99d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch    static base::Thread* ioThread();
100d0fc68897b5a7379951aaa5d50f0802dbe9e00d4Ben Murdoch
101f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsenprivate:
102d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    friend class base::RefCountedThreadSafe<WebUrlLoaderClient>;
103d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    virtual ~WebUrlLoaderClient();
104d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick
105f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen    void finish();
106d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick
107d4ff0cc91b5eb975d563f355f9f4c7358e0e2c06Iain Merrick    WebFrame* m_webFrame;
108f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen    RefPtr<WebCore::ResourceHandle> m_resourceHandle;
109e777e7663bb6cecc72754dbf56e068f5b6ea30d5Iain Merrick    bool m_isMainResource;
110990373e4c55ba4f0312b5ab7974388d717d1907cHuahui Wu    bool m_isMainFrame;
1118576680967155ccad63175f913367b0682c8d43eHuahui Wu    bool m_isCertMimeType;
112f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen    bool m_cancelling;
113a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    bool m_sync;
114a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    volatile bool m_finished;
115f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen
116d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    scoped_refptr<WebRequest> m_request;
1177d2f6c10941c9083e9ec30fb08444a5755ff8bc9Iain Merrick    OwnPtr<WebResponse> m_response; // NULL until didReceiveResponse is called.
118f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen
1195ceb0fecb9c6e4cb97ca46e0e75b56fbb5cbabdaKristian Monsen    // Check if a request is active
1205ceb0fecb9c6e4cb97ca46e0e75b56fbb5cbabdaKristian Monsen    bool isActive() const;
121a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick
122a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    // Mutex and condition variable used for synchronous requests.
123a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    // Note that these are static. This works because there's only one main thread.
124f5c16878840c58e6e0b1622e0cd950fe27ae7832Kristian Monsen    static base::Lock* syncLock();
125f5c16878840c58e6e0b1622e0cd950fe27ae7832Kristian Monsen    static base::ConditionVariable* syncCondition();
126a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick
127a01792f8060881461b672472ba3dfdd77044e0a5Iain Merrick    // Queue of callbacks to be executed by the main thread. Must only be accessed inside mutex.
128d4a869207d9c64cff5a8ac08cd9cddf473360504Iain Merrick    std::deque<Task*> m_queue;
129f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen};
130f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen
131f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen} // namespace android
132f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen
133f48006ff278822e558c43fa7d6635f0ff34342b6Kristian Monsen#endif
134