Merge remote-tracking branch 'origin/pr/3825'
This commit is contained in:
commit
c4add62301
@ -22,6 +22,7 @@
|
|||||||
import collections
|
import collections
|
||||||
import functools
|
import functools
|
||||||
import math
|
import math
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import html
|
import html
|
||||||
import enum
|
import enum
|
||||||
@ -154,6 +155,7 @@ class HintContext:
|
|||||||
to_follow: The link to follow when enter is pressed.
|
to_follow: The link to follow when enter is pressed.
|
||||||
args: Custom arguments for userscript/spawn
|
args: Custom arguments for userscript/spawn
|
||||||
rapid: Whether to do rapid hinting.
|
rapid: Whether to do rapid hinting.
|
||||||
|
first_run: Whether the action is run for the 1st time in rapid hinting.
|
||||||
add_history: Whether to add yanked or spawned link to the history.
|
add_history: Whether to add yanked or spawned link to the history.
|
||||||
filterstr: Used to save the filter string for restoring in rapid mode.
|
filterstr: Used to save the filter string for restoring in rapid mode.
|
||||||
tab: The WebTab object we started hinting in.
|
tab: The WebTab object we started hinting in.
|
||||||
@ -166,6 +168,7 @@ class HintContext:
|
|||||||
baseurl = attr.ib(None)
|
baseurl = attr.ib(None)
|
||||||
to_follow = attr.ib(None)
|
to_follow = attr.ib(None)
|
||||||
rapid = attr.ib(False)
|
rapid = attr.ib(False)
|
||||||
|
first_run = attr.ib(True)
|
||||||
add_history = attr.ib(False)
|
add_history = attr.ib(False)
|
||||||
filterstr = attr.ib(None)
|
filterstr = attr.ib(None)
|
||||||
args = attr.ib(attr.Factory(list))
|
args = attr.ib(attr.Factory(list))
|
||||||
@ -241,7 +244,18 @@ class HintActions:
|
|||||||
if url.scheme() == 'mailto':
|
if url.scheme() == 'mailto':
|
||||||
flags |= QUrl.RemoveScheme
|
flags |= QUrl.RemoveScheme
|
||||||
urlstr = url.toString(flags)
|
urlstr = url.toString(flags)
|
||||||
utils.set_clipboard(urlstr, selection=sel)
|
|
||||||
|
new_content = urlstr
|
||||||
|
|
||||||
|
# only second and consecutive yanks are to append to the clipboard
|
||||||
|
if context.rapid and not context.first_run:
|
||||||
|
try:
|
||||||
|
old_content = utils.get_clipboard(selection=sel)
|
||||||
|
except utils.ClipboardEmptyError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
new_content = os.linesep.join([old_content, new_content])
|
||||||
|
utils.set_clipboard(new_content, selection=sel)
|
||||||
|
|
||||||
msg = "Yanked URL to {}: {}".format(
|
msg = "Yanked URL to {}: {}".format(
|
||||||
"primary selection" if sel else "clipboard",
|
"primary selection" if sel else "clipboard",
|
||||||
@ -700,7 +714,8 @@ class HintManager(QObject):
|
|||||||
if rapid:
|
if rapid:
|
||||||
if target in [Target.tab_bg, Target.window, Target.run,
|
if target in [Target.tab_bg, Target.window, Target.run,
|
||||||
Target.hover, Target.userscript, Target.spawn,
|
Target.hover, Target.userscript, Target.spawn,
|
||||||
Target.download, Target.normal, Target.current]:
|
Target.download, Target.normal, Target.current,
|
||||||
|
Target.yank, Target.yank_primary]:
|
||||||
pass
|
pass
|
||||||
elif target == Target.tab and config.val.tabs.background:
|
elif target == Target.tab and config.val.tabs.background:
|
||||||
pass
|
pass
|
||||||
@ -914,6 +929,9 @@ class HintManager(QObject):
|
|||||||
except HintingError as e:
|
except HintingError as e:
|
||||||
message.error(str(e))
|
message.error(str(e))
|
||||||
|
|
||||||
|
if self._context is not None:
|
||||||
|
self._context.first_run = False
|
||||||
|
|
||||||
@cmdutils.register(instance='hintmanager', scope='tab',
|
@cmdutils.register(instance='hintmanager', scope='tab',
|
||||||
modes=[usertypes.KeyMode.hint])
|
modes=[usertypes.KeyMode.hint])
|
||||||
def follow_hint(self, select=False, keystring=None):
|
def follow_hint(self, select=False, keystring=None):
|
||||||
|
@ -510,11 +510,13 @@ def sanitize_filename(name, replacement='_'):
|
|||||||
|
|
||||||
def set_clipboard(data, selection=False):
|
def set_clipboard(data, selection=False):
|
||||||
"""Set the clipboard to some given data."""
|
"""Set the clipboard to some given data."""
|
||||||
|
global fake_clipboard
|
||||||
if selection and not supports_selection():
|
if selection and not supports_selection():
|
||||||
raise SelectionUnsupportedError
|
raise SelectionUnsupportedError
|
||||||
if log_clipboard:
|
if log_clipboard:
|
||||||
what = 'primary selection' if selection else 'clipboard'
|
what = 'primary selection' if selection else 'clipboard'
|
||||||
log.misc.debug("Setting fake {}: {}".format(what, json.dumps(data)))
|
log.misc.debug("Setting fake {}: {}".format(what, json.dumps(data)))
|
||||||
|
fake_clipboard = data
|
||||||
else:
|
else:
|
||||||
mode = QClipboard.Selection if selection else QClipboard.Clipboard
|
mode = QClipboard.Selection if selection else QClipboard.Clipboard
|
||||||
QApplication.clipboard().setText(data, mode=mode)
|
QApplication.clipboard().setText(data, mode=mode)
|
||||||
|
@ -600,6 +600,7 @@ def check_open_tabs(quteproc, request, tabs):
|
|||||||
def clipboard_contains(quteproc, server, what, content):
|
def clipboard_contains(quteproc, server, what, content):
|
||||||
expected = content.replace('(port)', str(server.port))
|
expected = content.replace('(port)', str(server.port))
|
||||||
expected = expected.replace('\\n', '\n')
|
expected = expected.replace('\\n', '\n')
|
||||||
|
expected = expected.replace('(linesep)', os.linesep)
|
||||||
quteproc.wait_for(message='Setting fake {}: {}'.format(
|
quteproc.wait_for(message='Setting fake {}: {}'.format(
|
||||||
what, json.dumps(expected)))
|
what, json.dumps(expected)))
|
||||||
|
|
||||||
|
@ -120,6 +120,15 @@ Feature: Using hints
|
|||||||
And I hint with args "links yank" and follow a
|
And I hint with args "links yank" and follow a
|
||||||
Then the clipboard should contain "javascript:window.location.href='/data/hello.txt'"
|
Then the clipboard should contain "javascript:window.location.href='/data/hello.txt'"
|
||||||
|
|
||||||
|
Scenario: Rapid yanking
|
||||||
|
When I run :debug-set-fake-clipboard
|
||||||
|
And I open data/hints/rapid.html
|
||||||
|
And I hint with args "links yank --rapid"
|
||||||
|
And I run :follow-hint a
|
||||||
|
And I run :follow-hint s
|
||||||
|
And I run :leave-mode
|
||||||
|
Then the clipboard should contain "http://localhost:(port)/data/hello.txt(linesep)http://localhost:(port)/data/hello2.txt"
|
||||||
|
|
||||||
Scenario: Rapid hinting
|
Scenario: Rapid hinting
|
||||||
When I open data/hints/rapid.html in a new tab
|
When I open data/hints/rapid.html in a new tab
|
||||||
And I run :tab-only
|
And I run :tab-only
|
||||||
|
@ -651,6 +651,7 @@ class TestGetSetClipboard:
|
|||||||
autospec=True)
|
autospec=True)
|
||||||
clipboard = m()
|
clipboard = m()
|
||||||
clipboard.text.return_value = 'mocked clipboard text'
|
clipboard.text.return_value = 'mocked clipboard text'
|
||||||
|
mocker.patch('qutebrowser.utils.utils.fake_clipboard', None)
|
||||||
return clipboard
|
return clipboard
|
||||||
|
|
||||||
def test_set(self, clipboard_mock, caplog):
|
def test_set(self, clipboard_mock, caplog):
|
||||||
|
Loading…
Reference in New Issue
Block a user