diff --git a/scripts/celerity_mapper.php b/scripts/celerity_mapper.php index 433f069124..dc047693ec 100755 --- a/scripts/celerity_mapper.php +++ b/scripts/celerity_mapper.php @@ -50,6 +50,7 @@ $package_spec = array( 'javelin-behavior-phabricator-search-typeahead', 'javelin-behavior-konami', 'javelin-behavior-aphlict-dropdown', + 'javelin-behavior-history-install', 'javelin-behavior-phabricator-active-nav', 'javelin-behavior-phabricator-nav', diff --git a/src/infrastructure/celerity/CelerityStaticResourceResponse.php b/src/infrastructure/celerity/CelerityStaticResourceResponse.php index 1545cd2ee0..758d7069e2 100644 --- a/src/infrastructure/celerity/CelerityStaticResourceResponse.php +++ b/src/infrastructure/celerity/CelerityStaticResourceResponse.php @@ -149,6 +149,7 @@ final class CelerityStaticResourceResponse { 'refresh-csrf', 'aphront-basic-tokenizer', 'dark-console', + 'history-install', ); $higher_priority_behaviors = array_select_keys( diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php index 1261573ea1..0963391c96 100644 --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -153,6 +153,7 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView { Javelin::initBehavior('aphront-form-disable-on-submit'); Javelin::initBehavior('toggle-class', array()); Javelin::initBehavior('konami', array()); + Javelin::initBehavior('history-install'); $current_token = null; if ($user) { diff --git a/webroot/rsrc/js/application/core/behavior-history-install.js b/webroot/rsrc/js/application/core/behavior-history-install.js new file mode 100644 index 0000000000..319a767462 --- /dev/null +++ b/webroot/rsrc/js/application/core/behavior-history-install.js @@ -0,0 +1,9 @@ +/** + * @provides javelin-behavior-history-install + * @requires javelin-behavior + * javelin-history + */ + +JX.behavior('history-install', function() { + JX.History.install(); +}); diff --git a/webroot/rsrc/js/application/diffusion/behavior-line-linker.js b/webroot/rsrc/js/application/diffusion/behavior-line-linker.js index 383ce448b0..b08f3b0271 100644 --- a/webroot/rsrc/js/application/diffusion/behavior-line-linker.js +++ b/webroot/rsrc/js/application/diffusion/behavior-line-linker.js @@ -3,7 +3,7 @@ * @requires javelin-behavior * javelin-stratcom * javelin-dom - * javelin-uri + * javelin-history */ JX.behavior('diffusion-line-linker', function() { @@ -31,29 +31,35 @@ JX.behavior('diffusion-line-linker', function() { }); JX.Stratcom.listen( - 'mouseover', - 'diffusion-source', + 'click', + 'diffusion-line-link', function(e) { - if (!origin || e.getNode('diffusion-source') !== root) { - return; - } - target = e.getNode('tag:tr'); - - var highlighting = false; - var source = null; - var trs = JX.DOM.scry(root, 'tr'); - for (var i = 0; i < trs.length; i++) { - if (!highlighting && (trs[i] === origin || trs[i] === target)) { - highlighting = true; - source = trs[i]; - } - JX.DOM.alterClass(trs[i], 'highlighted', highlighting); - if (trs[i] === (source === origin ? target : origin)) { - highlighting = false; - } - } + e.kill(); }); + var highlight = function(e) { + if (!origin || e.getNode('diffusion-source') !== root) { + return; + } + target = e.getNode('tag:tr'); + + var highlighting = false; + var source = null; + var trs = JX.DOM.scry(root, 'tr'); + for (var i = 0; i < trs.length; i++) { + if (!highlighting && (trs[i] === origin || trs[i] === target)) { + highlighting = true; + source = trs[i]; + } + JX.DOM.alterClass(trs[i], 'highlighted', highlighting); + if (trs[i] === (source === origin ? target : origin)) { + highlighting = false; + } + } + }; + + JX.Stratcom.listen('mouseover', 'diffusion-source', highlight); + JX.Stratcom.listen( 'mouseup', null, @@ -62,6 +68,8 @@ JX.behavior('diffusion-line-linker', function() { return; } + highlight(e); + var o = getRowNumber(origin); var t = getRowNumber(target); var lines = (o == t ? o : Math.min(o, t) + '-' + Math.max(o, t)); @@ -72,7 +80,7 @@ JX.behavior('diffusion-line-linker', function() { origin = null; target = null; e.kill(); - JX.$U(uri).go(); + JX.History.replace(uri); }); });