Merge branch 'shift_ins' of https://github.com/lahwaacz/qutebrowser into lahwaacz-shift_ins
This commit is contained in:
commit
44625b254c
@ -1307,6 +1307,31 @@ class CommandDispatcher:
|
|||||||
except webelem.IsNullError:
|
except webelem.IsNullError:
|
||||||
raise cmdexc.CommandError("Element vanished while editing!")
|
raise cmdexc.CommandError("Element vanished while editing!")
|
||||||
|
|
||||||
|
@cmdutils.register(instance='command-dispatcher',
|
||||||
|
modes=[KeyMode.insert], hide=True, scope='window',
|
||||||
|
needs_js=True)
|
||||||
|
def paste_primary(self):
|
||||||
|
"""Paste the primary selection at cursor position."""
|
||||||
|
frame = self._current_widget().page().currentFrame()
|
||||||
|
try:
|
||||||
|
elem = webelem.focus_elem(frame)
|
||||||
|
except webelem.IsNullError:
|
||||||
|
raise cmdexc.CommandError("No element focused!")
|
||||||
|
if not elem.is_editable(strict=True):
|
||||||
|
raise cmdexc.CommandError("Focused element is not editable!")
|
||||||
|
|
||||||
|
clipboard = QApplication.clipboard()
|
||||||
|
if clipboard.supportsSelection():
|
||||||
|
sel = clipboard.text(QClipboard.Selection)
|
||||||
|
log.misc.debug("Pasting primary selection into element {}".format(
|
||||||
|
elem.debug_text()))
|
||||||
|
elem.evaluateJavaScript("""
|
||||||
|
var sel = '{}';
|
||||||
|
var event = document.createEvent('TextEvent');
|
||||||
|
event.initTextEvent('textInput', true, true, null, sel);
|
||||||
|
this.dispatchEvent(event);
|
||||||
|
""".format(webelem.javascript_escape(sel)))
|
||||||
|
|
||||||
def _clear_search(self, view, text):
|
def _clear_search(self, view, text):
|
||||||
"""Clear search string/highlights for the given view.
|
"""Clear search string/highlights for the given view.
|
||||||
|
|
||||||
|
@ -1324,7 +1324,8 @@ KEY_SECTION_DESC = {
|
|||||||
"Since normal keypresses are passed through, only special keys are "
|
"Since normal keypresses are passed through, only special keys are "
|
||||||
"supported in this mode.\n"
|
"supported in this mode.\n"
|
||||||
"Useful hidden commands to map in this section:\n\n"
|
"Useful hidden commands to map in this section:\n\n"
|
||||||
" * `open-editor`: Open a texteditor with the focused field."),
|
" * `open-editor`: Open a texteditor with the focused field.\n"
|
||||||
|
" * `paste-primary`: Paste primary selection at cursor position."),
|
||||||
'hint': (
|
'hint': (
|
||||||
"Keybindings for hint mode.\n"
|
"Keybindings for hint mode.\n"
|
||||||
"Since normal keypresses are passed through, only special keys are "
|
"Since normal keypresses are passed through, only special keys are "
|
||||||
@ -1495,6 +1496,7 @@ KEY_DATA = collections.OrderedDict([
|
|||||||
|
|
||||||
('insert', collections.OrderedDict([
|
('insert', collections.OrderedDict([
|
||||||
('open-editor', ['<Ctrl-E>']),
|
('open-editor', ['<Ctrl-E>']),
|
||||||
|
('paste-primary', ['<Shift-Ins>']),
|
||||||
])),
|
])),
|
||||||
|
|
||||||
('hint', collections.OrderedDict([
|
('hint', collections.OrderedDict([
|
||||||
|
10
tests/integration/data/paste_primary.html
Normal file
10
tests/integration/data/paste_primary.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Paste primary selection</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<textarea id="qute-textarea"></textarea>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -170,3 +170,49 @@ Feature: Yanking and pasting.
|
|||||||
history:
|
history:
|
||||||
- active: true
|
- active: true
|
||||||
url: http://localhost:*/data/hello3.txt
|
url: http://localhost:*/data/hello3.txt
|
||||||
|
|
||||||
|
Scenario: Pasting the primary selection into an empty text field
|
||||||
|
When selection is supported
|
||||||
|
And I open data/paste_primary.html
|
||||||
|
And I put "Hello world" into the primary selection
|
||||||
|
# Click the text field
|
||||||
|
And I run :hint all
|
||||||
|
And I run :follow-hint a
|
||||||
|
And I run :paste-primary
|
||||||
|
# Compare
|
||||||
|
And I run :jseval console.log(document.getElementById('qute-textarea').value);
|
||||||
|
Then the javascript message "Hello world" should be logged
|
||||||
|
|
||||||
|
Scenario: Pasting the primary selection into a text field at specific position
|
||||||
|
When selection is supported
|
||||||
|
And I open data/paste_primary.html
|
||||||
|
And I run :jseval document.getElementById('qute-textarea').value = 'one two three four';
|
||||||
|
And I put " Hello world" into the primary selection
|
||||||
|
# Click the text field
|
||||||
|
And I run :hint all
|
||||||
|
And I run :follow-hint a
|
||||||
|
# Move to the beginning and two words to the right
|
||||||
|
And I press the keys "<Home>"
|
||||||
|
And I press the key "<Ctrl+Right>"
|
||||||
|
And I press the key "<Ctrl+Right>"
|
||||||
|
And I run :paste-primary
|
||||||
|
# Compare
|
||||||
|
And I run :jseval console.log(document.getElementById('qute-textarea').value);
|
||||||
|
Then the javascript message "one two Hello world three four" should be logged
|
||||||
|
|
||||||
|
Scenario: Pasting the primary selection into a text field with undo
|
||||||
|
When selection is supported
|
||||||
|
And I open data/paste_primary.html
|
||||||
|
# Click the text field
|
||||||
|
And I run :hint all
|
||||||
|
And I run :follow-hint a
|
||||||
|
# Paste and undo
|
||||||
|
And I put "This text should be undone" into the primary selection
|
||||||
|
And I run :paste-primary
|
||||||
|
And I press the key "<Ctrl+z>"
|
||||||
|
# Paste final text
|
||||||
|
And I put "This text should stay" into the primary selection
|
||||||
|
And I run :paste-primary
|
||||||
|
# Compare
|
||||||
|
And I run :jseval console.log(document.getElementById('qute-textarea').value);
|
||||||
|
Then the javascript message "This text should stay" should be logged
|
||||||
|
Loading…
Reference in New Issue
Block a user