about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2019-11-05 17:41:40 +0100
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2019-11-06 10:10:56 +0100
commitf66a331335f3ac931afabca6f927a9d7dc17db3e (patch)
tree72b3c918c31e1b0ee9dae05ea9bc74d1dd5ee453
parente4931eaaa3d95189b30e90d3af9f0db17c41bbb0 (diff)
downloadrust-f66a331335f3ac931afabca6f927a9d7dc17db3e.tar.gz
rust-f66a331335f3ac931afabca6f927a9d7dc17db3e.zip
When a URL hash refers to a hidden element, it makes the element visible
-rw-r--r--src/librustdoc/html/static/main.js61
1 files changed, 51 insertions, 10 deletions
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 53e16978ff1..9faddb8bc3f 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -161,17 +161,18 @@ function getSearchElement() {
         return window.history && typeof window.history.pushState === "function";
     }
 
+    function isHidden(elem) {
+        return elem.offsetHeight === 0;
+    }
+
     var main = document.getElementById("main");
+    var savedHash = "";
 
-    function onHashChange(ev) {
-        // If we're in mobile mode, we should hide the sidebar in any case.
-        hideSidebar();
-        var match = window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);
-        if (match) {
-            return highlightSourceLines(match, ev);
-        }
+    function handleHashes(ev) {
         var search = 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");
             var hash = ev.newURL.slice(ev.newURL.indexOf("#") + 1);
@@ -183,6 +184,35 @@ function getSearchElement() {
                 elem.scrollIntoView();
             }
         }
+        // This part is used in case an element is not visible.
+        if (savedHash !== window.location.hash) {
+            savedHash = window.location.hash;
+            if (savedHash.length === 0) {
+                return;
+            }
+            var elem = document.getElementById(savedHash.slice(1)); // we remove the '#'
+            if (!elem || !isHidden(elem)) {
+                return;
+            }
+            var parent = elem.parentNode;
+            if (parent && hasClass(parent, "impl-items")) {
+                // In case this is a trait implementation item, we first need to toggle
+                // the "Show hidden undocumented items".
+                onEachLazy(parent.getElementsByClassName("collapsed"), function(e) {
+                    if (e.parentNode === parent) {
+                        // Only click on the toggle we're looking for.
+                        e.click();
+                        return true;
+                    }
+                });
+                if (isHidden(elem)) {
+                    // The whole parent is collapsed. We need to click on its toggle as well!
+                    if (hasClass(parent.lastElementChild, "collapse-toggle")) {
+                        parent.lastElementChild.click();
+                    }
+                }
+            }
+        }
     }
 
     function highlightSourceLines(match, ev) {
@@ -228,6 +258,16 @@ function getSearchElement() {
         }
     }
 
+    function onHashChange(ev) {
+        // If we're in mobile mode, we should hide the sidebar in any case.
+        hideSidebar();
+        var match = window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);
+        if (match) {
+            return highlightSourceLines(match, ev);
+        }
+        handleHashes();
+    }
+
     function expandSection(id) {
         var elem = document.getElementById(id);
         if (elem && isHidden(elem)) {
@@ -246,9 +286,6 @@ function getSearchElement() {
         }
     }
 
-    highlightSourceLines();
-    window.onhashchange = onHashChange;
-
     // Gets the human-readable string for the virtual-key code of the
     // given KeyboardEvent, ev.
     //
@@ -2615,6 +2652,10 @@ function getSearchElement() {
         insertAfter(popup, getSearchElement());
     }
 
+    handleHashes();
+    highlightSourceLines();
+    window.onhashchange = onHashChange;
+
     buildHelperPopup();
 }());