From fcc0d8e911d5a543648f90d2bb7cbfac9a8b0690 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 25 Jun 2014 20:18:00 +0200 Subject: [PATCH] Better workaround for hang-with-warnings bug --- qutebrowser/network/networkmanager.py | 19 +++++-------------- qutebrowser/utils/log.py | 9 +++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/qutebrowser/network/networkmanager.py b/qutebrowser/network/networkmanager.py index d11bae445..8afdccc12 100644 --- a/qutebrowser/network/networkmanager.py +++ b/qutebrowser/network/networkmanager.py @@ -146,27 +146,18 @@ class NetworkManager(QNetworkAccessManager): if accept_language is not None: req.setRawHeader('Accept-Language'.encode('ascii'), accept_language.encode('ascii')) - if (op == QNetworkAccessManager.PostOperation and - not req.header(QNetworkRequest.ContentTypeHeader)): - # If we don't do this workaround, we get a freeze on + with log.disable_qt_msghandler(): + # If we don't disable our message handler, we get a freeze on # http://ch.mouser.com/localsites/ when clicking on a currency. - # We basically do the same thing as Qt would do by itself in - # src/network/access/qhttpnetworkrequest.cpp -> - # QHttpNetworkRequestPrivate::header but somehow it doesn't - # freeze when we do it here. # # FIXME: Open questions: # # - Shouldn't QtWebPage set the content-type correctly by # itself? # - # - Why does Qt freeze if we don't do that? Why doesn't it - # happen with the minimal browser? It should really only - # print a warning and nothing else... Maybe message - # handler?! - req.setHeader(QNetworkRequest.ContentTypeHeader, - 'application/x-www-form-urlencoded') - reply = super().createRequest(op, req, outgoing_data) + # - Why does Qt freeze if we don't disable our message + # handler? + reply = super().createRequest(op, req, outgoing_data) self._requests.append(reply) reply.destroyed.connect(lambda obj: self._requests.remove(obj)) return reply diff --git a/qutebrowser/utils/log.py b/qutebrowser/utils/log.py index 41738397c..462bf58c0 100644 --- a/qutebrowser/utils/log.py +++ b/qutebrowser/utils/log.py @@ -24,6 +24,7 @@ import os import sys import cgi import logging +from contextlib import contextmanager from logging import getLogger from collections import deque @@ -114,6 +115,14 @@ def init_log(args): qInstallMessageHandler(qt_message_handler) +@contextmanager +def disable_qt_msghandler(): + """Contextmanager which temporarely disables the Qt message handler.""" + old_handler = qInstallMessageHandler(None) + yield + qInstallMessageHandler(old_handler) + + def fix_rfc2622(): """Fix the rfc6266 logger.