diff --git a/static/skin/viewer.js b/static/skin/viewer.js
index 2c3c80a14..d1e7bb1ae 100644
--- a/static/skin/viewer.js
+++ b/static/skin/viewer.js
@@ -23,7 +23,7 @@ function userUrl2IframeUrl(url) {
}
function getBookFromUserUrl(url) {
- if ( url == '' ) {
+ if ( url == '' || url.startsWith('catch/external?') ) {
return null;
}
@@ -131,6 +131,10 @@ function iframeUrl2UserUrl(url, query) {
return '';
}
+ if ( url == `${root}/catch/external` ) {
+ return `catch/external${query}`;
+ }
+
if ( url == `${root}/search` ) {
return `search${query}`;
}
@@ -224,8 +228,12 @@ function handle_content_url_change() {
const iframeContentUrl = iframeLocation.pathname;
const iframeContentQuery = iframeLocation.search;
const newHash = iframeUrl2UserUrl(iframeContentUrl, iframeContentQuery);
- history.replaceState(viewerState, null, makeURL(location.search, newHash));
- updateCurrentBookIfNeeded(newHash);
+ if ( newHash.startsWith('catch/external?') ) {
+ handleInterceptedExternalLink(newHash);
+ } else {
+ history.replaceState(viewerState, null, makeURL(location.search, newHash));
+ updateCurrentBookIfNeeded(newHash);
+ }
};
////////////////////////////////////////////////////////////////////////////////
@@ -262,10 +270,7 @@ function onClickEvent(e) {
const target = matchingAncestorElement(e.target, iframeDocument, "a");
if (target !== null && "href" in target) {
if ( isExternalUrl(target.href) ) {
- target.setAttribute("target", "_top");
- if ( viewerSettings.linkBlockingEnabled ) {
- return blockLink(target);
- }
+ return blockLink(target);
}
}
}
@@ -304,6 +309,16 @@ function setup_external_link_blocker() {
setupEventHandler(contentIframe.contentDocument, 'a', 'click', onClickEvent);
}
+function handleInterceptedExternalLink(catchExternalUrl) {
+ // The external link blocking page was loaded in the viewer iframe.
+ // We need to get rid of the viewer taskbar and display the confirmation
+ // page in the top frame.
+ const urlpath = `${root}/` + catchExternalUrl;
+ history.back(); // drop from the browsing history the state where the
+ // external link catcher page is loaded in the iframe ...
+ window.location = urlpath; // ... and load it in the top frame instead
+}
+
////////////////////////////////////////////////////////////////////////////////
// End of external link blocking
////////////////////////////////////////////////////////////////////////////////
diff --git a/test/server.cpp b/test/server.cpp
index 961ef9a06..862dd3ba5 100644
--- a/test/server.cpp
+++ b/test/server.cpp
@@ -73,7 +73,7 @@ const ResourceCollection resources200Compressible{
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/taskbar.css" },
{ STATIC_CONTENT, "/ROOT%23%3F/skin/taskbar.css?cacheid=bbdaf425" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/viewer.js" },
- { STATIC_CONTENT, "/ROOT%23%3F/skin/viewer.js?cacheid=b9a574d4" },
+ { STATIC_CONTENT, "/ROOT%23%3F/skin/viewer.js?cacheid=202f8641" },
{ 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" },
@@ -312,7 +312,7 @@ R"EXPECTEDRESULT(
-
+
const blankPageUrl = root + "/skin/blank.html?cacheid=6b1fa032";