Skip to content

Commit

Permalink
Download Eruda to SharedPreference for offline
Browse files Browse the repository at this point in the history
Except that CSP policy might stop loading fonts, everything else works
well.
  • Loading branch information
JingMatrix committed Dec 22, 2022
1 parent 9ea99ee commit 3a8295e
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 51 deletions.
6 changes: 3 additions & 3 deletions app/src/main/java/org/matrix/chromext/hook/Menu.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ object MenuHook : BaseHook() {
val id = it.args[0] as Int
if (ctx.getResources().getResourceName(id) ==
"org.matrix.chromext:id/developer_tools_id") {
UserScriptHook.proxy!!.openDevTools()
UserScriptHook.proxy!!.openDevTools(ctx)
}
}

findMethod(proxy.appMenuPropertiesDelegateImpl!!) { name == proxy.PREPARE_MENU }
// public void prepareMenu(Menu menu, AppMenuHandler handler)
.hookBefore {
val menu = it.args[0] as Menu
proxy.injectLocalMenu(it.thisObject, ctx, menu)
proxy.injectLocalMenu(it.thisObject, menu)
}

findMethod(proxy.preferenceFragmentCompat!!) { name == proxy.ADD_PREFERENCES_FROM_RESOURCE }
Expand All @@ -55,7 +55,7 @@ object MenuHook : BaseHook() {
val refThis = it
arrayOf("eruda", "exit").forEach {
proxy.setClickListener(
(refThis.method as Method).invoke(refThis.thisObject, it)!!, it)
(refThis.method as Method).invoke(refThis.thisObject, it)!!, ctx, it)
}
}
}
Expand Down
35 changes: 15 additions & 20 deletions app/src/main/java/org/matrix/chromext/proxy/Menu.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package org.matrix.chromext.proxy

import android.content.Context
import android.content.SharedPreferences
import android.view.Menu
import android.view.MenuInflater
import android.view.View
import android.view.View.OnClickListener
import android.widget.PopupMenu
import java.lang.reflect.Field
import org.matrix.chromext.R

// import org.matrix.chromext.R
import org.matrix.chromext.settings.DownloadEruda
import org.matrix.chromext.settings.ExitDevMode

