Merge pull request #334 from kiwix/fix-external

fix external link blocking for nested elems in link
This commit is contained in:
Kelson 2020-04-01 20:05:24 +02:00 committed by GitHub
commit 411d4b0779
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 6 deletions

View File

@ -1,21 +1,22 @@
var block_path = "/catch/external"; var block_path = "/catch/external";
// called only on external links // called only on external links
function capture_event(e) { e.target.setAttribute("href", encodeURI(block_path + "?source=" + e.target.href)); } function capture_event(e, target) { target.setAttribute("href", encodeURI(block_path + "?source=" + target.href)); }
// called on all link clicks. filters external and call capture_event // called on all link clicks. filters external and call capture_event
function on_click_event(e) { function on_click_event(e) {
if ("target" in e && "href" in e.target) { var target = findParent("a", e.target);
var href = e.target.href; if (target !== null && "href" in target) {
var href = target.href;
if (window.location.pathname.indexOf(block_path) == 0) // already in catch page if (window.location.pathname.indexOf(block_path) == 0) // already in catch page
return; return;
if (href.indexOf(window.location.origin) == 0) if (href.indexOf(window.location.origin) == 0)
return; return;
if (href.substr(0, 2) == "//") if (href.substr(0, 2) == "//")
return capture_event(e); return capture_event(e, target);
if (href.substr(0, 5) == "http:") if (href.substr(0, 5) == "http:")
return capture_event(e); return capture_event(e, target);
if (href.substr(0, 6) == "https:") if (href.substr(0, 6) == "https:")
return capture_event(e); return capture_event(e, target);
return; return;
} }
} }
@ -23,6 +24,17 @@ function on_click_event(e) {
// script entrypoint (called on document ready) // script entrypoint (called on document ready)
function run() { live('a', 'click', on_click_event); } function run() { live('a', 'click', on_click_event); }
// find first parent with tagname
function findParent(tagname, el) {
while (el) {
if ((el.nodeName || el.tagName).toLowerCase() === tagname.toLowerCase()) {
return el;
}
el = el.parentNode;
}
return null;
}
// matches polyfill // matches polyfill
this.Element && function(ElementPrototype) { this.Element && function(ElementPrototype) {
ElementPrototype.matches = ElementPrototype.matches || ElementPrototype.matches = ElementPrototype.matches ||