diff options
author | Andras Becsi <andras.becsi@theqtcompany.com> | 2015-05-26 13:58:38 +0200 |
---|---|---|
committer | Andras Becsi <andras.becsi@theqtcompany.com> | 2015-07-08 13:16:57 +0000 |
commit | f7c4bab9157e25758ba526a6dce9a86fd4d1674e (patch) | |
tree | 512e88aeb9ea236f1c6cabd2e2fc47a43a450759 /src/core | |
parent | 5d56127cb7dbe38f552ac8858a5a7185c997911b (diff) |
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 <allan.jensen@theqtcompany.com>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/api/qwebenginecallback_p.h | 5 | ||||
-rw-r--r-- | src/core/api/qwebenginecookiestoreclient.cpp | 101 | ||||
-rw-r--r-- | src/core/api/qwebenginecookiestoreclient.h | 8 | ||||
-rw-r--r-- | src/core/api/qwebenginecookiestoreclient_p.h | 8 | ||||
-rw-r--r-- | src/core/cookie_monster_delegate_qt.cpp | 38 | ||||
-rw-r--r-- | src/core/cookie_monster_delegate_qt.h | 3 |
6 files changed, 163 insertions, 0 deletions
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 <QByteArray> #include <QHash> #include <QSharedData> #include <QString> @@ -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<const QByteArray&> &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<int> &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<int> &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<int>()); +} + +void QWebEngineCookieStoreClient::deleteAllCookies() +{ + deleteAllCookiesWithCallback(QWebEngineCallback<int>()); +} + 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<bool> &resultCallback, const QUrl &origin = QUrl()); + void deleteSessionCookiesWithCallback(const QWebEngineCallback<int> &resultCallback); + void deleteAllCookiesWithCallback(const QWebEngineCallback<int> &resultCallback); + void getAllCookies(const QWebEngineCallback<const QByteArray&> &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<CookieData> 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<bool> &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 <QStringBuilder> + 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); |