class MenuProxy(ctx: Context) {

Expand Down Expand Up @@ -58,13 +56,13 @@ class MenuProxy(ctx: Context) {

// Find field with Landroid/view/View$OnClickListener
val CLICK_LISTENER_FIELD = "X"

var sharedPref: SharedPreferences? = null
}

private val mContext: Field? = null
private var mDecorView: Field? = null

var chromeContext: Context? = null

var chromeTabbedActivity: Class<*>? = null
var appMenuPropertiesDelegateImpl: Class<*>? = null
var developerSettings: Class<*>? = null
Expand All @@ -76,9 +74,12 @@ class MenuProxy(ctx: Context) {
var isDeveloper: Boolean = false

init {
sharedPref = ctx.getSharedPreferences("com.android.chrome_preferences", Context.MODE_PRIVATE)
val sharedPref =
ctx.getSharedPreferences("com.android.chrome_preferences", Context.MODE_PRIVATE)
isDeveloper = sharedPref!!.getBoolean("developer", false)

chromeContext = ctx

preference = ctx.getClassLoader().loadClass("androidx.preference.Preference")
developerSettings =
ctx.getClassLoader()
Expand All @@ -94,25 +95,19 @@ class MenuProxy(ctx: Context) {
mClickListener!!.setAccessible(true)
}

fun injectLocalMenu(obj: Any, ctx: Context, menu: Menu) {
val localPopup = PopupMenu(ctx, mDecorView!!.get(obj) as View)
fun injectLocalMenu(obj: Any, menu: Menu) {
val localPopup = PopupMenu(chromeContext!!, mDecorView!!.get(obj) as View)
val localInflater: MenuInflater = localPopup.getMenuInflater()
localInflater.inflate(R.menu.main_menu, menu)
}

private object disableDevMode : OnClickListener {
override fun onClick(v: View) {
with(sharedPref!!.edit()) {
putBoolean("developer", false)
apply()
}
}
}

fun setClickListener(obj: Any, pref: String) {
fun setClickListener(obj: Any, ctx: Context, pref: String) {
when (pref) {
"exit" -> {
mClickListener!!.set(obj, disableDevMode)
mClickListener!!.set(obj, ExitDevMode(ctx))
}
"eruda" -> {
mClickListener!!.set(obj, DownloadEruda(ctx))
}
}
}
Expand Down
32 changes: 28 additions & 4 deletions app/src/main/java/org/matrix/chromext/proxy/UserScript.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.matrix.chromext.proxy

import android.content.Context
import android.content.SharedPreferences
import android.widget.Toast
import androidx.room.Room
import com.github.kyuubiran.ezxhelper.utils.Log
import com.github.kyuubiran.ezxhelper.utils.invokeMethod
Expand All @@ -12,7 +13,7 @@ import org.matrix.chromext.script.RunAt
import org.matrix.chromext.script.Script
import org.matrix.chromext.script.ScriptDao
import org.matrix.chromext.script.encodeScript
import org.matrix.chromext.script.eruda
import org.matrix.chromext.script.erudaToggle
import org.matrix.chromext.script.parseScript
import org.matrix.chromext.script.urlMatch

Expand Down Expand Up @@ -77,6 +78,9 @@ class UserScriptProxy(ctx: Context) {
// Fields of org/chromium/content_public/browser/LoadUrlParams
// are too many to list here
// They are in the same order as the source code

// A variable to avoid redloading eruda
var eruda_loaded = false
}

var tabWebContentsDelegateAndroidImpl: Class<*>? = null
Expand Down Expand Up @@ -174,7 +178,11 @@ class UserScriptProxy(ctx: Context) {
loadUrlParams!!.getDeclaredConstructor(String::class.java).newInstance(url)) {
name == LOAD_URL
}
Log.d("loadUrl: ${url}")
if (url.length < 300) {
Log.d("loadUrl: ${url}")
} else {
Log.d("loadUrl: ${url.substring(0, 99)} ...")
}
}

// private fun naviUrl(url: String) {
Expand Down Expand Up @@ -352,6 +360,7 @@ class UserScriptProxy(ctx: Context) {
if (url.startsWith("https://") || url.startsWith("http://") || url.startsWith("file://")) {
invokeScript(url)
}
eruda_loaded = false
}

// fun didStartLoading(url: String) {
Expand All @@ -362,7 +371,22 @@ class UserScriptProxy(ctx: Context) {
// invokeScriptAt(RunAt.END, url)
// }

fun openDevTools() {
evaluateJavaScript(eruda)
fun openDevTools(ctx: Context) {
if (!eruda_loaded) {
val sharedPref: SharedPreferences = ctx.getSharedPreferences("ChromeXt", Context.MODE_PRIVATE)
val eruda = sharedPref.getString("eruda", "")
if (eruda != "") {
evaluateJavaScript(eruda!!)
evaluateJavaScript(erudaToggle)
eruda_loaded = true
} else {
val text = "Please update Eruda in the Developper options menu"
val duration = Toast.LENGTH_SHORT
val toast = Toast.makeText(ctx, text, duration)
toast.show()
}
} else {
evaluateJavaScript(erudaToggle)
}
}
}
12 changes: 1 addition & 11 deletions app/src/main/java/org/matrix/chromext/script/LocalScripts.kt
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ addEventListener("contextmenu", () => {
});
"""

const val eruda =
const val erudaToggle =
"""
if (typeof globalThis.eruda != "undefined") {
if (eruda._isInit) {
Expand All @@ -209,15 +209,5 @@ if (typeof globalThis.eruda != "undefined") {
eruda.init();
eruda.show();
}
} else {
(async ()=>{
await import('//cdn.jsdelivr.net/npm/eruda');
if (typeof eruda != "undefined") {
eruda.init();
eruda.show();
globalThis.eruda = eruda;
}
}
)();
}
"""
62 changes: 62 additions & 0 deletions app/src/main/java/org/matrix/chromext/settings/DownloadEruda.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package org.matrix.chromext.settings

import android.app.DownloadManager
import android.app.DownloadManager.Request
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Environment
import android.view.View
import android.view.View.OnClickListener
import android.widget.Toast
import java.io.FileReader

class DownloadEruda(ctx: Context) : OnClickListener {

var context: Context? = null

companion object {
var id: Long? = null
}

init {
context = ctx
}

override fun onClick(v: View) {

context!!.registerReceiver(
writeSharedPreference, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))

val request = Request(Uri.parse("https://cdn.jsdelivr.net/npm/eruda"))
request.setDescription("Console for mobile browsers")
request.setTitle("Eruda.js")
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Eruda.js")
val downloadManager = context!!.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
id = downloadManager.enqueue(request)
}

object writeSharedPreference : BroadcastReceiver() {
override fun onReceive(ctx: Context, intent: Intent) {
if (intent.getAction() == DownloadManager.ACTION_DOWNLOAD_COMPLETE) {
val downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0)
if (downloadId == id) {
val downloadManager = ctx.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
val fd = downloadManager.openDownloadedFile(downloadId).getFileDescriptor()
val eruda = FileReader(fd).use { it.readText() }
val sharedPref = ctx.getSharedPreferences("ChromeXt", Context.MODE_PRIVATE)
with(sharedPref!!.edit()) {
putString("eruda", eruda)
apply()
val text = "Updated to the lastest Eruda"
val duration = Toast.LENGTH_SHORT
val toast = Toast.makeText(ctx, text, duration)
toast.show()
}
}
}
}
}
}
9 changes: 0 additions & 9 deletions app/src/main/java/org/matrix/chromext/settings/Eruda.kt

This file was deleted.

28 changes: 24 additions & 4 deletions app/src/main/java/org/matrix/chromext/settings/ExitDevMode.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
package org.matrix.chromext.settings

import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat
import android.content.Context
import android.view.View
import android.view.View.OnClickListener
import android.widget.Toast

class ExitDevMode : PreferenceFragmentCompat() {
override fun onCreatePreferences(p0: Bundle?, p1: String?) {}
class ExitDevMode(ctx: Context) : OnClickListener {

var context: Context? = null

init {
context = ctx
}

override fun onClick(v: View) {
val sharedPref =
context!!.getSharedPreferences("com.android.chrome_preferences", Context.MODE_PRIVATE)
with(sharedPref!!.edit()) {
putBoolean("developer", false)
apply()
val text = "Please restart Chrome to apply the changes"
val duration = Toast.LENGTH_SHORT
val toast = Toast.makeText(context, text, duration)
toast.show()
}
}
}

0 comments on commit 3a8295e

Please sign in to comment.