Fix signal_cache init, more debugging.
This commit is contained in:
parent
fecfc86bc0
commit
094640b39b
32
qutebrowser/utils/misc.py
Normal file
32
qutebrowser/utils/misc.py
Normal 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)))
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user