From 6c8a2d4715ffc5e8ce8b1aec613c091f0198eaea Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Sat, 30 Apr 2022 13:05:40 -0700 Subject: [PATCH 1/6] rustdoc: when running a function-signature search, tweak the tab bar --- src/librustdoc/html/static/css/rustdoc.css | 5 +++ src/librustdoc/html/static/js/search.js | 25 +++++++-------- .../search-tab-change-title-fn-sig.goml | 32 +++++++++++++++++++ ...rch-tab-selection-if-current-is-empty.goml | 23 ------------- 4 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml delete mode 100644 src/test/rustdoc-gui/search-tab-selection-if-current-is-empty.goml diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 81c12be8e83..9999c688607 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -1333,6 +1333,11 @@ pre.rust { border-top: 2px solid; } +#titles > button:first-child:last-child { + margin-right: 1px; + width: calc(100% - 1px); +} + #titles > button:not(:last-child) { margin-right: 1px; width: calc(33.3% - 1px); diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js index 60ad431ba7a..f93f21af817 100644 --- a/src/librustdoc/html/static/js/search.js +++ b/src/librustdoc/html/static/js/search.js @@ -1407,18 +1407,12 @@ window.initSearch = rawSearchIndex => { for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) { row = searchIndex[i]; 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) { - 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) { - handleArgs(searchIndex[i], i, container); + handleArgs(searchIndex[i], i, results_others); } } } @@ -1723,12 +1717,17 @@ window.initSearch = rawSearchIndex => { `${typeFilter} in ${crates} `; if (results.query.error !== null) { output += `

Query parser error: "${results.query.error}".

