diff options
author | Florian Bruhin <me@the-compiler.org> | 2019-12-20 10:49:27 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2019-12-20 11:29:39 +0100 |
commit | 6ecae98d97a2851c5de4897e04a2878e12bcad20 (patch) | |
tree | 0dcbd414e330b55090497148197e14948c6ab775 | |
parent | 3fe89ce84fa585332493995a3c54b613b7c640c3 (diff) | |
download | qutebrowser-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.py | 105 | ||||
-rw-r--r-- | qutebrowser/extensions/interceptors.py | 3 | ||||
-rw-r--r-- | tests/unit/browser/webengine/test_webengineinterceptor.py | 20 |
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 |