From cce3b0d81645611b35f34d828f0bab819aa62f38 Mon Sep 17 00:00:00 2001 From: wanderor Date: Sat, 21 Sep 2024 03:22:44 +0800 Subject: [PATCH 1/2] Overwrite img src with data-src Many website (e.g. Wechat) sets a placeholder for img src and loads the actual URL lazily. Mozilla Readability attempted to recognize and handle it, but the logic is narrow and does not cover many cases. Instead, this code change aggressively assume that we can overwrite img src with data-src, etc. --- app/src/main/assets/MozReadability.js | 8 ++++++-- .../java/info/plateaukao/einkbro/view/NinjaWebView.kt | 11 ++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/assets/MozReadability.js b/app/src/main/assets/MozReadability.js index c42a691a0..388fd38b3 100644 --- a/app/src/main/assets/MozReadability.js +++ b/app/src/main/assets/MozReadability.js @@ -54,6 +54,7 @@ function Readability(doc, options) { return el.innerHTML; }; this._disableJSONLD = !!options.disableJSONLD; + this._overwriteImgSrc = !!options.overwriteImgSrc; // Start with all flags set this._flags = this.FLAG_STRIP_UNLIKELYS | @@ -1979,7 +1980,9 @@ Readability.prototype = { } // also check for "null" to work around https://github.com/jsdom/jsdom/issues/2580 - if ((elem.src || (elem.srcset && elem.srcset != "null")) && elem.className.toLowerCase().indexOf("lazy") === -1) { + if ((elem.src || (elem.srcset && elem.srcset != "null")) && + elem.className.toLowerCase().indexOf("lazy") === -1 && + !this._overwriteImgSrc) { return; } @@ -1991,7 +1994,8 @@ Readability.prototype = { var copyTo = null; if (/\.(jpg|jpeg|png|webp)\s+\d/.test(attr.value)) { copyTo = "srcset"; - } else if (/^\s*\S+\.(jpg|jpeg|png|webp)\S*\s*$/.test(attr.value)) { + } else if (/^\s*\S+\.(jpg|jpeg|png|webp)\S*\s*$/.test(attr.value) || + /^\s*https?:\/\/\S+=(jpg|jpeg|png|webp)\S*\s*$/.test(attr.value)) { copyTo = "src"; } if (copyTo) { diff --git a/app/src/main/java/info/plateaukao/einkbro/view/NinjaWebView.kt b/app/src/main/java/info/plateaukao/einkbro/view/NinjaWebView.kt index 9f8d5ad58..d3e146a42 100755 --- a/app/src/main/java/info/plateaukao/einkbro/view/NinjaWebView.kt +++ b/app/src/main/java/info/plateaukao/einkbro/view/NinjaWebView.kt @@ -1203,9 +1203,14 @@ open class NinjaWebView( observer.observe(targetNode); }); """ + + + private const val readabilityOptions = + "{classesToPreserve: preservedClasses, overwriteImgSrc: true}" + private const val replaceWithReaderModeBodyJs = """ var documentClone = document.cloneNode(true); - var article = new Readability(documentClone, {classesToPreserve: preservedClasses}).parse(); + var article = new Readability(documentClone, $readabilityOptions).parse(); document.innerHTMLCache = document.body.innerHTML; article.readingTime = getReadingTime(article.length, document.lang); @@ -1218,7 +1223,7 @@ open class NinjaWebView( private const val getReaderModeBodyHtmlJs = """ javascript:(function() { var documentClone = document.cloneNode(true); - var article = new Readability(documentClone, {classesToPreserve: preservedClasses}).parse(); + var article = new Readability(documentClone, $readabilityOptions).parse(); article.readingTime = getReadingTime(article.length, document.lang); var bodyOuterHTML = createHtmlBodyWithUrl(article, "%s") var headOuterHTML = document.head.outerHTML; @@ -1228,7 +1233,7 @@ open class NinjaWebView( private const val getReaderModeBodyTextJs = """ javascript:(function() { var documentClone = document.cloneNode(true); - var article = new Readability(documentClone, {classesToPreserve: preservedClasses}).parse(); + var article = new Readability(documentClone, $readabilityOptions).parse(); return article.title + ', ' + article.textContent; })() """ From 2f9989186e4a63f911d165af25bbbc8c96899d0e Mon Sep 17 00:00:00 2001 From: wanderor Date: Sat, 21 Sep 2024 03:23:04 +0800 Subject: [PATCH 2/2] Log console.log() --- .../einkbro/browser/NinjaWebChromeClient.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/plateaukao/einkbro/browser/NinjaWebChromeClient.kt b/app/src/main/java/info/plateaukao/einkbro/browser/NinjaWebChromeClient.kt index 388003a2c..badfeff9f 100755 --- a/app/src/main/java/info/plateaukao/einkbro/browser/NinjaWebChromeClient.kt +++ b/app/src/main/java/info/plateaukao/einkbro/browser/NinjaWebChromeClient.kt @@ -5,8 +5,10 @@ import android.graphics.Bitmap import android.graphics.Color import android.net.Uri import android.os.Message +import android.util.Log import android.view.View import android.view.ViewGroup +import android.webkit.ConsoleMessage import android.webkit.CookieManager import android.webkit.GeolocationPermissions import android.webkit.PermissionRequest @@ -24,6 +26,8 @@ class NinjaWebChromeClient( private val ninjaWebView: NinjaWebView, private val onReceiveFavicon: (Bitmap) -> Unit, ) : WebChromeClient() { + private val TAG: String = "NinjaWebChromeClient" + private lateinit var webviewParent: ViewGroup override fun onCreateWindow( @@ -156,6 +160,11 @@ class NinjaWebChromeClient( super.onGeolocationPermissionsShowPrompt(origin, callback) } + override fun onConsoleMessage(message: ConsoleMessage): Boolean { + Log.d(TAG, message.message()) + return true + } + private val posterBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) .apply { setPixel(0, 0, Color.argb(0, 255, 255, 255)) } @@ -166,4 +175,4 @@ class NinjaWebChromeClient( val bitmap = icon ?: return onReceiveFavicon(bitmap) } -} \ No newline at end of file +}