From f7c4bab9157e25758ba526a6dce9a86fd4d1674e Mon Sep 17 00:00:00 2001 From: Andras Becsi Date: Tue, 26 May 2015 13:58:38 +0200 Subject: Add support for batch tasks to the cookie client This patch adds support for deleteSessionCookies, deleteAllCookies and getAllCookies to make these features directly accessible without the need of subclassing QWebEngineCookieStoreClient and having to implement a less efficient equivalent. Change-Id: I6645bee7fcef38d00dccfaa81f4e9ada86c491df Reviewed-by: Allan Sandfeld Jensen --- src/core/api/qwebenginecallback_p.h | 5 ++ src/core/api/qwebenginecookiestoreclient.cpp | 101 +++++++++++++++++++++++++++ src/core/api/qwebenginecookiestoreclient.h | 8 +++ src/core/api/qwebenginecookiestoreclient_p.h | 8 +++ src/core/cookie_monster_delegate_qt.cpp | 38 ++++++++++ src/core/cookie_monster_delegate_qt.h | 3 + 6 files changed, 163 insertions(+) (limited to 'src/core') diff --git a/src/core/api/qwebenginecallback_p.h b/src/core/api/qwebenginecallback_p.h index 9eb627ad3..44d9ceb14 100644 --- a/src/core/api/qwebenginecallback_p.h +++ b/src/core/api/qwebenginecallback_p.h @@ -40,6 +40,7 @@ #include "qtwebenginecoreglobal_p.h" #include "qwebenginecallback.h" +#include #include #include #include @@ -50,6 +51,7 @@ F(bool) \ F(int) \ F(const QString &) \ + F(const QByteArray &) \ F(const QVariant &) namespace QtWebEngineCore { @@ -75,6 +77,9 @@ public: enum ReservedCallbackIds { NoCallbackId = 0, DeleteCookieCallbackId, + DeleteSessionCookiesCallbackId, + DeleteAllCookiesCallbackId, + GetAllCookiesCallbackId, // Place reserved id's before this. ReservedCallbackIdsEnd diff --git a/src/core/api/qwebenginecookiestoreclient.cpp b/src/core/api/qwebenginecookiestoreclient.cpp index b0e91021d..f4770927e 100644 --- a/src/core/api/qwebenginecookiestoreclient.cpp +++ b/src/core/api/qwebenginecookiestoreclient.cpp @@ -46,6 +46,9 @@ using namespace QtWebEngineCore; QWebEngineCookieStoreClientPrivate::QWebEngineCookieStoreClientPrivate(QWebEngineCookieStoreClient* q) : m_nextCallbackId(CallbackDirectory::ReservedCallbackIdsEnd) + , m_deleteSessionCookiesPending(false) + , m_deleteAllCookiesPending(false) + , m_getAllCookiesPending(false) , delegate(0) , q_ptr(q) { @@ -61,6 +64,21 @@ void QWebEngineCookieStoreClientPrivate::processPendingUserCookies() Q_ASSERT(delegate); Q_ASSERT(delegate->hasCookieMonster()); + if (m_getAllCookiesPending) { + m_getAllCookiesPending = false; + delegate->getAllCookies(CallbackDirectory::GetAllCookiesCallbackId); + } + + if (m_deleteAllCookiesPending) { + m_deleteAllCookiesPending = false; + delegate->deleteAllCookies(CallbackDirectory::DeleteAllCookiesCallbackId); + } + + if (m_deleteSessionCookiesPending) { + m_deleteSessionCookiesPending = false; + delegate->deleteSessionCookies(CallbackDirectory::DeleteSessionCookiesCallbackId); + } + if (m_pendingUserCookies.isEmpty()) return; @@ -99,11 +117,51 @@ void QWebEngineCookieStoreClientPrivate::deleteCookie(const QNetworkCookie &cook delegate->deleteCookie(cookie, url); } +void QWebEngineCookieStoreClientPrivate::deleteSessionCookies() +{ + if (!delegate || !delegate->hasCookieMonster()) { + m_deleteSessionCookiesPending = true; + return; + } + + delegate->deleteSessionCookies(CallbackDirectory::DeleteSessionCookiesCallbackId); +} + +void QWebEngineCookieStoreClientPrivate::deleteAllCookies() +{ + if (!delegate || !delegate->hasCookieMonster()) { + m_deleteAllCookiesPending = true; + m_deleteSessionCookiesPending = false; + return; + } + + delegate->deleteAllCookies(CallbackDirectory::DeleteAllCookiesCallbackId); +} + +void QWebEngineCookieStoreClientPrivate::getAllCookies() +{ + if (!delegate || !delegate->hasCookieMonster()) { + m_getAllCookiesPending = true; + return; + } + + delegate->getAllCookies(CallbackDirectory::GetAllCookiesCallbackId); +} + +void QWebEngineCookieStoreClientPrivate::onGetAllCallbackResult(qint64 callbackId, const QByteArray &cookieList) +{ + callbackDirectory.invoke(callbackId, cookieList); +} void QWebEngineCookieStoreClientPrivate::onSetCallbackResult(qint64 callbackId, bool success) { callbackDirectory.invoke(callbackId, success); } +void QWebEngineCookieStoreClientPrivate::onDeleteCallbackResult(qint64 callbackId, int numCookies) +{ + callbackDirectory.invoke(callbackId, numCookies); +} + void QWebEngineCookieStoreClientPrivate::onCookieChanged(const QNetworkCookie &cookie, bool removed) { Q_Q(QWebEngineCookieStoreClient); @@ -142,4 +200,47 @@ void QWebEngineCookieStoreClient::deleteCookie(const QNetworkCookie &cookie, con d->deleteCookie(cookie, origin); } +void QWebEngineCookieStoreClient::getAllCookies(const QWebEngineCallback &resultCallback) +{ + Q_D(QWebEngineCookieStoreClient); + if (d->m_getAllCookiesPending) { + d->callbackDirectory.invokeEmpty(resultCallback); + return; + } + d->callbackDirectory.registerCallback(CallbackDirectory::GetAllCookiesCallbackId, resultCallback); + d->getAllCookies(); +} + +void QWebEngineCookieStoreClient::deleteSessionCookiesWithCallback(const QWebEngineCallback &resultCallback) +{ + Q_D(QWebEngineCookieStoreClient); + if (d->m_deleteAllCookiesPending || d->m_deleteSessionCookiesPending) { + d->callbackDirectory.invokeEmpty(resultCallback); + return; + } + d->callbackDirectory.registerCallback(CallbackDirectory::DeleteSessionCookiesCallbackId, resultCallback); + d->deleteSessionCookies(); +} + +void QWebEngineCookieStoreClient::deleteAllCookiesWithCallback(const QWebEngineCallback &resultCallback) +{ + Q_D(QWebEngineCookieStoreClient); + if (d->m_deleteAllCookiesPending) { + d->callbackDirectory.invokeEmpty(resultCallback); + return; + } + d->callbackDirectory.registerCallback(CallbackDirectory::DeleteAllCookiesCallbackId, resultCallback); + d->deleteAllCookies(); +} + +void QWebEngineCookieStoreClient::deleteSessionCookies() +{ + deleteSessionCookiesWithCallback(QWebEngineCallback()); +} + +void QWebEngineCookieStoreClient::deleteAllCookies() +{ + deleteAllCookiesWithCallback(QWebEngineCallback()); +} + QT_END_NAMESPACE diff --git a/src/core/api/qwebenginecookiestoreclient.h b/src/core/api/qwebenginecookiestoreclient.h index 58a332542..c9cfc1b37 100644 --- a/src/core/api/qwebenginecookiestoreclient.h +++ b/src/core/api/qwebenginecookiestoreclient.h @@ -60,11 +60,19 @@ public: #ifdef Q_QDOC void setCookieWithCallback(const QNetworkCookie &cookie, FunctorOrLambda resultCallback, const QUrl &origin = QUrl()); + void deleteSessionCookiesWithCallback(FunctorOrLambda resultCallback); + void deleteAllCookiesWithCallback(FunctorOrLambda resultCallback); + void getAllCookies(FunctorOrLambda resultCallback); #else void setCookieWithCallback(const QNetworkCookie &cookie, const QWebEngineCallback &resultCallback, const QUrl &origin = QUrl()); + void deleteSessionCookiesWithCallback(const QWebEngineCallback &resultCallback); + void deleteAllCookiesWithCallback(const QWebEngineCallback &resultCallback); + void getAllCookies(const QWebEngineCallback &resultCallback); #endif void setCookie(const QNetworkCookie &cookie, const QUrl &origin = QUrl()); void deleteCookie(const QNetworkCookie &cookie, const QUrl &origin = QUrl()); + void deleteSessionCookies(); + void deleteAllCookies(); Q_SIGNALS: void cookieAdded(const QNetworkCookie &cookie); diff --git a/src/core/api/qwebenginecookiestoreclient_p.h b/src/core/api/qwebenginecookiestoreclient_p.h index 4a0f280f5..ba7914d94 100644 --- a/src/core/api/qwebenginecookiestoreclient_p.h +++ b/src/core/api/qwebenginecookiestoreclient_p.h @@ -73,6 +73,9 @@ public: QtWebEngineCore::CallbackDirectory callbackDirectory; QList m_pendingUserCookies; quint64 m_nextCallbackId; + bool m_deleteSessionCookiesPending; + bool m_deleteAllCookiesPending; + bool m_getAllCookiesPending; QtWebEngineCore::CookieMonsterDelegateQt *delegate; QWebEngineCookieStoreClient *q_ptr; @@ -83,8 +86,13 @@ public: void processPendingUserCookies(); void setCookie(const QWebEngineCallback &callback, const QNetworkCookie &cookie, const QUrl &origin); void deleteCookie(const QNetworkCookie &cookie, const QUrl &url); + void deleteSessionCookies(); + void deleteAllCookies(); + void getAllCookies(); + void onGetAllCallbackResult(qint64 callbackId, const QByteArray &cookieList); void onSetCallbackResult(qint64 callbackId, bool success); + void onDeleteCallbackResult(qint64 callbackId, int numCookies); void onCookieChanged(const QNetworkCookie &cookie, bool removed); }; diff --git a/src/core/cookie_monster_delegate_qt.cpp b/src/core/cookie_monster_delegate_qt.cpp index d40abf13e..6b808e76c 100644 --- a/src/core/cookie_monster_delegate_qt.cpp +++ b/src/core/cookie_monster_delegate_qt.cpp @@ -44,6 +44,8 @@ #include "api/qwebenginecookiestoreclient_p.h" #include "type_conversion.h" +#include + namespace QtWebEngineCore { static GURL sourceUrlForCookie(const QNetworkCookie &cookie) { @@ -55,6 +57,18 @@ static void onSetCookieCallback(QWebEngineCookieStoreClientPrivate *client, qint client->onSetCallbackResult(callbackId, success); } +static void onDeleteCookiesCallback(QWebEngineCookieStoreClientPrivate *client, qint64 callbackId, int numCookies) { + client->onDeleteCallbackResult(callbackId, numCookies); +} + +static void onGetAllCookiesCallback(QWebEngineCookieStoreClientPrivate *client, qint64 callbackId, const net::CookieList& cookies) { + QByteArray rawCookies; + for (auto&& cookie: cookies) + rawCookies += toQt(cookie).toRawForm() % QByteArrayLiteral("\n"); + + client->onGetAllCallbackResult(callbackId, rawCookies); +} + CookieMonsterDelegateQt::CookieMonsterDelegateQt() : m_client(0) , m_cookieMonster(0) @@ -72,6 +86,12 @@ bool CookieMonsterDelegateQt::hasCookieMonster() return m_cookieMonster.get(); } +void CookieMonsterDelegateQt::getAllCookies(quint64 callbackId) +{ + net::CookieMonster::GetCookieListCallback callback = base::Bind(&onGetAllCookiesCallback, m_client->d_func(), callbackId); + m_cookieMonster->GetAllCookiesAsync(callback); +} + void CookieMonsterDelegateQt::setCookie(quint64 callbackId, const QNetworkCookie &cookie, const QUrl &origin) { Q_ASSERT(hasCookieMonster()); @@ -99,6 +119,24 @@ void CookieMonsterDelegateQt::deleteCookie(const QNetworkCookie &cookie, const Q m_cookieMonster->DeleteCookieAsync(gurl, cookie.name().toStdString(), base::Closure()); } +void CookieMonsterDelegateQt::deleteSessionCookies(quint64 callbackId) +{ + Q_ASSERT(hasCookieMonster()); + Q_ASSERT(m_client); + + net::CookieMonster::DeleteCallback callback = base::Bind(&onDeleteCookiesCallback, m_client->d_func(), callbackId); + m_cookieMonster->DeleteSessionCookiesAsync(callback); +} + +void CookieMonsterDelegateQt::deleteAllCookies(quint64 callbackId) +{ + Q_ASSERT(hasCookieMonster()); + Q_ASSERT(m_client); + + net::CookieMonster::DeleteCallback callback = base::Bind(&onDeleteCookiesCallback, m_client->d_func(), callbackId); + m_cookieMonster->DeleteAllAsync(callback); +} + void CookieMonsterDelegateQt::setCookieMonster(net::CookieMonster* monster) { m_cookieMonster = monster; diff --git a/src/core/cookie_monster_delegate_qt.h b/src/core/cookie_monster_delegate_qt.h index 7cd76bff0..971a09bbc 100644 --- a/src/core/cookie_monster_delegate_qt.h +++ b/src/core/cookie_monster_delegate_qt.h @@ -66,6 +66,9 @@ public: void setCookie(quint64 callbackId, const QNetworkCookie &cookie, const QUrl &origin); void deleteCookie(const QNetworkCookie &cookie, const QUrl &origin); + void getAllCookies(quint64 callbackId); + void deleteSessionCookies(quint64 callbackId); + void deleteAllCookies(quint64 callbackId); void setCookieMonster(net::CookieMonster* monster); void setClient(QWebEngineCookieStoreClient *client); -- cgit v1.2.3