Fix signal_cache init, more debugging.

This commit is contained in:
Florian Bruhin 2014-02-10 17:54:24 +01:00
parent fecfc86bc0
commit 094640b39b
2 changed files with 60 additions and 14 deletions

32
qutebrowser/utils/misc.py Normal file
View File

@ -0,0 +1,32 @@
"""Other utilities which don't fit anywhere else."""
# Copyright 2014 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# This file is part of qutebrowser.
#
# qutebrowser is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# qutebrowser is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
import re
def dbg_signal(sig, args):
"""Return a string representation of a signal for debugging.
sig -- A pyqtSignal.
args -- The arguments as list of strings.
"""
m = re.match(r'[0-9]+(.*)\(.*\)', sig.signal)
signame = m.group(1)
return '{}({})'.format(signame, ', '.join(map(str, args)))

View File

@ -36,6 +36,7 @@ import qutebrowser.utils.about as about
import qutebrowser.utils.config as config import qutebrowser.utils.config as config
import qutebrowser.utils.url as urlutils import qutebrowser.utils.url as urlutils
from qutebrowser.widgets.tabbar import TabWidget from qutebrowser.widgets.tabbar import TabWidget
from qutebrowser.utils.misc import dbg_signal
class TabbedBrowser(TabWidget): class TabbedBrowser(TabWidget):
@ -87,8 +88,7 @@ class TabbedBrowser(TabWidget):
self.setCurrentWidget(tab) self.setCurrentWidget(tab)
tab.loadProgress.connect(self._filter_factory(self.cur_progress)) tab.loadProgress.connect(self._filter_factory(self.cur_progress))
tab.loadFinished.connect(self._filter_factory(self.cur_load_finished)) tab.loadFinished.connect(self._filter_factory(self.cur_load_finished))
tab.loadStarted.connect(lambda: # pylint: disable=unnecessary-lambda tab.loadStarted.connect(self._clear_signal_cache)
self.sender().signal_cache.clear())
tab.loadStarted.connect(self._filter_factory(self.cur_load_started)) tab.loadStarted.connect(self._filter_factory(self.cur_load_started))
tab.statusBarMessage.connect( tab.statusBarMessage.connect(
self._filter_factory(self.cur_statusbar_message)) self._filter_factory(self.cur_statusbar_message))
@ -397,26 +397,32 @@ class TabbedBrowser(TabWidget):
# - While loading, open another tab # - While loading, open another tab
# - Switch back to #1 when loading finished # - Switch back to #1 when loading finished
# - It seems loadingStarted is before loadingFinished # - It seems loadingStarted is before loadingFinished
dbgstr = "{} ({})".format(
signal.signal, ','.join(str(e) for e in args))
sender = self.sender() sender = self.sender()
log_signal = not signal.signal.startswith('2cur_progress')
if log_signal:
logging.debug('signal {} (tab {})'.format(dbg_signal(signal, args),
self.indexOf(sender)))
if not isinstance(sender, BrowserTab): if not isinstance(sender, BrowserTab):
# FIXME why does this happen? # FIXME why does this happen?
logging.warn('Got signal "{}" by {} which is no tab!'.format( logging.warn('Got signal {} by {} which is no tab!'.format(
dbgstr, sender)) dbg_signal(signal, args), sender))
return return
if signal.signal in sender.signal_cache: if signal.signal in sender.signal_cache:
if log_signal:
logging.debug(" Moving to the end of signal cache")
sender.signal_cache[signal.signal] = (signal, args) sender.signal_cache[signal.signal] = (signal, args)
sender.signal_cache.move_to_end(signal.signal) sender.signal_cache.move_to_end(signal.signal)
else: else:
if log_signal:
logging.debug(" Adding to signal cache")
sender.signal_cache[signal.signal] = (signal, args) sender.signal_cache[signal.signal] = (signal, args)
if self.currentWidget() == sender: if self.currentWidget() == sender:
if not signal.signal.startswith('2cur_progress'): if log_signal:
logging.debug('{} - emitting'.format(dbgstr)) logging.debug(' emitting')
return signal.emit(*args) return signal.emit(*args)
else: else:
if not signal.signal.startswith('2cur_progress'): if log_signal:
logging.debug('{} - ignoring'.format(dbgstr)) logging.debug(' ignoring')
def _currentChanged_handler(self, idx): def _currentChanged_handler(self, idx):
"""Update status bar values when a tab was changed. """Update status bar values when a tab was changed.
@ -426,11 +432,18 @@ class TabbedBrowser(TabWidget):
Slot for the currentChanged signal. Slot for the currentChanged signal.
""" """
for (sigstr, (signal, args)) in self.widget(idx).signal_cache.items(): for (signal, args) in self.widget(idx).signal_cache.values():
dbgstr = "{} ({})".format(sigstr, ','.join(str(e) for e in args)) logging.debug('signal cache: emitting {} for tab {}'.format(
logging.debug('signal cache: emitting {}'.format(dbgstr)) dbg_signal(signal, args), idx))
signal.emit(*args) signal.emit(*args)
def _clear_signal_cache(self):
"""Clear the signal cache of the sender of the signal."""
sender = self.sender()
logging.debug("Clearing signal cache of tab {}".format(self.indexOf(
sender)))
sender.signal_cache.clear()
class BrowserTab(QWebView): class BrowserTab(QWebView):
@ -446,10 +459,11 @@ class BrowserTab(QWebView):
_scroll_pos = (-1, -1) _scroll_pos = (-1, -1)
_open_new_tab = False # open new tab for the next action _open_new_tab = False # open new tab for the next action
# dict of tab specific signals, and the values we last got from them. # dict of tab specific signals, and the values we last got from them.
signal_cache = OrderedDict() signal_cache = None
def __init__(self, parent): def __init__(self, parent):
super().__init__(parent) super().__init__(parent)
self.signal_cache = OrderedDict()
self.loadProgress.connect(self.set_progress) self.loadProgress.connect(self.set_progress)
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
self.installEventFilter(self) self.installEventFilter(self)