summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2022-06-13 14:06:51 +0200
committerFlorian Bruhin <me@the-compiler.org>2022-06-13 14:06:51 +0200
commitfe2a5529e6ecb9133afa3a1a59f603b47cf21a65 (patch)
tree1a82e2a891beebb9b034de68ad6f931165443f85
parent525cdd34788984e80ecd1e46527762b71555114c (diff)
parent55303587b8a88b729113a209c4692c62c72792f9 (diff)
downloadqutebrowser-fe2a5529e6ecb9133afa3a1a59f603b47cf21a65.tar.gz
qutebrowser-fe2a5529e6ecb9133afa3a1a59f603b47cf21a65.zip
Merge remote-tracking branch 'origin/pr/7003'
-rw-r--r--qutebrowser/browser/shared.py4
-rw-r--r--qutebrowser/config/configdata.yml1
-rw-r--r--qutebrowser/mainwindow/prompt.py22
-rw-r--r--tests/end2end/features/conftest.py32
-rw-r--r--tests/end2end/features/downloads.feature22
-rw-r--r--tests/end2end/features/test_editor_bdd.py30
6 files changed, 79 insertions, 32 deletions
diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py
index 3ea323d96..54c466415 100644
--- a/qutebrowser/browser/shared.py
+++ b/qutebrowser/browser/shared.py
@@ -405,7 +405,7 @@ class FileSelectionMode(enum.Enum):
def choose_file(qb_mode: FileSelectionMode) -> List[str]:
- """Select file(s)/folder for uploading, using external command defined in config.
+ """Select file(s)/folder for up-/downloading, using an external command.
Args:
qb_mode: File selection mode
@@ -451,7 +451,7 @@ def _execute_fileselect_command(
"""Execute external command to choose file.
Args:
- multiple: Should selecting multiple files be allowed.
+ qb_mode: Should selecting multiple files be allowed.
tmpfilename: Path to the temporary file if used, otherwise None.
Return:
diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml
index e2b34e327..5f348d102 100644
--- a/qutebrowser/config/configdata.yml
+++ b/qutebrowser/config/configdata.yml
@@ -3793,6 +3793,7 @@ bindings.default:
<Down>: prompt-item-focus next
<Alt-Y>: prompt-yank
<Alt-Shift-Y>: prompt-yank --sel
+ <Alt-E>: prompt-fileselect-external
<Ctrl-B>: rl-backward-char
<Ctrl-F>: rl-forward-char
<Alt-B>: rl-backward-word
diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py
index f7a04bee0..9db84b378 100644
--- a/qutebrowser/mainwindow/prompt.py
+++ b/qutebrowser/mainwindow/prompt.py
@@ -467,6 +467,27 @@ class PromptContainer(QWidget):
utils.set_clipboard(question.url, sel)
message.info("Yanked to {}: {}".format(target, question.url))
+ @cmdutils.register(
+ instance='prompt-container', scope='window',
+ modes=[usertypes.KeyMode.prompt])
+ def prompt_fileselect_external(self):
+ """Choose a location using a configured external picker."""
+ assert self._prompt is not None
+ if not isinstance(self._prompt, FilenamePrompt):
+ raise cmdutils.CommandError(
+ "Can only launch external fileselect for FilenamePrompt, "
+ f"not {self._prompt.__class__.__name__}"
+ )
+ # XXX to avoid current cyclic import
+ from qutebrowser.browser import shared
+ folders = shared.choose_file(shared.FileSelectionMode.folder)
+ if not folders:
+ message.info("No folder chosen.")
+ return
+ # choose_file already checks that this is max one folder
+ assert len(folders) == 1
+ self.prompt_accept(folders[0])
+
class LineEdit(QLineEdit):
@@ -835,6 +856,7 @@ class DownloadFilenamePrompt(FilenamePrompt):
('prompt-open-download', "Open download"),
('prompt-open-download --pdfjs', "Open download via PDF.js"),
('prompt-yank', "Yank URL"),
+ ('prompt-fileselect-external', "Launch external file selector"),
]
return cmds
diff --git a/tests/end2end/features/conftest.py b/tests/end2end/features/conftest.py
index da42ac6e1..2bb3d5079 100644
--- a/tests/end2end/features/conftest.py
+++ b/tests/end2end/features/conftest.py
@@ -712,3 +712,35 @@ def check_option_per_domain(quteproc, option, value, pattern, server):
pattern = pattern.replace('(port)', str(server.port))
actual_value = quteproc.get_setting(option, pattern=pattern)
assert actual_value == value
+
+
+@bdd.when(bdd.parsers.parse('I setup a fake {kind} fileselector '
+ 'selecting "{files}" and writes to {output_type}'))
+def set_up_fileselector(quteproc, py_proc, tmpdir, kind, files, output_type):
+ """Set up fileselect.xxx.command to select the file(s)."""
+ cmd, args = py_proc(r"""
+ import os
+ import sys
+ tmp_file = None
+ for i, arg in enumerate(sys.argv):
+ if arg.startswith('--file='):
+ tmp_file = arg[len('--file='):]
+ sys.argv.pop(i)
+ break
+ selected_files = sys.argv[1:]
+ if tmp_file is None:
+ for selected_file in selected_files:
+ print(os.path.abspath(selected_file))
+ else:
+ with open(tmp_file, 'w') as f:
+ for selected_file in selected_files:
+ f.write(os.path.abspath(selected_file) + '\n')
+ """)
+ files = files.replace('(tmpdir)', str(tmpdir))
+ files = files.replace('(dirsep)', os.sep)
+ args += files.split(' ')
+ if output_type == "a temporary file":
+ args += ['--file={}']
+ fileselect_cmd = json.dumps([cmd, *args])
+ quteproc.set_setting('fileselect.handler', 'external')
+ quteproc.set_setting(f'fileselect.{kind}.command', fileselect_cmd)
diff --git a/tests/end2end/features/downloads.feature b/tests/end2end/features/downloads.feature
index dfdb24704..e1957a679 100644
--- a/tests/end2end/features/downloads.feature
+++ b/tests/end2end/features/downloads.feature
@@ -684,3 +684,25 @@ Feature: Downloading things from a website.
When I set downloads.location.prompt to false
And I open 500-inline
Then the error "Download error: *INTERNAL SERVER ERROR" should be shown
+
+ ## External download path fileselector
+
+ Scenario: Select download path
+ When I set downloads.location.prompt to true
+ And I setup a fake folder fileselector selecting "(tmpdir)(dirsep)downloads(dirsep)subdir" and writes to a temporary file
+ And I open data/downloads/downloads.html
+ And I run :click-element id download
+ And I wait for the download prompt for "*"
+ And I run :prompt-fileselect-external
+ And I wait until the download is finished
+ Then the downloaded file subdir/download.bin should exist
+
+ Scenario: No download folder chosen
+ When I set downloads.location.prompt to true
+ And I set fileselect.folder.command to ['echo', '{}']
+ And I open data/downloads/downloads.html
+ And I run :click-element id download
+ And I wait for the download prompt for "*"
+ And I run :prompt-fileselect-external
+ Then the message "No folder chosen." should be shown
+ And the download prompt should be shown with "(tmpdir)(dirsep)downloads"
diff --git a/tests/end2end/features/test_editor_bdd.py b/tests/end2end/features/test_editor_bdd.py
index 40f77a0f7..6a4da49de 100644
--- a/tests/end2end/features/test_editor_bdd.py
+++ b/tests/end2end/features/test_editor_bdd.py
@@ -178,33 +178,3 @@ def save_editor_wait(tmpdir):
# for posix, there IS a member so we need to ignore useless-suppression
# pylint: disable=no-member,useless-suppression
os.kill(pid, signal.SIGUSR2)
-
-
-@bdd.when(bdd.parsers.parse('I setup a fake {kind} fileselector '
- 'selecting "{files}" and writes to {output_type}'))
-def set_up_fileselector(quteproc, py_proc, kind, files, output_type):
- """Set up fileselect.xxx.command to select the file(s)."""
- cmd, args = py_proc(r"""
- import os
- import sys
- tmp_file = None
- for i, arg in enumerate(sys.argv):
- if arg.startswith('--file='):
- tmp_file = arg[len('--file='):]
- sys.argv.pop(i)
- break
- selected_files = sys.argv[1:]
- if tmp_file is None:
- for selected_file in selected_files:
- print(os.path.abspath(selected_file))
- else:
- with open(tmp_file, 'w') as f:
- for selected_file in selected_files:
- f.write(os.path.abspath(selected_file) + '\n')
- """)
- args += files.split(' ')
- if output_type == "a temporary file":
- args += ['--file={}']
- fileselect_cmd = json.dumps([cmd, *args])
- quteproc.set_setting('fileselect.handler', 'external')
- quteproc.set_setting(f'fileselect.{kind}.command', fileselect_cmd)