diff options
author | Ascrod <32915892+Ascrod@users.noreply.github.com> | 2018-07-04 21:25:02 -0400 |
---|---|---|
committer | Ascrod <32915892+Ascrod@users.noreply.github.com> | 2018-07-04 21:25:02 -0400 |
commit | caa2ac23c3b669e77890d9ee62ce7865be5c2190 (patch) | |
tree | ecbac49f7152847c46de36c78eb4823da0b9179c | |
parent | 057bc2ddba93c1170aef58922c2a7beba04d0de2 (diff) | |
download | UXP-caa2ac23c3b669e77890d9ee62ce7865be5c2190.tar UXP-caa2ac23c3b669e77890d9ee62ce7865be5c2190.tar.gz UXP-caa2ac23c3b669e77890d9ee62ce7865be5c2190.tar.lz UXP-caa2ac23c3b669e77890d9ee62ce7865be5c2190.tar.xz UXP-caa2ac23c3b669e77890d9ee62ce7865be5c2190.zip |
Fix local link handling in Reader Mode.
-rw-r--r-- | toolkit/components/reader/AboutReader.jsm | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/toolkit/components/reader/AboutReader.jsm b/toolkit/components/reader/AboutReader.jsm index fb82e5789..c5d04476d 100644 --- a/toolkit/components/reader/AboutReader.jsm +++ b/toolkit/components/reader/AboutReader.jsm @@ -200,9 +200,6 @@ AboutReader.prototype = { } else if (!target.closest(".dropdown-popup")) { this._closeDropdowns(); } - if (target.tagName == "A" && !target.classList.contains("reader-domain")) { - this._linkClicked(aEvent); - } break; case "scroll": this._closeDropdowns(true); @@ -720,6 +717,21 @@ AboutReader.prototype = { } }, + _fixLocalLinks() { + // We need to do this because preprocessing the content through nsIParserUtils + // gives back a DOM with a <base> element. That influences how these URLs get + // resolved, making them no longer match the document URI (which is + // about:reader?url=...). To fix this, make all the hash URIs absolute. This + // is hacky, but the alternative of removing the base element has potential + // security implications if Readability has not successfully made all the URLs + // absolute, so we pick just fixing these in-document links explicitly. + let localLinks = this._contentElement.querySelectorAll("a[href^='#']"); + for (let localLink of localLinks) { + // Have to get the attribute because .href provides an absolute URI. + localLink.href = this._doc.documentURI + localLink.getAttribute("href"); + } + }, + _formatReadTime(slowEstimate, fastEstimate) { let displayStringKey = "aboutReader.estimatedReadTimeRange1"; @@ -790,6 +802,7 @@ AboutReader.prototype = { false, articleUri, this._contentElement); this._contentElement.innerHTML = ""; this._contentElement.appendChild(contentFragment); + this._fixLocalLinks(); this._maybeSetTextDirection(article); this._foundLanguage(article.language); @@ -978,18 +991,6 @@ AboutReader.prototype = { }, /* - * Override link handling for same-page references so we don't exit Reader View. - */ - _linkClicked(event) { - var originalUrl = Services.io.newURI(this._getOriginalUrl(), null, null); - var targetUrl = Services.io.newURI(event.target.href, null, null); - if (originalUrl.specIgnoringRef == targetUrl.specIgnoringRef) { - event.preventDefault(); - this._goToReference(targetUrl.ref); - } - }, - - /* * Scroll reader view to a reference */ _goToReference(ref) { |