diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 1459e8f37cd32..8ccb74d6f15d3 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -138,6 +138,22 @@ function getSearchElement() {
}
}
+ function showSearchResults(search) {
+ if (search === null || typeof search === 'undefined') {
+ search = getSearchElement();
+ }
+ addClass(main, "hidden");
+ removeClass(search, "hidden");
+ }
+
+ function hideSearchResults(search) {
+ if (search === null || typeof search === 'undefined') {
+ search = getSearchElement();
+ }
+ addClass(search, "hidden");
+ removeClass(main, "hidden");
+ }
+
// used for special search precedence
var TY_PRIMITIVE = itemTypes.indexOf("primitive");
var TY_KEYWORD = itemTypes.indexOf("keyword");
@@ -169,8 +185,7 @@ function getSearchElement() {
if (ev !== null && search && !hasClass(search, "hidden") && ev.newURL) {
// This block occurs when clicking on an element in the navbar while
// in a search.
- addClass(search, "hidden");
- removeClass(main, "hidden");
+ hideSearchResults(search);
var hash = ev.newURL.slice(ev.newURL.indexOf("#") + 1);
if (browserSupportsHistoryApi()) {
history.replaceState(hash, "", "?search=#" + hash);
@@ -331,8 +346,7 @@ function getSearchElement() {
displayHelp(false, ev, help);
} else if (hasClass(search, "hidden") === false) {
ev.preventDefault();
- addClass(search, "hidden");
- removeClass(main, "hidden");
+ hideSearchResults(search);
document.title = titleBeforeSearch;
}
defocusSearchBar();
@@ -390,8 +404,8 @@ function getSearchElement() {
return null;
}
- document.onkeypress = handleShortcut;
- document.onkeydown = handleShortcut;
+ document.addEventListener("keypress", handleShortcut);
+ document.addEventListener("keydown", handleShortcut);
var handleSourceHighlight = (function() {
var prev_line_id = 0;
@@ -430,7 +444,7 @@ function getSearchElement() {
}
})();
- document.onclick = function(ev) {
+ document.addEventListener("click", function(ev) {
if (hasClass(ev.target, "collapse-toggle")) {
collapseDocs(ev.target, "toggle");
} else if (hasClass(ev.target.parentNode, "collapse-toggle")) {
@@ -452,7 +466,7 @@ function getSearchElement() {
expandSection(a.hash.replace(/^#/, ""));
}
}
- };
+ });
var x = document.getElementsByClassName("version-selector");
if (x.length > 0) {
@@ -1264,8 +1278,7 @@ function getSearchElement() {
}
dst = dst[0];
if (window.location.pathname === dst.pathname) {
- addClass(getSearchElement(), "hidden");
- removeClass(main, "hidden");
+ hideSearchResults();
document.location.href = dst.href;
}
};
@@ -1340,8 +1353,6 @@ function getSearchElement() {
e.preventDefault();
} else if (e.which === 16) { // shift
// Does nothing, it's just to avoid losing "focus" on the highlighted element.
- } else if (e.which === 27) { // escape
- handleEscape(e);
} else if (actives[currentTab].length > 0) {
removeClass(actives[currentTab][0], "highlighted");
}
@@ -1491,10 +1502,9 @@ function getSearchElement() {
"
" +
ret_others[0] + ret_in_args[0] + ret_returned[0] + "
";
- addClass(main, "hidden");
var search = getSearchElement();
- removeClass(search, "hidden");
search.innerHTML = output;
+ showSearchResults(search);
var tds = search.getElementsByTagName("td");
var td_width = 0;
if (tds.length > 0) {
@@ -1699,13 +1709,7 @@ function getSearchElement() {
if (browserSupportsHistoryApi()) {
history.replaceState("", window.currentCrate + " - Rust", "?search=");
}
- if (hasClass(main, "content")) {
- removeClass(main, "hidden");
- }
- var search_c = getSearchElement();
- if (hasClass(search_c, "content")) {
- addClass(search_c, "hidden");
- }
+ hideSearchResults();
} else {
searchTimeout = setTimeout(search, 500);
}
@@ -1718,6 +1722,10 @@ function getSearchElement() {
search();
};
search_input.onchange = function(e) {
+ if (e.target !== document.activeElement) {
+ // To prevent doing anything when it's from a blur event.
+ return;
+ }
// Do NOT e.preventDefault() here. It will prevent pasting.
clearTimeout(searchTimeout);
// zero-timeout necessary here because at the time of event handler execution the
@@ -1741,19 +1749,8 @@ function getSearchElement() {
// Store the previous so we can revert back to it later.
var previousTitle = document.title;
- window.onpopstate = function(e) {
+ window.addEventListener("popstate", function(e) {
var params = getQueryStringParams();
- // When browsing back from search results the main page
- // visibility must be reset.
- if (!params.search) {
- if (hasClass(main, "content")) {
- removeClass(main, "hidden");
- }
- var search_c = getSearchElement();
- if (hasClass(search_c, "content")) {
- addClass(search_c, "hidden");
- }
- }
// Revert to the previous title manually since the History
// API ignores the title parameter.
document.title = previousTitle;
@@ -1765,18 +1762,21 @@ function getSearchElement() {
// perform the search. This will empty the bar if there's
// nothing there, which lets you really go back to a
// previous state with nothing in the bar.
- if (params.search) {
+ if (params.search && params.search.length > 0) {
search_input.value = params.search;
+ // Some browsers fire "onpopstate" for every page load
+ // (Chrome), while others fire the event only when actually
+ // popping a state (Firefox), which is why search() is
+ // called both here and at the end of the startSearch()
+ // function.
+ search(e);
} else {
search_input.value = "";
+ // When browsing back from search results the main page
+ // visibility must be reset.
+ hideSearchResults();
}
- // Some browsers fire "onpopstate" for every page load
- // (Chrome), while others fire the event only when actually
- // popping a state (Firefox), which is why search() is
- // called both here and at the end of the startSearch()
- // function.
- search();
- };
+ });
}
search();
}
@@ -2522,9 +2522,9 @@ function getSearchElement() {
}
function putBackSearch(search_input) {
- if (search_input.value !== "") {
- addClass(main, "hidden");
- removeClass(getSearchElement(), "hidden");
+ var search = getSearchElement();
+ if (search_input.value !== "" && hasClass(search, "hidden")) {
+ showSearchResults(search);
if (browserSupportsHistoryApi()) {
history.replaceState(search_input.value,
"",
@@ -2541,10 +2541,9 @@ function getSearchElement() {
var params = getQueryStringParams();
if (params && params.search) {
- addClass(main, "hidden");
var search = getSearchElement();
- removeClass(search, "hidden");
search.innerHTML = "Loading search results...
";
+ showSearchResults(search);
}
var sidebar_menu = document.getElementsByClassName("sidebar-menu")[0];