From 2a56ec7ce4713711b55bb1dfc86a4320d943f606 Mon Sep 17 00:00:00 2001
From: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Date: Wed, 29 Jul 2015 11:04:20 +0200
Subject: [PATCH] add API to set the Accept-Language HTTP request-header field

Add methods to set the Accept-Language field in QWebEngineProfile and
QQuickWebEngineProfile.

Task-number: QTBUG-47412
Change-Id: Ifa376bb3551fdc1fb3d68279d734b7f7735782fc
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com>
---
 src/core/browser_context_adapter.cpp          | 10 ++++++++
 src/core/browser_context_adapter.h            |  4 ++++
 src/core/content_browser_client_qt.cpp        |  5 ++++
 src/core/content_browser_client_qt.h          |  1 +
 src/core/url_request_context_getter_qt.cpp    | 23 +++++++++++++++++--
 src/webengine/api/qquickwebengineprofile.cpp  | 22 ++++++++++++++++++
 src/webengine/api/qquickwebengineprofile_p.h  |  5 ++++
 .../api/qwebengineprofile.cpp                 | 22 ++++++++++++++++++
 src/webenginewidgets/api/qwebengineprofile.h  |  3 +++
 9 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/src/core/browser_context_adapter.cpp b/src/core/browser_context_adapter.cpp
index fdb410e66..14f3b1c6c 100644
--- a/src/core/browser_context_adapter.cpp
+++ b/src/core/browser_context_adapter.cpp
@@ -368,4 +368,14 @@ void BrowserContextAdapter::permissionRequestReply(const QUrl &origin, Permissio
     static_cast<PermissionManagerQt*>(browserContext()->GetPermissionManager())->permissionRequestReply(origin, type, reply);
 }
 
+QString BrowserContextAdapter::httpAcceptLanguage() const
+{
+    return m_httpAcceptLanguage;
+}
+
+void BrowserContextAdapter::setHttpAcceptLanguage(const QString &httpAcceptLanguage)
+{
+    m_httpAcceptLanguage = httpAcceptLanguage;
+}
+
 } // namespace QtWebEngineCore
diff --git a/src/core/browser_context_adapter.h b/src/core/browser_context_adapter.h
index d8609108c..d58d8a4be 100644
--- a/src/core/browser_context_adapter.h
+++ b/src/core/browser_context_adapter.h
@@ -151,6 +151,9 @@ public:
 
     void permissionRequestReply(const QUrl &origin, PermissionType type, bool reply);
 
+    QString httpAcceptLanguage() const;
+    void setHttpAcceptLanguage(const QString &httpAcceptLanguage);
+
 private:
     QString m_name;
     bool m_offTheRecord;
@@ -165,6 +168,7 @@ private:
     QString m_cachePath;
     QString m_httpUserAgent;
     HttpCacheType m_httpCacheType;
+    QString m_httpAcceptLanguage;
     PersistentCookiesPolicy m_persistentCookiesPolicy;
     VisitedLinksPolicy m_visitedLinksPolicy;
     QVector<CustomUrlSchemeHandler*> m_customUrlSchemeHandlers;
diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
index f38451901..a8cb54c0c 100644
--- a/src/core/content_browser_client_qt.cpp
+++ b/src/core/content_browser_client_qt.cpp
@@ -422,6 +422,11 @@ std::string ContentBrowserClientQt::GetApplicationLocale()
     return WebEngineLibraryInfo::getApplicationLocale();
 }
 
