Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java

Issue 2559243003: Extend with a language code in http accept languages
Patch Set: Rebased separate Generate AcceptLanguage Header from http_util Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.Matcher; 21 import java.util.regex.Matcher;
23 import java.util.regex.Pattern; 22 import java.util.regex.Pattern;
24 23
25 /** 24 /**
26 * Tests for Accept Language implementation. 25 * Tests for Accept Language implementation.
27 */ 26 */
28 public class AcceptLanguageTest extends AwTestBase { 27 public class AcceptLanguageTest extends AwTestBase {
29 private TestAwContentsClient mContentsClient; 28 private TestAwContentsClient mContentsClient;
30 private AwContents mAwContents; 29 private AwContents mAwContents;
(...skipping 18 matching lines...) Expand all
49 private static final Pattern COMMA_AND_OPTIONAL_Q_VALUE = 48 private static final Pattern COMMA_AND_OPTIONAL_Q_VALUE =
50 Pattern.compile("(?:;q=[^,]+)?(?:,|$)"); 49 Pattern.compile("(?:;q=[^,]+)?(?:,|$)");
51 private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(. *)\\1$"); 50 private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(. *)\\1$");
52 51
53 /** 52 /**
54 * Extract the languages from the Accept-Language header. 53 * Extract the languages from the Accept-Language header.
55 * 54 *
56 * The Accept-Language header can have more than one language along with opt ional quality 55 * The Accept-Language header can have more than one language along with opt ional quality
57 * factors for each, e.g. 56 * factors for each, e.g.
58 * 57 *
59 * "de-DE,en-US;q=0.8,en-UK;q=0.5" 58 * "de-DE,de;q=0.8,en-US;q=0.6,en-UK;q=0.4,en;q=0.2"
60 * 59 *
61 * This function extracts only the language strings from the Accept-Language header, so 60 * This function extracts only the language strings from the Accept-Language header, so
62 * the example above would yield the following: 61 * the example above would yield the following:
63 * 62 *
64 * ["de-DE", "en-US", "en-UK"] 63 * ["de-DE", "de", "en-US", "en-UK", "en"]
65 * 64 *
66 * @param raw String containing the raw Accept-Language header 65 * @param raw String containing the raw Accept-Language header
67 * @return A list of languages as Strings. 66 * @return A list of languages as Strings.
68 */ 67 */
69 private String[] getAcceptLanguages(String raw) { 68 private String[] getAcceptLanguages(String raw) {
70 assertNotNull(raw); 69 assertNotNull(raw);
71 Matcher m = MAYBE_QUOTED_STRING.matcher(raw); 70 Matcher m = MAYBE_QUOTED_STRING.matcher(raw);
72 assertTrue(m.matches()); 71 assertTrue(m.matches());
73 return COMMA_AND_OPTIONAL_Q_VALUE.split(m.group(2)); 72 return COMMA_AND_OPTIONAL_Q_VALUE.split(m.group(2));
74 } 73 }
(...skipping 14 matching lines...) Expand all
89 String[] acceptLanguages = getAcceptLanguages( 88 String[] acceptLanguages = getAcceptLanguages(
90 JSUtils.executeJavaScriptAndWaitForResult( 89 JSUtils.executeJavaScriptAndWaitForResult(
91 this, mAwContents, mContentsClient.getOnEvaluateJavaScri ptResultHelper(), 90 this, mAwContents, mContentsClient.getOnEvaluateJavaScri ptResultHelper(),
92 "document.body.textContent")); 91 "document.body.textContent"));
93 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]); 92 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]);
94 93
95 String[] acceptLanguagesJs = getAcceptLanguages( 94 String[] acceptLanguagesJs = getAcceptLanguages(
96 JSUtils.executeJavaScriptAndWaitForResult( 95 JSUtils.executeJavaScriptAndWaitForResult(
97 this, mAwContents, mContentsClient.getOnEvaluateJavaScri ptResultHelper(), 96 this, mAwContents, mContentsClient.getOnEvaluateJavaScri ptResultHelper(),
98 "navigator.languages.join(',')")); 97 "navigator.languages.join(',')"));
99 assertEquals(acceptLanguagesJs.length, acceptLanguages.length); 98 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguagesJs[0]) ;
100 for (int i = 0; i < acceptLanguagesJs.length; ++i) {
101 assertEquals(acceptLanguagesJs[i], acceptLanguages[i]);
102 }
103 99
104 // Test locale change at run time 100 // Test locale change at run time
105 Locale.setDefault(new Locale("de", "DE")); 101 Locale.setDefault(new Locale("de", "DE"));
106 mAwContents.updateDefaultLocale(); 102 mAwContents.updateDefaultLocale();
107 mAwContents.getSettings().updateAcceptLanguages(); 103 mAwContents.getSettings().updateAcceptLanguages();
108 104
109 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ; 105 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ;
110 106
111 acceptLanguages = getAcceptLanguages( 107 acceptLanguages = getAcceptLanguages(
112 JSUtils.executeJavaScriptAndWaitForResult( 108 JSUtils.executeJavaScriptAndWaitForResult(
113 this, mAwContents, mContentsClient.getOnEvaluateJavaScri ptResultHelper(), 109 this, mAwContents, mContentsClient.getOnEvaluateJavaScri ptResultHelper(),
114 "document.body.textContent")); 110 "document.body.textContent"));
115 assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]); 111 assertEquals("de-DE,de", acceptLanguages[0] + "," + acceptLanguages[1]);
116 } 112 }
117 113
118 /** 114 /**
119 * Verify that the Accept Languages string is correct. 115 * Verify that the Accept Languages string is correct.
120 * When default locales do not contain "en-US" or "en-us", 116 * When default locales do not contain "en-US" or "en-us",
121 * "en-US" should be added with lowest priority. 117 * "en-US" should be added with lowest priority.
122 */ 118 */
123 @SmallTest 119 @SmallTest
124 @MinAndroidSdkLevel(Build.VERSION_CODES.N) 120 @MinAndroidSdkLevel(Build.VERSION_CODES.N)
125 @SuppressLint("NewApi") 121 @SuppressLint("NewApi")
126 @Feature({"AndroidWebView"}) 122 @Feature({"AndroidWebView"})
127 public void testAcceptLanguagesWithenUS() throws Throwable { 123 public void testAcceptLanguages() throws Throwable {
128 getAwSettingsOnUiThread(mAwContents).setJavaScriptEnabled(true); 124 getAwSettingsOnUiThread(mAwContents).setJavaScriptEnabled(true);
129
130 // This should yield a lightly formatted page with the contents of the A ccept-Language
131 // header, e.g. "en-US" or "de-DE,en-US;q=0.8", as the only text content .
132 String url = mTestServer.getURL("/echoheader?Accept-Language"); 125 String url = mTestServer.getURL("/echoheader?Accept-Language");
133 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ; 126 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ;
134 127
135 String[] acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptA ndWaitForResult(
136 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult Helper(),
137 "document.body.textContent"));
138 assertEquals(
139 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac ceptLanguages));
140
141 String[] acceptLanguagesJs = getAcceptLanguages(JSUtils.executeJavaScrip tAndWaitForResult( 128 String[] acceptLanguagesJs = getAcceptLanguages(JSUtils.executeJavaScrip tAndWaitForResult(
142 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult Helper(), 129 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult Helper(),
143 "navigator.languages.join(',')")); 130 "navigator.languages.join(',')"));
144 assertEquals(acceptLanguagesJs.length, acceptLanguages.length); 131 assertEquals(
145 for (int i = 0; i < acceptLanguagesJs.length; ++i) { 132 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac ceptLanguagesJs));
146 assertEquals(acceptLanguagesJs[i], acceptLanguages[i]);
147 }
148 133
149 // Test locales that contain "en-US" change at run time 134 // Test locales that contain "en-US" change at run time
150 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale( "en", "US"))); 135 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale( "en", "US")));
151 mAwContents.updateDefaultLocale(); 136 mAwContents.updateDefaultLocale();
152 mAwContents.getSettings().updateAcceptLanguages(); 137 mAwContents.getSettings().updateAcceptLanguages();
153 138
154 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ; 139 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ;
155 140
141 String[] acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptA ndWaitForResult(
142 this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResult Helper(),
143 "document.body.textContent"));
144 assertEquals("de-DE,de,en-US,en", TextUtils.join(",", acceptLanguages));
145
146 // Test locales that do not contain "en-US" change at run time,
147 // "en-US" should be added with lower priority.
148 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale( "ja", "JP")));
149 mAwContents.updateDefaultLocale();
150 mAwContents.getSettings().updateAcceptLanguages();
151
152 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ;
153
156 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor Result(this, 154 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor Result(this,
157 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper (), 155 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper (),
158 "document.body.textContent")); 156 "document.body.textContent"));
159 assertEquals( 157 assertEquals("de-DE,de,ja-JP,ja,en-US,en", TextUtils.join(",", acceptLan guages));
160 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac ceptLanguages));
161 158
162 // Test locales that contain "en-us" change at run time 159 // Test language code is inserted only after the last language tag that
Seigo Nonaka 2016/12/12 01:48:54 nit: continue line until 100chars?
Yirui Huang 2016/12/12 06:50:40 Done.
163 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale( "en", "us"))); 160 // contains that language.
161 LocaleList.setDefault(new LocaleList(new Locale("en", "GB"), new Locale( "en", "US")));
164 mAwContents.updateDefaultLocale(); 162 mAwContents.updateDefaultLocale();
165 mAwContents.getSettings().updateAcceptLanguages(); 163 mAwContents.getSettings().updateAcceptLanguages();
166 164
167 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ; 165 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ;
168 166
169 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor Result(this, 167 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor Result(this,
170 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper (), 168 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper (),
171 "document.body.textContent")); 169 "document.body.textContent"));
172 assertEquals( 170 assertEquals("en-GB,en-US,en", TextUtils.join(",", acceptLanguages));
173 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", ac ceptLanguages));
174 171
175 // Test locales that do not contain "en-us" or "en-US" change at run tim e 172 LocaleList.setDefault(new LocaleList(new Locale("en", "GB"), new Locale( "ja", "JP")));
176 LocaleList.setDefault(new LocaleList(new Locale("de", "DE"), new Locale( "ja", "JP")));
177 mAwContents.updateDefaultLocale(); 173 mAwContents.updateDefaultLocale();
178 mAwContents.getSettings().updateAcceptLanguages(); 174 mAwContents.getSettings().updateAcceptLanguages();
179 175
180 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ; 176 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url) ;
181 177
182 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor Result(this, 178 acceptLanguages = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitFor Result(this,
183 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper (), 179 mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper (),
184 "document.body.textContent")); 180 "document.body.textContent"));
185 String[] acceptLangs = Arrays.copyOfRange(acceptLanguages, 0, acceptLang uages.length - 1); 181 assertEquals("en-GB,ja-JP,ja,en-US,en", TextUtils.join(",", acceptLangua ges));
186 assertEquals(LocaleUtils.getDefaultLocaleListString(), TextUtils.join(", ", acceptLangs));
187 } 182 }
188 } 183 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698