diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-07-24 12:32:25 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-08-01 15:29:51 +0000 |
commit | 6a5f8d69fc1d090326fa92a0b24bd494369c2d0d (patch) | |
tree | c5d21e50d796a110eb7345bd691d3ba11065528c /src | |
parent | b80a0ef3c1af16ba74c2b9e931c18266362ce926 (diff) |
Add DNS prefetching
Turns out we did no have DNS prefetching. It requires an extra
component. The same component can also do pre-connect, but we do not
enable that, as it requires a predictive browsing backend.
[ChangeLog][Settings] DnsPrefetchEnabled added, but disabled by default.
Change-Id: Ieb036435b9f1a72a7be302e38e89e0c347c7176b
Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/content_browser_client_qt.cpp | 19 | ||||
-rw-r--r-- | src/core/content_browser_client_qt.h | 2 | ||||
-rw-r--r-- | src/core/qtwebengine.gni | 3 | ||||
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.cpp | 8 | ||||
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.h | 6 | ||||
-rw-r--r-- | src/core/web_engine_settings.cpp | 2 | ||||
-rw-r--r-- | src/core/web_engine_settings.h | 1 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginesettings.cpp | 22 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginesettings_p.h | 4 | ||||
-rw-r--r-- | src/webengine/plugin/plugin.cpp | 1 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginesettings.cpp | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginesettings.h | 1 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc | 4 |
13 files changed, 75 insertions, 0 deletions
diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index a7a2605eb..2d4ac3552 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -49,6 +49,7 @@ #include "components/spellcheck/browser/spellcheck_message_filter_platform.h" #endif #endif +#include "components/network_hints/browser/network_hints_message_filter.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/common/url_schemes.h" #include "content/public/browser/browser_main_parts.h" @@ -410,6 +411,11 @@ void ContentBrowserClientQt::RenderProcessWillLaunch(content::RenderProcessHost* { const int id = host->GetID(); Profile *profile = Profile::FromBrowserContext(host->GetBrowserContext()); + content::BrowserThread::PostTaskAndReplyWithResult( + content::BrowserThread::IO, FROM_HERE, + base::Bind(&net::URLRequestContextGetter::GetURLRequestContext, base::Unretained(profile->GetRequestContext())), + base::Bind(&ContentBrowserClientQt::AddNetworkHintsMessageFilter, base::Unretained(this), id)); + // FIXME: Add a settings variable to enable/disable the file scheme. content::ChildProcessSecurityPolicy::GetInstance()->GrantScheme(id, url::kFileScheme); static_cast<ProfileQt*>(host->GetBrowserContext())->m_profileAdapter->userResourceController()->renderProcessStartedWithHost(host); @@ -776,6 +782,19 @@ void ContentBrowserClientQt::GetGeolocationRequestContext( base::BindOnce(&GetSystemRequestContextOnUIThread), std::move(callback)); } +void ContentBrowserClientQt::AddNetworkHintsMessageFilter(int render_process_id, net::URLRequestContext *context) +{ + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + content::RenderProcessHost* host = content::RenderProcessHost::FromID(render_process_id); + if (!host) + return; + + content::BrowserMessageFilter *network_hints_message_filter( + new network_hints::NetworkHintsMessageFilter(context->host_resolver())); + host->AddFilter(network_hints_message_filter); +} + bool ContentBrowserClientQt::AllowGetCookie(const GURL &url, const GURL &first_party, const net::CookieList & /*cookie_list*/, diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h index 5a3fafd1a..a7f4313ea 100644 --- a/src/core/content_browser_client_qt.h +++ b/src/core/content_browser_client_qt.h @@ -198,6 +198,8 @@ public: private: void InitFrameInterfaces(); + void AddNetworkHintsMessageFilter(int render_process_id, net::URLRequestContext *context); + BrowserMainPartsQt* m_browserMainParts; std::unique_ptr<content::ResourceDispatcherHostDelegate> m_resourceDispatcherHostDelegate; scoped_refptr<ShareGroupQtQuick> m_shareGroupQtQuick; diff --git a/src/core/qtwebengine.gni b/src/core/qtwebengine.gni index 0fd8e4085..db3acfb50 100644 --- a/src/core/qtwebengine.gni +++ b/src/core/qtwebengine.gni @@ -16,6 +16,9 @@ deps = [ "//components/cdm/renderer", "//components/error_page/common", "//components/keyed_service/content", + "//components/network_hints/browser", + "//components/network_hints/common", + "//components/network_hints/renderer", "//components/visitedlink/browser", "//components/visitedlink/renderer", "//components/web_cache/browser", diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 707efc1c1..79c2294de 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -51,6 +51,7 @@ #include "components/error_page/common/error.h" #include "components/error_page/common/error_page_params.h" #include "components/error_page/common/localized_error.h" +#include "components/network_hints/renderer/prescient_networking_dispatcher.h" #if QT_CONFIG(webengine_printing_and_pdf) #include "components/printing/renderer/print_render_frame_helper.h" #endif @@ -114,6 +115,8 @@ void ContentRendererClientQt::RenderThreadStarted() m_visitedLinkSlave.reset(new visitedlink::VisitedLinkSlave); m_webCacheImpl.reset(new web_cache::WebCacheImpl()); + m_prescientNetworkingDispatcher.reset(new network_hints::PrescientNetworkingDispatcher()); + auto registry = std::make_unique<service_manager::BinderRegistry>(); registry->AddInterface(m_visitedLinkSlave->GetBindCallback(), base::ThreadTaskRunnerHandle::Get()); @@ -239,6 +242,11 @@ bool ContentRendererClientQt::IsLinkVisited(unsigned long long linkHash) return m_visitedLinkSlave->IsVisited(linkHash); } +blink::WebPrescientNetworking *ContentRendererClientQt::GetPrescientNetworking() +{ + return m_prescientNetworkingDispatcher.get(); +} + void ContentRendererClientQt::OnStart() { context()->connector()->BindConnectorRequest(std::move(m_connectorRequest)); diff --git a/src/core/renderer/content_renderer_client_qt.h b/src/core/renderer/content_renderer_client_qt.h index a919c6ab6..2a353caa6 100644 --- a/src/core/renderer/content_renderer_client_qt.h +++ b/src/core/renderer/content_renderer_client_qt.h @@ -53,6 +53,10 @@ namespace error_page { class Error; } +namespace network_hints { +class PrescientNetworkingDispatcher; +} + namespace visitedlink { class VisitedLinkSlave; } @@ -89,6 +93,7 @@ public: unsigned long long VisitedLinkHash(const char *canonicalUrl, size_t length) override; bool IsLinkVisited(unsigned long long linkHash) override; + blink::WebPrescientNetworking* GetPrescientNetworking() override; void AddSupportedKeySystems(std::vector<std::unique_ptr<media::KeySystemProperties>>* key_systems) override; void RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) override; @@ -123,6 +128,7 @@ private: service_manager::mojom::ConnectorRequest m_connectorRequest; std::unique_ptr<service_manager::ServiceContext> m_serviceContext; service_manager::BinderRegistry m_registry; + std::unique_ptr<network_hints::PrescientNetworkingDispatcher> m_prescientNetworkingDispatcher; DISALLOW_COPY_AND_ASSIGN(ContentRendererClientQt); }; diff --git a/src/core/web_engine_settings.cpp b/src/core/web_engine_settings.cpp index 129a3f01d..2e48a806a 100644 --- a/src/core/web_engine_settings.cpp +++ b/src/core/web_engine_settings.cpp @@ -298,6 +298,7 @@ void WebEngineSettings::initDefaults() s_defaultAttributes.insert(PlaybackRequiresUserGesture, playbackRequiresUserGesture); s_defaultAttributes.insert(WebRTCPublicInterfacesOnly, false); s_defaultAttributes.insert(JavascriptCanPaste, false); + s_defaultAttributes.insert(DnsPrefetchEnabled, false); } if (s_defaultFontFamilies.isEmpty()) { @@ -390,6 +391,7 @@ void WebEngineSettings::applySettingsToWebPreferences(content::WebPreferences *p : content::AutoplayPolicy::kNoUserGestureRequired; } prefs->dom_paste_enabled = testAttribute(JavascriptCanPaste); + prefs->dns_prefetching_enabled = testAttribute(DnsPrefetchEnabled); // Fonts settings. prefs->standard_font_family_map[content::kCommonScript] = toString16(fontFamily(StandardFont)); diff --git a/src/core/web_engine_settings.h b/src/core/web_engine_settings.h index ec99c5a29..06a7a6004 100644 --- a/src/core/web_engine_settings.h +++ b/src/core/web_engine_settings.h @@ -102,6 +102,7 @@ public: PlaybackRequiresUserGesture, WebRTCPublicInterfacesOnly, JavascriptCanPaste, + DnsPrefetchEnabled, }; // Must match the values from the public API in qwebenginesettings.h. diff --git a/src/webengine/api/qquickwebenginesettings.cpp b/src/webengine/api/qquickwebenginesettings.cpp index 6203f20f1..6e96e76cf 100644 --- a/src/webengine/api/qquickwebenginesettings.cpp +++ b/src/webengine/api/qquickwebenginesettings.cpp @@ -443,6 +443,20 @@ bool QQuickWebEngineSettings::javascriptCanPaste() const } /*! + \qmlproperty bool WebEngineSettings::dnsPrefetchEnabled + \since QtWebEngine 1.8 + + Enables speculative prefetching of DNS records for HTML links before + they are activated. + + Disabled by default. +*/ +bool QQuickWebEngineSettings::dnsPrefetchEnabled() const +{ + return d_ptr->testAttribute(WebEngineSettings::DnsPrefetchEnabled); +} + +/*! \qmlproperty string WebEngineSettings::defaultTextEncoding \since QtWebEngine 1.2 @@ -692,6 +706,14 @@ void QQuickWebEngineSettings::setJavascriptCanPaste(bool on) Q_EMIT javascriptCanPasteChanged(); } +void QQuickWebEngineSettings::setDnsPrefetchEnabled(bool on) +{ + bool wasOn = d_ptr->testAttribute(WebEngineSettings::DnsPrefetchEnabled); + d_ptr->setAttribute(WebEngineSettings::DnsPrefetchEnabled, on); + if (wasOn != on) + Q_EMIT dnsPrefetchEnabledChanged(); +} + void QQuickWebEngineSettings::setUnknownUrlSchemePolicy(QQuickWebEngineSettings::UnknownUrlSchemePolicy policy) { WebEngineSettings::UnknownUrlSchemePolicy oldPolicy = d_ptr->unknownUrlSchemePolicy(); diff --git a/src/webengine/api/qquickwebenginesettings_p.h b/src/webengine/api/qquickwebenginesettings_p.h index ca583379d..179416b54 100644 --- a/src/webengine/api/qquickwebenginesettings_p.h +++ b/src/webengine/api/qquickwebenginesettings_p.h @@ -92,6 +92,7 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineSettings : public QObject { Q_PROPERTY(bool playbackRequiresUserGesture READ playbackRequiresUserGesture WRITE setPlaybackRequiresUserGesture NOTIFY playbackRequiresUserGestureChanged REVISION 6 FINAL) Q_PROPERTY(bool webRTCPublicInterfacesOnly READ webRTCPublicInterfacesOnly WRITE setWebRTCPublicInterfacesOnly NOTIFY webRTCPublicInterfacesOnlyChanged REVISION 6 FINAL) Q_PROPERTY(bool javascriptCanPaste READ javascriptCanPaste WRITE setJavascriptCanPaste NOTIFY javascriptCanPasteChanged REVISION 6 FINAL) + Q_PROPERTY(bool dnsPrefetchEnabled READ dnsPrefetchEnabled WRITE setDnsPrefetchEnabled NOTIFY dnsPrefetchEnabledChanged REVISION 7 FINAL) public: enum UnknownUrlSchemePolicy { @@ -133,6 +134,7 @@ public: bool playbackRequiresUserGesture() const; bool webRTCPublicInterfacesOnly() const; bool javascriptCanPaste() const; + bool dnsPrefetchEnabled() const; void setAutoLoadImages(bool on); void setJavascriptEnabled(bool on); @@ -163,6 +165,7 @@ public: void setPlaybackRequiresUserGesture(bool on); void setWebRTCPublicInterfacesOnly(bool on); void setJavascriptCanPaste(bool on); + void setDnsPrefetchEnabled(bool on); signals: void autoLoadImagesChanged(); @@ -194,6 +197,7 @@ signals: Q_REVISION(6) void playbackRequiresUserGestureChanged(); Q_REVISION(6) void webRTCPublicInterfacesOnlyChanged(); Q_REVISION(6) void javascriptCanPasteChanged(); + Q_REVISION(7) void dnsPrefetchEnabledChanged(); private: explicit QQuickWebEngineSettings(QQuickWebEngineSettings *parentSettings = 0); diff --git a/src/webengine/plugin/plugin.cpp b/src/webengine/plugin/plugin.cpp index d81b797fc..545f17f82 100644 --- a/src/webengine/plugin/plugin.cpp +++ b/src/webengine/plugin/plugin.cpp @@ -119,6 +119,7 @@ public: qmlRegisterUncreatableType<QQuickWebEngineSettings, 4>(uri, 1, 5, "WebEngineSettings", tr("Cannot create a separate instance of WebEngineSettings")); qmlRegisterUncreatableType<QQuickWebEngineSettings, 5>(uri, 1, 6, "WebEngineSettings", tr("Cannot create a separate instance of WebEngineSettings")); qmlRegisterUncreatableType<QQuickWebEngineSettings, 6>(uri, 1, 7, "WebEngineSettings", tr("Cannot create a separate instance of WebEngineSettings")); + qmlRegisterUncreatableType<QQuickWebEngineSettings, 7>(uri, 1, 8, "WebEngineSettings", tr("Cannot create a separate instance of WebEngineSettings")); qmlRegisterSingletonType<QQuickWebEngineSingleton>(uri, 1, 1, "WebEngine", webEngineSingletonProvider); qmlRegisterUncreatableType<QQuickWebEngineHistory>(uri, 1, 1, "NavigationHistory", tr("Cannot create a separate instance of NavigationHistory")); diff --git a/src/webenginewidgets/api/qwebenginesettings.cpp b/src/webenginewidgets/api/qwebenginesettings.cpp index 32f9b75cd..d91eb3f97 100644 --- a/src/webenginewidgets/api/qwebenginesettings.cpp +++ b/src/webenginewidgets/api/qwebenginesettings.cpp @@ -107,6 +107,8 @@ static WebEngineSettings::Attribute toWebEngineAttribute(QWebEngineSettings::Web return WebEngineSettings::WebRTCPublicInterfacesOnly; case QWebEngineSettings::JavascriptCanPaste: return WebEngineSettings::JavascriptCanPaste; + case QWebEngineSettings::DnsPrefetchEnabled: + return WebEngineSettings::DnsPrefetchEnabled; default: return WebEngineSettings::UnsupportedInCoreSettings; diff --git a/src/webenginewidgets/api/qwebenginesettings.h b/src/webenginewidgets/api/qwebenginesettings.h index 1815396b6..9100e32d5 100644 --- a/src/webenginewidgets/api/qwebenginesettings.h +++ b/src/webenginewidgets/api/qwebenginesettings.h @@ -95,6 +95,7 @@ public: PlaybackRequiresUserGesture, WebRTCPublicInterfacesOnly, JavascriptCanPaste, + DnsPrefetchEnabled, }; enum FontSize { diff --git a/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc index 18187d86e..88f6e05c2 100644 --- a/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc @@ -185,6 +185,10 @@ local network IP addresses, but remote hosts can also see your local network IP address. Disabled by default. (Added in Qt 5.11) + \value DnsPrefetchEnabled Specifies whether WebEngine will try to pre-fetch DNS entries to + speed up browsing. + Disabled by default. (Added in Qt 5.12) + */ /*! |