Skip to content

Commit 0e050ae

Browse files
Witty-31-06valenting
authored andcommitted
Bug 2000765 - Updated q-value generation in Accept-Language Header to match chrome.r=valentin,necko-reviewers,devtools-reviewers,android-reviewers,nchevobbe,nalexander
The algorithm now generates q-value 0.9 for second language in two language option. Now q-weight of each language decrements by 0.1 (minimum 0.1) down the language list. Differential Revision: https://phabricator.services.mozilla.com/D273761
1 parent fb7c472 commit 0e050ae

File tree

9 files changed

+32
-43
lines changed

9 files changed

+32
-43
lines changed

devtools/client/netmonitor/test/browser_net_copy_headers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ add_task(async function () {
4343
"Host: example.com",
4444
"User-Agent: " + navigator.userAgent + "",
4545
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
46-
"Accept-Language: " + navigator.languages.join(",") + ";q=0.5",
46+
"Accept-Language: " + navigator.languages.join(",") + ";q=0.9",
4747
"Accept-Encoding: gzip, deflate",
4848
"Connection: keep-alive",
4949
"Upgrade-Insecure-Requests: 1",

devtools/client/shared/test/xpcshell/test_curl.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ add_task(async function () {
2424
"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0",
2525
},
2626
{ name: "Accept", value: "*/*" },
27-
{ name: "Accept-Language", value: "en-US,en;q=0.5" },
27+
{ name: "Accept-Language", value: "en-US,en;q=0.9" },
2828
{ name: "Accept-Encoding", value: "gzip, deflate, br" },
2929
{ name: "Origin", value: "https://example.com" },
3030
{ name: "Connection", value: "keep-alive" },
@@ -54,7 +54,7 @@ add_task(async function () {
5454
"user-agent header present in curl command"
5555
);
5656
ok(
57-
exactHeaderInParams(curlParams, "Accept-Language: en-US,en;q=0.5"),
57+
exactHeaderInParams(curlParams, "Accept-Language: en-US,en;q=0.9"),
5858
"accept-language header present in curl output"
5959
);
6060
ok(

mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/fetch/GeckoViewFetchUnitTestCases.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class GeckoViewFetchUnitTestCases : FetchTestCases() {
117117
val requestHeaders = mapOf(
118118
"Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
119119
"Accept-Encoding" to "gzip, deflate",
120-
"Accept-Language" to "en-US,en;q=0.5",
120+
"Accept-Language" to "en-US,en;q=0.9",
121121
"Connection" to "keep-alive",
122122
"User-Agent" to "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0",
123123
)

mobile/android/android-components/components/concept/fetch/src/test/java/mozilla/components/concept/fetch/HeadersTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class HeadersTest {
1818
val headers = MutableHeaders(
1919
"Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
2020
"Accept-Encoding" to "gzip, deflate",
21-
"Accept-Language" to "en-US,en;q=0.5",
21+
"Accept-Language" to "en-US,en;q=0.9",
2222
"Connection" to "keep-alive",
2323
"Dnt" to "1",
2424
"User-Agent" to "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0",
@@ -35,7 +35,7 @@ class HeadersTest {
3535

3636
assertEquals("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", headers[0].value)
3737
assertEquals("gzip, deflate", headers[1].value)
38-
assertEquals("en-US,en;q=0.5", headers[2].value)
38+
assertEquals("en-US,en;q=0.9", headers[2].value)
3939
assertEquals("keep-alive", headers[3].value)
4040
assertEquals("1", headers[4].value)
4141
assertEquals("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0", headers[5].value)
@@ -92,15 +92,15 @@ class HeadersTest {
9292
}
9393

9494
headers[2] = Header("Dnt", "0")
95-
headers[0] = Header("Accept-Language", "en-US,en;q=0.5")
95+
headers[0] = Header("Accept-Language", "en-US,en;q=0.9")
9696

9797
assertEquals(3, headers.size)
9898

9999
assertEquals("Accept-Language", headers[0].name)
100100
assertEquals("Connection", headers[1].name)
101101
assertEquals("Dnt", headers[2].name)
102102

103-
assertEquals("en-US,en;q=0.5", headers[0].value)
103+
assertEquals("en-US,en;q=0.9", headers[0].value)
104104
assertEquals("keep-alive", headers[1].value)
105105
assertEquals("0", headers[2].value)
106106
}
@@ -166,7 +166,7 @@ class HeadersTest {
166166
val headers = MutableHeaders(
167167
"Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
168168
"Accept-Encoding" to "gzip, deflate",
169-
"Accept-Language" to "en-US,en;q=0.5",
169+
"Accept-Language" to "en-US,en;q=0.9",
170170
"Connection" to "keep-alive",
171171
"Dnt" to "1",
172172
"User-Agent" to "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0",
@@ -188,7 +188,7 @@ class HeadersTest {
188188

189189
assertEquals("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", headers[0].value)
190190
assertEquals("gzip, deflate", headers[1].value)
191-
assertEquals("en-US,en;q=0.5", headers[2].value)
191+
assertEquals("en-US,en;q=0.9", headers[2].value)
192192
assertEquals("keep-alive", headers[3].value)
193193
assertEquals("0", headers[4].value)
194194
assertEquals("Mozilla/6.0", headers[5].value)

mobile/android/android-components/components/concept/fetch/src/test/java/mozilla/components/concept/fetch/RequestTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class RequestTest {
3838
url = "https://www.mozilla.org",
3939
method = Request.Method.POST,
4040
headers = MutableHeaders(
41-
"Accept-Language" to "en-US,en;q=0.5",
41+
"Accept-Language" to "en-US,en;q=0.9",
4242
"Connection" to "keep-alive",
4343
"Dnt" to "1",
4444
),
@@ -75,7 +75,7 @@ class RequestTest {
7575
assertEquals("Connection", headers[1].name)
7676
assertEquals("Dnt", headers[2].name)
7777

78-
assertEquals("en-US,en;q=0.5", headers[0].value)
78+
assertEquals("en-US,en;q=0.9", headers[0].value)
7979
assertEquals("keep-alive", headers[1].value)
8080
assertEquals("1", headers[2].value)
8181
}

mobile/android/android-components/components/tooling/fetch-tests/src/main/java/mozilla/components/tooling/fetch/tests/FetchTestCases.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ abstract class FetchTestCases {
8484
headers = MutableHeaders()
8585
.set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
8686
.set("Accept-Encoding", "gzip, deflate")
87-
.set("Accept-Language", "en-US,en;q=0.5")
87+
.set("Accept-Language", "en-US,en;q=0.9")
8888
.set("Connection", "keep-alive")
8989
.set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"),
9090
),
@@ -113,7 +113,7 @@ abstract class FetchTestCases {
113113
)
114114

115115
assertEquals(
116-
"en-US,en;q=0.5",
116+
"en-US,en;q=0.9",
117117
request.headers.get("Accept-Language"),
118118
)
119119

netwerk/base/rust-helper/src/lib.rs

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,14 @@ fn open_read_fast_fail(path: &Path) -> io::Result<File> {
6767
/// Allocates an nsACString that contains a ISO 639 language list
6868
/// notated with HTTP "q" values for output with an HTTP Accept-Language
6969
/// header. Previous q values will be stripped because the order of
70-
/// the langs implies the q value. The q values are calculated by dividing
71-
/// 1.0 amongst the number of languages present.
70+
/// the langs implies the q value. q-values decrease by 0.1 for each subsequent language,
71+
/// with a minimum value of 0.1.
7272
///
7373
/// Ex: passing: "en, ja"
74-
/// returns: "en,ja;q=0.5"
74+
/// returns: "en,ja;q=0.9"
7575
///
7676
/// passing: "en, ja, fr_CA"
77-
/// returns: "en,ja;q=0.7,fr_CA;q=0.3"
77+
/// returns: "en,ja;q=0.9,fr_CA;q=0.8"
7878
pub extern "C" fn rust_prepare_accept_languages(
7979
i_accept_languages: &nsACString,
8080
o_accept_languages: &mut nsACString,
@@ -90,8 +90,6 @@ pub extern "C" fn rust_prepare_accept_languages(
9090
.filter(|token| !token.is_empty())
9191
};
9292

93-
let n = make_tokens().count();
94-
9593
for (count_n, i_token) in make_tokens().enumerate() {
9694
// delimiter if not first item
9795
if count_n != 0 {
@@ -106,23 +104,14 @@ pub extern "C" fn rust_prepare_accept_languages(
106104
canonicalize_language_tag(&mut o_token[token_pos..]);
107105
}
108106

109-
// Divide the quality-values evenly among the languages.
110-
let q = 1.0 - count_n as f32 / n as f32;
111-
112-
let u: u32 = ((q + 0.005) * 100.0) as u32;
113-
// Only display q-value if less than 1.00.
114-
if u < 100 {
115-
// With a small number of languages, one decimal place is
116-
// enough to prevent duplicate q-values.
117-
// Also, trailing zeroes do not add any information, so
118-
// they can be removed.
119-
if n < 10 || u % 10 == 0 {
120-
let u = (u + 5) / 10;
121-
o_accept_languages.append(&format!(";q=0.{}", u));
122-
} else {
123-
// Values below 10 require zero padding.
124-
o_accept_languages.append(&format!(";q=0.{:02}", u));
125-
}
107+
//Since we need to emulate chrome behavior i.e languages should get q=1.0,0.9,0.8 and so on...
108+
let q_val_max = 10;
109+
let weight_of_decrement = 1;
110+
let step = std::cmp::min(10, count_n); //if num_language > 10, q_val_max - curr_cnt*weight_of_decrement underflows
111+
let q_val = std::cmp::max(q_val_max - step * weight_of_decrement, 1); //q-weight shouldn't go below 0.1
112+
113+
if count_n > 0 && q_val < 10 {
114+
o_accept_languages.append(&format!(";q=0.{}", q_val));
126115
}
127116
}
128117

netwerk/test/unit/test_header_Accept-Language.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function test_accepted_languages() {
8282
// All the other languages should have an evenly-spaced quality value.
8383
Assert.equal(
8484
parseFloat(qualityValue).toFixed(decimalPlaces),
85-
(1.0 - (1 / acceptedLanguagesLength) * i).toFixed(decimalPlaces)
85+
Math.max(1.0 - i * 0.1, 0.1).toFixed(decimalPlaces)
8686
);
8787
}
8888
}

netwerk/test/unit/test_header_Accept-Language_case.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ function run_test() {
1818
["ZH-HANT-HK", "zh-Hant-HK"],
1919
["en-us-x-priv", "en-US-x-priv"],
2020
["en-us-x-twain", "en-US-x-twain"],
21-
["de, en-US, en", "de,en-US;q=0.7,en;q=0.3"],
22-
["de,en-us,en", "de,en-US;q=0.7,en;q=0.3"],
23-
["en-US, en", "en-US,en;q=0.5"],
24-
["EN-US;q=0.2, EN", "en-US,en;q=0.5"],
25-
["en ;q=0.8, de ", "en,de;q=0.5"],
21+
["de, en-US, en", "de,en-US;q=0.9,en;q=0.8"],
22+
["de,en-us,en", "de,en-US;q=0.9,en;q=0.8"],
23+
["en-US, en", "en-US,en;q=0.9"],
24+
["EN-US;q=0.2, EN", "en-US,en;q=0.9"],
25+
["en ;q=0.8, de ", "en,de;q=0.9"],
2626
[",en,", "en"],
2727
];
2828

0 commit comments

Comments
 (0)