summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-03-10 17:14:27 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-03-12 06:43:56 +0100
commit199ea00a9eea13315a652c62778738629185b059 (patch)
treec2ed79d1ac9dfec274b700e7c3c4662db5e1942e
parentb93c7e4cdb516ade74c5de6a63b5e4d8bbf45f22 (diff)
Fix normalization of app locales
Use the internal Chromium routine to get the app locale Chromium expects. Fixes: QTBUG-91715 Change-Id: I5042eb066cb6879ad69628959912f2841867b4e8 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
-rw-r--r--src/core/content_browser_client_qt.cpp7
-rw-r--r--src/core/content_browser_client_qt.h2
-rw-r--r--src/core/web_engine_library_info.cpp18
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp24
4 files changed, 40 insertions, 11 deletions
diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
index e13ecd8d1..c2c78ff8b 100644
--- a/src/core/content_browser_client_qt.cpp
+++ b/src/core/content_browser_client_qt.cpp
@@ -471,7 +471,12 @@ std::unique_ptr<net::ClientCertStore> ContentBrowserClientQt::CreateClientCertSt
std::string ContentBrowserClientQt::GetApplicationLocale()
{
- return WebEngineLibraryInfo::getApplicationLocale();
+ std::string bcp47Name = QLocale().bcp47Name().toStdString();
+ if (m_cachedQtLocale != bcp47Name) {
+ m_cachedQtLocale = bcp47Name;
+ m_appLocale = WebEngineLibraryInfo::getApplicationLocale();
+ }
+ return m_appLocale;
}
std::string ContentBrowserClientQt::GetAcceptLangs(content::BrowserContext *context)
diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h
index 7c8aa3ac9..1ccd2926d 100644
--- a/src/core/content_browser_client_qt.h
+++ b/src/core/content_browser_client_qt.h
@@ -269,6 +269,8 @@ public:
private:
scoped_refptr<ShareGroupQtQuick> m_shareGroupQtQuick;
+ std::string m_appLocale;
+ std::string m_cachedQtLocale;
};
} // namespace QtWebEngineCore
diff --git a/src/core/web_engine_library_info.cpp b/src/core/web_engine_library_info.cpp
index 2ad5b7565..09a4141b0 100644
--- a/src/core/web_engine_library_info.cpp
+++ b/src/core/web_engine_library_info.cpp
@@ -46,6 +46,7 @@
#include "components/spellcheck/spellcheck_buildflags.h"
#include "content/public/common/content_paths.h"
#include "sandbox/policy/switches.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/base/ui_base_paths.h"
#include "ui/base/ui_base_switches.h"
@@ -353,18 +354,15 @@ base::string16 WebEngineLibraryInfo::getApplicationName()
std::string WebEngineLibraryInfo::getApplicationLocale()
{
base::CommandLine *parsedCommandLine = base::CommandLine::ForCurrentProcess();
- if (!parsedCommandLine->HasSwitch(switches::kLang)) {
+ if (parsedCommandLine->HasSwitch(switches::kLang)) {
+ return parsedCommandLine->GetSwitchValueASCII(switches::kLang);
+ } else {
const QString &locale = QLocale().bcp47Name();
-
- // QLocale::bcp47Name returns "en" for American English locale. Chromium requires the "US" suffix
- // to clarify the dialect and ignores the shorter version.
- if (locale == "en")
- return "en-US";
-
- return locale.toStdString();
+ std::string resolvedLocale;
+ if (l10n_util::CheckAndResolveLocale(locale.toStdString(), &resolvedLocale))
+ return resolvedLocale;
}
-
- return parsedCommandLine->GetSwitchValueASCII(switches::kLang);
+ return "en-US";
}
#if defined(OS_WIN)
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index 021986381..bf2c28ae6 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -123,6 +123,7 @@ private Q_SLOTS:
void doNotBreakLayout();
void changeLocale();
+ void mixLangLocale();
void inputMethodsTextFormat_data();
void inputMethodsTextFormat();
void keyboardEvents();
@@ -1210,6 +1211,29 @@ void tst_QWebEngineView::changeLocale()
QCOMPARE(errorLines.first().toUtf8(), QByteArrayLiteral("Die Website ist nicht erreichbar"));
}
+void tst_QWebEngineView::mixLangLocale()
+{
+ for (QString locale : { "en_DK", "de_CH", "eu_ES" }) {
+ QLocale::setDefault(locale);
+ QWebEngineView view;
+ QSignalSpy loadSpy(&view, &QWebEngineView::loadFinished);
+
+ bool terminated = false;
+ auto sc = connect(view.page(), &QWebEnginePage::renderProcessTerminated, [&] () { terminated = true; });
+
+ view.load(QUrl("qrc:///resources/dummy.html"));
+ QTRY_VERIFY(terminated || loadSpy.count() == 1);
+
+ QVERIFY2(!terminated,
+ qPrintable(QString("Locale [%1] terminated: %2, loaded: %3").arg(locale).arg(terminated).arg(loadSpy.count())));
+ QVERIFY(loadSpy.first().first().toBool());
+
+ QString content = toPlainTextSync(view.page());
+ QVERIFY2(!content.isEmpty() && content.contains("test content"), qPrintable(content));
+ }
+ QLocale::setDefault(QLocale("en"));
+}
+
void tst_QWebEngineView::inputMethodsTextFormat_data()
{
QTest::addColumn<QString>("string");