diff --git a/static/skin/viewer.js b/static/skin/viewer.js
index 0b7a6787..89bbae47 100644
--- a/static/skin/viewer.js
+++ b/static/skin/viewer.js
@@ -10,6 +10,8 @@ let viewerState = {
uiLanguage: 'en',
};
+const FULL_ROOT_URL = `${window.location.origin}${root}`;
+
function dropUserLang(query) {
const q = new URLSearchParams(query);
q.delete('userlang');
@@ -347,6 +349,12 @@ function onClickEvent(e) {
if (target !== null && "href" in target) {
const target_href = getRealHref(target);
const target_url = new URL(target_href, iframeDocument.location);
+ if ( target_url.href.startsWith(`${FULL_ROOT_URL}/viewer#`) &&
+ !linkShouldBeOpenedInANewWindow(target, e) ) {
+ contentIframe.contentWindow.parent.location = target_url;
+ e.preventDefault();
+ return;
+ }
const isExternalAppUrl = urlMustBeHandledByAnExternalApp(target_url);
if ( (isExternalAppUrl && !viewerSettings.linkBlockingEnabled)
|| goingToOpenALinkToAnUndisplayableResource(target_url) ) {
@@ -398,14 +406,24 @@ this.Element && function(ElementPrototype) {
}
}(Element.prototype);
-function setup_external_link_blocker() {
- setupEventHandler(contentIframe.contentDocument, 'a', 'click', onClickEvent);
-}
-
////////////////////////////////////////////////////////////////////////////////
// End of external link blocking
////////////////////////////////////////////////////////////////////////////////
+const internalUrlPrefix = `${FULL_ROOT_URL}/content/`;
+
+function setup_chaperon_mode() {
+ setupEventHandler(contentIframe.contentDocument, 'a', 'click', onClickEvent);
+ const links = contentIframe.contentDocument.getElementsByTagName('a');
+ for ( const a of links ) {
+ // XXX: wombat's possible involvement with href not taken into account
+ if ( a.hasAttribute('href') && a.href.startsWith(internalUrlPrefix) ) {
+ const userUrl = a.href.substr(internalUrlPrefix.length);
+ a.href = `${root}/viewer#${userUrl}`;
+ }
+ }
+}
+
let viewerSetupComplete = false;
function on_content_load() {
@@ -416,7 +434,7 @@ function on_content_load() {
if ( viewerSetupComplete ) {
handle_content_url_change();
}
- setup_external_link_blocker();
+ setup_chaperon_mode();
}
function htmlDecode(input) {
diff --git a/test/server.cpp b/test/server.cpp
index bf5a2a34..481ff31f 100644
--- a/test/server.cpp
+++ b/test/server.cpp
@@ -77,7 +77,7 @@ const ResourceCollection resources200Compressible{
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/taskbar.css" },
{ STATIC_CONTENT, "/ROOT%23%3F/skin/taskbar.css?cacheid=42e90cb9" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/viewer.js" },
- { STATIC_CONTENT, "/ROOT%23%3F/skin/viewer.js?cacheid=7f05bf6c" },
+ { STATIC_CONTENT, "/ROOT%23%3F/skin/viewer.js?cacheid=05ef466b" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/fonts/Poppins.ttf" },
{ STATIC_CONTENT, "/ROOT%23%3F/skin/fonts/Poppins.ttf?cacheid=af705837" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/fonts/Roboto.ttf" },
@@ -338,7 +338,7 @@ R"EXPECTEDRESULT(
-
+
const blankPageUrl = root + "/skin/blank.html?cacheid=6b1fa032";