Skip to content

Commit

Permalink
Update method params comparison
Browse files Browse the repository at this point in the history
  • Loading branch information
JingMatrix committed May 2, 2023
1 parent c212a05 commit 933f5f1
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 43 deletions.
6 changes: 2 additions & 4 deletions app/src/main/java/org/matrix/chromext/hook/Intent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,8 @@ object IntentHook : BaseHook() {

findMethod(proxy.intentHandler, true) {
Modifier.isStatic(getModifiers()) &&
getParameterCount() == 3 &&
getParameterTypes()[0] == Context::class.java &&
getParameterTypes()[1] == Intent::class.java &&
getParameterTypes()[2] == String::class.java
getParameterTypes() contentDeepEquals
arrayOf(Context::class.java, Intent::class.java, String::class.java)
}
// private static void startActivityForTrustedIntentInternal(Context context,
// Intent intent, String componentClassName)
Expand Down
40 changes: 13 additions & 27 deletions app/src/main/java/org/matrix/chromext/hook/Menu.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ object readerMode {
readerModeManager!!.getDeclaredFields().filter { it.type == UserScriptProxy.gURL }.last()!!
val activateReaderMode =
// This is purely luck, there are other methods with the same signatures
findMethod(readerModeManager!!) { getParameterCount() == 0 && getReturnType() == Void.TYPE }
findMethod(readerModeManager!!) {
getParameterTypes().size == 0 && getReturnType() == Void.TYPE
}

val manager =
readerModeManager!!.getDeclaredConstructors()[0].newInstance(TabModel.getTab(), null)
Expand Down Expand Up @@ -122,9 +124,7 @@ object MenuHook : BaseHook() {

findMethod(proxy.chromeTabbedActivity) {
// public boolean onMenuOrKeyboardAction(int id, boolean fromMenu)
getParameterCount() == 2 &&
getParameterTypes().first() == Int::class.java &&
getParameterTypes().last() == Boolean::class.java &&
getParameterTypes() contentDeepEquals arrayOf(Int::class.java, Boolean::class.java) &&
getReturnType() == Boolean::class.java
}
.hookBefore {
Expand All @@ -136,7 +136,7 @@ object MenuHook : BaseHook() {
var findMenuHook: Unhook? = null
findMenuHook =
findMethod(proxy.chromeTabbedActivity) {
getParameterCount() == 0 &&
getParameterTypes().size == 0 &&
getReturnType().isInterface() &&
getReturnType().getDeclaredMethods().size > 6
}
Expand All @@ -150,10 +150,12 @@ object MenuHook : BaseHook() {
}!!
mContext.setAccessible(true)
findMethod(appMenuPropertiesDelegateImpl, true) {
getParameterCount() == 4 &&
getParameterTypes().first() == Menu::class.java &&
getParameterTypes().last() == Boolean::class.java &&
getReturnType() == Void.TYPE
getParameterTypes() contentDeepEquals
arrayOf(
Menu::class.java,
proxy.tab,
Boolean::class.java,
Boolean::class.java) && getReturnType() == Void.TYPE
}
// protected void updateRequestDesktopSiteMenuItem(Menu menu, @Nullable Tab
// currentTab, boolean canShowRequestDesktopSite, boolean isChromeScheme)
Expand Down Expand Up @@ -249,26 +251,10 @@ object MenuHook : BaseHook() {
}
}

// if (Chrome.isVivaldi) {
// findMethod(proxy.mainSettings) {
// getParameterCount() == 1 &&
// getParameterTypes().first() == String::class.java &&
// getReturnType() == proxy.preference
// }
// // Preference addPreferenceIfAbsent(String key)
// .hookBefore {
// // if ((it.args[0] as String) == "homepage") {
// // (it.method as Method).invoke(it.thisObject, "developer")
// // }
// }
// }

findMethod(proxy.developerSettings, true) {
Modifier.isStatic(getModifiers()) &&
getParameterCount() == 3 &&
getParameterTypes()[0] == Context::class.java &&
getParameterTypes()[1] == String::class.java &&
getParameterTypes()[2] == Bundle::class.java
getParameterTypes() contentDeepEquals
arrayOf(Context::class.java, String::class.java, Bundle::class.java)
// public static Fragment instantiate(Context context,
// String fname, @Nullable Bundle args)
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/org/matrix/chromext/hook/UserScript.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ object UserScriptHook : BaseHook() {
}

findMethod(proxy.navigationControllerImpl) {
getParameterCount() == 1 && getParameterTypes().first() == proxy.loadUrlParams
getParameterTypes() contentDeepEquals arrayOf(proxy.loadUrlParams)
}
// public void loadUrl(LoadUrlParams params)
.hookBefore {
Expand Down
12 changes: 5 additions & 7 deletions app/src/main/java/org/matrix/chromext/proxy/Menu.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ object MenuProxy {
Chrome.load("org.chromium.chrome.browser.tracing.settings.DeveloperSettings")
val chromeTabbedActivity = Chrome.load("org.chromium.chrome.browser.ChromeTabbedActivity")
val propertyModel = Chrome.load("org.chromium.ui.modelutil.PropertyModel")
val tab = Chrome.load("org.chromium.chrome.browser.tab.Tab")

private val pageInfoController =
Chrome.load("org.chromium.components.page_info.PageInfoController")
Expand Down Expand Up @@ -69,29 +70,26 @@ object MenuProxy {
}!!
private val setSummary =
findMethod(preference) {
getParameterCount() == 1 &&
getParameterTypes().first() == CharSequence::class.java &&
getParameterTypes() contentDeepEquals arrayOf(CharSequence::class.java) &&
getReturnType() == Void.TYPE
}
private val twoStatePreference =
Chrome.load("org.chromium.components.browser_ui.settings.ChromeSwitchPreference")
.getSuperclass() as Class<*>
private val setChecked =
findMethod(twoStatePreference, true) {
getParameterCount() == 1 && getParameterTypes().first() == Boolean::class.java
getParameterTypes() contentDeepEquals arrayOf(Boolean::class.java)
}

private val preferenceFragmentCompat = developerSettings.getSuperclass() as Class<*>
val findPreference =
findMethod(preferenceFragmentCompat, true) {
getParameterCount() == 1 &&
getParameterTypes().first() == CharSequence::class.java &&
getParameterTypes() contentDeepEquals arrayOf(CharSequence::class.java) &&
getReturnType() == preference
}
val addPreferencesFromResource =
findMethod(preferenceFragmentCompat, true) {
getParameterCount() == 1 &&
getParameterTypes().first() == Int::class.java &&
getParameterTypes() contentDeepEquals arrayOf(Int::class.java) &&
getReturnType() == Void.TYPE
}

Expand Down
7 changes: 3 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 @@ -31,18 +31,17 @@ object UserScriptProxy {

private fun loadUrl(url: String) {
TabModel.getTab()?.invokeMethod(newUrl(url)) {
getParameterCount() == 1 &&
getParameterTypes().first() == loadUrlParams &&
getParameterTypes() contentDeepEquals arrayOf(loadUrlParams) &&
getReturnType() == Int::class.java
}
}

private fun newUrl(url: String): Any {
val constructor = loadUrlParams.getDeclaredConstructors().first()
val types = constructor.getParameterTypes()
if (types.size == 2 && types.first() == Int::class.java) {
if (types contentDeepEquals arrayOf(Int::class.java, String::class.java)) {
return constructor.newInstance(0, url)
} else if (types.size == 2 && types.first() == String::class.java) {
} else if (types contentDeepEquals arrayOf(String::class.java, Int::class.java)) {
return constructor.newInstance(url, 0)
} else {
return constructor.newInstance(url)
Expand Down

0 comments on commit 933f5f1

Please sign in to comment.