Bug 1488828: For collapsed select controls in the content process, set the number of rows to the maximum instead of 1. r=dholbert

The number of rows for the select dropdown can't be calculated in the content process because the dropdown has to be rendered in the parent process.
Therefore, we previously set the number of rows to 1 in this case.
That meant that the page up and page down keys only moved one item at a time for a collapsed select control, making them effectively useless.
Instead, set the number of rows to the maximum in this case.

Differential Revision: https://phabricator.services.mozilla.com/D45154

--HG--
extra : moz-landing-system : lando
This commit is contained in:
James Teh 2019-09-13 03:59:51 +00:00
Родитель ba97145da5
Коммит 0d216e928b
3 изменённых файлов: 50 добавлений и 1 удалений

Просмотреть файл

@ -556,7 +556,11 @@ void nsListControlFrame::ReflowAsDropdown(nsPresContext* aPresContext,
// Looks like we have no options. Just size us to a single row
// block size.
state.SetComputedBSize(blockSizeOfARow);
mNumDisplayRows = 1;
// mNumDisplayRows is used as the number of options to move for the page
// up/down keys. If we're in a content process, we can't calculate
// mNumDisplayRows properly, but the maximum number of rows is a lot more
// uesful for page up/down than 1.
mNumDisplayRows = XRE_IsContentProcess() ? kMaxDropDownRows : 1;
} else {
nsComboboxControlFrame* combobox =
static_cast<nsComboboxControlFrame*>(mComboboxFrame);

Просмотреть файл

@ -72,3 +72,5 @@ skip-if = toolkit == 'android'
[test_bug1529036.html]
[test_readonly.html]
[test_select_key_navigation_bug1498769.html]
[test_select_collapsed_page_keys.html]
skip-if = os == 'mac' # select control keyboard behavior is different

Просмотреть файл

@ -0,0 +1,43 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test for page up/down in collapsed select (bug 1488828)</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script>
SimpleTest.waitForExplicitFinish();
function test() {
let select = document.getElementById("select");
select.focus();
is(select.selectedIndex, 0, "Option 0 initially selected");
synthesizeKey("KEY_PageDown", {});
ok(select.selectedIndex >= 2, "PageDown skips more than 1 option");
ok(select.selectedIndex < 49, "PageDown does not move to the last option");
synthesizeKey("KEY_PageUp", {});
is(select.selectedIndex, 0, "PageUp skips more than 1 option");
SimpleTest.finish();
}
</script>
</head>
<body onload="test()">
<div>
<select id="select" size="1">
<option selected>0</option>
</select>
<script>
// Add more options so we have 50 in total.
let select = document.getElementById("select");
for (let i = 1; i <= 49; ++i) {
let option = document.createElement("option");
option.textContent = i;
select.appendChild(option);
}
</script>
</div>
<pre id="test">
</pre>
</body>
</html>