diff options
author | Florian Bruhin <me@the-compiler.org> | 2022-06-13 14:06:51 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2022-06-13 14:06:51 +0200 |
commit | fe2a5529e6ecb9133afa3a1a59f603b47cf21a65 (patch) | |
tree | 1a82e2a891beebb9b034de68ad6f931165443f85 | |
parent | 525cdd34788984e80ecd1e46527762b71555114c (diff) | |
parent | 55303587b8a88b729113a209c4692c62c72792f9 (diff) | |
download | qutebrowser-fe2a5529e6ecb9133afa3a1a59f603b47cf21a65.tar.gz qutebrowser-fe2a5529e6ecb9133afa3a1a59f603b47cf21a65.zip |
Merge remote-tracking branch 'origin/pr/7003'
-rw-r--r-- | qutebrowser/browser/shared.py | 4 | ||||
-rw-r--r-- | qutebrowser/config/configdata.yml | 1 | ||||
-rw-r--r-- | qutebrowser/mainwindow/prompt.py | 22 | ||||
-rw-r--r-- | tests/end2end/features/conftest.py | 32 | ||||
-rw-r--r-- | tests/end2end/features/downloads.feature | 22 | ||||
-rw-r--r-- | tests/end2end/features/test_editor_bdd.py | 30 |
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) |