diff options
11 files changed, 62 insertions, 33 deletions
diff --git a/WebCore/platform/network/android/ResourceHandleAndroid.cpp b/WebCore/platform/network/android/ResourceHandleAndroid.cpp index fbafd6d..2cd1ba9 100644 --- a/WebCore/platform/network/android/ResourceHandleAndroid.cpp +++ b/WebCore/platform/network/android/ResourceHandleAndroid.cpp @@ -36,6 +36,7 @@ #include "ResourceHandleClient.h" #include "ResourceHandleInternal.h" #include "ResourceLoaderAndroid.h" +#include "Settings.h" #include <wtf/text/CString.h> namespace WebCore { @@ -54,8 +55,11 @@ bool ResourceHandle::start(Frame* frame) MainResourceLoader* mainLoader = docLoader->mainResourceLoader(); bool isMainResource = static_cast<void*>(mainLoader) == static_cast<void*>(client()); + bool isPrivateBrowsing = false; + if (frame->settings()) + isPrivateBrowsing = frame->settings()->privateBrowsingEnabled(); - PassRefPtr<ResourceLoaderAndroid> loader = ResourceLoaderAndroid::start(this, d->m_firstRequest, frame->loader()->client(), isMainResource, false); + PassRefPtr<ResourceLoaderAndroid> loader = ResourceLoaderAndroid::start(this, d->m_firstRequest, frame->loader()->client(), isMainResource, false, isPrivateBrowsing); if (loader) { d->m_loader = loader; @@ -157,12 +161,15 @@ void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request, { SyncLoader s(error, response, data); RefPtr<ResourceHandle> h = adoptRef(new ResourceHandle(request, &s, false, false)); + bool isPrivateBrowsing = false; + if (frame->settings()) + isPrivateBrowsing = frame->settings()->privateBrowsingEnabled(); // This blocks until the load is finished. // Use the request owned by the ResourceHandle. This has had the username // and password (if present) stripped from the URL in // ResourceHandleInternal::ResourceHandleInternal(). This matches the // behaviour in the asynchronous case. - ResourceLoaderAndroid::start(h.get(), request, frame->loader()->client(), false, true); + ResourceLoaderAndroid::start(h.get(), request, frame->loader()->client(), false, true, isPrivateBrowsing); } } // namespace WebCore diff --git a/WebCore/platform/network/android/ResourceLoaderAndroid.h b/WebCore/platform/network/android/ResourceLoaderAndroid.h index f627d62..93617f4 100644 --- a/WebCore/platform/network/android/ResourceLoaderAndroid.h +++ b/WebCore/platform/network/android/ResourceLoaderAndroid.h @@ -37,7 +37,7 @@ class ResourceHandle; class ResourceLoaderAndroid : public RefCounted<ResourceLoaderAndroid> { public: - static PassRefPtr<ResourceLoaderAndroid> start(ResourceHandle*, const ResourceRequest&, FrameLoaderClient*, bool isMainResource, bool isSync); + static PassRefPtr<ResourceLoaderAndroid> start(ResourceHandle*, const ResourceRequest&, FrameLoaderClient*, bool isMainResource, bool isSync, bool isPrivateBrowsing); virtual ~ResourceLoaderAndroid() { } virtual void cancel() = 0; diff --git a/WebKit/android/WebCoreSupport/ResourceLoaderAndroid.cpp b/WebKit/android/WebCoreSupport/ResourceLoaderAndroid.cpp index 2b2ad95..8872a52 100644 --- a/WebKit/android/WebCoreSupport/ResourceLoaderAndroid.cpp +++ b/WebKit/android/WebCoreSupport/ResourceLoaderAndroid.cpp @@ -36,7 +36,7 @@ using namespace android; namespace WebCore { PassRefPtr<ResourceLoaderAndroid> ResourceLoaderAndroid::start( - ResourceHandle* handle, const ResourceRequest& request, FrameLoaderClient* client, bool isMainResource, bool isSync) + ResourceHandle* handle, const ResourceRequest& request, FrameLoaderClient* client, bool isMainResource, bool isSync, bool /*isPrivateBrowsing*/) { FrameLoaderClientAndroid* clientAndroid = static_cast<FrameLoaderClientAndroid*> (client); return clientAndroid->webFrame()->startLoadingResource(handle, request, isMainResource, isSync); diff --git a/WebKit/android/WebCoreSupport/WebRequest.cpp b/WebKit/android/WebCoreSupport/WebRequest.cpp index 45318bc..9118baf 100644 --- a/WebKit/android/WebCoreSupport/WebRequest.cpp +++ b/WebKit/android/WebCoreSupport/WebRequest.cpp @@ -84,13 +84,17 @@ void WebRequest::AppendBytesToUpload(const char* bytes, int bytesLen) m_request->AppendBytesToUpload(bytes, bytesLen); } -void WebRequest::start() +void WebRequest::start(bool isPrivateBrowsing) { // Handle data urls before we send it off to the http stack if (m_request->url().SchemeIs("data")) return handleDataURL(m_request->url()); - m_request->set_context(WebRequestContext::GetAndroidContext()); + if (!isPrivateBrowsing) + m_request->set_context(WebRequestContext::GetAndroidContext()); + else + m_request->set_context(WebRequestContext::GetAndroidPrivateBrowsingContext()); + m_request->Start(); } diff --git a/WebKit/android/WebCoreSupport/WebRequest.h b/WebKit/android/WebCoreSupport/WebRequest.h index 2bd86d8..9c9c830 100644 --- a/WebKit/android/WebCoreSupport/WebRequest.h +++ b/WebKit/android/WebCoreSupport/WebRequest.h @@ -45,7 +45,7 @@ public: // Optional, but if used has to be called before start void AppendBytesToUpload(const char* bytes, int bytesLen); - void start(); + void start(bool isPrivateBrowsing); void cancel(); // From URLRequest::Delegate diff --git a/WebKit/android/WebCoreSupport/WebRequestContext.cpp b/WebKit/android/WebCoreSupport/WebRequestContext.cpp index e9ef24c..1de066e 100644 --- a/WebKit/android/WebCoreSupport/WebRequestContext.cpp +++ b/WebKit/android/WebCoreSupport/WebRequestContext.cpp @@ -77,28 +77,44 @@ const std::string* WebRequestContext::GetDataDirectory() return s_dataDirectory; } +WebRequestContext* WebRequestContext::GetAndroidContextForPath(const char* cookieFilename, const char* cacheFilename) +{ + std::string cookieString(*GetDataDirectory()); + cookieString.append(cookieFilename); + FilePath cookiePath(cookieString.c_str()); + std::string cacheString(*GetDataDirectory()); + cacheString.append(cacheFilename); + FilePath cachePath(cacheString.c_str()); + + scoped_refptr<WebRequestContext> androidContext = new WebRequestContext(); + androidContext->host_resolver_ = net::CreateSystemHostResolver(0); + scoped_refptr<base::MessageLoopProxy> cacheMessageLoopProxy = base::MessageLoopProxy::CreateForCurrentThread(); + // Todo: check if the context takes ownership of the cache + net::HttpCache::DefaultBackend* defaultBackend = new net::HttpCache::DefaultBackend(net::DISK_CACHE, cachePath, 20 * 1024 * 1024, cacheMessageLoopProxy); + androidContext->http_transaction_factory_ = new net::HttpCache(androidContext->host_resolver(), net::ProxyService::CreateNull(), net::SSLConfigService::CreateSystemSSLConfigService(), 0, 0, 0, defaultBackend); + + scoped_refptr<SQLitePersistentCookieStore> cookieDb = new SQLitePersistentCookieStore(cookiePath); + androidContext->cookie_store_ = new net::CookieMonster(cookieDb.get(), 0); + + return androidContext.release(); +} + WebRequestContext* WebRequestContext::GetAndroidContext() { static scoped_refptr<WebRequestContext> androidContext(0); + if (!androidContext) + androidContext = GetAndroidContextForPath("/chromecookies.db", "/chromecache"); + return androidContext; +} + +WebRequestContext* WebRequestContext::GetAndroidPrivateBrowsingContext() +{ + static scoped_refptr<WebRequestContext> androidContext(0); if (!androidContext) { - std::string cookieString(*GetDataDirectory()); - cookieString.append("/chromecookies.db"); - FilePath cookiePath(cookieString.c_str()); - std::string cacheString(*GetDataDirectory()); - cacheString.append("/chromecache"); - FilePath cachePath(cacheString.c_str()); - - androidContext = new WebRequestContext(); - androidContext->host_resolver_ = net::CreateSystemHostResolver(0); - scoped_refptr<base::MessageLoopProxy> cacheMessageLoopProxy = base::MessageLoopProxy::CreateForCurrentThread(); - // Todo: check if the context takes ownership of the cache - net::HttpCache::DefaultBackend* defaultBackend = new net::HttpCache::DefaultBackend(net::DISK_CACHE, cachePath, 20 * 1024 * 1024, cacheMessageLoopProxy); - androidContext->http_transaction_factory_ = new net::HttpCache(androidContext->host_resolver(), net::ProxyService::CreateNull(), net::SSLConfigService::CreateSystemSSLConfigService(), 0, 0, 0, defaultBackend); - - scoped_refptr<SQLitePersistentCookieStore> cookieDb = new SQLitePersistentCookieStore(cookiePath); - androidContext->cookie_store_ = new net::CookieMonster(cookieDb.get(), 0); + // TODO: Where is the right place to put the temporary db? Should it be + // kept in memory? + androidContext = GetAndroidContextForPath("/chromecookies_private.db", "/chromecache_private"); } - return androidContext; } diff --git a/WebKit/android/WebCoreSupport/WebRequestContext.h b/WebKit/android/WebCoreSupport/WebRequestContext.h index 0ff081c..c321528 100644 --- a/WebKit/android/WebCoreSupport/WebRequestContext.h +++ b/WebKit/android/WebCoreSupport/WebRequestContext.h @@ -40,8 +40,10 @@ class WebRequestContext : public URLRequestContext { public: virtual const std::string& GetUserAgent(const GURL& url) const; static WebRequestContext* GetAndroidContext(); + static WebRequestContext* GetAndroidPrivateBrowsingContext(); private: static const std::string* GetDataDirectory(); + static WebRequestContext* GetAndroidContextForPath(const char* cookiePath, const char* cachePath); WebRequestContext(); ~WebRequestContext(); diff --git a/WebKit/android/WebCoreSupport/WebUrlLoader.cpp b/WebKit/android/WebCoreSupport/WebUrlLoader.cpp index 9df58e4..4b815c6 100644 --- a/WebKit/android/WebCoreSupport/WebUrlLoader.cpp +++ b/WebKit/android/WebCoreSupport/WebUrlLoader.cpp @@ -42,10 +42,10 @@ WebUrlLoader::~WebUrlLoader() { } -PassRefPtr<WebUrlLoader> WebUrlLoader::start(WebCore::ResourceHandle* resourceHandle, const WebCore::ResourceRequest& resourceRequest, bool isSync) +PassRefPtr<WebUrlLoader> WebUrlLoader::start(WebCore::ResourceHandle* resourceHandle, const WebCore::ResourceRequest& resourceRequest, bool isSync, bool isPrivateBrowsing) { RefPtr<WebUrlLoader> loader = WebUrlLoader::create(resourceHandle, resourceRequest); - loader->m_loaderClient->start(isSync); + loader->m_loaderClient->start(isSync, isPrivateBrowsing); return loader.release(); } @@ -69,9 +69,9 @@ namespace WebCore { // static // TODO: Implement sync requests PassRefPtr<ResourceLoaderAndroid> ResourceLoaderAndroid::start(WebCore::ResourceHandle* resourceHandle, const WebCore::ResourceRequest& resourceRequest, - FrameLoaderClient* /*client*/, bool /*isMainResource*/, bool isSync) + FrameLoaderClient* /*client*/, bool /*isMainResource*/, bool isSync, bool isPrivateBrowsing) { - return android::WebUrlLoader::start(resourceHandle, resourceRequest, isSync); + return android::WebUrlLoader::start(resourceHandle, resourceRequest, isSync, isPrivateBrowsing); } // static diff --git a/WebKit/android/WebCoreSupport/WebUrlLoader.h b/WebKit/android/WebCoreSupport/WebUrlLoader.h index 167bdc0..c465b66 100644 --- a/WebKit/android/WebCoreSupport/WebUrlLoader.h +++ b/WebKit/android/WebCoreSupport/WebUrlLoader.h @@ -36,7 +36,7 @@ class WebUrlLoaderClient; class WebUrlLoader : public ResourceLoaderAndroid { public: virtual ~WebUrlLoader(); - static PassRefPtr<WebUrlLoader> start(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, bool sync); + static PassRefPtr<WebUrlLoader> start(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, bool sync, bool isPrivateBrowsing); virtual void cancel(); virtual void downloadFile() {} // Not implemented yet diff --git a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp index 33f94af..e3ee14c 100644 --- a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp +++ b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp @@ -143,7 +143,7 @@ WebUrlLoaderClient::WebUrlLoaderClient(WebCore::ResourceHandle* resourceHandle, } } -bool WebUrlLoaderClient::start(bool sync) +bool WebUrlLoaderClient::start(bool sync, bool isPrivateBrowsing) { base::Thread* thread = ioThread(); if (!thread) { @@ -153,7 +153,7 @@ bool WebUrlLoaderClient::start(bool sync) m_sync = sync; if (m_sync) { AutoLock autoLock(*syncLock()); - thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request, &WebRequest::start)); + thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request, &WebRequest::start, isPrivateBrowsing)); // Run callbacks until the queue is exhausted and m_finished is true. while(!m_finished) { @@ -174,7 +174,7 @@ bool WebUrlLoaderClient::start(bool sync) m_resourceHandle = 0; } else { // Asynchronous start. - thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request, &WebRequest::start)); + thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request, &WebRequest::start, isPrivateBrowsing)); } return true; } diff --git a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.h b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.h index 4231d02..a761f15 100644 --- a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.h +++ b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.h @@ -63,7 +63,7 @@ public: ~WebUrlLoaderClient(); // Called from WebCore, will be forwarded to the IO thread - bool start(bool sync); + bool start(bool sync, bool isPrivateBrowsing); void cancel(); void downloadFile(); void pauseLoad(bool pause) {} // Android method, does nothing for now |