OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.android_webview.test; | 5 package org.chromium.android_webview.test; |
6 | 6 |
7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
8 import android.os.Build; | 8 import android.os.Build; |
9 import android.os.LocaleList; | 9 import android.os.LocaleList; |
10 import android.test.suitebuilder.annotation.SmallTest; | 10 import android.test.suitebuilder.annotation.SmallTest; |
11 import android.text.TextUtils; | 11 import android.text.TextUtils; |
12 | 12 |
13 import org.chromium.android_webview.AwContents; | 13 import org.chromium.android_webview.AwContents; |
14 import org.chromium.android_webview.test.util.JSUtils; | 14 import org.chromium.android_webview.test.util.JSUtils; |
15 import org.chromium.base.LocaleUtils; | 15 import org.chromium.base.LocaleUtils; |
16 import org.chromium.base.test.util.Feature; | 16 import org.chromium.base.test.util.Feature; |
17 import org.chromium.base.test.util.MinAndroidSdkLevel; | 17 import org.chromium.base.test.util.MinAndroidSdkLevel; |
18 import org.chromium.net.test.EmbeddedTestServer; | 18 import org.chromium.net.test.EmbeddedTestServer; |
19 | 19 |
20 import java.util.Arrays; | |
21 import java.util.Locale; | 20 import java.util.Locale; |
22 import java.util.regex.Pattern; | 21 import java.util.regex.Pattern; |
23 | 22 |
24 /** | 23 /** |
25 * Tests for Accept Language implementation. | 24 * Tests for Accept Language implementation. |
26 */ | 25 */ |
27 public class AcceptLanguageTest extends AwTestBase { | 26 public class AcceptLanguageTest extends AwTestBase { |
28 private TestAwContentsClient mContentsClient; | 27 private TestAwContentsClient mContentsClient; |
29 private AwContents mAwContents; | 28 private AwContents mAwContents; |
30 | 29 |
(...skipping 16 matching lines...) Expand all Loading... |
47 | 46 |
48 private static final Pattern COMMA_AND_OPTIONAL_Q_VALUE = | 47 private static final Pattern COMMA_AND_OPTIONAL_Q_VALUE = |
49 Pattern.compile("(?:;q=[^,]+)?(?:,|$)"); | 48 Pattern.compile("(?:;q=[^,]+)?(?:,|$)"); |
50 | 49 |
51 /** | 50 /** |
52 * Extract the languages from the Accept-Language header. | 51 * Extract the languages from the Accept-Language header. |
53 * | 52 * |
54 * The Accept-Language header can have more than one language along with opt
ional quality | 53 * The Accept-Language header can have more than one language along with opt
ional quality |
55 * factors for each, e.g. | 54 * factors for each, e.g. |
56 * | 55 * |
57 * "de-DE,en-US;q=0.8,en-UK;q=0.5" | 56 * "de-DE,de;q=0.8,en-US;q=0.6,en-GB;q=0.4,en;q=0.2" |
58 * | 57 * |
59 * This function extracts only the language strings from the Accept-Language
header, so | 58 * This function extracts only the language strings from the Accept-Language
header, so |
60 * the example above would yield the following: | 59 * the example above would yield the following: |
61 * | 60 * |
62 * ["de-DE", "en-US", "en-UK"] | 61 * ["de-DE", "de", "en-US", "en-GB", "en"] |
63 * | 62 * |
64 * @param raw String containing the raw Accept-Language header | 63 * @param raw String containing the raw Accept-Language header |
65 * @return A list of languages as Strings. | 64 * @return A list of languages as Strings. |
66 */ | 65 */ |
67 private String[] getAcceptLanguages(String raw) { | 66 private String[] getAcceptLanguages(String raw) { |
68 return COMMA_AND_OPTIONAL_Q_VALUE.split(maybeStripDoubleQuotes(raw)); | 67 return COMMA_AND_OPTIONAL_Q_VALUE.split(maybeStripDoubleQuotes(raw)); |
69 } | 68 } |
70 | 69 |
71 /** | 70 /** |
72 * Verify that the Accept Language string is correct. | 71 * Verify that the Accept Language string is correct. |
(...skipping 11 matching lines...) Expand all Loading... |
84 String[] acceptLanguages = getAcceptLanguages( | 83 String[] acceptLanguages = getAcceptLanguages( |
85 JSUtils.executeJavaScriptAndWaitForResult( | 84 JSUtils.executeJavaScriptAndWaitForResult( |
86 this, mAwContents, mContentsClient.getOnEvaluateJavaScri
ptResultHelper(), | 85 this, mAwContents, mContentsClient.getOnEvaluateJavaScri
ptResultHelper(), |
87 "document.body.textContent")); | 86 "document.body.textContent")); |
88 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]); | 87 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]); |
89 | 88 |
90 String[] acceptLanguagesJs = getAcceptLanguages( | 89 String[] acceptLanguagesJs = getAcceptLanguages( |
91 JSUtils.executeJavaScriptAndWaitForResult( | 90 JSUtils.executeJavaScriptAndWaitForResult( |
92 this, mAwContents, mContentsClient.getOnEvaluateJavaScri
ptResultHelper(), | 91 this, mAwContents, mContentsClient.getOnEvaluateJavaScri
ptResultHelper(), |
93 "navigator.languages.join(',')")); | 92 "navigator.languages.join(',')")); |
94 assertEquals(acceptLanguagesJs.length, acceptLanguages.length); | 93 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguagesJs[0])
; |
95 for (int i = 0; i < acceptLanguagesJs.length; ++i) { | |
96 assertEquals(acceptLanguagesJs[i], acceptLanguages[i]); | |
97 } | |
98 | 94 |
99 // Test locale change at run time | 95 // Test locale change at run time. |
100 Locale.setDefault(new Locale("de", "DE")); | 96 Locale.setDefault(new Locale("de", "DE")); |
101 mAwContents.updateDefaultLocale(); | 97 mAwContents.updateDefaultLocale(); |
102 mAwContents.getSettings().updateAcceptLanguages(); | 98 mAwContents.getSettings().updateAcceptLanguages(); |
103 | 99 |
104 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; | 100 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
105 | 101 |
106 acceptLanguages = getAcceptLanguages( | 102 acceptLanguages = getAcceptLanguages( |
107 JSUtils.executeJavaScriptAndWaitForResult( | 103 JSUtils.executeJavaScriptAndWaitForResult( |
108 this, mAwContents, mContentsClient.getOnEvaluateJavaScri
ptResultHelper(), | 104 this, mAwContents, mContentsClient.getOnEvaluateJavaScri
ptResultHelper(), |
109 "document.body.textContent")); | 105 "document.body.textContent")); |
110 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]); | 106 assertEquals("de-DE,de", acceptLanguages[0] + "," + acceptLanguages[1]); |
111 } | 107 } |
112 | 108 |
113 /** | 109 /** |
114 * Verify that the Accept Languages string is correct. | 110 * Verify that the Accept Languages string is correct. |
115 * When default locales do not contain "en-US" or "en-us", | 111 * When default locales do not contain "en-US" or "en-us", |
116 * "en-US" should be added with lowest priority. | 112 * "en-US" should be added with lowest priority. |
117 */ | 113 */ |
118 @SmallTest | 114 @SmallTest |
119 @MinAndroidSdkLevel(Build.VERSION_CODES.N) | 115 @MinAndroidSdkLevel(Build.VERSION_CODES.N) |
120 @SuppressLint("NewApi") | 116 @SuppressLint("NewApi") |
121 @Feature({"AndroidWebView"}) | 117 @Feature({"AndroidWebView"}) |
122 public void testAcceptLanguagesWithenUS() throws Throwable { | 118 public void testAcceptLanguages() throws Throwable { |
123 getAwSettingsOnUiThread(mAwContents).setJavaScriptEnabled(true); | 119 getAwSettingsOnUiThread(mAwContents).setJavaScriptEnabled(true); |
| 120 String url = mTestServer.getURL("/echoheader?Accept-Language"); |
| 121 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
124 | 122 |
125 // This should yield a lightly formatted page with the contents of the A
ccept-Language | 123 String[] acceptLanguagesJs = getAcceptLanguages(JSUtils.executeJavaScrip
tAndWaitForResult( |
126 // header, e.g. "en-US" or "de-DE,en-US;q=0.8", as the only text content
. | 124 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult
Helper(), |
127 String url = mTestServer.getURL("/echoheader?Accept-Language"); | 125 "navigator.languages.join(',')")); |
| 126 assertEquals( |
| 127 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac
ceptLanguagesJs)); |
| 128 |
| 129 // Test locales that contain "en-US" change at run time. |
| 130 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale(
"en", "US"))); |
| 131 mAwContents.updateDefaultLocale(); |
| 132 mAwContents.getSettings().updateAcceptLanguages(); |
| 133 |
128 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; | 134 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
129 | 135 |
130 String[] acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptA
ndWaitForResult( | 136 String[] acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptA
ndWaitForResult( |
131 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult
Helper(), | 137 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult
Helper(), |
132 "document.body.textContent")); | 138 "document.body.textContent")); |
133 assertEquals( | 139 assertEquals("de-DE,de,en-US,en", TextUtils.join(",", acceptLanguages)); |
134 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac
ceptLanguages)); | |
135 | 140 |
136 String[] acceptLanguagesJs = getAcceptLanguages(JSUtils.executeJavaScrip
tAndWaitForResult( | 141 // Test locales that do not contain "en-US" change at run time, "en-US"
should be added with |
137 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult
Helper(), | 142 // lower priority. |
138 "navigator.languages.join(',')")); | 143 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale(
"ja", "JP"))); |
139 assertEquals(acceptLanguagesJs.length, acceptLanguages.length); | |
140 for (int i = 0; i < acceptLanguagesJs.length; ++i) { | |
141 assertEquals(acceptLanguagesJs[i], acceptLanguages[i]); | |
142 } | |
143 | |
144 // Test locales that contain "en-US" change at run time | |
145 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale(
"en", "US"))); | |
146 mAwContents.updateDefaultLocale(); | 144 mAwContents.updateDefaultLocale(); |
147 mAwContents.getSettings().updateAcceptLanguages(); | 145 mAwContents.getSettings().updateAcceptLanguages(); |
148 | 146 |
149 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; | 147 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
150 | 148 |
151 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor
Result(this, | 149 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor
Result(this, |
152 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper
(), | 150 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper
(), |
153 "document.body.textContent")); | 151 "document.body.textContent")); |
154 assertEquals( | 152 assertEquals("de-DE,de,ja-JP,ja,en-US,en", TextUtils.join(",", acceptLan
guages)); |
155 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac
ceptLanguages)); | |
156 | 153 |
157 // Test locales that contain "en-us" change at run time | 154 // Test language code is inserted only after the last language tag that
contains that |
158 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale(
"en", "us"))); | 155 // language. |
| 156 LocaleList.setDefault(new LocaleList(new Locale("en", "GB"), new Locale(
"en", "US"))); |
159 mAwContents.updateDefaultLocale(); | 157 mAwContents.updateDefaultLocale(); |
160 mAwContents.getSettings().updateAcceptLanguages(); | 158 mAwContents.getSettings().updateAcceptLanguages(); |
161 | 159 |
162 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; | 160 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
163 | 161 |
164 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor
Result(this, | 162 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor
Result(this, |
165 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper
(), | 163 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper
(), |
166 "document.body.textContent")); | 164 "document.body.textContent")); |
167 assertEquals( | 165 assertEquals("en-GB,en-US,en", TextUtils.join(",", acceptLanguages)); |
168 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac
ceptLanguages)); | |
169 | 166 |
170 // Test locales that do not contain "en-us" or "en-US" change at run tim
e | 167 LocaleList.setDefault(new LocaleList(new Locale("en", "GB"), new Locale(
"ja", "JP"))); |
171 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale(
"ja", "JP"))); | |
172 mAwContents.updateDefaultLocale(); | 168 mAwContents.updateDefaultLocale(); |
173 mAwContents.getSettings().updateAcceptLanguages(); | 169 mAwContents.getSettings().updateAcceptLanguages(); |
174 | 170 |
175 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; | 171 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
176 | 172 |
177 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor
Result(this, | 173 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor
Result(this, |
178 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper
(), | 174 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper
(), |
179 "document.body.textContent")); | 175 "document.body.textContent")); |
180 String[] acceptLangs = Arrays.copyOfRange(acceptLanguages, 0, acceptLang
uages.length - 1); | 176 assertEquals("en-GB,ja-JP,ja,en-US,en", TextUtils.join(",", acceptLangua
ges)); |
181 assertEquals(LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",
", acceptLangs)); | |
182 } | 177 } |
183 } | 178 } |
OLD | NEW |