diff --git a/tests/end2end/features/conftest.py b/tests/end2end/features/conftest.py index c2b5865a5..bea896a8d 100644 --- a/tests/end2end/features/conftest.py +++ b/tests/end2end/features/conftest.py @@ -177,21 +177,25 @@ def pdfjs_available(): def open_path(quteproc, httpbin, path): """Open a URL. - If used like "When I open ... in a new tab", the URL is opened in a new - tab. With "... in a new window", it's opened in a new window. With - "... as a URL", it's opened according to new-instance-open-target. + - If used like "When I open ... in a new tab", the URL is opened in a new + tab. + - With "... in a new window", it's opened in a new window. + - With "... in a private window" it's opened in a new private window. + - With "... as a URL", it's opened according to new-instance-open-target. """ path = path.replace('(port)', str(httpbin.port)) new_tab = False new_bg_tab = False new_window = False + private = False as_url = False wait = True new_tab_suffix = ' in a new tab' new_bg_tab_suffix = ' in a new background tab' new_window_suffix = ' in a new window' + private_suffix = ' in a private window' do_not_wait_suffix = ' without waiting' as_url_suffix = ' as a URL' @@ -205,6 +209,9 @@ def open_path(quteproc, httpbin, path): elif path.endswith(new_window_suffix): path = path[:-len(new_window_suffix)] new_window = True + elif path.endswith(private_suffix): + path = path[:-len(private_suffix)] + private = True elif path.endswith(as_url_suffix): path = path[:-len(as_url_suffix)] as_url = True @@ -215,7 +222,8 @@ def open_path(quteproc, httpbin, path): break quteproc.open_path(path, new_tab=new_tab, new_bg_tab=new_bg_tab, - new_window=new_window, as_url=as_url, wait=wait) + new_window=new_window, private=private, as_url=as_url, + wait=wait) @bdd.when(bdd.parsers.parse("I set {sect} -> {opt} to {value}")) diff --git a/tests/end2end/features/misc.feature b/tests/end2end/features/misc.feature index 83de1c822..21b220174 100644 --- a/tests/end2end/features/misc.feature +++ b/tests/end2end/features/misc.feature @@ -569,26 +569,6 @@ Feature: Various utility commands. And I run :command-accept Then the message "Hello World" should be shown - ## https://github.com/qutebrowser/qutebrowser/issues/1219 - - @qtwebengine_todo: private browsing is not implemented yet @qtwebkit_ng_skip: private browsing is not implemented yet - Scenario: Sharing cookies with private browsing - When I set general -> private-browsing to true - And I open cookies/set?qute-test=42 without waiting - And I wait until cookies is loaded - And I open cookies in a new tab - And I set general -> private-browsing to false - Then the cookie qute-test should be set to 42 - - ## https://github.com/qutebrowser/qutebrowser/issues/1742 - - @qtwebengine_todo: private browsing is not implemented yet @qtwebkit_ng_xfail: private browsing is not implemented yet - Scenario: Private browsing is activated in QtWebKit without restart - When I set general -> private-browsing to true - And I open data/javascript/localstorage.html - And I set general -> private-browsing to false - Then the page should contain the plaintext "Local storage status: not working" - @no_xvfb Scenario: :window-only Given I run :tab-only @@ -681,20 +661,6 @@ Feature: Various utility commands. And I run :command-accept Then the error "No command given" should be shown - @qtwebengine_todo: private browsing is not implemented yet @qtwebkit_ng_skip: private browsing is not implemented yet - Scenario: Calling previous command with private-browsing mode - When I run :set-cmd-text :message-info blah - And I run :command-accept - And I set general -> private-browsing to true - And I run :set-cmd-text :message-error "This should only be shown once" - And I run :command-accept - And I wait for the error "This should only be shown once" - And I run :set-cmd-text : - And I run :command-history-prev - And I run :command-accept - And I set general -> private-browsing to false - Then the message "blah" should be shown - ## Modes blacklisted for :enter-mode Scenario: Trying to enter command mode with :enter-mode diff --git a/tests/end2end/features/private.feature b/tests/end2end/features/private.feature new file mode 100644 index 000000000..0faf74014 --- /dev/null +++ b/tests/end2end/features/private.feature @@ -0,0 +1,112 @@ +# vim: ft=cucumber fileencoding=utf-8 sts=4 sw=4 et: + +Feature: Using private browsing + + Background: + Given I open about:blank + And I clean up open tabs + + @qtwebkit_ng_xfail: private browsing is not implemented yet + Scenario: Opening new tab in private window + When I open about:blank in a private window + And I run :window-only + And I open data/javascript/localstorage.html in a new tab + Then the page should contain the plaintext "Local storage status: not working" + + @qtwebkit_ng_xfail: private browsing is not implemented yet + Scenario: Opening new tab in private window with :navigate next + When I open data/navigate in a private window + And I run :window-only + And I run :navigate -t next + And I wait until data/navigate/next.html is loaded + And I open data/javascript/localstorage.html + Then the page should contain the plaintext "Local storage status: not working" + + Scenario: Using command history in a new private browsing window + When I run :set-cmd-text :message-info "Hello World" + And I run :command-accept + And I open about:blank in a private window + And I run :set-cmd-text :message-error "This should only be shown once" + And I run :command-accept + And I wait for the error "This should only be shown once" + And I run :close + And I run :set-cmd-text : + And I run :command-history-prev + And I run :command-accept + # Then the error should not be shown again + + ## https://github.com/qutebrowser/qutebrowser/issues/1219 + + @qtwebkit_ng_skip: private browsing is not implemented yet + Scenario: Sharing cookies with private browsing + When I open cookies/set?qute-test=42 without waiting in a private window + And I wait until cookies is loaded + And I open cookies in a new tab + And I set general -> private-browsing to false + Then the cookie qute-test should be set to 42 + + Scenario: Opening private window with :navigate increment + # Private window handled in commands.py + When I open data/numbers/1.txt in a private window + And I run :window-only + And I run :navigate -w increment + And I wait until data/numbers/2.txt is loaded + Then the session should look like: + windows: + - private: True + tabs: + - history: + - url: http://localhost:*/data/numbers/1.txt + - private: True + tabs: + - history: + - url: http://localhost:*/data/numbers/2.txt + + Scenario: Opening private window with :navigate next + # Private window handled in navigate.py + When I open data/navigate in a private window + And I run :window-only + And I run :navigate -w next + And I wait until data/navigate/next.html is loaded + Then the session should look like: + windows: + - private: True + tabs: + - history: + - url: http://localhost:*/data/navigate + - private: True + tabs: + - history: + - url: http://localhost:*/data/navigate/next.html + + Scenario: Opening private window with :tab-clone + When I open data/hello.txt in a private window + And I run :window-only + And I run :tab-clone -w + And I wait until data/hello.txt is loaded + Then the session should look like: + windows: + - private: True + tabs: + - history: + - url: http://localhost:*/data/hello.txt + - private: True + tabs: + - history: + - url: http://localhost:*/data/hello.txt + + Scenario: Opening private window via :click-element + When I open data/click_element.html in a private window + And I run :window-only + And I run :click-element --target window id link + And I wait until data/hello.txt is loaded + Then the session should look like: + windows: + - private: True + tabs: + - history: + - url: http://localhost:*/data/click_element.html + - private: True + tabs: + - history: + - url: http://localhost:*/data/hello.txt diff --git a/tests/end2end/features/test_misc_bdd.py b/tests/end2end/features/test_misc_bdd.py index e78840d68..a47b89af4 100644 --- a/tests/end2end/features/test_misc_bdd.py +++ b/tests/end2end/features/test_misc_bdd.py @@ -18,7 +18,6 @@ # along with qutebrowser. If not, see . import sys -import json import os.path import subprocess @@ -57,18 +56,6 @@ def update_documentation(): subprocess.call([sys.executable, update_script]) -@bdd.then(bdd.parsers.parse('the cookie {name} should be set to {value}')) -def check_cookie(quteproc, name, value): - """Check if a given cookie is set correctly. - - This assumes we're on the httpbin cookies page. - """ - content = quteproc.get_content() - data = json.loads(content) - print(data) - assert data['cookies'][name] == value - - @bdd.then(bdd.parsers.parse('the PDF {filename} should exist in the tmpdir')) def pdf_exists(quteproc, tmpdir, filename): path = tmpdir / filename diff --git a/tests/end2end/features/test_private_bdd.py b/tests/end2end/features/test_private_bdd.py new file mode 100644 index 000000000..6ff44ce6e --- /dev/null +++ b/tests/end2end/features/test_private_bdd.py @@ -0,0 +1,36 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2017 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +import os.path +import json + +import pytest_bdd as bdd +bdd.scenarios('private.feature') + + +@bdd.then(bdd.parsers.parse('the cookie {name} should be set to {value}')) +def check_cookie(quteproc, name, value): + """Check if a given cookie is set correctly. + + This assumes we're on the httpbin cookies page. + """ + content = quteproc.get_content() + data = json.loads(content) + print(data) + assert data['cookies'][name] == value diff --git a/tests/end2end/fixtures/quteprocess.py b/tests/end2end/fixtures/quteprocess.py index 992714095..88c98f80f 100644 --- a/tests/end2end/fixtures/quteprocess.py +++ b/tests/end2end/fixtures/quteprocess.py @@ -497,18 +497,20 @@ class QuteProc(testprocess.Process): self.set_setting(sect, opt, old_value) def open_path(self, path, *, new_tab=False, new_bg_tab=False, - new_window=False, as_url=False, port=None, https=False, - wait=True): + new_window=False, private=False, as_url=False, port=None, + https=False, wait=True): """Open the given path on the local webserver in qutebrowser.""" url = self.path_to_url(path, port=port, https=https) self.open_url(url, new_tab=new_tab, new_bg_tab=new_bg_tab, - new_window=new_window, as_url=as_url, wait=wait) + new_window=new_window, private=private, as_url=as_url, + wait=wait) def open_url(self, url, *, new_tab=False, new_bg_tab=False, - new_window=False, as_url=False, wait=True): + new_window=False, private=False, as_url=False, wait=True): """Open the given url in qutebrowser.""" - if new_tab and new_window: - raise ValueError("new_tab and new_window given!") + if sum(1 for opt in [new_tab, new_bg_tab, new_window, private, as_url] + if opt) > 1: + raise ValueError("Conflicting options given!") if as_url: self.send_cmd(url, invalid=True) @@ -518,6 +520,8 @@ class QuteProc(testprocess.Process): self.send_cmd(':open -b ' + url) elif new_window: self.send_cmd(':open -w ' + url) + elif private: + self.send_cmd(':open -p ' + url) else: self.send_cmd(':open ' + url) diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py index e4470ac3a..f048849cb 100644 --- a/tests/end2end/test_invocations.py +++ b/tests/end2end/test_invocations.py @@ -267,3 +267,21 @@ def test_launching_with_python2(): assert proc.returncode == 1 error = "At least Python 3.4 is required to run qutebrowser" assert stderr.decode('ascii').startswith(error) + + +def test_initial_private_browsing(request, quteproc_new): + """Make sure the initial window is private when the setting is set.""" + args = (_base_args(request.config) + + ['--temp-basedir', '-s', 'general', 'private-browsing', 'true']) + quteproc_new.start(args) + + quteproc_new.compare_session(""" + windows: + - private: True + tabs: + - history: + - url: about:blank + """) + + quteproc_new.send_cmd(':quit') + quteproc_new.wait_for_quit()