Page MenuHome GnuPG

No OneTemporary

diff --git a/webroot/rsrc/js/application/core/behavior-active-nav.js b/webroot/rsrc/js/application/core/behavior-active-nav.js
index 43fcc3328..a753e1518 100644
--- a/webroot/rsrc/js/application/core/behavior-active-nav.js
+++ b/webroot/rsrc/js/application/core/behavior-active-nav.js
@@ -1,86 +1,98 @@
/**
* @provides javelin-behavior-phabricator-active-nav
* @requires javelin-behavior
* javelin-stratcom
* javelin-vector
* javelin-dom
* javelin-uri
*/
JX.behavior('phabricator-active-nav', function(config) {
var local = JX.$(config.localID);
/**
* Select the navigation item corresponding to a given anchor.
*/
var selectnav = function(anchor) {
var links = JX.DOM.scry(local, 'a');
var link;
var link_anchor;
var selected;
for (var ii = 0; ii < links.length; ii++) {
link = links[ii];
link_anchor = JX.$U(link.href).getFragment();
selected = (link_anchor == anchor);
JX.DOM.alterClass(
link,
'phabricator-active-nav-focus',
selected);
+ if (selected && link.scrollIntoView) {
+ link.scrollIntoView(false);
+ }
}
- }
+ };
/**
* Identify the current anchor based on the document scroll position.
*/
var updateposition = function() {
// Find all the markers in the document.
var scroll_position = JX.Vector.getScroll().y;
var document_size = JX.Vector.getDocument();
var viewport_size = JX.Vector.getViewport();
// If we're scrolled all the way down, we always want to select the last
// anchor.
var is_at_bottom = (viewport_size.y + scroll_position >= document_size.y);
var markers = JX.DOM.scry(document.body, 'legend', 'marker');
// Sort the markers by Y position, descending.
var markinfo = [];
for (var ii = 0; ii < markers.length; ii++) {
markinfo.push({
marker: markers[ii],
position: JX.$V(markers[ii]).y
});
}
markinfo.sort(function(u, v) { return (v.position - u.position); });
// Find the first marker above the current scroll position, or the first
// marker in the document if we're above all the markers.
var active = null;
for (var ii = 0; ii < markinfo.length; ii++) {
active = markinfo[ii].marker;
if (markinfo[ii].position <= scroll_position) {
break;
}
if (is_at_bottom) {
break;
}
}
// If we get above the first marker, select it.
selectnav(active && JX.Stratcom.getData(active).anchor);
- }
+ };
var pending = null;
var onviewportchange = function(e) {
pending && clearTimeout(pending);
pending = setTimeout(updateposition, 100);
- }
+ };
+
+ var onscroll = function(e) {
+ if (e.getNode('tag:body')) {
+ // If we are inside <body> then it means we just scrolled some <textarea>
+ // or <div style="overflow: scroll;">. We are interested only in window.
+ return;
+ }
+ onviewportchange(e);
+ };
- JX.Stratcom.listen('scroll', null, onviewportchange);
+ JX.Stratcom.listen('scroll', null, onscroll);
JX.Stratcom.listen('resize', null, onviewportchange);
JX.Stratcom.listen('hashchange', null, onviewportchange);
});

File Metadata

Mime Type
text/x-diff
Expires
Sat, Jul 12, 10:30 AM (1 d, 11 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
59/07/f0213d235f3dad27d59dee349d44

Event Timeline