diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 752b93f2ac5e3..197efb7cac80d 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -396,38 +396,51 @@ function getSearchElement() {
document.onkeypress = handleShortcut;
document.onkeydown = handleShortcut;
- document.onclick = function(ev) {
- if (hasClass(ev.target, "collapse-toggle")) {
- collapseDocs(ev.target, "toggle");
- } else if (hasClass(ev.target.parentNode, "collapse-toggle")) {
- collapseDocs(ev.target.parentNode, "toggle");
- } else if (ev.target.tagName === "SPAN" && hasClass(ev.target.parentNode, "line-numbers")) {
- var prev_id = 0;
- var set_fragment = function(name) {
- if (browserSupportsHistoryApi()) {
- history.replaceState(null, null, "#" + name);
- highlightSourceLines();
- } else {
- location.replace("#" + name);
- }
- };
+ var handleSourceHighlight = (function() {
+ var prev_line_id = 0;
- var cur_id = parseInt(ev.target.id, 10);
+ var set_fragment = function(name) {
+ var x = window.scrollX,
+ y = window.scrollY;
+ if (browserSupportsHistoryApi()) {
+ history.replaceState(null, null, "#" + name);
+ highlightSourceLines();
+ } else {
+ location.replace("#" + name);
+ }
+ // Prevent jumps when selecting one or many lines
+ window.scrollTo(x, y);
+ };
+
+ return function(ev) {
+ var cur_line_id = parseInt(ev.target.id, 10);
+ ev.preventDefault();
- if (ev.shiftKey && prev_id) {
- if (prev_id > cur_id) {
- var tmp = prev_id;
- prev_id = cur_id;
- cur_id = tmp;
+ if (ev.shiftKey && prev_line_id) {
+ // Swap selection if needed
+ if (prev_line_id > cur_line_id) {
+ var tmp = prev_line_id;
+ prev_line_id = cur_line_id;
+ cur_line_id = tmp;
}
- set_fragment(prev_id + "-" + cur_id);
+ set_fragment(prev_line_id + "-" + cur_line_id);
} else {
- prev_id = cur_id;
+ prev_line_id = cur_line_id;
- set_fragment(cur_id);
+ set_fragment(cur_line_id);
}
+ }
+ })();
+
+ document.onclick = function(ev) {
+ if (hasClass(ev.target, "collapse-toggle")) {
+ collapseDocs(ev.target, "toggle");
+ } else if (hasClass(ev.target.parentNode, "collapse-toggle")) {
+ collapseDocs(ev.target.parentNode, "toggle");
+ } else if (ev.target.tagName === "SPAN" && hasClass(ev.target.parentNode, "line-numbers")) {
+ handleSourceHighlight(ev);
} else if (hasClass(getHelpElement(), "hidden") === false) {
var help = getHelpElement();
var is_inside_help_popup = ev.target !== help && help.contains(ev.target);