Bug 1785807 - Added duplication check and proper capitilization for computeAcceptLanguages. r=geckoview-reviewers,extension-reviewers,calu,owlish,robwu

Differential Revision: https://phabricator.services.mozilla.com/D162678
This commit is contained in:
Zac McKenney 2022-11-23 19:25:24 +00:00
parent 0916724862
commit e20312a8cd
3 changed files with 25 additions and 8 deletions

View File

@ -22,4 +22,22 @@ class LocaleTest : BaseSessionTest() {
greaterThanOrEqualTo(0)
)
}
@Test fun duplicateLocales() {
sessionRule.runtime.settings.setLocales(arrayOf("en-gb", "en-US", "en-gb", "en-fr", "en-us", "en-FR"))
assertThat(
"Locales have no duplicates",
sessionRule.requestedLocales,
equalTo(listOf("en-GB", "en-US", "en-FR"))
)
}
@Test fun lowerCaseToUpperCaseLocales() {
sessionRule.runtime.settings.setLocales(arrayOf("en-gb", "en-us", "en-fr"))
assertThat(
"Locales are formatted properly",
sessionRule.requestedLocales,
equalTo(listOf("en-GB", "en-US", "en-FR"))
)
}
}

View File

@ -22,7 +22,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Locale;
import org.mozilla.gecko.EventDispatcher;
import org.mozilla.gecko.GeckoSystemStateListener;
@ -778,23 +778,23 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
}
private String computeAcceptLanguages() {
final ArrayList<String> locales = new ArrayList<String>();
final LinkedHashMap<String, String> locales = new LinkedHashMap<>();
// Explicitly-set app prefs come first:
if (mRequestedLocales != null) {
for (final String locale : mRequestedLocales) {
locales.add(locale.toLowerCase(Locale.ROOT));
locales.put(locale.toLowerCase(Locale.ROOT), locale);
}
}
// OS prefs come second:
for (final String locale : getDefaultLocales()) {
final String localeLowerCase = locale.toLowerCase(Locale.ROOT);
if (!locales.contains(localeLowerCase)) {
locales.add(localeLowerCase);
if (!locales.containsKey(localeLowerCase)) {
locales.put(localeLowerCase, locale);
}
}
return TextUtils.join(",", locales);
return TextUtils.join(",", locales.values());
}
private static String[] getDefaultLocales() {

View File

@ -352,9 +352,8 @@ add_task(async function test_get_accept_languages() {
await extension.awaitMessage("content-loaded");
// TODO bug 1765375: ", en" is missing on Android.
// TODO bug 1785807: "en-us" should be "en-US" on Android
let expectedLangs =
AppConstants.platform == "android" ? ["en-us"] : ["en-US", "en"];
AppConstants.platform == "android" ? ["en-US"] : ["en-US", "en"];
extension.sendMessage(["expect-results", expectedLangs]);
await extension.awaitMessage("background-done");
await extension.awaitMessage("content-done");