From a029f27a6e98a43e8f1492b85ca18007670d9b28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Mon, 4 Dec 2017 18:34:17 +0000 Subject: [PATCH] Ensure navigator.language agrees with navigator.languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Although perhaps not strictly required by the specification, it is at least quite clearly suggested that navigator.language should equal the first element of navigator.languages (see note in [1]). [1]: https://html.spec.whatwg.org/multipage/system-state.html#language-preferences Changes in behavior: - navigator.language: Previously returned DefaultLanguage() which may or may not have matched the first element of navigator.languages. Now always returns the first element from navigator.languages. - navigator.languages: Previously would return an empty list if ChromeClient's AcceptLanguages() happened to return an empty string. Now always returns a non-empty list (the existing DefaultLanguage() fallback is extended to cover this case too). Bug: 351715 Change-Id: Id945ec3958180991c0abcfec4e5c191d3cb5e9cf Reviewed-on: https://chromium-review.googlesource.com/581295 Commit-Queue: Mounir Lamouri Reviewed-by: David Bokan Reviewed-by: Mounir Lamouri Reviewed-by: Philip Jägenstedt Cr-Commit-Position: refs/heads/master@{#521394} --- AUTHORS | 1 + .../navigatorlanguage-expected.txt | 4 --- .../navigator_language.html | 27 ++++++++----------- .../WebKit/Source/core/frame/Navigator.cpp | 14 +++++----- .../Source/core/frame/NavigatorLanguage.cpp | 2 +- 5 files changed, 21 insertions(+), 27 deletions(-) delete mode 100644 third_party/WebKit/LayoutTests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage-expected.txt diff --git a/AUTHORS b/AUTHORS index 296de9b5467bbd..d7f0a3dc9b6723 100644 --- a/AUTHORS +++ b/AUTHORS @@ -419,6 +419,7 @@ JungJik Lee Jungkee Song Junmin Zhu Justin Okamoto +Jüri Valdmann Kai Jiang Kai Köhne Kal Conley diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage-expected.txt deleted file mode 100644 index 725a6475ea1819..00000000000000 --- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage-expected.txt +++ /dev/null @@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL NavigatorLanguage: the most preferred language is the one returned by navigator.language assert_equals: navigator.languages is the most preferred language first expected (string) "en-US" but got (undefined) undefined -Harness: the test ran to completion. - diff --git a/third_party/WebKit/LayoutTests/navigator_language/navigator_language.html b/third_party/WebKit/LayoutTests/navigator_language/navigator_language.html index 313fc3ec2b8c30..bcae825ca009df 100644 --- a/third_party/WebKit/LayoutTests/navigator_language/navigator_language.html +++ b/third_party/WebKit/LayoutTests/navigator_language/navigator_language.html @@ -90,16 +90,16 @@ test(function() { var testValues = [ - { accept_languages: 'foo', language: 'foo', languages: ['foo'] }, - { accept_languages: '', language: '', languages: [] }, - { accept_languages: 'foo,bar', language: 'foo', languages: [ 'foo', 'bar' ] }, - { accept_languages: ' foo , bar ', language: 'foo', languages: [ 'foo', 'bar' ] }, - { accept_languages: ' foo ; bar ', language: 'foo ; bar', languages: [ 'foo ; bar' ] }, - { accept_languages: '_foo_', language: '_foo_', languages: ['_foo_'] }, - { accept_languages: 'en_', language: 'en-', languages: ['en-'] }, - { accept_languages: 'en__', language: 'en-_', languages: ['en-_'] }, - { accept_languages: 'en_US, fr_FR', language: 'en-US', languages: ['en-US', 'fr-FR'] }, - { accept_languages: 'en_US_CA', language: 'en-US_CA', languages: ['en-US_CA'] }, + { accept_languages: 'foo', languages: ['foo'] }, + { accept_languages: '', languages: ['en-US'] }, + { accept_languages: 'foo,bar', languages: [ 'foo', 'bar' ] }, + { accept_languages: ' foo , bar ', languages: [ 'foo', 'bar' ] }, + { accept_languages: ' foo ; bar ', languages: [ 'foo ; bar' ] }, + { accept_languages: '_foo_', languages: ['_foo_'] }, + { accept_languages: 'en_', languages: ['en-'] }, + { accept_languages: 'en__', languages: ['en-_'] }, + { accept_languages: 'en_US, fr_FR', languages: ['en-US', 'fr-FR'] }, + { accept_languages: 'en_US_CA', languages: ['en-US_CA'] }, ]; var eventsCount = 0; @@ -114,7 +114,7 @@ assert_equals(eventsCount, i + 1); assert_equals(navigator.languages.length, data.languages.length); - // FIXME: test navigator.language + assert_equals(navigator.language, data.languages[0]); for (var j = 0; j < navigator.languages.length; ++j) { assert_equals(navigator.languages[j], data.languages[j]); } @@ -130,11 +130,6 @@ assert_not_equals(navigator.languages, previous); }, "Test navigator.languages' caching behaviour."); -test(function() { - // The region code should be uppercase. - assert_equals(navigator.language, 'en-US'); -}, 'Test the default navigator.language in the test environment.'); - diff --git a/third_party/WebKit/Source/core/frame/Navigator.cpp b/third_party/WebKit/Source/core/frame/Navigator.cpp index e4b136c5f9fcd2..250b74e5bb8ed7 100644 --- a/third_party/WebKit/Source/core/frame/Navigator.cpp +++ b/third_party/WebKit/Source/core/frame/Navigator.cpp @@ -88,16 +88,15 @@ bool Navigator::cookieEnabled() const { } Vector Navigator::languages() { - Vector languages; languages_changed_ = false; - if (!GetFrame() || !GetFrame()->GetPage()) { - languages.push_back(DefaultLanguage()); - return languages; + String accept_languages; + if (GetFrame() && GetFrame()->GetPage()) { + accept_languages = + GetFrame()->GetPage()->GetChromeClient().AcceptLanguages(); } - String accept_languages = - GetFrame()->GetPage()->GetChromeClient().AcceptLanguages(); + Vector languages; accept_languages.Split(',', languages); // Sanitizing tokens. We could do that more extensively but we should assume @@ -110,6 +109,9 @@ Vector Navigator::languages() { token.replace(2, 1, "-"); } + if (languages.IsEmpty()) + languages.push_back(DefaultLanguage()); + return languages; } diff --git a/third_party/WebKit/Source/core/frame/NavigatorLanguage.cpp b/third_party/WebKit/Source/core/frame/NavigatorLanguage.cpp index 7163b9d40b1343..00a5dfac9dd818 100644 --- a/third_party/WebKit/Source/core/frame/NavigatorLanguage.cpp +++ b/third_party/WebKit/Source/core/frame/NavigatorLanguage.cpp @@ -11,7 +11,7 @@ namespace blink { NavigatorLanguage::NavigatorLanguage() {} AtomicString NavigatorLanguage::language() { - return DefaultLanguage(); + return AtomicString(languages().front()); } bool NavigatorLanguage::hasLanguagesChanged() const {