diff --git a/app/assets/javascripts/discourse/lib/click-track.js.es6 b/app/assets/javascripts/discourse/lib/click-track.js.es6 index 96ea6f2f9cf..327ca311f74 100644 --- a/app/assets/javascripts/discourse/lib/click-track.js.es6 +++ b/app/assets/javascripts/discourse/lib/click-track.js.es6 @@ -128,16 +128,18 @@ export default { const isInternal = DiscourseURL.isInternal(href); // If we're on the same site, use the router and track via AJAX - if (tracking && isInternal && !$link.hasClass("attachment")) { - ajax("/clicks/track", { - data: { - url: href, - post_id: postId, - topic_id: topicId, - redirect: false - }, - dataType: "html" - }); + if (isInternal && !$link.hasClass("attachment")) { + if (tracking) { + ajax("/clicks/track", { + data: { + url: href, + post_id: postId, + topic_id: topicId, + redirect: false + }, + dataType: "html" + }); + } DiscourseURL.routeTo(href); return false; } diff --git a/app/assets/javascripts/discourse/lib/url.js.es6 b/app/assets/javascripts/discourse/lib/url.js.es6 index 786ed36081f..e7f46eb8709 100644 --- a/app/assets/javascripts/discourse/lib/url.js.es6 +++ b/app/assets/javascripts/discourse/lib/url.js.es6 @@ -187,13 +187,7 @@ const DiscourseURL = Ember.Object.extend({ const pathname = path.replace(/(https?\:)?\/\/[^\/]+/, ""); const baseUri = Discourse.BaseUri; - // If we have a baseUri and an absolute URL, make sure the baseUri - // is the same. Otherwise we could be switching forums. - if ( - baseUri && - path.indexOf("http") === 0 && - pathname.indexOf(baseUri) !== 0 - ) { + if (!DiscourseURL.isInternal(path)) { return redirectTo(path); } @@ -207,11 +201,6 @@ const DiscourseURL = Ember.Object.extend({ return; } - // Protocol relative URLs - if (path.indexOf("//") === 0) { - return redirectTo(path); - } - // Scroll to the same page, different anchor const m = /^#(.+)$/.exec(path); if (m) { diff --git a/test/javascripts/lib/click-track-test.js.es6 b/test/javascripts/lib/click-track-test.js.es6 index 6b2149b9830..146d23df2bb 100644 --- a/test/javascripts/lib/click-track-test.js.es6 +++ b/test/javascripts/lib/click-track-test.js.es6 @@ -30,7 +30,8 @@ QUnit.module("lib:click-track", { #hashtag email-me ` @@ -45,14 +46,14 @@ var generateClickEventOn = function(selector) { return $.Event("click", { currentTarget: fixture(selector)[0] }); }; -QUnit.test("does not track clicks on lightboxes", function(assert) { +QUnit.test("does not track clicks on lightboxes", assert => { var clickEvent = generateClickEventOn(".lightbox"); sandbox.stub(clickEvent, "preventDefault"); assert.ok(track(clickEvent)); assert.ok(!clickEvent.preventDefault.calledOnce); }); -QUnit.test("it calls preventDefault when clicking on an a", function(assert) { +QUnit.test("it calls preventDefault when clicking on an a", assert => { var clickEvent = generateClickEventOn("a"); sandbox.stub(clickEvent, "preventDefault"); track(clickEvent); @@ -60,28 +61,40 @@ QUnit.test("it calls preventDefault when clicking on an a", function(assert) { assert.ok(DiscourseURL.redirectTo.calledOnce); }); -QUnit.test("does not track clicks when forcibly disabled", function(assert) { +QUnit.test("does not track clicks when forcibly disabled", assert => { assert.ok(track(generateClickEventOn(".no-track-link"))); }); -QUnit.test("does not track clicks on back buttons", function(assert) { +QUnit.test("does not track clicks on back buttons", assert => { assert.ok(track(generateClickEventOn(".back"))); }); -QUnit.test("does not track clicks in quotes", function(assert) { - track(generateClickEventOn(".inside-quote")); - assert.ok(DiscourseURL.redirectTo.calledWith("http://discuss.domain.com")); +QUnit.test("does not track clicks to internal links in quotes", assert => { + sandbox.stub(DiscourseURL, "routeTo"); + sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com"); + + track(generateClickEventOn(".quote a:first-child")); + assert.ok( + DiscourseURL.routeTo.calledWith( + "https://discuss.domain.com/t/welcome-to-meta-discourse-org/1/30" + ) + ); +}); + +QUnit.test("does not track clicks to external links in quotes", assert => { + track(generateClickEventOn(".quote a:last-child")); + assert.ok(DiscourseURL.redirectTo.calledWith("https://google.com")); }); QUnit.test("does not track clicks on category badges", assert => { assert.ok(track(generateClickEventOn(".hashtag"))); }); -QUnit.test("does not track clicks on mailto", function(assert) { +QUnit.test("does not track clicks on mailto", assert => { assert.ok(track(generateClickEventOn(".mailto"))); }); -QUnit.test("removes the href and put it as a data attribute", function(assert) { +QUnit.test("removes the href and put it as a data attribute", assert => { track(generateClickEventOn("a")); var $link = fixture("a").first(); @@ -92,7 +105,7 @@ QUnit.test("removes the href and put it as a data attribute", function(assert) { assert.ok(DiscourseURL.redirectTo.calledOnce); }); -asyncTestDiscourse("restores the href after a while", function(assert) { +asyncTestDiscourse("restores the href after a while", assert => { assert.expect(1); track(generateClickEventOn("a")); @@ -110,7 +123,7 @@ var badgeClickCount = function(assert, id, expected) { assert.equal(parseInt($badge.html(), 10), expected); }; -QUnit.test("does not update badge clicks on my own link", function(assert) { +QUnit.test("does not update badge clicks on my own link", assert => { sandbox .stub(Discourse.User, "currentProp") .withArgs("id") @@ -118,7 +131,7 @@ QUnit.test("does not update badge clicks on my own link", function(assert) { badgeClickCount(assert, "with-badge", 1); }); -QUnit.test("does not update badge clicks in my own post", function(assert) { +QUnit.test("does not update badge clicks in my own post", assert => { sandbox .stub(Discourse.User, "currentProp") .withArgs("id") @@ -126,14 +139,14 @@ QUnit.test("does not update badge clicks in my own post", function(assert) { badgeClickCount(assert, "with-badge-but-not-mine", 1); }); -QUnit.test("updates badge counts correctly", function(assert) { +QUnit.test("updates badge counts correctly", assert => { badgeClickCount(assert, "inside-onebox", 1); badgeClickCount(assert, "inside-onebox-forced", 2); badgeClickCount(assert, "with-badge", 2); }); var testOpenInANewTab = function(description, clickEventModifier) { - test(description, function(assert) { + test(description, assert => { var clickEvent = generateClickEventOn("a"); clickEventModifier(clickEvent); sandbox.stub(clickEvent, "preventDefault"); @@ -166,7 +179,7 @@ testOpenInANewTab("it opens in a new tab on middle click", function( clickEvent.button = 2; }); -QUnit.test("tracks via AJAX if we're on the same site", function(assert) { +QUnit.test("tracks via AJAX if we're on the same site", assert => { sandbox.stub(DiscourseURL, "routeTo"); sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com"); @@ -174,7 +187,7 @@ QUnit.test("tracks via AJAX if we're on the same site", function(assert) { assert.ok(DiscourseURL.routeTo.calledOnce); }); -QUnit.test("does not track via AJAX for attachments", function(assert) { +QUnit.test("does not track via AJAX for attachments", assert => { sandbox.stub(DiscourseURL, "routeTo"); sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com");