+std::string ContentBrowserClientQt::GetAcceptLangs(content::BrowserContext *context)
+{
+    return static_cast<BrowserContextQt*>(context)->adapter()->httpAcceptLanguage().toStdString();
+}
+
 void ContentBrowserClientQt::AppendExtraCommandLineSwitches(base::CommandLine* command_line, int child_process_id)
 {
     Q_UNUSED(child_process_id);
diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h
index f6add6805..eea7d2a22 100644
--- a/src/core/content_browser_client_qt.h
+++ b/src/core/content_browser_client_qt.h
@@ -106,6 +106,7 @@ public:
     virtual net::URLRequestContextGetter *CreateRequestContext(content::BrowserContext *browser_context, content::ProtocolHandlerMap *protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptorss) Q_DECL_OVERRIDE;
 
     virtual std::string GetApplicationLocale() Q_DECL_OVERRIDE;
+    std::string GetAcceptLangs(content::BrowserContext* context) Q_DECL_OVERRIDE;
     virtual void AppendExtraCommandLineSwitches(base::CommandLine* command_line, int child_process_id) Q_DECL_OVERRIDE;
 
 #if defined(ENABLE_PLUGINS)
diff --git a/src/core/url_request_context_getter_qt.cpp b/src/core/url_request_context_getter_qt.cpp
index 7db1fa094..0eb5163f9 100644
--- a/src/core/url_request_context_getter_qt.cpp
+++ b/src/core/url_request_context_getter_qt.cpp
@@ -236,13 +236,32 @@ void URLRequestContextGetterQt::updateUserAgent()
         content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::generateUserAgent, this));
 }
 
+class HttpUserAgentSettingsQt : public net::HttpUserAgentSettings
+{
+    const BrowserContextAdapter *m_browserContext;
+public:
+    HttpUserAgentSettingsQt(const BrowserContextAdapter *ctx)
+        : m_browserContext(ctx)
+    {
+    }
+
+    std::string GetAcceptLanguage() const Q_DECL_OVERRIDE
+    {
+        return m_browserContext->httpAcceptLanguage().toStdString();
+    }
+
+    std::string GetUserAgent() const Q_DECL_OVERRIDE
+    {
+        return m_browserContext->httpUserAgent().toStdString();
+    }
+};
+
 void URLRequestContextGetterQt::generateUserAgent()
 {
     Q_ASSERT(m_urlRequestContext);
     Q_ASSERT(m_storage);
 
-    m_storage->set_http_user_agent_settings(
-        new net::StaticHttpUserAgentSettings("en-us,en", m_browserContext->httpUserAgent().toStdString()));
+    m_storage->set_http_user_agent_settings(new HttpUserAgentSettingsQt(m_browserContext));
 }
 
 void URLRequestContextGetterQt::updateHttpCache()
diff --git a/src/webengine/api/qquickwebengineprofile.cpp b/src/webengine/api/qquickwebengineprofile.cpp
index 75ac6bb62..38b042fff 100644
--- a/src/webengine/api/qquickwebengineprofile.cpp
+++ b/src/webengine/api/qquickwebengineprofile.cpp
@@ -399,6 +399,28 @@ void QQuickWebEngineProfile::setHttpCacheMaximumSize(int maximumSize)
     emit httpCacheMaximumSizeChanged();
 }
 
