Diff
Modified: trunk/Tools/ChangeLog (92477 => 92478)
--- trunk/Tools/ChangeLog 2011-08-05 13:45:21 UTC (rev 92477)
+++ trunk/Tools/ChangeLog 2011-08-05 14:03:41 UTC (rev 92478)
@@ -1,3 +1,24 @@
+2011-08-05 Ademar de Souza Reis Jr <[email protected]>
+
+ [Qt] QtTestBrowser: Add support for saving cookies on disk
+ https://bugs.webkit.org/show_bug.cgi?id=65328
+
+ Simple cookiejar that saves cookies on disk.
+
+ Added menu options to clear cookies (Edit->Clear cookies) and
+ disable disk cookies (Settings->[ ]Save Cookies on Disk).
+
+ Option -no-disk-cookies is also available.
+
+ Reviewed by Andreas Kling.
+
+ * QtTestBrowser/QtTestBrowser.pro:
+ * QtTestBrowser/cookiejar.cpp: Added.
+ * QtTestBrowser/cookiejar.h: Added.
+ * QtTestBrowser/launcherwindow.cpp:
+ * QtTestBrowser/launcherwindow.h:
+ * QtTestBrowser/main.cpp:
+
2011-08-04 Adam Barth <[email protected]>
model.js needs some unit testing
Modified: trunk/Tools/QtTestBrowser/QtTestBrowser.pro (92477 => 92478)
--- trunk/Tools/QtTestBrowser/QtTestBrowser.pro 2011-08-05 13:45:21 UTC (rev 92477)
+++ trunk/Tools/QtTestBrowser/QtTestBrowser.pro 2011-08-05 14:03:41 UTC (rev 92478)
@@ -10,6 +10,7 @@
webpage.cpp \
webview.cpp \
fpstimer.cpp \
+ cookiejar.cpp
HEADERS += \
locationedit.h \
@@ -21,6 +22,7 @@
webpage.h \
webview.h \
fpstimer.h \
+ cookiejar.h
!isEqual(QT_ARCH,sh4): CONFIG += uitools
Added: trunk/Tools/QtTestBrowser/cookiejar.cpp (0 => 92478)
--- trunk/Tools/QtTestBrowser/cookiejar.cpp (rev 0)
+++ trunk/Tools/QtTestBrowser/cookiejar.cpp 2011-08-05 14:03:41 UTC (rev 92478)
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "cookiejar.h"
+
+#include <QDesktopServices>
+#include <QDir>
+#include <QTextStream>
+
+TestBrowserCookieJar::TestBrowserCookieJar(QObject* parent)
+ : QNetworkCookieJar(parent)
+ , m_storageEnabled(false)
+{
+ // We use a timer for the real disk write to avoid multiple IO
+ // syscalls in sequence (when loading pages which set multiple cookies).
+ m_timer.setInterval(10000);
+ m_timer.setSingleShot(true);
+ connect(&m_timer, SIGNAL(timeout()), this, SLOT(saveToDisk()));
+
+ QString path = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
+ QDir().mkpath(path);
+ m_file.setFileName(path + "/cookieJar");
+}
+
+TestBrowserCookieJar::~TestBrowserCookieJar()
+{
+ if (m_storageEnabled) {
+ extractRawCookies();
+ saveToDisk();
+ }
+}
+
+bool TestBrowserCookieJar::setCookiesFromUrl(const QList<QNetworkCookie>& cookieList, const QUrl& url)
+{
+ bool status = QNetworkCookieJar::setCookiesFromUrl(cookieList, url);
+ if (status && m_storageEnabled)
+ scheduleSaveToDisk();
+ return status;
+}
+
+void TestBrowserCookieJar::setDiskStorageEnabled(bool enabled)
+{
+ m_storageEnabled = enabled;
+
+ if (enabled && allCookies().isEmpty())
+ loadFromDisk();
+
+ // When disabling, save current cookies.
+ if (!enabled && !allCookies().isEmpty())
+ scheduleSaveToDisk();
+}
+
+void TestBrowserCookieJar::scheduleSaveToDisk()
+{
+ // We extract the raw cookies here because the user may
+ // enable/disable/clear cookies while the timer is running.
+ extractRawCookies();
+ m_timer.start();
+}
+
+void TestBrowserCookieJar::extractRawCookies()
+{
+ QList<QNetworkCookie> cookies = allCookies();
+ m_rawCookies.clear();
+
+ foreach (const QNetworkCookie &cookie, cookies) {
+ if (!cookie.isSessionCookie())
+ m_rawCookies.append(cookie.toRawForm());
+ }
+}
+
+void TestBrowserCookieJar::saveToDisk()
+{
+ m_timer.stop();
+
+ if (m_file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ QTextStream out(&m_file);
+ foreach (const QByteArray &cookie, m_rawCookies)
+ out << cookie + "\n";
+ m_file.close();
+ } else
+ qWarning("IO error handling cookiejar file");
+}
+
+void TestBrowserCookieJar::loadFromDisk()
+{
+ if (!m_file.exists())
+ return;
+
+ QList<QNetworkCookie> cookies;
+
+ if (m_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QTextStream in(&m_file);
+ while (!in.atEnd())
+ cookies.append(QNetworkCookie::parseCookies(in.readLine().toUtf8()));
+ m_file.close();
+ } else
+ qWarning("IO error handling cookiejar file");
+
+ setAllCookies(cookies);
+}
+
+void TestBrowserCookieJar::reset()
+{
+ setAllCookies(QList<QNetworkCookie>());
+ if (m_storageEnabled)
+ scheduleSaveToDisk();
+}
Added: trunk/Tools/QtTestBrowser/cookiejar.h (0 => 92478)
--- trunk/Tools/QtTestBrowser/cookiejar.h (rev 0)
+++ trunk/Tools/QtTestBrowser/cookiejar.h 2011-08-05 14:03:41 UTC (rev 92478)
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef cookiejar_h
+#define cookiejar_h
+
+#include <QFile>
+#include <QNetworkCookieJar>
+#include <QTimer>
+
+class TestBrowserCookieJar : public QNetworkCookieJar {
+ Q_OBJECT
+
+public:
+ TestBrowserCookieJar(QObject* parent = 0);
+ virtual ~TestBrowserCookieJar();
+
+ virtual bool setCookiesFromUrl(const QList<QNetworkCookie>&, const QUrl&);
+
+ void setDiskStorageEnabled(bool);
+
+public slots:
+ void scheduleSaveToDisk();
+ void loadFromDisk();
+ void reset();
+
+private slots:
+ void saveToDisk();
+
+private:
+ void extractRawCookies();
+
+ QList<QByteArray> m_rawCookies;
+ bool m_storageEnabled;
+ QFile m_file;
+ QTimer m_timer;
+};
+
+#endif
Modified: trunk/Tools/QtTestBrowser/launcherwindow.cpp (92477 => 92478)
--- trunk/Tools/QtTestBrowser/launcherwindow.cpp 2011-08-05 13:45:21 UTC (rev 92477)
+++ trunk/Tools/QtTestBrowser/launcherwindow.cpp 2011-08-05 14:03:41 UTC (rev 92478)
@@ -33,8 +33,11 @@
*/
#include "launcherwindow.h"
+#include "cookiejar.h"
#include "urlloader.h"
+#include <QCoreApplication>
+
#if !defined(QT_NO_FILEDIALOG) && !defined(QT_NO_MESSAGEBOX)
#include <QFileDialog>
#include <QFileInfo>
@@ -50,6 +53,12 @@
const int gExitClickArea = 80;
QVector<int> LauncherWindow::m_zoomLevels;
+static TestBrowserCookieJar* testBrowserCookieJarInstance()
+{
+ static TestBrowserCookieJar* cookieJar = new TestBrowserCookieJar(qApp);
+ return cookieJar;
+}
+
LauncherWindow::LauncherWindow(WindowOptions* data, QGraphicsScene* sharedScene)
: MainWindow()
, m_currentZoom(100)
@@ -121,7 +130,13 @@
QUrl url = ""
setPage(new WebPage(this));
setDiskCache(m_windowOptions.useDiskCache);
+ setUseDiskCookies(m_windowOptions.useDiskCookies);
+ // We reuse the same cookieJar on multiple QNAMs, which is OK.
+ QObject* cookieJarParent = testBrowserCookieJarInstance()->parent();
+ page()->networkAccessManager()->setCookieJar(testBrowserCookieJarInstance());
+ testBrowserCookieJarInstance()->setParent(cookieJarParent);
+
QSplitter* splitter = static_cast<QSplitter*>(centralWidget());
if (!m_windowOptions.useGraphicsView) {
@@ -226,6 +241,8 @@
QAction* setEditable = editMenu->addAction("Set Editable", this, SLOT(setEditable(bool)));
setEditable->setCheckable(true);
+ editMenu->addAction("Clear Cookies", this, SLOT(clearCookies()));
+
QMenu* viewMenu = menuBar()->addMenu("&View");
viewMenu->addAction(page()->action(QWebPage::Stop));
viewMenu->addAction(page()->action(QWebPage::Reload));
@@ -439,6 +456,11 @@
QAction* toggleJavascriptCanOpenWindows = settingsMenu->addAction("Enable js popup windows", this, SLOT(toggleJavascriptCanOpenWindows(bool)));
toggleJavascriptCanOpenWindows->setCheckable(true);
toggleJavascriptCanOpenWindows->setChecked(false);
+
+ QAction* toggleUseDiskCookies = settingsMenu->addAction("Save Cookies on Disk", this, SLOT(setUseDiskCookies(bool)));
+ toggleUseDiskCookies->setCheckable(true);
+ toggleUseDiskCookies->setChecked(m_windowOptions.useDiskCookies);
+
#ifndef QT_NO_LINEEDIT
m_findBar = new QToolBar("Find", this);
addToolBar(Qt::BottomToolBarArea, m_findBar);
@@ -885,6 +907,16 @@
page()->settings()->setAttribute(QWebSettings::_javascript_CanOpenWindows, enable);
}
+void LauncherWindow::setUseDiskCookies(bool enable)
+{
+ testBrowserCookieJarInstance()->setDiskStorageEnabled(enable);
+}
+
+void LauncherWindow::clearCookies()
+{
+ testBrowserCookieJarInstance()->reset();
+}
+
void LauncherWindow::toggleAutoLoadImages(bool enable)
{
page()->settings()->setAttribute(QWebSettings::AutoLoadImages, !enable);
Modified: trunk/Tools/QtTestBrowser/launcherwindow.h (92477 => 92478)
--- trunk/Tools/QtTestBrowser/launcherwindow.h 2011-08-05 13:45:21 UTC (rev 92477)
+++ trunk/Tools/QtTestBrowser/launcherwindow.h 2011-08-05 14:03:41 UTC (rev 92478)
@@ -97,6 +97,7 @@
, useLocalStorage(false)
, useOfflineStorageDatabase(false)
, useOfflineWebApplicationCache(false)
+ , useDiskCookies(true)
, offlineStorageDefaultQuotaSize(0)
#if defined(QT_CONFIGURED_WITH_OPENGL)
, useQGLWidgetViewport(false)
@@ -126,6 +127,7 @@
bool useLocalStorage;
bool useOfflineStorageDatabase;
bool useOfflineWebApplicationCache;
+ bool useDiskCookies;
quint64 offlineStorageDefaultQuotaSize;
#if defined(QT_CONFIGURED_WITH_OPENGL)
bool useQGLWidgetViewport;
@@ -188,6 +190,8 @@
void toggleInterruptingJavaScriptEnabled(bool enable);
void toggleJavascriptCanOpenWindows(bool enable);
void toggleAutoLoadImages(bool enable);
+ void setUseDiskCookies(bool enable);
+ void clearCookies();
void togglePlugins(bool enable);
void toggleLocalStorage(bool toggle);
void toggleOfflineStorageDatabase(bool toggle);
Modified: trunk/Tools/QtTestBrowser/main.cpp (92477 => 92478)
--- trunk/Tools/QtTestBrowser/main.cpp 2011-08-05 13:45:21 UTC (rev 92477)
+++ trunk/Tools/QtTestBrowser/main.cpp 2011-08-05 14:03:41 UTC (rev 92478)
@@ -195,6 +195,7 @@
<< "[-tiled-backing-store]"
<< "[-resizes-to-contents]"
<< "[-local-storage-enabled]"
+ << "[-no-disk-cookies]"
<< "[-offline-storage-database-enabled]"
<< "[-offline-web-application-cache-enabled]"
<< "[-set-offline-storage-default-quota maxSize]"
@@ -245,7 +246,10 @@
if (args.contains("-local-storage-enabled"))
windowOptions.useLocalStorage = true;
-
+
+ if (args.contains("-no-disk-cookies"))
+ windowOptions.useDiskCookies = false;
+
if (args.contains("-maximize"))
windowOptions.startMaximized = true;