Title: [92478] trunk/Tools
Revision
92478
Author
[email protected]
Date
2011-08-05 07:03:41 -0700 (Fri, 05 Aug 2011)

Log Message

[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:

Modified Paths

Added Paths

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;
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to