mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Rollup merge of #96590 - notriddle:notriddle/tab-bar-fn-search, r=GuillaumeGomez,jsha
rustdoc: when running a function-signature search, tweak the tab bar # Before ![In Names (7) / In Parameters (0) / In Return types (0)](https://user-images.githubusercontent.com/1593513/166122875-ffdeafe6-8d4d-4e61-84a6-f5986b50ac35.png) # After ![In Function Signature (7)](https://user-images.githubusercontent.com/1593513/166122883-9a3d7515-3235-4ee3-8c4b-5401d109e099.png)
This commit is contained in:
commit
fcb0bce25c
@ -1333,6 +1333,11 @@ pre.rust {
|
|||||||
border-top: 2px solid;
|
border-top: 2px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#titles > button:first-child:last-child {
|
||||||
|
margin-right: 1px;
|
||||||
|
width: calc(100% - 1px);
|
||||||
|
}
|
||||||
|
|
||||||
#titles > button:not(:last-child) {
|
#titles > button:not(:last-child) {
|
||||||
margin-right: 1px;
|
margin-right: 1px;
|
||||||
width: calc(33.3% - 1px);
|
width: calc(33.3% - 1px);
|
||||||
|
@ -45,26 +45,33 @@ const TY_KEYWORD = itemTypes.indexOf("keyword");
|
|||||||
|
|
||||||
// In the search display, allows to switch between tabs.
|
// In the search display, allows to switch between tabs.
|
||||||
function printTab(nb) {
|
function printTab(nb) {
|
||||||
if (nb === 0 || nb === 1 || nb === 2) {
|
let iter = 0;
|
||||||
searchState.currentTab = nb;
|
let foundCurrentTab = false;
|
||||||
}
|
let foundCurrentResultSet = false;
|
||||||
let nb_copy = nb;
|
|
||||||
onEachLazy(document.getElementById("titles").childNodes, elem => {
|
onEachLazy(document.getElementById("titles").childNodes, elem => {
|
||||||
if (nb_copy === 0) {
|
if (nb === iter) {
|
||||||
addClass(elem, "selected");
|
addClass(elem, "selected");
|
||||||
|
foundCurrentTab = true;
|
||||||
} else {
|
} else {
|
||||||
removeClass(elem, "selected");
|
removeClass(elem, "selected");
|
||||||
}
|
}
|
||||||
nb_copy -= 1;
|
iter += 1;
|
||||||
});
|
});
|
||||||
|
iter = 0;
|
||||||
onEachLazy(document.getElementById("results").childNodes, elem => {
|
onEachLazy(document.getElementById("results").childNodes, elem => {
|
||||||
if (nb === 0) {
|
if (nb === iter) {
|
||||||
addClass(elem, "active");
|
addClass(elem, "active");
|
||||||
|
foundCurrentResultSet = true;
|
||||||
} else {
|
} else {
|
||||||
removeClass(elem, "active");
|
removeClass(elem, "active");
|
||||||
}
|
}
|
||||||
nb -= 1;
|
iter += 1;
|
||||||
});
|
});
|
||||||
|
if (foundCurrentTab && foundCurrentResultSet) {
|
||||||
|
searchState.currentTab = nb;
|
||||||
|
} else if (nb != 0) {
|
||||||
|
printTab(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1409,18 +1416,12 @@ window.initSearch = rawSearchIndex => {
|
|||||||
for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) {
|
for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) {
|
||||||
row = searchIndex[i];
|
row = searchIndex[i];
|
||||||
in_returned = checkReturned(row, elem, parsedQuery.typeFilter);
|
in_returned = checkReturned(row, elem, parsedQuery.typeFilter);
|
||||||
addIntoResults(results_returned, row.id, i, -1, in_returned);
|
addIntoResults(results_others, row.id, i, -1, in_returned);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (parsedQuery.foundElems > 0) {
|
} else if (parsedQuery.foundElems > 0) {
|
||||||
let container = results_others;
|
|
||||||
// In the special case where only a "returned" information is available, we want to
|
|
||||||
// put the information into the "results_returned" dict.
|
|
||||||
if (parsedQuery.returned.length !== 0 && parsedQuery.elems.length === 0) {
|
|
||||||
container = results_returned;
|
|
||||||
}
|
|
||||||
for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) {
|
for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) {
|
||||||
handleArgs(searchIndex[i], i, container);
|
handleArgs(searchIndex[i], i, results_others);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1725,12 +1726,26 @@ window.initSearch = rawSearchIndex => {
|
|||||||
`${typeFilter}</h1> in ${crates} </div>`;
|
`${typeFilter}</h1> in ${crates} </div>`;
|
||||||
if (results.query.error !== null) {
|
if (results.query.error !== null) {
|
||||||
output += `<h3>Query parser error: "${results.query.error}".</h3>`;
|
output += `<h3>Query parser error: "${results.query.error}".</h3>`;
|
||||||
|
output += '<div id="titles">' +
|
||||||
|
makeTabHeader(0, "In Names", ret_others[1]) +
|
||||||
|
"</div>";
|
||||||
|
currentTab = 0;
|
||||||
|
} else if (results.query.foundElems <= 1 && results.query.returned.length === 0) {
|
||||||
|
output += `<div id="titles">` +
|
||||||
|
makeTabHeader(0, "In Names", ret_others[1]) +
|
||||||
|
makeTabHeader(1, "In Parameters", ret_in_args[1]) +
|
||||||
|
makeTabHeader(2, "In Return Types", ret_returned[1]) +
|
||||||
|
"</div>";
|
||||||
|
} else {
|
||||||
|
const signatureTabTitle =
|
||||||
|
results.query.elems.length === 0 ? "In Function Return Types" :
|
||||||
|
results.query.returned.length === 0 ? "In Function Parameters" :
|
||||||
|
"In Function Signatures";
|
||||||
|
output += '<div id="titles">' +
|
||||||
|
makeTabHeader(0, signatureTabTitle, ret_others[1]) +
|
||||||
|
"</div>";
|
||||||
|
currentTab = 0;
|
||||||
}
|
}
|
||||||
output += `<div id="titles">` +
|
|
||||||
makeTabHeader(0, "In Names", ret_others[1]) +
|
|
||||||
makeTabHeader(1, "In Parameters", ret_in_args[1]) +
|
|
||||||
makeTabHeader(2, "In Return Types", ret_returned[1]) +
|
|
||||||
"</div>";
|
|
||||||
|
|
||||||
const resultsElem = document.createElement("div");
|
const resultsElem = document.createElement("div");
|
||||||
resultsElem.id = "results";
|
resultsElem.id = "results";
|
||||||
@ -1745,12 +1760,16 @@ window.initSearch = rawSearchIndex => {
|
|||||||
}
|
}
|
||||||
search.appendChild(resultsElem);
|
search.appendChild(resultsElem);
|
||||||
// Reset focused elements.
|
// Reset focused elements.
|
||||||
searchState.focusedByTab = [null, null, null];
|
|
||||||
searchState.showResults(search);
|
searchState.showResults(search);
|
||||||
const elems = document.getElementById("titles").childNodes;
|
const elems = document.getElementById("titles").childNodes;
|
||||||
elems[0].onclick = () => { printTab(0); };
|
searchState.focusedByTab = [];
|
||||||
elems[1].onclick = () => { printTab(1); };
|
let i = 0;
|
||||||
elems[2].onclick = () => { printTab(2); };
|
for (const elem of elems) {
|
||||||
|
const j = i;
|
||||||
|
elem.onclick = () => { printTab(j); };
|
||||||
|
searchState.focusedByTab.push(null);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
printTab(currentTab);
|
printTab(currentTab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
64
src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml
Normal file
64
src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// Checks that the search tab results work correctly with function signature syntax
|
||||||
|
// First, try a search-by-name
|
||||||
|
goto: file://|DOC_PATH|/test_docs/index.html
|
||||||
|
write: (".search-input", "Foo")
|
||||||
|
// Waiting for the search results to appear...
|
||||||
|
wait-for: "#titles"
|
||||||
|
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
assert-text: ("#titles > button:nth-of-type(1)", "In Names", STARTS_WITH)
|
||||||
|
assert: "input.search-input:focus"
|
||||||
|
// Use left-right keys
|
||||||
|
press-key: "ArrowDown"
|
||||||
|
assert: "#results > .search-results.active > a:nth-of-type(1):focus"
|
||||||
|
press-key: "ArrowRight"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(2)", {"class": "selected"})
|
||||||
|
press-key: "ArrowRight"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(3)", {"class": "selected"})
|
||||||
|
press-key: "ArrowRight"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
press-key: "ArrowLeft"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(3)", {"class": "selected"})
|
||||||
|
|
||||||
|
// Now try search-by-return
|
||||||
|
goto: file://|DOC_PATH|/test_docs/index.html
|
||||||
|
write: (".search-input", "-> String")
|
||||||
|
// Waiting for the search results to appear...
|
||||||
|
wait-for: "#titles"
|
||||||
|
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
assert-text: ("#titles > button:nth-of-type(1)", "In Function Return Types", STARTS_WITH)
|
||||||
|
assert: "input.search-input:focus"
|
||||||
|
// Use left-right keys
|
||||||
|
press-key: "ArrowDown"
|
||||||
|
assert: "#results > .search-results.active > a:nth-of-type(1):focus"
|
||||||
|
press-key: "ArrowRight"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
press-key: "ArrowRight"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
press-key: "ArrowRight"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
press-key: "ArrowLeft"
|
||||||
|
wait-for-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
|
||||||
|
// Try with a search-by-return with no results
|
||||||
|
goto: file://|DOC_PATH|/test_docs/index.html
|
||||||
|
write: (".search-input", "-> Something")
|
||||||
|
// Waiting for the search results to appear...
|
||||||
|
wait-for: "#titles"
|
||||||
|
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
assert-text: ("#titles > button:nth-of-type(1)", "In Function Return Types", STARTS_WITH)
|
||||||
|
|
||||||
|
// Try with a search-by-parameter
|
||||||
|
goto: file://|DOC_PATH|/test_docs/index.html
|
||||||
|
write: (".search-input", "usize pattern")
|
||||||
|
// Waiting for the search results to appear...
|
||||||
|
wait-for: "#titles"
|
||||||
|
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
assert-text: ("#titles > button:nth-of-type(1)", "In Function Parameters", STARTS_WITH)
|
||||||
|
|
||||||
|
// Try with a search-by-parameter-and-return
|
||||||
|
goto: file://|DOC_PATH|/test_docs/index.html
|
||||||
|
write: (".search-input", "pattern -> str")
|
||||||
|
// Waiting for the search results to appear...
|
||||||
|
wait-for: "#titles"
|
||||||
|
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
||||||
|
assert-text: ("#titles > button:nth-of-type(1)", "In Function Signatures", STARTS_WITH)
|
@ -1,23 +0,0 @@
|
|||||||
// Checks that the first non-empty search result tab is selected if the default/currently selected
|
|
||||||
// one is empty.
|
|
||||||
goto: file://|DOC_PATH|/test_docs/index.html
|
|
||||||
write: (".search-input", "Foo")
|
|
||||||
// Waiting for the search results to appear...
|
|
||||||
wait-for: "#titles"
|
|
||||||
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
|
||||||
|
|
||||||
// To go back to the original "state"
|
|
||||||
goto: file://|DOC_PATH|/test_docs/index.html
|
|
||||||
write: (".search-input", "-> String")
|
|
||||||
// Waiting for the search results to appear...
|
|
||||||
wait-for: "#titles"
|
|
||||||
// With this search, only the last tab shouldn't be empty so it should be selected.
|
|
||||||
assert-attribute: ("#titles > button:nth-of-type(3)", {"class": "selected"})
|
|
||||||
|
|
||||||
// To go back to the original "state"
|
|
||||||
goto: file://|DOC_PATH|/test_docs/index.html
|
|
||||||
write: (".search-input", "-> Something")
|
|
||||||
// Waiting for the search results to appear...
|
|
||||||
wait-for: "#titles"
|
|
||||||
// With this search, all the tabs are empty so the first one should remain selected.
|
|
||||||
assert-attribute: ("#titles > button:nth-of-type(1)", {"class": "selected"})
|
|
Loading…
Reference in New Issue
Block a user