summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2019-12-20 10:49:27 +0100
committerFlorian Bruhin <me@the-compiler.org>2019-12-20 11:29:39 +0100
commit6ecae98d97a2851c5de4897e04a2878e12bcad20 (patch)
tree0dcbd414e330b55090497148197e14948c6ab775
parent3fe89ce84fa585332493995a3c54b613b7c640c3 (diff)
downloadqutebrowser-6ecae98d97a2851c5de4897e04a2878e12bcad20.tar.gz
qutebrowser-6ecae98d97a2851c5de4897e04a2878e12bcad20.zip
Qt 5.14: Add interceptors.ResourceType.Preload(Main|Sub)Frame
This requires the dict to be built dynamically because only newer PyQt versions define those keys. See
-rw-r--r--qutebrowser/browser/webengine/interceptor.py105
-rw-r--r--qutebrowser/extensions/interceptors.py3
-rw-r--r--tests/unit/browser/webengine/test_webengineinterceptor.py20
3 files changed, 75 insertions, 53 deletions
diff --git a/qutebrowser/browser/webengine/interceptor.py b/qutebrowser/browser/webengine/interceptor.py
index 55badb813..6d15b9c40 100644
--- a/qutebrowser/browser/webengine/interceptor.py
+++ b/qutebrowser/browser/webengine/interceptor.py
@@ -63,49 +63,65 @@ class WebEngineRequest(interceptors.Request):
class RequestInterceptor(QWebEngineUrlRequestInterceptor):
"""Handle ad blocking and custom headers."""
- # This dict should be from QWebEngine Resource Types to qutebrowser
- # extension ResourceTypes. If a ResourceType is added to Qt, this table
- # should be updated too.
- RESOURCE_TYPES = {
- QWebEngineUrlRequestInfo.ResourceTypeMainFrame:
- interceptors.ResourceType.main_frame,
- QWebEngineUrlRequestInfo.ResourceTypeSubFrame:
- interceptors.ResourceType.sub_frame,
- QWebEngineUrlRequestInfo.ResourceTypeStylesheet:
- interceptors.ResourceType.stylesheet,
- QWebEngineUrlRequestInfo.ResourceTypeScript:
- interceptors.ResourceType.script,
- QWebEngineUrlRequestInfo.ResourceTypeImage:
- interceptors.ResourceType.image,
- QWebEngineUrlRequestInfo.ResourceTypeFontResource:
- interceptors.ResourceType.font_resource,
- QWebEngineUrlRequestInfo.ResourceTypeSubResource:
- interceptors.ResourceType.sub_resource,
- QWebEngineUrlRequestInfo.ResourceTypeObject:
- interceptors.ResourceType.object,
- QWebEngineUrlRequestInfo.ResourceTypeMedia:
- interceptors.ResourceType.media,
- QWebEngineUrlRequestInfo.ResourceTypeWorker:
- interceptors.ResourceType.worker,
- QWebEngineUrlRequestInfo.ResourceTypeSharedWorker:
- interceptors.ResourceType.shared_worker,
- QWebEngineUrlRequestInfo.ResourceTypePrefetch:
- interceptors.ResourceType.prefetch,
- QWebEngineUrlRequestInfo.ResourceTypeFavicon:
- interceptors.ResourceType.favicon,
- QWebEngineUrlRequestInfo.ResourceTypeXhr:
- interceptors.ResourceType.xhr,
- QWebEngineUrlRequestInfo.ResourceTypePing:
- interceptors.ResourceType.ping,
- QWebEngineUrlRequestInfo.ResourceTypeServiceWorker:
- interceptors.ResourceType.service_worker,
- QWebEngineUrlRequestInfo.ResourceTypeCspReport:
- interceptors.ResourceType.csp_report,
- QWebEngineUrlRequestInfo.ResourceTypePluginResource:
- interceptors.ResourceType.plugin_resource,
- QWebEngineUrlRequestInfo.ResourceTypeUnknown:
- interceptors.ResourceType.unknown,
- }
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ # This dict should be from QWebEngine Resource Types to qutebrowser
+ # extension ResourceTypes. If a ResourceType is added to Qt, this table
+ # should be updated too.
+ self._resource_types = {
+ QWebEngineUrlRequestInfo.ResourceTypeMainFrame:
+ interceptors.ResourceType.main_frame,
+ QWebEngineUrlRequestInfo.ResourceTypeSubFrame:
+ interceptors.ResourceType.sub_frame,
+ QWebEngineUrlRequestInfo.ResourceTypeStylesheet:
+ interceptors.ResourceType.stylesheet,
+ QWebEngineUrlRequestInfo.ResourceTypeScript:
+ interceptors.ResourceType.script,
+ QWebEngineUrlRequestInfo.ResourceTypeImage:
+ interceptors.ResourceType.image,
+ QWebEngineUrlRequestInfo.ResourceTypeFontResource:
+ interceptors.ResourceType.font_resource,
+ QWebEngineUrlRequestInfo.ResourceTypeSubResource:
+ interceptors.ResourceType.sub_resource,
+ QWebEngineUrlRequestInfo.ResourceTypeObject:
+ interceptors.ResourceType.object,
+ QWebEngineUrlRequestInfo.ResourceTypeMedia:
+ interceptors.ResourceType.media,
+ QWebEngineUrlRequestInfo.ResourceTypeWorker:
+ interceptors.ResourceType.worker,
+ QWebEngineUrlRequestInfo.ResourceTypeSharedWorker:
+ interceptors.ResourceType.shared_worker,
+ QWebEngineUrlRequestInfo.ResourceTypePrefetch:
+ interceptors.ResourceType.prefetch,
+ QWebEngineUrlRequestInfo.ResourceTypeFavicon:
+ interceptors.ResourceType.favicon,
+ QWebEngineUrlRequestInfo.ResourceTypeXhr:
+ interceptors.ResourceType.xhr,
+ QWebEngineUrlRequestInfo.ResourceTypePing:
+ interceptors.ResourceType.ping,
+ QWebEngineUrlRequestInfo.ResourceTypeServiceWorker:
+ interceptors.ResourceType.service_worker,
+ QWebEngineUrlRequestInfo.ResourceTypeCspReport:
+ interceptors.ResourceType.csp_report,
+ QWebEngineUrlRequestInfo.ResourceTypePluginResource:
+ interceptors.ResourceType.plugin_resource,
+ QWebEngineUrlRequestInfo.ResourceTypeUnknown:
+ interceptors.ResourceType.unknown,
+ }
+
+ try:
+ preload_main_frame = (QWebEngineUrlRequestInfo.
+ ResourceTypeNavigationPreloadMainFrame)
+ preload_sub_frame = (QWebEngineUrlRequestInfo.
+ ResourceTypeNavigationPreloadSubFrame)
+ except AttributeError:
+ # Added in Qt 5.14
+ pass
+ else:
+ self._resource_types[preload_main_frame] = (
+ interceptors.ResourceType.preload_main_frame)
+ self._resource_types[preload_sub_frame] = (
+ interceptors.ResourceType.preload_sub_frame)
def install(self, profile):
"""Install the interceptor on the given QWebEngineProfile."""
@@ -155,8 +171,7 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor):
# Per QWebEngineUrlRequestInfo::ResourceType documentation, if we fail
# our lookup, we should fall back to ResourceTypeUnknown
try:
- resource_type = RequestInterceptor.RESOURCE_TYPES[
- info.resourceType()]
+ resource_type = self._resource_types[info.resourceType()]
except KeyError:
log.webview.warning(
"Resource type {} not found in RequestInterceptor dict."
diff --git a/qutebrowser/extensions/interceptors.py b/qutebrowser/extensions/interceptors.py
index a72fe6cfa..58bd3f2bc 100644
--- a/qutebrowser/extensions/interceptors.py
+++ b/qutebrowser/extensions/interceptors.py
@@ -52,6 +52,9 @@ class ResourceType(enum.Enum):
service_worker = 15
csp_report = 16
plugin_resource = 17
+ # 18 is "preload", deprecated in Chromium
+ preload_main_frame = 19
+ preload_sub_frame = 20
unknown = 255
diff --git a/tests/unit/browser/webengine/test_webengineinterceptor.py b/tests/unit/browser/webengine/test_webengineinterceptor.py
index 9ea8ddcf5..437a014e8 100644
--- a/tests/unit/browser/webengine/test_webengineinterceptor.py
+++ b/tests/unit/browser/webengine/test_webengineinterceptor.py
@@ -29,11 +29,15 @@ from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInfo
from qutebrowser.browser.webengine import interceptor
-class TestWebengineInterceptor:
-
- def test_requestinfo_dict_valid(self):
- """Test that the RESOURCE_TYPES dict is not missing any values."""
- qb_keys = interceptor.RequestInterceptor.RESOURCE_TYPES.keys()
- qt_keys = {i for i in vars(QWebEngineUrlRequestInfo).values()
- if isinstance(i, QWebEngineUrlRequestInfo.ResourceType)}
- assert qt_keys == qb_keys
+def test_no_missing_resource_types():
+ request_interceptor = interceptor.RequestInterceptor()
+ qb_keys = request_interceptor._resource_types.keys()
+ qt_keys = {i for i in vars(QWebEngineUrlRequestInfo).values()
+ if isinstance(i, QWebEngineUrlRequestInfo.ResourceType)}
+ assert qt_keys == qb_keys
+
+
+def test_resource_type_values():
+ request_interceptor = interceptor.RequestInterceptor()
+ for qt_value, qb_item in request_interceptor._resource_types.items():
+ assert qt_value == qb_item.value