From ae95b5ea3be2ce7863e6402c5cf2607ecf36e616 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 5 May 2014 16:28:43 +0200 Subject: [PATCH] Basic cookie handling --- TODO | 1 - qutebrowser/app.py | 8 ++++++++ qutebrowser/browser/webpage.py | 5 ++--- qutebrowser/config/_conftypes.py | 8 ++++++++ qutebrowser/config/config.py | 2 +- qutebrowser/config/configdata.py | 8 ++++++++ .../config/{_lineparser.py => lineparser.py} | 0 qutebrowser/network/networkmanager.py | 15 +++++++++++++++ qutebrowser/widgets/webview.py | 3 ++- 9 files changed, 44 insertions(+), 6 deletions(-) rename qutebrowser/config/{_lineparser.py => lineparser.py} (100%) diff --git a/TODO b/TODO index 7048c50f7..b773a2d10 100644 --- a/TODO +++ b/TODO @@ -26,7 +26,6 @@ Bookmarks Internationalization more completions (URLs, ...) SSL handling -cookie handling history Minor features diff --git a/qutebrowser/app.py b/qutebrowser/app.py index c231084ff..8b88f2cb2 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -28,6 +28,8 @@ from argparse import ArgumentParser from base64 import b64encode import qutebrowser.config.websettings as websettings +import qutebrowser.network.networkmanager as networkmanager +import qutebrowser.browser.cookies as cookies # Print a nice traceback on segfault -- only available on Python 3.3+, but if # it's unavailable, it doesn't matter much. @@ -126,6 +128,8 @@ class QuteBrowser(QApplication): sys.exit(1) self.config = config.instance websettings.init(self._dirs.user_cache_dir) + cookies.init(self._dirs.user_data_dir) + networkmanager.init(cookies.cookiejar) self.commandmanager = CommandManager() self.searchmanager = SearchManager() @@ -478,6 +482,10 @@ class QuteBrowser(QApplication): config.state.save() except AttributeError: logging.exception("Could not save window geometry.") + try: + cookies.cookiejar.save() + except AttributeError: + logging.exception("Could not save cookies.") try: if do_quit: self.mainwindow.tabs.shutdown_complete.connect( diff --git a/qutebrowser/browser/webpage.py b/qutebrowser/browser/webpage.py index 621a39ad9..dde8bdf08 100644 --- a/qutebrowser/browser/webpage.py +++ b/qutebrowser/browser/webpage.py @@ -23,7 +23,7 @@ from PyQt5.QtWebKitWidgets import QWebPage import qutebrowser.utils.url as urlutils import qutebrowser.config.config as config -from qutebrowser.network.networkmanager import NetworkManager +import qutebrowser.network.networkmanager as networkmanager from qutebrowser.utils.misc import read_file @@ -41,8 +41,7 @@ class BrowserPage(QWebPage): self._extension_handlers = { QWebPage.ErrorPageExtension: self._handle_errorpage, } - self.network_access_manager = NetworkManager(self) - self.setNetworkAccessManager(self.network_access_manager) + self.setNetworkAccessManager(networkmanager.networkmanager) def _handle_errorpage(self, opt, out): """Display an error page if needed. diff --git a/qutebrowser/config/_conftypes.py b/qutebrowser/config/_conftypes.py index ed361e588..7b6be09a1 100644 --- a/qutebrowser/config/_conftypes.py +++ b/qutebrowser/config/_conftypes.py @@ -742,6 +742,14 @@ class LastClose(String): ('quit', "Quit qutebrowser.")) +class AcceptCookies(String): + + """Whether to accept a cookie.""" + + valid_values = ValidValues(('default', "Default QtWebKit behaviour"), + ('never', "Don't accept cookies at all.")) + + class KeyBinding(Command): """The command of a keybinding.""" diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index ad0796b68..2ab3f51b4 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -43,7 +43,7 @@ import qutebrowser.utils.message as message from qutebrowser.config._conftypes import ValidationError from qutebrowser.config._iniparsers import (ReadConfigParser, ReadWriteConfigParser) -from qutebrowser.config._lineparser import LineConfigParser +from qutebrowser.config.lineparser import LineConfigParser instance = None state = None diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index 41f9c8e5a..328d0ba8c 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -209,6 +209,14 @@ DATA = OrderedDict([ ('user-agent', SettingValue(types.String(), ''), "User agent to send. Empty to send the default."), + + ('accept-cookies', + SettingValue(types.AcceptCookies(), 'default'), + "Whether to accept cookies."), + + ('store-cookies', + SettingValue(types.Bool(), 'false'), + "Whether to store cookies."), )), ('completion', sect.KeyValue( diff --git a/qutebrowser/config/_lineparser.py b/qutebrowser/config/lineparser.py similarity index 100% rename from qutebrowser/config/_lineparser.py rename to qutebrowser/config/lineparser.py diff --git a/qutebrowser/network/networkmanager.py b/qutebrowser/network/networkmanager.py index d041c7f78..b7b4556e5 100644 --- a/qutebrowser/network/networkmanager.py +++ b/qutebrowser/network/networkmanager.py @@ -23,6 +23,21 @@ import qutebrowser.config.config as config from qutebrowser.network.qutescheme import QuteSchemeHandler +networkmanager = None + + +def init(cookiejar): + """Initialize the global NetworkManager. + + Args: + cookiejar: The QCookieJar to use. + """ + global networkmanager + networkmanager = NetworkManager() + networkmanager.setCookieJar(cookiejar) + cookiejar.setParent(None) + + class NetworkManager(QNetworkAccessManager): """Our own QNetworkAccessManager. diff --git a/qutebrowser/widgets/webview.py b/qutebrowser/widgets/webview.py index b38a66de9..8adea96ba 100644 --- a/qutebrowser/widgets/webview.py +++ b/qutebrowser/widgets/webview.py @@ -30,6 +30,7 @@ import qutebrowser.config.config as config import qutebrowser.keyinput.modeman as modeman import qutebrowser.utils.message as message import qutebrowser.utils.webelem as webelem +import qutebrowser.network.networkmanager as networkmanager from qutebrowser.browser.webpage import BrowserPage from qutebrowser.browser.hints import HintManager from qutebrowser.utils.signals import SignalCache @@ -209,7 +210,7 @@ class WebView(QWebView): self.destroyed.connect(functools.partial(self._on_destroyed, self)) self.deleteLater() - netman = self.page_.network_access_manager + netman = networkmanager.networkmanager self._destroyed[netman] = False netman.abort_requests() netman.destroyed.connect(functools.partial(self._on_destroyed, netman))