summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndras Becsi <andras.becsi@theqtcompany.com>2015-05-26 13:58:38 +0200
committerAndras Becsi <andras.becsi@theqtcompany.com>2015-07-08 13:16:57 +0000
commitf7c4bab9157e25758ba526a6dce9a86fd4d1674e (patch)
tree512e88aeb9ea236f1c6cabd2e2fc47a43a450759
parent5d56127cb7dbe38f552ac8858a5a7185c997911b (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>
-rw-r--r--src/core/api/qwebenginecallback_p.h5
-rw-r--r--src/core/api/qwebenginecookiestoreclient.cpp101
-rw-r--r--src/core/api/qwebenginecookiestoreclient.h8
-rw-r--r--src/core/api/qwebenginecookiestoreclient_p.h8
-rw-r--r--src/core/cookie_monster_delegate_qt.cpp38
-rw-r--r--src/core/cookie_monster_delegate_qt.h3
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);