about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2019-11-08 13:42:19 +0900
committerGitHub <noreply@github.com>2019-11-08 13:42:19 +0900
commit392ebad5c693ee9dab4faa70bf400fff1f523dd7 (patch)
treeb49809055d0d2e58ff7be1c881d073e85c7a5153 /src
parent996d94a9db8ec6f8c6feb4d11a0c53a1436457ff (diff)
parentd4527b7e00de1e6ed5b22a3fdb99a4515f2ba482 (diff)
Rollup merge of #66123 - GuillaumeGomez:no-more-hidden-elements, r=Dylan-DPC
No more hidden elements

Fixes #66046.

Follow-up of #66082.

r? @kinnison
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/html/static/main.js62
-rw-r--r--src/librustdoc/html/static/storage.js4
2 files changed, 51 insertions, 15 deletions
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 87eb36aba13..04c0a0f005b 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -3,7 +3,7 @@
 
 // Local js definitions:
 /* global addClass, getCurrentValue, hasClass */
-/* global isHidden, onEach, removeClass, updateLocalStorage */
+/* global onEach, removeClass, updateLocalStorage */
 
 if (!String.prototype.startsWith) {
     String.prototype.startsWith = function(searchString, position) {
@@ -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(ev);
+    }
+
     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.
     //
@@ -2639,6 +2676,9 @@ function getSearchElement() {
         insertAfter(popup, getSearchElement());
     }
 
+    onHashChange();
+    window.onhashchange = onHashChange;
+
     buildHelperPopup();
 }());
 
diff --git a/src/librustdoc/html/static/storage.js b/src/librustdoc/html/static/storage.js
index eae998ca3ec..d142d99ac70 100644
--- a/src/librustdoc/html/static/storage.js
+++ b/src/librustdoc/html/static/storage.js
@@ -24,10 +24,6 @@ function removeClass(elem, className) {
     elem.classList.remove(className);
 }
 
-function isHidden(elem) {
-    return elem.offsetParent === null;
-}
-
 function onEach(arr, func, reversed) {
     if (arr && arr.length > 0 && func) {
         var length = arr.length;