+/*!
+    \qmlproperty QString WebEngineProfile::httpAcceptLanguage
+
+    The value of the Accept-Language HTTP request-header field.
+
+    \since QtWebEngine 1.2
+*/
+QString QQuickWebEngineProfile::httpAcceptLanguage() const
+{
+    Q_D(const QQuickWebEngineProfile);
+    return d->browserContext()->httpAcceptLanguage();
+}
+
+void QQuickWebEngineProfile::setHttpAcceptLanguage(const QString &httpAcceptLanguage)
+{
+    Q_D(QQuickWebEngineProfile);
+    if (d->browserContext()->httpAcceptLanguage() == httpAcceptLanguage)
+        return;
+    d->browserContext()->setHttpAcceptLanguage(httpAcceptLanguage);
+    emit httpAcceptLanguageChanged();
+}
+
 QQuickWebEngineProfile *QQuickWebEngineProfile::defaultProfile()
 {
     static QQuickWebEngineProfile *profile = new QQuickWebEngineProfile(
diff --git a/src/webengine/api/qquickwebengineprofile_p.h b/src/webengine/api/qquickwebengineprofile_p.h
index 3978fc5e0..174734fa1 100644
--- a/src/webengine/api/qquickwebengineprofile_p.h
+++ b/src/webengine/api/qquickwebengineprofile_p.h
@@ -63,6 +63,7 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineProfile : public QObject {
     Q_PROPERTY(QString cachePath READ cachePath WRITE setCachePath NOTIFY cachePathChanged FINAL)
     Q_PROPERTY(QString httpUserAgent READ httpUserAgent WRITE setHttpUserAgent NOTIFY httpUserAgentChanged FINAL)
     Q_PROPERTY(HttpCacheType httpCacheType READ httpCacheType WRITE setHttpCacheType NOTIFY httpCacheTypeChanged FINAL)
+    Q_PROPERTY(QString httpAcceptLanguage READ httpAcceptLanguage WRITE setHttpAcceptLanguage NOTIFY httpAcceptLanguageChanged FINAL)
     Q_PROPERTY(PersistentCookiesPolicy persistentCookiesPolicy READ persistentCookiesPolicy WRITE setPersistentCookiesPolicy NOTIFY persistentCookiesPolicyChanged FINAL)
     Q_PROPERTY(int httpCacheMaximumSize READ httpCacheMaximumSize WRITE setHttpCacheMaximumSize NOTIFY httpCacheMaximumSizeChanged FINAL)
 public:
@@ -104,6 +105,9 @@ public:
     int httpCacheMaximumSize() const;
     void setHttpCacheMaximumSize(int maxSize);
 
+    Q_REVISION(2) QString httpAcceptLanguage() const;
+    Q_REVISION(2) void setHttpAcceptLanguage(const QString &httpAcceptLanguage);
+
     static QQuickWebEngineProfile *defaultProfile();
 
 signals:
@@ -115,6 +119,7 @@ signals:
     void httpCacheTypeChanged();
     void persistentCookiesPolicyChanged();
     void httpCacheMaximumSizeChanged();
+    Q_REVISION(2) void httpAcceptLanguageChanged();
 
     void downloadRequested(QQuickWebEngineDownloadItem *download);
     void downloadFinished(QQuickWebEngineDownloadItem *download);
diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp
index b73355ac2..29010b0dd 100644
--- a/src/webenginewidgets/api/qwebengineprofile.cpp
+++ b/src/webenginewidgets/api/qwebengineprofile.cpp
@@ -354,6 +354,28 @@ void QWebEngineProfile::setHttpCacheType(QWebEngineProfile::HttpCacheType httpCa
     d->browserContext()->setHttpCacheType(BrowserContextAdapter::HttpCacheType(httpCacheType));
 }
 
+/*!
+    Sets the value of the Accept-Language HTTP request-header field.
+
+    \since 5.6
+ */
+void QWebEngineProfile::setHttpAcceptLanguage(const QString &httpAcceptLanguage)
+{
+    Q_D(QWebEngineProfile);
+    d->browserContext()->setHttpAcceptLanguage(httpAcceptLanguage);
+}
+
+/*!
+    Returns the value of the Accept-Language HTTP request-header field.
+
+    \since 5.6
+ */
+QString QWebEngineProfile::httpAcceptLanguage() const
+{
+    Q_D(const QWebEngineProfile);
+    return d->browserContext()->httpAcceptLanguage();
+}
+
 /*!
     Returns the current policy for persistent cookies.
 
diff --git a/src/webenginewidgets/api/qwebengineprofile.h b/src/webenginewidgets/api/qwebengineprofile.h
index c90ea01e5..09160fecb 100644
--- a/src/webenginewidgets/api/qwebengineprofile.h
+++ b/src/webenginewidgets/api/qwebengineprofile.h
@@ -89,6 +89,9 @@ public:
     HttpCacheType httpCacheType() const;
     void setHttpCacheType(QWebEngineProfile::HttpCacheType);
 
+    void setHttpAcceptLanguage(const QString &httpAcceptLanguage);
+    QString httpAcceptLanguage() const;
+
     PersistentCookiesPolicy persistentCookiesPolicy() const;
     void setPersistentCookiesPolicy(QWebEngineProfile::PersistentCookiesPolicy);
 
-- 
GitLab