summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-07-24 12:32:25 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-08-01 15:29:51 +0000
commit6a5f8d69fc1d090326fa92a0b24bd494369c2d0d (patch)
treec5d21e50d796a110eb7345bd691d3ba11065528c
parentb80a0ef3c1af16ba74c2b9e931c18266362ce926 (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>
-rw-r--r--src/core/content_browser_client_qt.cpp19
-rw-r--r--src/core/content_browser_client_qt.h2
-rw-r--r--src/core/qtwebengine.gni3
-rw-r--r--src/core/renderer/content_renderer_client_qt.cpp8
-rw-r--r--src/core/renderer/content_renderer_client_qt.h6
-rw-r--r--src/core/web_engine_settings.cpp2
-rw-r--r--src/core/web_engine_settings.h1
-rw-r--r--src/webengine/api/qquickwebenginesettings.cpp22
-rw-r--r--src/webengine/api/qquickwebenginesettings_p.h4
-rw-r--r--src/webengine/plugin/plugin.cpp1
-rw-r--r--src/webenginewidgets/api/qwebenginesettings.cpp2
-rw-r--r--src/webenginewidgets/api/qwebenginesettings.h1
-rw-r--r--src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc4
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)
+
*/
/*!