FIX: Some absolute links were causing full page reloads (#13377)
This commit is contained in:
parent
7fca7fb7ff
commit
96c14c1968
|
@ -1,13 +1,6 @@
|
||||||
let cdn, baseUrl, baseUri, baseUriMatcher;
|
let cdn, baseUrl, baseUri, baseUriMatcher;
|
||||||
let S3BaseUrl, S3CDN;
|
let S3BaseUrl, S3CDN;
|
||||||
|
|
||||||
export function getBaseURI() {
|
|
||||||
if (baseUri === undefined) {
|
|
||||||
setPrefix($('meta[name="discourse-base-uri"]').attr("content") || "");
|
|
||||||
}
|
|
||||||
return baseUri || "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function getURL(url) {
|
export default function getURL(url) {
|
||||||
if (baseUri === undefined) {
|
if (baseUri === undefined) {
|
||||||
setPrefix($('meta[name="discourse-base-uri"]').attr("content") || "");
|
setPrefix($('meta[name="discourse-base-uri"]').attr("content") || "");
|
||||||
|
@ -76,3 +69,14 @@ export function setupS3CDN(configS3BaseUrl, configS3CDN) {
|
||||||
S3BaseUrl = configS3BaseUrl;
|
S3BaseUrl = configS3BaseUrl;
|
||||||
S3CDN = configS3CDN;
|
S3CDN = configS3CDN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We can use this to identify when navigating on the same host but outside of the
|
||||||
|
// prefix directory. For example from `/forum` to `/about-us` which is not discourse
|
||||||
|
export function samePrefix(url) {
|
||||||
|
if (baseUri === undefined) {
|
||||||
|
setPrefix($('meta[name="discourse-base-uri"]').attr("content") || "");
|
||||||
|
}
|
||||||
|
let origin = window.location.origin;
|
||||||
|
let cmp = url[0] === "/" ? baseUri || "/" : origin + baseUri || origin;
|
||||||
|
return url.indexOf(cmp) === 0;
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { Promise } from "rsvp";
|
||||||
import User from "discourse/models/user";
|
import User from "discourse/models/user";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import bootbox from "bootbox";
|
import bootbox from "bootbox";
|
||||||
import getURL, { getBaseURI } from "discourse-common/lib/get-url";
|
import getURL, { samePrefix } from "discourse-common/lib/get-url";
|
||||||
import { isTesting } from "discourse-common/config/environment";
|
import { isTesting } from "discourse-common/config/environment";
|
||||||
import { later } from "@ember/runloop";
|
import { later } from "@ember/runloop";
|
||||||
import { selectedText } from "discourse/lib/utilities";
|
import { selectedText } from "discourse/lib/utilities";
|
||||||
|
@ -162,10 +162,7 @@ export default {
|
||||||
openLinkInNewTab($link[0]);
|
openLinkInNewTab($link[0]);
|
||||||
} else {
|
} else {
|
||||||
trackPromise.finally(() => {
|
trackPromise.finally(() => {
|
||||||
if (
|
if (DiscourseURL.isInternal(href) && samePrefix(href)) {
|
||||||
DiscourseURL.isInternal(href) &&
|
|
||||||
href.indexOf(getBaseURI()) === 0
|
|
||||||
) {
|
|
||||||
DiscourseURL.routeTo(href);
|
DiscourseURL.routeTo(href);
|
||||||
} else {
|
} else {
|
||||||
DiscourseURL.redirectAbsolute(href);
|
DiscourseURL.redirectAbsolute(href);
|
||||||
|
|
|
@ -49,6 +49,7 @@ module("Unit | Utility | click-track", function (hooks) {
|
||||||
<a href="https://google.com">bar</a>
|
<a href="https://google.com">bar</a>
|
||||||
</aside>
|
</aside>
|
||||||
<a class="prefix-url" href="/forum/thing">prefix link</a>
|
<a class="prefix-url" href="/forum/thing">prefix link</a>
|
||||||
|
<a class="abs-prefix-url" href="${window.location.origin}/forum/thing">prefix link</a>
|
||||||
<a class="diff-prefix-url" href="/thing">diff prefix link</a>
|
<a class="diff-prefix-url" href="/thing">diff prefix link</a>
|
||||||
</article>
|
</article>
|
||||||
</div>`
|
</div>`
|
||||||
|
@ -97,6 +98,17 @@ module("Unit | Utility | click-track", function (hooks) {
|
||||||
assert.ok(DiscourseURL.routeTo.calledWith("/forum/thing"));
|
assert.ok(DiscourseURL.routeTo.calledWith("/forum/thing"));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("routes to absolute internal urls", async function (assert) {
|
||||||
|
setPrefix("/forum");
|
||||||
|
pretender.post("/clicks/track", () => [200, {}, ""]);
|
||||||
|
await track(generateClickEventOn(".abs-prefix-url"), null, {
|
||||||
|
returnPromise: true,
|
||||||
|
});
|
||||||
|
assert.ok(
|
||||||
|
DiscourseURL.routeTo.calledWith(window.location.origin + "/forum/thing")
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test("redirects to internal urls with a different prefix", async function (assert) {
|
test("redirects to internal urls with a different prefix", async function (assert) {
|
||||||
setPrefix("/forum");
|
setPrefix("/forum");
|
||||||
sinon.stub(DiscourseURL, "redirectAbsolute");
|
sinon.stub(DiscourseURL, "redirectAbsolute");
|
||||||
|
|
Loading…
Reference in New Issue