Merge remote-tracking branch 'origin/pr/3906'

This commit is contained in:
Florian Bruhin 2018-06-14 14:49:30 +02:00
commit cec63ea449
5 changed files with 95 additions and 5 deletions

View File

@ -22,7 +22,7 @@
from PyQt5.QtCore import QObject, QEvent, Qt, QTimer from PyQt5.QtCore import QObject, QEvent, Qt, QTimer
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import message, log, usertypes, qtutils from qutebrowser.utils import message, log, usertypes, qtutils, objreg
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
@ -40,11 +40,12 @@ class ChildEventFilter(QObject):
_widget: The widget expected to send out childEvents. _widget: The widget expected to send out childEvents.
""" """
def __init__(self, eventfilter, widget, parent=None): def __init__(self, eventfilter, widget, win_id, parent=None):
super().__init__(parent) super().__init__(parent)
self._filter = eventfilter self._filter = eventfilter
assert widget is not None assert widget is not None
self._widget = widget self._widget = widget
self._win_id = win_id
def eventFilter(self, obj, event): def eventFilter(self, obj, event):
"""Act on ChildAdded events.""" """Act on ChildAdded events."""
@ -57,7 +58,22 @@ class ChildEventFilter(QObject):
if qtutils.version_check('5.11', compiled=False, exact=True): if qtutils.version_check('5.11', compiled=False, exact=True):
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68076 # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68076
pass_modes = [usertypes.KeyMode.command,
usertypes.KeyMode.prompt,
usertypes.KeyMode.yesno]
if modeman.instance(self._win_id).mode not in pass_modes:
tabbed_browser = objreg.get('tabbed-browser',
scope='window',
window=self._win_id)
current_index = tabbed_browser.widget.currentIndex()
try:
widget_index = tabbed_browser.widget.indexOf(
self._widget.parent())
except RuntimeError:
widget_index = -1
if current_index == widget_index:
QTimer.singleShot(0, self._widget.setFocus) QTimer.singleShot(0, self._widget.setFocus)
elif event.type() == QEvent.ChildRemoved: elif event.type() == QEvent.ChildRemoved:
child = event.child() child = event.child()
log.mouse.debug("{}: removed child {}".format(obj, child)) log.mouse.debug("{}: removed child {}".format(obj, child))

View File

@ -959,7 +959,7 @@ class WebEngineTab(browsertab.AbstractTab):
fp.installEventFilter(self._mouse_event_filter) fp.installEventFilter(self._mouse_event_filter)
self._child_event_filter = mouse.ChildEventFilter( self._child_event_filter = mouse.ChildEventFilter(
eventfilter=self._mouse_event_filter, widget=self._widget, eventfilter=self._mouse_event_filter, widget=self._widget,
parent=self) win_id=self.win_id, parent=self)
self._widget.installEventFilter(self._child_event_filter) self._widget.installEventFilter(self._child_event_filter)
@pyqtSlot() @pyqtSlot()

View File

@ -22,7 +22,7 @@
import functools import functools
import attr import attr
from PyQt5.QtWidgets import QSizePolicy, QWidget from PyQt5.QtWidgets import QSizePolicy, QWidget, QApplication
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QTimer, QUrl from PyQt5.QtCore import pyqtSignal, pyqtSlot, QTimer, QUrl
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
@ -462,6 +462,8 @@ class TabbedBrowser(QWidget):
"related {}, idx {}".format( "related {}, idx {}".format(
url, background, related, idx)) url, background, related, idx))
prev_focus = QApplication.focusWidget()
if (config.val.tabs.tabs_are_windows and self.widget.count() > 0 and if (config.val.tabs.tabs_are_windows and self.widget.count() > 0 and
not ignore_tabs_are_windows): not ignore_tabs_are_windows):
window = mainwindow.MainWindow(private=self.private) window = mainwindow.MainWindow(private=self.private)
@ -491,12 +493,21 @@ class TabbedBrowser(QWidget):
tab.resize(self.widget.currentWidget().size()) tab.resize(self.widget.currentWidget().size())
self.widget.tab_index_changed.emit(self.widget.currentIndex(), self.widget.tab_index_changed.emit(self.widget.currentIndex(),
self.widget.count()) self.widget.count())
# Refocus webview in case we lost it by spawning a bg tab
self.widget.currentWidget().setFocus()
else: else:
self.widget.setCurrentWidget(tab) self.widget.setCurrentWidget(tab)
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68076 # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68076
# Still seems to be needed with Qt 5.11.1 # Still seems to be needed with Qt 5.11.1
tab.setFocus() tab.setFocus()
mode = modeman.instance(self._win_id).mode
if mode in [usertypes.KeyMode.command, usertypes.KeyMode.prompt,
usertypes.KeyMode.yesno]:
# If we were in a command prompt, restore old focus
# The above commands need to be run to switch tabs
prev_focus.setFocus()
tab.show() tab.show()
self.new_tab.emit(tab, idx) self.new_tab.emit(tab, idx)
return tab return tab

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Simple link and input</title>
<script type="text/javascript">
function setup_event_listener() {
var elem = document.getElementById('qute-input-existing');
console.log(elem);
elem.addEventListener('input', function() {
console.log("contents: " + elem.value);
});
}
</script>
</head>
<body onload="setup_event_listener()">
<a href="/data/hello.txt" id="link">Follow me!</a>
<form><input id="qute-input"></input></form>
With padding:
<form><input type="text" style="padding-left: 20px;"></input></form>
With existing text (logs to JS)::
<form><input id="qute-input-existing" value="existing"></input></form>
</body>
</html>

View File

@ -1250,3 +1250,41 @@ Feature: Tab management
Then the following tabs should be open: Then the following tabs should be open:
- data/numbers/1.txt - data/numbers/1.txt
- data/numbers/2.txt (pinned) (active) - data/numbers/2.txt (pinned) (active)
Scenario: Focused webview after clicking link in bg
When I open data/hints/link_input.html
And I run :click-element id qute-input-existing
And I wait for "Entering mode KeyMode.insert *" in the log
And I run :leave-mode
And I hint with args "all tab-bg" and follow a
And I wait until data/hello.txt is loaded
And I run :enter-mode insert
And I run :fake-key -g new
Then the javascript message "contents: existingnew" should be logged
Scenario: Focused webview after opening link in bg
When I open data/hints/link_input.html
And I run :click-element id qute-input-existing
And I wait for "Entering mode KeyMode.insert *" in the log
And I run :leave-mode
And I open data/hello.txt in a new background tab
And I run :enter-mode insert
And I run :fake-key -g new
Then the javascript message "contents: existingnew" should be logged
Scenario: Focused prompt after opening link in bg
When I open data/hints/link_input.html
When I run :set-cmd-text -s :message-info
And I open data/hello.txt in a new background tab
And I run :fake-key -g hello-world
And I run :command-accept
Then the message "hello-world" should be shown
Scenario: Focused prompt after opening link in fg
When I open data/hints/link_input.html
When I run :set-cmd-text -s :message-info
And I open data/hello.txt in a new tab
And I run :fake-key -g hello-world
And I run :command-accept
Then the message "hello-world" should be shown