summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml8
-rw-r--r--CHANGELOG.asciidoc80
-rw-r--r--CONTRIBUTING.asciidoc5
-rw-r--r--INSTALL.asciidoc8
-rw-r--r--README.asciidoc5
-rw-r--r--doc/help/commands.asciidoc4
-rw-r--r--doc/help/settings.asciidoc2
-rw-r--r--doc/qutebrowser.1.asciidoc2
-rw-r--r--misc/qutebrowser.spec2
-rw-r--r--misc/requirements/requirements-pylint.txt2
-rw-r--r--misc/requirements/requirements-pyqt.txt4
-rw-r--r--misc/requirements/requirements-tests.txt4
-rw-r--r--pytest.ini1
-rw-r--r--qutebrowser/__init__.py2
-rw-r--r--qutebrowser/app.py6
-rw-r--r--qutebrowser/browser/commands.py17
-rw-r--r--qutebrowser/browser/webengine/webenginesettings.py3
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py3
-rw-r--r--qutebrowser/browser/webkit/webkittab.py7
-rw-r--r--qutebrowser/config/configdata.py8
-rw-r--r--qutebrowser/mainwindow/tabbedbrowser.py4
-rw-r--r--qutebrowser/mainwindow/tabwidget.py9
-rw-r--r--qutebrowser/misc/earlyinit.py1
-rw-r--r--qutebrowser/misc/sessions.py9
-rw-r--r--qutebrowser/qutebrowser.py3
-rwxr-xr-xscripts/dev/build_release.py48
-rw-r--r--scripts/dev/ci/travis_install.sh11
-rwxr-xr-xscripts/dev/src2asciidoc.py3
-rw-r--r--tests/end2end/features/downloads.feature4
-rw-r--r--tests/end2end/features/scroll.feature7
-rw-r--r--tests/end2end/features/tabs.feature10
-rw-r--r--tests/end2end/features/test_downloads_bdd.py9
-rw-r--r--tests/end2end/features/zoom.feature5
-rw-r--r--tests/unit/config/old_configs/qutebrowser-v0.11.0.conf251
-rw-r--r--tests/unit/config/test_config.py2
-rw-r--r--tests/unit/misc/test_editor.py10
-rw-r--r--tox.ini24
37 files changed, 453 insertions, 130 deletions
diff --git a/.travis.yml b/.travis.yml
index e18bd2efa..ec2868730 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -25,12 +25,16 @@ matrix:
env: TESTENV=py36-pyqt571
- os: linux
language: python
+ python: 3.6
+ env: TESTENV=py36-pyqt58
+ - os: linux
+ language: python
python: 3.5
- env: TESTENV=py35-pyqt58
+ env: TESTENV=py35-pyqt59
- os: linux
language: python
python: 3.6
- env: TESTENV=py36-pyqt58
+ env: TESTENV=py36-pyqt59
- os: osx
env: TESTENV=py36 OSX=elcapitan
osx_image: xcode7.3
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 353bd3d00..14fd41b88 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -14,8 +14,8 @@ This project adheres to http://semver.org/[Semantic Versioning].
// `Fixed` for any bug fixes.
// `Security` to invite users to upgrade in case of vulnerabilities.
-v0.11.0 (unreleased)
---------------------
+v0.11.0
+-------
New dependencies
~~~~~~~~~~~~~~~~
@@ -28,7 +28,10 @@ New dependencies
Added
~~~~~
-- New `-p` flag for `:open` to open a private window.
+- Private browsing is now implemented for QtWebEngine, *and changed its
+ behavior*: The `general -> private-browsing` setting now only applies to newly
+ opened windows, and you can use the `-p` flag to `:open` to open a private
+ window.
- New "pinned tabs" feature, with a new `:tab-pin` command (bound
to `<Ctrl-p>` by default).
- (QtWebEngine) Implemented `:follow-selected`.
@@ -45,6 +48,8 @@ Added
customize statusbar colors for private windows.
- New `{private}` field displaying `[Private Mode]` for
`ui -> window-title-format` and `tabs -> title-format`.
+- (QtWebEngine) Proxy support with Qt 5.7.1 (already was supported for 5.8 and
+ newer)
Changed
~~~~~~~
@@ -52,62 +57,51 @@ Changed
- To prevent elaborate phishing attacks, the Punycode version (`xn--*`) is now
shown in addition to the decoded version for international domain names
(IDN).
-- Private browsing is now implemented for QtWebEngine, and changed it's
- behavior: The `general -> private-browsing` setting now only applies to newly
- opened windows, and you can use the `-p` flag to `:open` to open a private
- window.
+- Starting with legacy QtWebKit now shows a warning message.
+ *With the next release, support for it will be removed.*
+- The Windows releases are redone from scratch, which means:
+ - They now use the new QtWebEngine backend
+ - The bundled Qt is updated from 5.5 to 5.9
+ - The bundled Python is updated from 3.4 to 3.6
+ - They are now generated with PyInstaller instead of cx_Freeze
+ - The installer is now generated using NSIS instead of being a MSI
- Improved `qute://history` page (with lazy loading)
-- Starting with legacy QtWebKit now shows a warning message once.
- Crash reports are not public anymore.
- Paths like `C:` are now treated as absolute paths on Windows for downloads,
and invalid paths are handled properly.
-- PAC on QtWebKit now supports SOCKS5 as type.
-- Comments in the config file are now before the individual options instead of
- being before sections.
+- Comments in the config file are now placed before the individual options
+ instead of being before sections.
- Messages are now hidden when clicked.
- stdin is now closed immediately for processes spawned from qutebrowser.
- When `ui -> message-timeout` is set to 0, messages are now never cleared.
- Middle/right-clicking the blank parts of the tab bar (when vertical) now
closes the current tab.
-- (QtWebEngine) With Qt 5.9, `content -> cookies-store` can now be set without
- a restart.
-- (QtWebEngine) With Qt 5.9, better error messages are now shown for failed
- downloads.
- The adblocker now also blocks non-GET requests (e.g. POST).
- `javascript:` links can now be hinted.
- `:view-source`, `:tab-clone` and `:navigate --tab` now don't open the tab as
"explicit" anymore, i.e. (with the default settings) open it next to the
active tab.
-- (QtWebEngine) The underlying Chromium version is now shown in the version
- info.
- `qute:*` pages now use `qute://*` instead (e.g. `qute://version` instead of
`qute:version`), but the old versions are automatically redirected.
-- The Windows releases are redone from scratch, which means:
- - They now use the new QtWebEngine backend
- - The bundled Qt is updated from 5.5 to 5.9
- - The bundled Python is updated from 3.4 to 3.6
- - They are now generated with PyInstaller instead of cx_Freeze
- - The installer is now generated using NSIS instead of being a MSI
- Texts in prompts are now selectable.
-- Renderer process crashes now show an error page.
-- (QtWebKit) storage -> offline-web-application-storage` got renamed to `...-cache`
- The default level for `:messages` is now `info`, not `error`
- Trying to focus the currently focused tab with `:tab-focus` now focuses the
last viewed tab.
+- (QtWebEngine) With Qt 5.9, `content -> cookies-store` can now be set without
+ a restart.
+- (QtWebEngine) With Qt 5.9, better error messages are now shown for failed
+ downloads.
+- (QtWebEngine) The underlying Chromium version is now shown in the version
+ info.
+- (QtWebKit) Renderer process crashes now show an error page on Qt 5.9 or newer.
+- (QtWebKit) storage -> offline-web-application-storage` got renamed to `...-cache`
+- (QtWebKit) PAC now supports SOCKS5 as type.
Fixed
~~~~~
- The macOS .dmg is now built against Qt 5.9 which fixes various
important issues (such as not being able to type dead keys).
-- (QtWebEngine) Added a workaround for a black screen with some setups
- (the workaround requires PyOpenGL to be installed, but it's optional)
-- (QtWebEngine) Starting with Nouveau graphics now shows an error message
- instead of crashing in Qt. This adds a new dependency on `PyQt5.QtOpenGL`.
-- (QtWebEngine) Retrying downloads now shows an error instead of crashing.
-- (QtWebEngine) Cloning a view-source tab now doesn't crash anymore.
-- (QtWebKit) The HTTP cache is disabled on Qt 5.7.1 and 5.8 now as it leads to
- frequent crashes due to a Qt bug.
- Fixed crash with `:download` on PyQt 5.9.
- Cloning a page without history doesn't crash anymore.
- When a download results in a HTTP error, it now shows the error correctly
@@ -117,7 +111,6 @@ Fixed
- Fixed crash when unbinding an unbound key in the key config.
- Fixed crash when using `:debug-log-filter` when `--filter` wasn't given on startup.
- Fixed crash with some invalid setting values.
-- (QtWebKit) Fixed Crash when a PAC file returns an invalid value.
- Continuing a search after clearing it now works correctly.
- The tabbar and completion should now be more consistently and correctly
styled with various system styles.
@@ -125,18 +118,27 @@ Fixed
- The validation for colors in stylesheets is now less strict,
allowing for all valid Qt values.
- `data:` URLs now aren't added to the history anymore.
-- (QtWebEngine) `window.navigator.userAgent` is now set correctly when
- customizing the user agent.
- Accidentally starting with Python 2 now shows a proper error message again.
-- (QtWebEngine) HTML fullscreen is now tracked for each tab separately, which
- means it's not possible anymore to accidentally get stuck in fullscreen state
- by closing a tab with a fullscreen video.
- For some people, running some userscripts crashed - this should now be fixed.
- Various other rare crashes should now be fixed.
- The settings documentation was truncated with v0.10.1 which should now be
fixed.
- Scrolling to an anchor in a background tab now works correctly, and javascript
gets the correct window size for background tabs.
+- (QtWebEngine) Added a workaround for a black screen with some setups
+- (QtWebEngine) Starting with Nouveau graphics now shows an error message
+ instead of crashing in Qt.
+- (QtWebEngine) Retrying downloads now shows an error instead of crashing.
+- (QtWebEngine) Cloning a view-source tab now doesn't crash anymore.
+- (QtWebEngine) `window.navigator.userAgent` is now set correctly when
+ customizing the user agent.
+- (QtWebEngine) HTML fullscreen is now tracked for each tab separately, which
+ means it's not possible anymore to accidentally get stuck in fullscreen state
+ by closing a tab with a fullscreen video.
+- (QtWebEngine) `:scroll-page` with `--bottom-navigate` now works correctly.
+- (QtWebKit) The HTTP cache is disabled on Qt 5.7.1 and 5.8 now as it leads to
+ frequent crashes due to a Qt bug.
+- (QtWebKit) Fixed Crash when a PAC file returns an invalid value.
v0.10.1
-------
diff --git a/CONTRIBUTING.asciidoc b/CONTRIBUTING.asciidoc
index d5c77f521..2ac99804e 100644
--- a/CONTRIBUTING.asciidoc
+++ b/CONTRIBUTING.asciidoc
@@ -682,8 +682,9 @@ qutebrowser release
* Add newest config to `tests/unit/config/old_configs` and update `test_upgrade_version`
- `python -m qutebrowser --basedir conf :quit`
- - `sed '/^#/d' conf/config/qutebrowser.conf > tests/unit/config/old_configs/qutebrowser-v0.x.y.conf`
+ - `sed '/^#/d' conf/config/qutebrowser.conf > tests/unit/config/old_configs/qutebrowser-v0.$x.$y.conf`
- `rm -r conf`
+ - git add
- commit
* Adjust `__version_info__` in `qutebrowser/__init__.py`.
* Update changelog (remove *(unreleased)*)
@@ -698,7 +699,7 @@ qutebrowser release
as closed.
* Linux: Run `python3 scripts/dev/build_release.py --upload v0.$x.$y`
-* Windows: Run `C:\Python34_x32\python scripts\dev\build_release.py --asciidoc C:\Python27\python C:\asciidoc-8.6.9\asciidoc.py --upload v0.X.Y` (replace X/Y by hand)
+* Windows: Run `C:\Python36-32\python scripts\dev\build_release.py --asciidoc C:\Python27\python C:\asciidoc-8.6.9\asciidoc.py --upload v0.X.Y` (replace X/Y by hand)
* OS X: Run `python3 scripts/dev/build_release.py --upload v0.X.Y` (replace X/Y by hand)
* On server: Run `python3 scripts/dev/download_release.py v0.X.Y` (replace X/Y by hand)
* Update `qutebrowser-git` PKGBUILD if dependencies/install changed
diff --git a/INSTALL.asciidoc b/INSTALL.asciidoc
index 1c330c79e..425bf738c 100644
--- a/INSTALL.asciidoc
+++ b/INSTALL.asciidoc
@@ -371,14 +371,6 @@ your `$PATH` (e.g. `/usr/local/bin/qutebrowser` or `~/bin/qutebrowser`):
~/path/to/qutebrowser/.venv/bin/python3 -m qutebrowser "$@"
----
-If you are developing on qutebrowser, you may want to redirect it to a local
-config:
-
-----
-#!/bin/bash
-~/path/to/qutebrowser/.venv/bin/python3 -m qutebrowser -c .qutebrowser-local "$@"
-----
-
Updating
~~~~~~~~
diff --git a/README.asciidoc b/README.asciidoc
index 98e13a538..fff189cee 100644
--- a/README.asciidoc
+++ b/README.asciidoc
@@ -99,10 +99,10 @@ Requirements
The following software and libraries are required to run qutebrowser:
* http://www.python.org/[Python] 3.4 or newer (3.5 recommended)
-* http://qt.io/[Qt] 5.2.0 or newer (5.9.0 recommended)
+* http://qt.io/[Qt] 5.2.0 or newer (5.9 recommended)
* QtWebKit (old or link:https://github.com/annulen/webkit/wiki[reloaded]/NG) or QtWebEngine
* http://www.riverbankcomputing.com/software/pyqt/intro[PyQt] 5.2.0 or newer
-(5.8.1 recommended) for Python 3
+(5.9 recommended) for Python 3
* https://pypi.python.org/pypi/setuptools/[pkg_resources/setuptools]
* http://fdik.org/pyPEG/[pyPEG2]
* http://jinja.pocoo.org/[jinja2]
@@ -281,6 +281,7 @@ Contributors, sorted by the number of commits in descending order:
* Lazlow Carmichael
* Kevin Wang
* Ján Kobezda
+* Justin Partain
* Johannes Martinsson
* Jean-Christophe Petkovich
* Helen Sherwood-Taylor
diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc
index c3ff94d35..05bf3ad93 100644
--- a/doc/help/commands.asciidoc
+++ b/doc/help/commands.asciidoc
@@ -85,7 +85,7 @@ It is possible to run or bind multiple commands by separating them with `;;`.
|<<tab-pin,tab-pin>>|Pin/Unpin the current/[count]th tab.
|<<tab-prev,tab-prev>>|Switch to the previous tab, or switch [count] tabs back.
|<<unbind,unbind>>|Unbind a keychain.
-|<<undo,undo>>|Re-open a closed tab (optionally skipping [count] closed tabs).
+|<<undo,undo>>|Re-open a closed tab.
|<<view-source,view-source>>|Show the source of the current page in a new tab.
|<<window-only,window-only>>|Close all windows except for the current one.
|<<wq,wq>>|Save open pages and quit.
@@ -936,7 +936,7 @@ Unbind a keychain.
[[undo]]
=== undo
-Re-open a closed tab (optionally skipping [count] closed tabs).
+Re-open a closed tab.
[[view-source]]
=== view-source
diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc
index 9c362dbca..b038d462d 100644
--- a/doc/help/settings.asciidoc
+++ b/doc/help/settings.asciidoc
@@ -789,8 +789,6 @@ The proxy to use.
In addition to the listed values, you can use a `socks://...` or `http://...` URL.
-This setting only works with Qt 5.8 or newer when using the QtWebEngine backend.
-
Valid values:
* +system+: Use the system wide proxy.
diff --git a/doc/qutebrowser.1.asciidoc b/doc/qutebrowser.1.asciidoc
index cd95bf8e5..1b8345b0c 100644
--- a/doc/qutebrowser.1.asciidoc
+++ b/doc/qutebrowser.1.asciidoc
@@ -57,7 +57,7 @@ show it.
How URLs should be opened if there is already a qutebrowser instance running.
*--backend* '{webkit,webengine}'::
- Which backend to use (webengine backend is EXPERIMENTAL!).
+ Which backend to use.
*--enable-webengine-inspector*::
Enable the web inspector for QtWebEngine. Note that this is a SECURITY RISK and you should not visit untrusted websites with the inspector turned on. See https://bugreports.qt.io/browse/QTBUG-50725 for more details.
diff --git a/misc/qutebrowser.spec b/misc/qutebrowser.spec
index 5dc51015d..cd0ce3883 100644
--- a/misc/qutebrowser.spec
+++ b/misc/qutebrowser.spec
@@ -41,7 +41,7 @@ a = Analysis(['../qutebrowser/__main__.py'],
pathex=['misc'],
binaries=None,
datas=get_data_files(),
- hiddenimports=['PyQt5.QtOpenGL'],
+ hiddenimports=['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'],
hookspath=[],
runtime_hooks=[],
excludes=['tkinter'],
diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt
index bc7236b89..a76d0dbf4 100644
--- a/misc/requirements/requirements-pylint.txt
+++ b/misc/requirements/requirements-pylint.txt
@@ -8,7 +8,7 @@ idna==2.5
isort==4.2.15
lazy-object-proxy==1.3.1
mccabe==0.6.1
-pylint==1.7.1
+pylint==1.7.2
./scripts/dev/pylint_checkers
requests==2.18.1
six==1.10.0
diff --git a/misc/requirements/requirements-pyqt.txt b/misc/requirements/requirements-pyqt.txt
index da611589a..fffa133ab 100644
--- a/misc/requirements/requirements-pyqt.txt
+++ b/misc/requirements/requirements-pyqt.txt
@@ -1,4 +1,4 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
-PyQt5==5.8.2
-sip==4.19.2
+PyQt5==5.9
+sip==4.19.3
diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt
index 3f8bc6f1c..57a4daff7 100644
--- a/misc/requirements/requirements-tests.txt
+++ b/misc/requirements/requirements-tests.txt
@@ -1,7 +1,7 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
beautifulsoup4==4.6.0
-cheroot==5.5.2
+cheroot==5.7.0
click==6.7
# colorama==0.3.9
coverage==4.4.1
@@ -30,7 +30,7 @@ pytest-instafail==0.3.0
pytest-mock==1.6.0
pytest-qt==2.1.0
pytest-repeat==0.4.1
-pytest-rerunfailures==2.1.0
+pytest-rerunfailures==2.2
pytest-travis-fold==1.2.0
pytest-xvfb==1.0.0
PyVirtualDisplay==0.2.1
diff --git a/pytest.ini b/pytest.ini
index a2d2779d9..ab437801b 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -45,6 +45,7 @@ qt_log_ignore =
^QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to .*
^QGeoclueMaster error creating GeoclueMasterClient\.
^Geoclue error: Process org\.freedesktop\.Geoclue\.Master exited with status 127
+ ^QDBusConnection: name 'org.freedesktop.Geoclue.Master' had owner '' but we thought it was ':1.1'
^QObject::connect: Cannot connect \(null\)::stateChanged\(QNetworkSession::State\) to QNetworkReplyHttpImpl::_q_networkSessionStateChanged\(QNetworkSession::State\)
^QXcbClipboard: Cannot transfer data, no data available
^load glyph failed
diff --git a/qutebrowser/__init__.py b/qutebrowser/__init__.py
index e61419c0c..cca2bf1b8 100644
--- a/qutebrowser/__init__.py
+++ b/qutebrowser/__init__.py
@@ -26,7 +26,7 @@ __copyright__ = "Copyright 2014-2017 Florian Bruhin (The Compiler)"
__license__ = "GPL"
__maintainer__ = __author__
__email__ = "mail@qutebrowser.org"
-__version_info__ = (0, 10, 1)
+__version_info__ = (0, 11, 0)
__version__ = '.'.join(str(e) for e in __version_info__)
__description__ = "A keyboard-driven, vim-like browser based on PyQt5."
diff --git a/qutebrowser/app.py b/qutebrowser/app.py
index a3a855f9a..65e8d8181 100644
--- a/qutebrowser/app.py
+++ b/qutebrowser/app.py
@@ -410,10 +410,8 @@ def _init_modules(args, crash_handler):
log.init.debug("Initializing network...")
networkmanager.init()
- if qtutils.version_check('5.8'):
- # Otherwise we can only initialize it for QtWebKit because of crashes
- log.init.debug("Initializing proxy...")
- proxy.init()
+ log.init.debug("Initializing proxy...")
+ proxy.init()
log.init.debug("Initializing readline-bridge...")
readline_bridge = readline.ReadlineBridge()
diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py
index 8fead7269..0b448a845 100644
--- a/qutebrowser/browser/commands.py
+++ b/qutebrowser/browser/commands.py
@@ -280,9 +280,7 @@ class CommandDispatcher:
return
to_pin = not tab.data.pinned
- tab_index = self._current_index() if count is None else count - 1
- cmdutils.check_overflow(tab_index + 1, 'int')
- self._tabbed_browser.set_tab_pinned(tab_index, to_pin)
+ self._tabbed_browser.set_tab_pinned(tab, to_pin)
@cmdutils.register(instance='command-dispatcher', name='open',
maxsplit=0, scope='window')
@@ -515,7 +513,7 @@ class CommandDispatcher:
newtab.data.keep_icon = True
newtab.history.deserialize(history)
newtab.zoom.set_factor(curtab.zoom.factor())
- new_tabbed_browser.set_tab_pinned(idx, curtab.data.pinned)
+ new_tabbed_browser.set_tab_pinned(newtab, curtab.data.pinned)
return newtab
@cmdutils.register(instance='command-dispatcher', scope='window')
@@ -868,7 +866,7 @@ class CommandDispatcher:
@cmdutils.register(instance='command-dispatcher', scope='window')
@cmdutils.argument('count', count=True)
- def zoom(self, zoom: int = None, count=None):
+ def zoom(self, zoom=None, count=None):
"""Set the zoom level for the current tab.
The zoom can be given as argument or as [count]. If neither is
@@ -879,6 +877,13 @@ class CommandDispatcher:
zoom: The zoom percentage to set.
count: The zoom percentage to set.
"""
+ if zoom is not None:
+ try:
+ zoom = int(zoom.rstrip('%'))
+ except ValueError:
+ raise cmdexc.CommandError("zoom: Invalid int value {}"
+ .format(zoom))
+
level = count if count is not None else zoom
if level is None:
level = config.get('ui', 'default-zoom')
@@ -925,7 +930,7 @@ class CommandDispatcher:
@cmdutils.register(instance='command-dispatcher', scope='window')
def undo(self):
- """Re-open a closed tab (optionally skipping [count] closed tabs)."""
+ """Re-open a closed tab."""
try:
self._tabbed_browser.undo()
except IndexError:
diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py
index 66f3a1219..493a2a687 100644
--- a/qutebrowser/browser/webengine/webenginesettings.py
+++ b/qutebrowser/browser/webengine/webenginesettings.py
@@ -132,9 +132,6 @@ def _init_stylesheet(profile):
Mostly inspired by QupZilla:
https://github.com/QupZilla/qupzilla/blob/v2.0/src/lib/app/mainapplication.cpp#L1063-L1101
https://github.com/QupZilla/qupzilla/blob/v2.0/src/lib/tools/scripts.cpp#L119-L132
-
- FIXME:qtwebengine Use QWebEngineStyleSheet once that's available
- https://codereview.qt-project.org/#/c/148671/
"""
old_script = profile.scripts().findScript('_qute_stylesheet')
if not old_script.isNull():
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index 8acd0eda0..0a4c2dfc7 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -20,6 +20,7 @@
"""Wrapper over a QWebEngineView."""
import os
+import math
import functools
import sip
@@ -342,7 +343,7 @@ class WebEngineScroller(browsertab.AbstractScroller):
else:
perc_y = min(100, round(100 / dy * jsret['px']['y']))
- self._at_bottom = dy >= jsret['px']['y']
+ self._at_bottom = math.ceil(jsret['px']['y']) >= dy
self._pos_perc = perc_x, perc_y
self.perc_changed.emit(*self._pos_perc)
diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py
index fa626e863..c29aa15cb 100644
--- a/qutebrowser/browser/webkit/webkittab.py
+++ b/qutebrowser/browser/webkit/webkittab.py
@@ -33,7 +33,6 @@ from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtPrintSupport import QPrinter
from qutebrowser.browser import browsertab
-from qutebrowser.browser.network import proxy
from qutebrowser.browser.webkit import webview, tabhistory, webkitelem
from qutebrowser.browser.webkit.network import webkitqutescheme
from qutebrowser.utils import qtutils, objreg, usertypes, utils, log, debug
@@ -42,12 +41,6 @@ from qutebrowser.utils import qtutils, objreg, usertypes, utils, log, debug
def init():
"""Initialize QtWebKit-specific modules."""
qapp = QApplication.instance()
-
- if not qtutils.version_check('5.8'):
- # Otherwise we initialize it globally in app.py
- log.init.debug("Initializing proxy...")
- proxy.init()
-
log.init.debug("Initializing js-bridge...")
js_bridge = webkitqutescheme.JSBridge(qapp)
objreg.register('js-bridge', js_bridge)
diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py
index 28cf41ac5..32d80f3b7 100644
--- a/qutebrowser/config/configdata.py
+++ b/qutebrowser/config/configdata.py
@@ -437,14 +437,10 @@ def data(readonly=False):
"User agent to send. Empty to send the default."),
('proxy',
- SettingValue(typ.Proxy(), 'system',
- backends=(None if qtutils.version_check('5.8')
- else [usertypes.Backend.QtWebKit])),
+ SettingValue(typ.Proxy(), 'system'),
"The proxy to use.\n\n"
"In addition to the listed values, you can use a `socks://...` "
- "or `http://...` URL.\n\n"
- "This setting only works with Qt 5.8 or newer when using the "
- "QtWebEngine backend."),
+ "or `http://...` URL."),
('proxy-dns-requests',
SettingValue(typ.Bool(), 'true',
diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py
index b01c9d282..94508ab63 100644
--- a/qutebrowser/mainwindow/tabbedbrowser.py
+++ b/qutebrowser/mainwindow/tabbedbrowser.py
@@ -273,6 +273,8 @@ class TabbedBrowser(tabwidget.TabWidget):
"""
idx = self.indexOf(tab)
if idx == -1:
+ if crashed:
+ return
raise TabDeletedError("tab {} is not contained in "
"TabbedWidget!".format(tab))
if tab is self._now_focused:
@@ -340,7 +342,7 @@ class TabbedBrowser(tabwidget.TabWidget):
newtab = self.tabopen(url, background=False, idx=idx)
newtab.history.deserialize(history_data)
- self.set_tab_pinned(idx, pinned)
+ self.set_tab_pinned(newtab, pinned)
@pyqtSlot('QUrl', bool)
def openurl(self, url, newtab):
diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py
index d1beea7c7..eeee223aa 100644
--- a/qutebrowser/mainwindow/tabwidget.py
+++ b/qutebrowser/mainwindow/tabwidget.py
@@ -26,7 +26,7 @@ from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QSize, QRect, QPoint,
QTimer, QUrl)
from PyQt5.QtWidgets import (QTabWidget, QTabBar, QSizePolicy, QCommonStyle,
QStyle, QStylePainter, QStyleOptionTab,
- QStyleFactory)
+ QStyleFactory, QWidget)
from PyQt5.QtGui import QIcon, QPalette, QColor
from qutebrowser.utils import qtutils, objreg, utils, usertypes, log
@@ -94,17 +94,18 @@ class TabWidget(QTabWidget):
bar.set_tab_data(idx, 'indicator-color', color)
bar.update(bar.tabRect(idx))
- def set_tab_pinned(self, idx, pinned, *, loading=False):
+ def set_tab_pinned(self, tab: QWidget,
+ pinned: bool, *, loading: bool = False) -> None:
"""Set the tab status as pinned.
Args:
- idx: The tab index.
+ tab: The tab to pin
pinned: Pinned tab state to set.
loading: Whether to ignore current data state when
counting pinned_count.
"""
bar = self.tabBar()
- tab = self.widget(idx)
+ idx = self.indexOf(tab)
# Only modify pinned_count if we had a change
# always modify pinned_count if we are loading
diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py
index e0cbfbbc9..4993d6927 100644
--- a/qutebrowser/misc/earlyinit.py
+++ b/qutebrowser/misc/earlyinit.py
@@ -336,6 +336,7 @@ def check_libraries(backend):
"http://pyyaml.org/download/pyyaml/ (py3.4) "
"or Install via pip.",
pip="PyYAML"),
+ 'PyQt5.QtQml': _missing_str("PyQt5.QtQml"),
}
if backend == 'webengine':
modules['PyQt5.QtWebEngineWidgets'] = _missing_str("QtWebEngine",
diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py
index aa9a1be97..26656e1ee 100644
--- a/qutebrowser/misc/sessions.py
+++ b/qutebrowser/misc/sessions.py
@@ -406,7 +406,7 @@ class SessionManager(QObject):
tab_to_focus = i
if new_tab.data.pinned:
tabbed_browser.set_tab_pinned(
- i, new_tab.data.pinned, loading=True)
+ new_tab, new_tab.data.pinned, loading=True)
if tab_to_focus is not None:
tabbed_browser.setCurrentIndex(tab_to_focus)
if win.get('active', False):
@@ -420,7 +420,10 @@ class SessionManager(QObject):
def delete(self, name):
"""Delete a session."""
path = self._get_session_path(name, check_exists=True)
- os.remove(path)
+ try:
+ os.remove(path)
+ except OSError as e:
+ raise SessionError(e)
self.update_completion.emit()
def list_sessions(self):
@@ -516,7 +519,7 @@ class SessionManager(QObject):
self.delete(name)
except SessionNotFoundError:
raise cmdexc.CommandError("Session {} not found!".format(name))
- except (OSError, SessionError) as e:
+ except SessionError as e:
log.sessions.exception("Error while deleting session!")
raise cmdexc.CommandError("Error while deleting session: {}"
.format(e))
diff --git a/qutebrowser/qutebrowser.py b/qutebrowser/qutebrowser.py
index eba5b6884..e163a9f8d 100644
--- a/qutebrowser/qutebrowser.py
+++ b/qutebrowser/qutebrowser.py
@@ -64,8 +64,7 @@ def get_argparser():
help="How URLs should be opened if there is already a "
"qutebrowser instance running.")
parser.add_argument('--backend', choices=['webkit', 'webengine'],
- help="Which backend to use (webengine backend is "
- "EXPERIMENTAL!).")
+ help="Which backend to use.")
parser.add_argument('--enable-webengine-inspector', action='store_true',
help="Enable the web inspector for QtWebEngine. Note "
"that this is a SECURITY RISK and you should not "
diff --git a/scripts/dev/build_release.py b/scripts/dev/build_release.py
index 073b9a58e..e6a4f89e1 100755
--- a/scripts/dev/build_release.py
+++ b/scripts/dev/build_release.py
@@ -64,7 +64,7 @@ def call_tox(toxenv, *args, python=sys.executable):
env['PYTHON'] = python
env['PATH'] = os.environ['PATH'] + os.pathsep + os.path.dirname(python)
subprocess.check_call(
- [sys.executable, '-m', 'tox', '-v', '-e', toxenv] + list(args),
+ [sys.executable, '-m', 'tox', '-vv', '-e', toxenv] + list(args),
env=env)
@@ -109,8 +109,11 @@ def patch_osx_app():
for f in glob.glob(os.path.join(qtwe_core_dir, 'Resources', '*')):
dest = os.path.join(app_path, 'Contents', 'Resources')
if os.path.isdir(f):
- shutil.copytree(f, os.path.join(dest, f))
+ dir_dest = os.path.join(dest, os.path.basename(f))
+ print("Copying directory {} to {}".format(f, dir_dest))
+ shutil.copytree(f, dir_dest)
else:
+ print("Copying {} to {}".format(f, dest))
shutil.copy(f, dest)
# Link dependencies
for lib in ['QtCore', 'QtWebEngineCore', 'QtQuick', 'QtQml', 'QtNetwork',
@@ -124,7 +127,16 @@ def patch_osx_app():
def build_osx():
"""Build OS X .dmg/.app."""
+ utils.print_title("Cleaning up...")
+ for f in ['wc.dmg', 'template.dmg']:
+ try:
+ os.remove(f)
+ except FileNotFoundError:
+ pass
+ for d in ['dist', 'build']:
+ shutil.rmtree(d, ignore_errors=True)
utils.print_title("Updating 3rdparty content")
+ # Currently disabled because QtWebEngine has no pdfjs support
# update_3rdparty.run(ace=False, pdfjs=True, fancy_dmg=False)
utils.print_title("Building .app via pyinstaller")
call_tox('pyinstaller', '-r')
@@ -132,25 +144,24 @@ def build_osx():
patch_osx_app()
utils.print_title("Building .dmg")
subprocess.check_call(['make', '-f', 'scripts/dev/Makefile-dmg'])
- utils.print_title("Cleaning up...")
- for f in ['wc.dmg', 'template.dmg']:
- os.remove(f)
- for d in ['dist', 'build']:
- shutil.rmtree(d)
dmg_name = 'qutebrowser-{}.dmg'.format(qutebrowser.__version__)
os.rename('qutebrowser.dmg', dmg_name)
utils.print_title("Running smoke test")
- with tempfile.TemporaryDirectory() as tmpdir:
- subprocess.check_call(['hdiutil', 'attach', dmg_name,
- '-mountpoint', tmpdir])
- try:
- binary = os.path.join(tmpdir, 'qutebrowser.app', 'Contents',
- 'MacOS', 'qutebrowser')
- smoke_test(binary)
- finally:
- subprocess.check_call(['hdiutil', 'detach', tmpdir])
+
+ try:
+ with tempfile.TemporaryDirectory() as tmpdir:
+ subprocess.check_call(['hdiutil', 'attach', dmg_name,
+ '-mountpoint', tmpdir])
+ try:
+ binary = os.path.join(tmpdir, 'qutebrowser.app', 'Contents',
+ 'MacOS', 'qutebrowser')
+ smoke_test(binary)
+ finally:
+ subprocess.call(['hdiutil', 'detach', tmpdir])
+ except PermissionError as e:
+ print("Failed to remove tempdir: {}".format(e))
return [(dmg_name, 'application/x-apple-diskimage', 'OS X .dmg')]
@@ -167,6 +178,7 @@ def patch_windows(out_dir):
def build_windows():
"""Build windows executables/setups."""
utils.print_title("Updating 3rdparty content")
+ # Currently disabled because QtWebEngine has no pdfjs support
# update_3rdparty.run(ace=False, pdfjs=True, fancy_dmg=False)
utils.print_title("Building Windows binaries")
@@ -203,8 +215,8 @@ def build_windows():
'/DVERSION={}'.format(qutebrowser.__version__),
'misc/qutebrowser.nsi'])
- name_32 = 'qutebrowser-{}-win32.msi'.format(qutebrowser.__version__)
- name_64 = 'qutebrowser-{}-amd64.msi'.format(qutebrowser.__version__)
+ name_32 = 'qutebrowser-{}-win32.exe'.format(qutebrowser.__version__)
+ name_64 = 'qutebrowser-{}-amd64.exe'.format(qutebrowser.__version__)
artifacts += [
(os.path.join('dist', name_32),
diff --git a/scripts/dev/ci/travis_install.sh b/scripts/dev/ci/travis_install.sh
index 0ada134c1..9bcb5e07c 100644
--- a/scripts/dev/ci/travis_install.sh
+++ b/scripts/dev/ci/travis_install.sh
@@ -43,6 +43,12 @@ travis_retry() {
}
apt_install() {
+ sudo tee /etc/apt/sources.list <<EOF
+deb http://us.archive.ubuntu.com/ubuntu/ trusty main
+deb http://us.archive.ubuntu.com/ubuntu/ trusty-security main
+deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates main
+EOF
+ sudo rm -rf /etc/apt/sources.list.d
travis_retry sudo apt-get -y -q update
travis_retry sudo apt-get -y -q install --no-install-recommends "$@"
}
@@ -64,8 +70,9 @@ npm_install() {
}
install_node() {
- curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
- apt_install nodejs
+ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
+ travis_retry sudo apt-get -y -q update
+ travis_retry sudo apt-get -y -q install --no-install-recommends nodejs
}
check_pyqt() {
diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py
index 7445a99c6..a202edeb3 100755
--- a/scripts/dev/src2asciidoc.py
+++ b/scripts/dev/src2asciidoc.py
@@ -365,8 +365,7 @@ def generate_commands(filename):
def _generate_setting_section(f, sectname, sect):
"""Generate documentation for a single section."""
- version_dependent_options = [('network', 'proxy'),
- ('general', 'print-element-backgrounds')]
+ version_dependent_options = [('general', 'print-element-backgrounds')]
for optname, option in sect.items():
f.write("\n")
f.write('[[{}-{}]]'.format(sectname, optname) + "\n")
diff --git a/tests/end2end/features/downloads.feature b/tests/end2end/features/downloads.feature
index 95b775303..07e062610 100644
--- a/tests/end2end/features/downloads.feature
+++ b/tests/end2end/features/downloads.feature
@@ -579,9 +579,9 @@ Feature: Downloading things from a website.
And I wait until the download is finished
Then the downloaded file content-size should exist
- @posix
Scenario: Downloading to unwritable destination
- When I set storage -> prompt-download-directory to false
+ When the unwritable dir is unwritable
+ And I set storage -> prompt-download-directory to false
And I run :download http://localhost:(port)/data/downloads/download.bin --dest (tmpdir)/downloads/unwritable
Then the error "Download error: Permission denied" should be shown
diff --git a/tests/end2end/features/scroll.feature b/tests/end2end/features/scroll.feature
index a69b6ffae..28658e1e6 100644
--- a/tests/end2end/features/scroll.feature
+++ b/tests/end2end/features/scroll.feature
@@ -292,6 +292,13 @@ Feature: Scrolling
And I run :scroll-page --bottom-navigate next 0 1
Then data/hello2.txt should be loaded
+ Scenario: :scroll-page with --bottom-navigate when not at the bottom
+ When I run :scroll-px 0 10
+ And I wait until the scroll position changed
+ And I run :scroll-page --bottom-navigate next 0 1
+ Then the following tabs should be open:
+ - data/scroll/simple.html
+
Scenario: :scroll-page with --top-navigate
When I run :scroll-page --top-navigate prev 0 -1
Then data/hello3.txt should be loaded
diff --git a/tests/end2end/features/tabs.feature b/tests/end2end/features/tabs.feature
index 9980b448f..8097f390e 100644
--- a/tests/end2end/features/tabs.feature
+++ b/tests/end2end/features/tabs.feature
@@ -1073,6 +1073,16 @@ Feature: Tab management
- data/numbers/2.txt (pinned)
- data/numbers/3.txt (active)
+ Scenario: :tab-pin with an invalid count
+ When I open data/numbers/1.txt
+ And I open data/numbers/2.txt in a new tab
+ And I open data/numbers/3.txt in a new tab
+ And I run :tab-pin with count 23
+ Then the following tabs should be open:
+ - data/numbers/1.txt
+ - data/numbers/2.txt
+ - data/numbers/3.txt (active)
+
Scenario: Pinned :tab-close prompt yes
When I open data/numbers/1.txt
And I run :tab-pin
diff --git a/tests/end2end/features/test_downloads_bdd.py b/tests/end2end/features/test_downloads_bdd.py
index 25eb52aad..4be175a66 100644
--- a/tests/end2end/features/test_downloads_bdd.py
+++ b/tests/end2end/features/test_downloads_bdd.py
@@ -21,6 +21,7 @@ import os
import sys
import shlex
+import pytest
import pytest_bdd as bdd
bdd.scenarios('downloads.feature')
@@ -53,6 +54,14 @@ def clean_old_downloads(quteproc):
quteproc.send_cmd(':download-clear')
+@bdd.when("the unwritable dir is unwritable")
+def check_unwritable(tmpdir):
+ unwritable = tmpdir / 'downloads' / 'unwritable'
+ if os.access(str(unwritable), os.W_OK):
+ # Docker container or similar
+ pytest.skip("Unwritable dir was writable")
+
+
@bdd.when("I wait until the download is finished")
def wait_for_download_finished(quteproc):
quteproc.wait_for(category='downloads', message='Download * finished')
diff --git a/tests/end2end/features/zoom.feature b/tests/end2end/features/zoom.feature
index 015b85b17..bc36afe0d 100644
--- a/tests/end2end/features/zoom.feature
+++ b/tests/end2end/features/zoom.feature
@@ -51,6 +51,11 @@ Feature: Zooming in and out
Then the message "Zoom level: 50%" should be shown
And the zoom should be 50%
+ Scenario: Setting zoom with trailing %
+ When I run :zoom 50%
+ Then the message "Zoom level: 50%" should be shown
+ And the zoom should be 50%
+
Scenario: Setting zoom with count
When I run :zoom with count 40
Then the message "Zoom level: 40%" should be shown
diff --git a/tests/unit/config/old_configs/qutebrowser-v0.11.0.conf b/tests/unit/config/old_configs/qutebrowser-v0.11.0.conf
new file mode 100644
index 000000000..ba48a6ff5
--- /dev/null
+++ b/tests/unit/config/old_configs/qutebrowser-v0.11.0.conf
@@ -0,0 +1,251 @@
+[general]
+ignore-case = smart
+startpage = https://start.duckduckgo.com
+yank-ignored-url-parameters = ref,utm_source,utm_medium,utm_campaign,utm_term,utm_content
+default-open-dispatcher =
+default-page = ${startpage}
+auto-search = naive
+auto-save-config = true
+auto-save-interval = 15000
+editor = gvim -f "{}"
+editor-encoding = utf-8
+private-browsing = false
+developer-extras = false
+print-element-backgrounds = true
+xss-auditing = false
+default-encoding = iso-8859-1
+new-instance-open-target = tab
+new-instance-open-target.window = last-focused
+log-javascript-console = debug
+save-session = false
+session-default-name =
+url-incdec-segments = path,query
+[ui]
+history-session-interval = 30
+zoom-levels = 25%,33%,50%,67%,75%,90%,100%,110%,125%,150%,175%,200%,250%,300%,400%,500%
+default-zoom = 100%
+downloads-position = top
+status-position = bottom
+message-timeout = 2000
+message-unfocused = false
+confirm-quit = never
+zoom-text-only = false
+frame-flattening = false
+user-stylesheet =
+hide-scrollbar = true
+smooth-scrolling = false
+remove-finished-downloads = -1
+hide-statusbar = false
+statusbar-padding = 1,1,0,0
+window-title-format = {perc}{title}{title_sep}qutebrowser
+modal-js-dialog = false
+hide-wayland-decoration = false
+keyhint-blacklist =
+keyhint-delay = 500
+prompt-radius = 8
+prompt-filebrowser = true
+[network]
+do-not-track = true
+accept-language = en-US,en
+referer-header = same-domain
+user-agent =
+proxy = system
+proxy-dns-requests = true
+ssl-strict = ask
+dns-prefetch = true
+custom-headers =
+netrc-file =
+[completion]
+show = always
+download-path-suggestion = path
+timestamp-format = %Y-%m-%d
+height = 50%
+cmd-history-max-items = 100
+web-history-max-items = 1000
+quick-complete = true
+shrink = false
+scrollbar-width = 12
+scrollbar-padding = 2
+[input]
+timeout = 500
+partial-timeout = 5000
+insert-mode-on-plugins = false
+auto-leave-insert-mode = true
+auto-insert-mode = false
+forward-unbound-keys = auto
+spatial-navigation = false
+links-included-in-focus-chain = true
+rocker-gestures = false
+mouse-zoom-divider = 512
+[tabs]
+background-tabs = false
+select-on-remove = next
+new-tab-position = next
+new-tab-position-explicit = last
+last-close = ignore
+show = always
+show-switching-delay = 800
+wrap = true
+movable = true
+close-mouse-button = middle
+position = top
+show-favicons = true
+favicon-scale = 1.0
+width = 20%
+pinned-width = 43
+indicator-width = 3
+tabs-are-windows = false
+title-format = {index}: {title}
+title-format-pinned = {index}
+title-alignment = left
+mousewheel-tab-switching = true
+padding = 0,0,5,5
+indicator-padding = 2,2,0,4
+[storage]
+download-directory =
+prompt-download-directory = true
+remember-download-directory = true
+maximum-pages-in-cache = 0
+offline-web-application-cache = true
+local-storage = true
+cache-size =
+[content]
+allow-images = true
+allow-javascript = true
+allow-plugins = false
+webgl = true
+hyperlink-auditing = false
+geolocation = ask
+notifications = ask
+media-capture = ask
+javascript-can-open-windows-automatically = false
+javascript-can-close-windows = false
+javascript-can-access-clipboard = false
+ignore-javascript-prompt = false
+ignore-javascript-alert = false
+local-content-can-access-remote-urls = false
+local-content-can-access-file-urls = true
+cookies-accept = no-3rdparty
+cookies-store = true
+host-block-lists = https://www.malwaredomainlist.com/hostslist/hosts.txt,http://someonewhocares.org/hosts/hosts,http://winhelp2002.mvps.org/hosts.zip,http://malwaredomains.lehigh.edu/files/justdomains.zip,https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext
+host-blocking-enabled = true
+host-blocking-whitelist = piwik.org
+enable-pdfjs = false
+[hints]
+border = 1px solid #E3BE23
+mode = letter
+chars = asdfghjkl
+min-chars = 1
+scatter = true
+uppercase = false
+dictionary = /usr/share/dict/words
+auto-follow = unique-match
+auto-follow-timeout = 0
+next-regexes = \bnext\b,\bmore\b,\bnewer\b,\b[>→≫]\b,\b(>>|»)\b,\bcontinue\b
+prev-regexes = \bprev(ious)?\b,\bback\b,\bolder\b,\b[<←≪]\b,\b(<<|«)\b
+find-implementation = python
+hide-unmatched-rapid-hints = true
+[searchengines]
+DEFAULT = https://duckduckgo.com/?q={}
+[aliases]
+[colors]
+completion.fg = white
+completion.bg = #333333
+completion.alternate-bg = #444444
+completion.category.fg = white
+completion.category.bg = qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #888888, stop:1 #505050)
+completion.category.border.top = black
+completion.category.border.bottom = ${completion.category.border.top}
+completion.item.selected.fg = black
+completion.item.selected.bg = #e8c000
+completion.item.selected.border.top = #bbbb00
+completion.item.selected.border.bottom = ${completion.item.selected.border.top}
+completion.match.fg = #ff4444
+completion.scrollbar.fg = ${completion.fg}
+completion.scrollbar.bg = ${completion.bg}
+statusbar.fg = white
+statusbar.bg = black
+statusbar.fg.private = ${statusbar.fg}
+statusbar.bg.private = #666666
+statusbar.fg.insert = ${statusbar.fg}
+statusbar.bg.insert = darkgreen
+statusbar.fg.command = ${statusbar.fg}
+statusbar.bg.command = ${statusbar.bg}
+statusbar.fg.command.private = ${statusbar.fg.private}
+statusbar.bg.command.private = ${statusbar.bg.private}
+statusbar.fg.caret = ${statusbar.fg}
+statusbar.bg.caret = purple
+statusbar.fg.caret-selection = ${statusbar.fg}
+statusbar.bg.caret-selection = #a12dff
+statusbar.progress.bg = white
+statusbar.url.fg = ${statusbar.fg}
+statusbar.url.fg.success = white
+statusbar.url.fg.success.https = lime
+statusbar.url.fg.error = orange
+statusbar.url.fg.warn = yellow
+statusbar.url.fg.hover = aqua
+tabs.fg.odd = white
+tabs.bg.odd = grey
+tabs.fg.even = white
+tabs.bg.even = darkgrey
+tabs.fg.selected.odd = white
+tabs.bg.selected.odd = black
+tabs.fg.selected.even = ${tabs.fg.selected.odd}
+tabs.bg.selected.even = ${tabs.bg.selected.odd}
+tabs.bg.bar = #555555
+tabs.indicator.start = #0000aa
+tabs.indicator.stop = #00aa00
+tabs.indicator.error = #ff0000
+tabs.indicator.system = rgb
+hints.fg = black
+hints.bg = qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 247, 133, 0.8), stop:1 rgba(255, 197, 66, 0.8))
+hints.fg.match = green
+downloads.bg.bar = black
+downloads.fg.start = white
+downloads.bg.start = #0000aa
+downloads.fg.stop = ${downloads.fg.start}
+downloads.bg.stop = #00aa00
+downloads.fg.system = rgb
+downloads.bg.system = rgb
+downloads.fg.error = white
+downloads.bg.error = red
+webpage.bg = white
+keyhint.fg = #FFFFFF
+keyhint.fg.suffix = #FFFF00
+keyhint.bg = rgba(0, 0, 0, 80%)
+messages.fg.error = white
+messages.bg.error = red
+messages.border.error = #bb0000
+messages.fg.warning = white
+messages.bg.warning = darkorange
+messages.border.warning = #d47300
+messages.fg.info = white
+messages.bg.info = black
+messages.border.info = #333333
+prompts.fg = white
+prompts.bg = darkblue
+prompts.selected.bg = #308cc6
+[fonts]
+_monospace = xos4 Terminus, Terminus, Monospace, "DejaVu Sans Mono", Monaco, "Bitstream Vera Sans Mono", "Andale Mono", "Courier New", Courier, "Liberation Mono", monospace, Fixed, Consolas, Terminal
+completion = 8pt ${_monospace}
+completion.category = bold ${completion}
+tabbar = 8pt ${_monospace}
+statusbar = 8pt ${_monospace}
+downloads = 8pt ${_monospace}
+hints = bold 13px ${_monospace}
+debug-console = 8pt ${_monospace}
+web-family-standard =
+web-family-fixed =
+web-family-serif =
+web-family-sans-serif =
+web-family-cursive =
+web-family-fantasy =
+web-size-minimum = 0
+web-size-minimum-logical = 6
+web-size-default = 16
+web-size-default-fixed = 13
+keyhint = 8pt ${_monospace}
+messages.error = 8pt ${_monospace}
+messages.warning = 8pt ${_monospace}
+messages.info = 8pt ${_monospace}
+prompts = 8pt sans-serif
diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py
index c897b9f16..be526dac3 100644
--- a/tests/unit/config/test_config.py
+++ b/tests/unit/config/test_config.py
@@ -408,7 +408,7 @@ class TestDefaultConfig:
If it did change, place a new qutebrowser-vx.y.z.conf in old_configs
and then increment the version.
"""
- assert qutebrowser.__version__ == '0.10.1'
+ assert qutebrowser.__version__ == '0.11.0'
@pytest.mark.parametrize('filename',
os.listdir(os.path.join(os.path.dirname(__file__), 'old_configs')),
diff --git a/tests/unit/misc/test_editor.py b/tests/unit/misc/test_editor.py
index de9125c8b..70886cda6 100644
--- a/tests/unit/misc/test_editor.py
+++ b/tests/unit/misc/test_editor.py
@@ -123,24 +123,30 @@ class TestFileHandling:
os.remove(filename)
- @pytest.mark.posix
def test_unreadable(self, message_mock, editor, caplog):
"""Test file handling when closing with an unreadable file."""
editor.edit("")
filename = editor._file.name
assert os.path.exists(filename)
os.chmod(filename, 0o077)
+ if os.access(filename, os.R_OK):
+ # Docker container or similar
+ pytest.skip("File was still readable")
+
with caplog.at_level(logging.ERROR):
editor._proc.finished.emit(0, QProcess.NormalExit)
assert not os.path.exists(filename)
msg = message_mock.getmsg(usertypes.MessageLevel.error)
assert msg.text.startswith("Failed to read back edited file: ")
- @pytest.mark.posix
def test_unwritable(self, monkeypatch, message_mock, editor, tmpdir,
caplog):
"""Test file handling when the initial file is not writable."""
tmpdir.chmod(0)
+ if os.access(str(tmpdir), os.W_OK):
+ # Docker container or similar
+ pytest.skip("File was still writable")
+
monkeypatch.setattr(editormod.tempfile, 'tempdir', str(tmpdir))
with caplog.at_level(logging.ERROR):
diff --git a/tox.ini b/tox.ini
index 722dad3c4..04cf826d1 100644
--- a/tox.ini
+++ b/tox.ini
@@ -4,7 +4,7 @@
# and then run "tox" from this directory.
[tox]
-envlist = py34,py35,py36-cov,misc,vulture,flake8,pylint,pyroma,check-manifest
+envlist = py36-cov,misc,vulture,flake8,pylint,pyroma,check-manifest,eslint
distshare = {toxworkdir}
skipsdist = true
@@ -111,6 +111,28 @@ deps =
PyQt5==5.8.2
commands = {envpython} -bb -m pytest {posargs:tests}
+[testenv:py35-pyqt59]
+basepython = python3.5
+setenv =
+ {[testenv]setenv}
+ QUTE_BDD_WEBENGINE=true
+passenv = {[testenv]passenv}
+deps =
+ {[testenv]deps}
+ PyQt5==5.9
+commands = {envpython} -bb -m pytest {posargs:tests}
+
+[testenv:py36-pyqt59]
+basepython = {env:PYTHON:python3.6}
+setenv =
+ {[testenv]setenv}
+ QUTE_BDD_WEBENGINE=true
+passenv = {[testenv]passenv}
+deps =
+ {[testenv]deps}
+ PyQt5==5.9
+commands = {envpython} -bb -m pytest {posargs:tests}
+
# other envs
[testenv:mkvenv]