190 lines
7.9 KiB
Gherkin
190 lines
7.9 KiB
Gherkin
Feature: Keyboard input
|
|
|
|
Tests for :clear-keychain and other keyboard input related things.
|
|
|
|
# :clear-keychain
|
|
|
|
Scenario: Clearing the keychain
|
|
When I run :bind ,foo message-error test12
|
|
And I run :bind ,bar message-info test12-2
|
|
And I press the keys ",fo"
|
|
And I run :clear-keychain
|
|
And I press the keys ",bar"
|
|
And I run :unbind ,foo
|
|
And I run :unbind ,bar
|
|
Then the message "test12-2" should be shown
|
|
|
|
# input.forward_unbound_keys
|
|
|
|
Scenario: Forwarding no keys
|
|
When I open data/keyinput/log.html
|
|
And I set input.forward_unbound_keys to none
|
|
And I press the key "<F1>"
|
|
# <F1>
|
|
Then the javascript message "key press: 112" should not be logged
|
|
And the javascript message "key release: 112" should not be logged
|
|
|
|
# :fake-key
|
|
|
|
Scenario: :fake-key with an unparsable key
|
|
When I run :fake-key <blub>
|
|
Then the error "Could not parse '<blub>': Got invalid key!" should be shown
|
|
|
|
Scenario: :fake-key sending key to the website
|
|
When I open data/keyinput/log.html
|
|
And I wait 0.01s
|
|
And I run :fake-key x
|
|
Then the javascript message "key press: 88" should be logged
|
|
And the javascript message "key release: 88" should be logged
|
|
|
|
@no_xvfb @posix @qtwebengine_skip
|
|
Scenario: :fake-key sending key to the website with other window focused
|
|
When I open data/keyinput/log.html
|
|
And I run :devtools
|
|
And I wait for "Focus object changed: <Py*.QtWebKitWidgets.QWebView object at *>" in the log
|
|
And I run :fake-key x
|
|
And I run :devtools
|
|
And I wait for "Focus object changed: <qutebrowser.browser.webkit.webview.WebView *>" in the log
|
|
Then the error "No focused webview!" should be shown
|
|
|
|
Scenario: :fake-key sending special key to the website
|
|
When I open data/keyinput/log.html
|
|
And I wait 0.01s
|
|
And I run :fake-key <Escape>
|
|
Then the javascript message "key press: 27" should be logged
|
|
And the javascript message "key release: 27" should be logged
|
|
|
|
Scenario: :fake-key sending keychain to the website
|
|
When I open data/keyinput/log.html
|
|
And I wait 0.01s
|
|
And I run :fake-key x<greater>y<less>" "
|
|
Then the javascript message "key press: 88" should be logged
|
|
And the javascript message "key release: 88" should be logged
|
|
And the javascript message "key press: 190" should be logged
|
|
And the javascript message "key release: 190" should be logged
|
|
And the javascript message "key press: 89" should be logged
|
|
And the javascript message "key release: 89" should be logged
|
|
And the javascript message "key press: 188" should be logged
|
|
And the javascript message "key release: 188" should be logged
|
|
And the javascript message "key press: 32" should be logged
|
|
And the javascript message "key release: 32" should be logged
|
|
|
|
Scenario: :fake-key sending keypress to qutebrowser
|
|
When I run :fake-key -g x
|
|
And I wait for "got keypress in mode KeyMode.normal - delegating to <qutebrowser.keyinput.modeparsers.NormalKeyParser>" in the log
|
|
Then no crash should happen
|
|
|
|
# Macros
|
|
|
|
Scenario: Recording a simple macro
|
|
When I run :macro-record
|
|
And I press the key "a"
|
|
And I run :message-info "foo 1"
|
|
And I run :message-info "bar 1"
|
|
And I run :macro-record
|
|
And I run :macro-run with count 2
|
|
And I press the key "a"
|
|
Then the message "foo 1" should be shown
|
|
And the message "bar 1" should be shown
|
|
And the message "foo 1" should be shown
|
|
And the message "bar 1" should be shown
|
|
And the message "foo 1" should be shown
|
|
And the message "bar 1" should be shown
|
|
|
|
Scenario: Recording a named macro
|
|
When I run :macro-record foo
|
|
And I run :message-info "foo 2"
|
|
And I run :message-info "bar 2"
|
|
And I run :macro-record foo
|
|
And I run :macro-run foo
|
|
Then the message "foo 2" should be shown
|
|
And the message "bar 2" should be shown
|
|
And the message "foo 2" should be shown
|
|
And the message "bar 2" should be shown
|
|
|
|
Scenario: Running an invalid macro
|
|
Given I open data/scroll/simple.html
|
|
And I run :tab-only
|
|
When I run :macro-run
|
|
And I press the key "b"
|
|
Then the error "No macro recorded in 'b'!" should be shown
|
|
And no crash should happen
|
|
|
|
Scenario: Running an invalid named macro
|
|
Given I open data/scroll/simple.html
|
|
And I run :tab-only
|
|
When I run :macro-run bar
|
|
Then the error "No macro recorded in 'bar'!" should be shown
|
|
And no crash should happen
|
|
|
|
Scenario: Running a macro with a mode-switching command
|
|
When I open data/hints/html/simple.html
|
|
And I run :macro-record a
|
|
And I run :hint links normal
|
|
And I wait for "hints: *" in the log
|
|
And I run :mode-leave
|
|
And I run :macro-record a
|
|
And I run :macro-run
|
|
And I press the key "a"
|
|
And I wait for "hints: *" in the log
|
|
Then no crash should happen
|
|
|
|
Scenario: Cancelling key input
|
|
When I run :macro-record
|
|
And I press the key "<Escape>"
|
|
Then "Leaving mode KeyMode.record_macro (reason: leave current)" should be logged
|
|
|
|
Scenario: Ignoring non-register keys
|
|
When I run :macro-record
|
|
And I press the key "<Menu>"
|
|
And I press the key "c"
|
|
And I run :message-info "foo 3"
|
|
And I run :macro-record
|
|
And I run :macro-run
|
|
And I press the key "c"
|
|
Then the message "foo 3" should be shown
|
|
And the message "foo 3" should be shown
|
|
|
|
# test all tabs.mode_on_change modes
|
|
|
|
Scenario: mode on change normal
|
|
Given I set tabs.mode_on_change to normal
|
|
And I clean up open tabs
|
|
When I open data/hello.txt
|
|
And I run :mode-enter insert
|
|
And I wait for "Entering mode KeyMode.insert (reason: command)" in the log
|
|
And I open data/hello2.txt in a new background tab
|
|
And I run :tab-focus 2
|
|
Then "Leaving mode KeyMode.insert (reason: tab changed)" should be logged
|
|
And "Mode before tab change: insert (mode_on_change = normal)" should be logged
|
|
And "Mode after tab change: normal (mode_on_change = normal)" should be logged
|
|
|
|
Scenario: mode on change persist
|
|
Given I set tabs.mode_on_change to persist
|
|
And I clean up open tabs
|
|
When I open data/hello.txt
|
|
And I run :mode-enter insert
|
|
And I wait for "Entering mode KeyMode.insert (reason: command)" in the log
|
|
And I open data/hello2.txt in a new background tab
|
|
And I run :tab-focus 2
|
|
Then "Leaving mode KeyMode.insert (reason: tab changed)" should not be logged
|
|
And "Mode before tab change: insert (mode_on_change = persist)" should be logged
|
|
And "Mode after tab change: insert (mode_on_change = persist)" should be logged
|
|
|
|
Scenario: mode on change restore
|
|
Given I set tabs.mode_on_change to restore
|
|
And I clean up open tabs
|
|
When I open data/hello.txt
|
|
And I run :mode-enter insert
|
|
And I wait for "Entering mode KeyMode.insert (reason: command)" in the log
|
|
And I open data/hello2.txt in a new background tab
|
|
And I run :tab-focus 2
|
|
And I wait for "Mode before tab change: insert (mode_on_change = restore)" in the log
|
|
And I wait for "Mode after tab change: normal (mode_on_change = restore)" in the log
|
|
And I run :mode-enter passthrough
|
|
And I wait for "Entering mode KeyMode.passthrough (reason: command)" in the log
|
|
And I run :tab-focus 1
|
|
Then "Mode before tab change: passthrough (mode_on_change = restore)" should be logged
|
|
And "Entering mode KeyMode.insert (reason: restore)" should be logged
|
|
And "Mode after tab change: insert (mode_on_change = restore)" should be logged
|