`; + } else if (results.query.foundElems <= 1 && results.query.returned.length === 0) { + output += `
` + + makeTabHeader(0, "In Names", ret_others[1]) + + makeTabHeader(1, "In Parameters", ret_in_args[1]) + + makeTabHeader(2, "In Return Types", ret_returned[1]) + + "
"; + } else { + output += '
' + + makeTabHeader(0, "In Function Signature", ret_others[1]) + + "
"; } - output += `
` + - makeTabHeader(0, "In Names", ret_others[1]) + - makeTabHeader(1, "In Parameters", ret_in_args[1]) + - makeTabHeader(2, "In Return Types", ret_returned[1]) + - "
"; const resultsElem = document.createElement("div"); resultsElem.id = "results"; diff --git a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml new file mode 100644 index 00000000000..3269305331b --- /dev/null +++ b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml @@ -0,0 +1,32 @@ +// 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", CONTAINS) + +// 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 Signature", CONTAINS) + +// 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 Signature", CONTAINS) + +// Try with a search-by-return with no results +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 Signature", CONTAINS) diff --git a/src/test/rustdoc-gui/search-tab-selection-if-current-is-empty.goml b/src/test/rustdoc-gui/search-tab-selection-if-current-is-empty.goml deleted file mode 100644 index 52b3ceae7b1..00000000000 --- a/src/test/rustdoc-gui/search-tab-selection-if-current-is-empty.goml +++ /dev/null @@ -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"}) From 345a580e8d19c59cdd7d6ab5889311d2f07d7931 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Sun, 1 May 2022 15:40:46 -0700 Subject: [PATCH 2/6] Use STARTS_WITH, since it's more specific Co-Authored-By: Guillaume Gomez --- src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml index 3269305331b..3cf34c2f432 100644 --- a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml +++ b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml @@ -5,7 +5,7 @@ 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", CONTAINS) +assert-text: ("#titles > button:nth-of-type(1)", "In Names", STARTS_WITH) // Now try search-by-return goto: file://|DOC_PATH|/test_docs/index.html @@ -13,7 +13,7 @@ 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 Signature", CONTAINS) +assert-text: ("#titles > button:nth-of-type(1)", "In Function Signature", STARTS_WITH) // Try with a search-by-return with no results goto: file://|DOC_PATH|/test_docs/index.html @@ -21,7 +21,7 @@ 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 Signature", CONTAINS) +assert-text: ("#titles > button:nth-of-type(1)", "In Function Signature", STARTS_WITH) // Try with a search-by-return with no results goto: file://|DOC_PATH|/test_docs/index.html @@ -29,4 +29,4 @@ 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 Signature", CONTAINS) +assert-text: ("#titles > button:nth-of-type(1)", "In Function Signature", STARTS_WITH) From 21a121332b4c5e2302c46956564879c447d555b2 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 2 May 2022 09:45:32 -0700 Subject: [PATCH 3/6] rustdoc: change the "In Function Signatures" to context-sensitive * If it's just `-> a`, use "In Function Return Types" * If it's just `a b`, use "In Function Parameters" * Otherwise, still use "In Function Signatures" --- src/librustdoc/html/static/js/search.js | 6 +++++- .../search-tab-change-title-fn-sig.goml | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js index f93f21af817..2468d39ebc7 100644 --- a/src/librustdoc/html/static/js/search.js +++ b/src/librustdoc/html/static/js/search.js @@ -1724,8 +1724,12 @@ window.initSearch = rawSearchIndex => { makeTabHeader(2, "In Return Types", ret_returned[1]) + ""; } else { + const signatureTabTitle = + results.query.elems.length === 0 ? "In Function Return Types" : + results.query.returned.length === 0 ? "In Function Parameters" : + "In Function Signatures"; output += '
' + - makeTabHeader(0, "In Function Signature", ret_others[1]) + + makeTabHeader(0, signatureTabTitle, ret_others[1]) + "
"; } diff --git a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml index 3cf34c2f432..fc6b0696bf0 100644 --- a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml +++ b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml @@ -13,7 +13,7 @@ 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 Signature", STARTS_WITH) +assert-text: ("#titles > button:nth-of-type(1)", "In Function Return Types", STARTS_WITH) // Try with a search-by-return with no results goto: file://|DOC_PATH|/test_docs/index.html @@ -21,12 +21,20 @@ 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 Signature", STARTS_WITH) +assert-text: ("#titles > button:nth-of-type(1)", "In Function Return Types", STARTS_WITH) -// Try with a search-by-return with no results +// 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 Signature", STARTS_WITH) +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) From 8b2147b4970a06377defd142fa932d2264d2aa5d Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 2 May 2022 15:50:01 -0700 Subject: [PATCH 4/6] rustdoc: fix keyboard shortcuts and console log on search page --- src/librustdoc/html/static/js/search.js | 36 ++++++++++++------- .../search-tab-change-title-fn-sig.goml | 20 +++++++++++ 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js index 2468d39ebc7..2bb850f994d 100644 --- a/src/librustdoc/html/static/js/search.js +++ b/src/librustdoc/html/static/js/search.js @@ -43,26 +43,33 @@ const TY_KEYWORD = itemTypes.indexOf("keyword"); // In the search display, allows to switch between tabs. function printTab(nb) { - if (nb === 0 || nb === 1 || nb === 2) { - searchState.currentTab = nb; - } - let nb_copy = nb; + let iter = 0; + let foundCurrentTab = false; + let foundCurrentResultSet = false; onEachLazy(document.getElementById("titles").childNodes, elem => { - if (nb_copy === 0) { + if (nb === iter) { addClass(elem, "selected"); + foundCurrentTab = true; } else { removeClass(elem, "selected"); } - nb_copy -= 1; + iter += 1; }); + iter = 0; onEachLazy(document.getElementById("results").childNodes, elem => { - if (nb === 0) { + if (nb === iter) { addClass(elem, "active"); + foundCurrentResultSet = true; } else { removeClass(elem, "active"); } - nb -= 1; + iter += 1; }); + if (foundCurrentTab && foundCurrentResultSet) { + searchState.currentTab = nb; + } else if (nb != 0) { + printTab(0); + } } /** @@ -1731,6 +1738,7 @@ window.initSearch = rawSearchIndex => { output += '
' + makeTabHeader(0, signatureTabTitle, ret_others[1]) + "
"; + currentTab = 0; } const resultsElem = document.createElement("div"); @@ -1746,12 +1754,16 @@ window.initSearch = rawSearchIndex => { } search.appendChild(resultsElem); // Reset focused elements. - searchState.focusedByTab = [null, null, null]; searchState.showResults(search); const elems = document.getElementById("titles").childNodes; - elems[0].onclick = () => { printTab(0); }; - elems[1].onclick = () => { printTab(1); }; - elems[2].onclick = () => { printTab(2); }; + searchState.focusedByTab = []; + let i = 0; + for (const elem of elems) { + const j = i; + elem.onclick = () => { printTab(j); }; + searchState.focusedByTab.push(null); + i += 1; + } printTab(currentTab); } diff --git a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml index fc6b0696bf0..7bc837bfaeb 100644 --- a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml +++ b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml @@ -6,6 +6,16 @@ write: (".search-input", "Foo") 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) +// Use left-right keys +press-key: "ArrowDown" +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 @@ -14,6 +24,16 @@ write: (".search-input", "-> String") 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) +// Use left-right keys +press-key: "ArrowDown" +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 From 75790fabedbb2abd0a9ec30b65655398c89c10e1 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 3 May 2022 09:20:22 -0700 Subject: [PATCH 5/6] rustdoc: add test case assertions for ArrowDown highlight first result --- src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml index 7bc837bfaeb..763927f9d0f 100644 --- a/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml +++ b/src/test/rustdoc-gui/search-tab-change-title-fn-sig.goml @@ -6,8 +6,10 @@ write: (".search-input", "Foo") 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" @@ -24,8 +26,10 @@ write: (".search-input", "-> String") 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" From 4c183cd2d41abfe22b20ff1c9d5a1bb712ef1d71 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 3 May 2022 09:20:45 -0700 Subject: [PATCH 6/6] rustdoc: fix JS error when rendering parse error --- src/librustdoc/html/static/js/search.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js index 2bb850f994d..e755d27f737 100644 --- a/src/librustdoc/html/static/js/search.js +++ b/src/librustdoc/html/static/js/search.js @@ -1724,6 +1724,10 @@ window.initSearch = rawSearchIndex => { `${typeFilter} in ${crates} `; if (results.query.error !== null) { output += `

Query parser error: "${results.query.error}".

`; + output += '
' + + makeTabHeader(0, "In Names", ret_others[1]) + + "
"; + currentTab = 0; } else if (results.query.foundElems <= 1 && results.query.returned.length === 0) { output += `
` + makeTabHeader(0, "In Names", ret_others[1]) +