Giter Club home page Giter Club logo

chromext's Introduction

ChromeXt

Add UserScript and DevTools supports to Chromium based and WebView based browsers using Xposed framework.

How does it work?

We hook the onUpdateUrl function in UserScript.kt, add URL comparison there and evaluate JavaScript using the javascript: scheme (or DevTools Protocol when possible).

Chromium based browsers, such as Egde, Bromite, Samsung Internet, and Brave, are fully supported.

Most WebView based browsers are also supported, if not, please report it. Note for WebView based browsers users: you only need to enable this module for the browser application you wish to use, not for any possible WebView applications, neither for the Android system.

Usage

ChromeXt requires Xposed framework.

For root users, install LSPosed first, pick up the latest built APK from my repo's GitHub Actions and install it.

For non-root users, I modify a bit LSPatch to support ChromeXt; here is how to use it:

  1. Download the latest lspatch-release from my GitHub Actions.
  2. Download the latest ChromeXt.apk from my GitHub Actions.
  3. Extract previously downloaded files to get files lspatch.jar (with some suffix) and ChromeXt-signed.apk.
  4. Patch your APK (taking arm64_ChromePublic.apk as example) using the following command: java -jar lspatch.jar arm64_ChromePublic.apk -d -v -m ChromeXt-signed.apk --force. If java environment is not available, please consider using the provided manager APK.
  5. Install the patched APK, which might require you to first uninstall the one on your devices.

Notes: currently to download files from GitHub Actions, one needs to log in GitHub.

The author uploads releases to Xposed-Modules-Repo when needed, but not that frequently.

You can then install UserScripts from popular sources: URLs that ends with .user.js.

Supported API

Currently, ChromeXt supports almost all Tampermonkey APIs:

  1. @name (colons not allowed), @namespace, @description and so on
  2. @match (conform to the Chrome Standard, supports regular expressions)
  3. @include = @match, @exclude
  4. @run-at: document-start, document-end, document-idle (the default and fallback value)
  5. @grant: GM_addStyle, GM_addElement, GM_xmlhttpRequest, GM_openInTab, GM_registerMenuCommand (shown in the Resources panel of eruda), GM_unregisterMenuCommand, GM_download, unsafeWindow (= window)
  6. @grant: GM_setValue, GM_getValue (less powerful than GM.getValue), GM_listValues, GM_addValueChangeListener, GM_removeValueChangeListener, GM_setClipboard, GM_cookie, GM_notification
  7. @require, @resource (without Subresource Integrity)

These APIs are implemented differently from the official ones, please refer to the source files Local.kt and GM.js if you have doubts or questions.

Moreover, there is the powerful (also dangerous) GM.ChromeXt API, which must be declared by @grant GM.ChromeXt to unlock its usage. It is locked by default so that the users are protected from malicious UserScripts exploiting ChromeXt. This API allows scripts to use the JavaScript method ChromeXt.dispatch(action, payload), which is fundamental to implement other APIs. (Hence, one can find usage examples in GM.js). Dispatched action and payload are handled by Listener.kt.

UserScripts manager front end

To manage scripts installed by ChromeXt, here are a simple front end hosted on github.io and two mirrors of it (in case that you have connection issues): onrender.com, netlify.app.

Edit scripts before installing them

If you cancel the prompt of installing a new UserScript, then you can edit it directly in Chrome. Use the Install UserScript page menu to install your modified UserScript.

DevTools for developers

From the three dots page menu, ChromeXt offers you the

  1. Developer tools menu for the UserScript manager front end,
  2. Eruda console menu for other pages.

For Edge browser, these menus are moved to the page info menu, which locates at the left corner inside the URL input bar.

For WebView based browsers and Samsung Internet, these menu items are presented in the context menu.

Bonus

Since WebView based browsers have no unified designs, the following first four features are not supported for them. (By the same reason, they are neither supported for Samsung Internet.)

Open in Chrome

The application ChromeXt is able to

  1. received shared texts to search them using Google,
  2. open JavaScript files to install them as UserScripts.

The reversed priority order of opening which Chromium based browsers is given in AndroidManifest.xml.

Solution of system gesture conflicts

By default, the history forward gesture of Chrome is available near the vertical center of screen. On other areas, only the system gesture is available. One can disable this behavior through the Developer options menu. (Tap seven times on the Chrome version from the Chrome settings, you will see the Developer options menu.) (In Vivaldi browsers, Developer options menu is removed by its developers.)

Enable reader mode manually

ChromeXt adds a book icon in the page menu to enable reader (distiller) mode manually.

Export browser bookmarks

Bookmarks can be exported in HTML format through the Developer options menu.

AD Blocker solution

For blocking network requests, I recommend to use AdAway or any proxy AD Blocker such as clash.

A content cosmetic blocker is embedded into ChromeXt with the help of eruda. To use it, first open the Eruda console. In the Elements panel, one can use the pointer icon to select elements on the page. After clicking the delete icon for a selected element, a corresponding filter will be saved to the Resources panel, where one can manage previous added filters. These filters are saved in the browser even after clearing the site's data.

Another way to block ADs is using the Content-Security-Policy to block some scripts from loading.

User-Agent spoofing

One can edit the User-Agent from the Info panel of Eruda console. A valid User-Agent should contain only ASCII characters. Currently, ChromeXt only changes the User-Agent HTTP header, which works well but is deprecated.

For Chromium based browsers, when the User-Agent spoofing is not taking effects, refresh the page using the reload button in the page menu. (By contrast, a swipe refresh might be insufficient.)

Note that the DevTools can also change User-Agent.

Contribute to this project

Before you submit your pull-requests, please ensure that the command ./gradlew build or gradlew.bat build produces no warnings and no errors.

Here are corresponding files you might want / need to change:

  1. Front end: manager.vue
  2. Tampermonkey API: Local.kt and GM.js
  3. Eruda configuration: eruda.js
  4. Support more WebView based browsers: WebView.kt

Development plans

  • Make it possible to pass intents to Chrome with file scheme
  • Fix encoding problem for Chrome downloaded JavaScript files
  • Inject module resource into Chrome
  • Implement developer tools
  • Use local versions of eruda
  • Improve eruda incorporation with Chrome
  • Add more information in the preference screen
  • Support more Tampermonkey APIs
  • Find elegant way to support DevTools for Android 11-
  • Add cosmetic AdBlocker using eruda
  • Find way to get current interactive tab
  • Remove AndroidX Room dependency to reduce app size
  • Support non-split version of Android Chrome
  • Solve the menu hook problem for non-split versions
  • Handle multiple Tab Model
  • Forward DevTools server socket
  • A mobile friendly DevTools front end
  • Allow user to trigger reader mode
  • Support @resource API
  • Make GestureNav Fix optional
  • Add an open source License
  • Support mocking User-Agent
  • Support urlFilter syntax
  • Improve Open in Chrome function
  • Implement fully GM_info
  • Eruda fails due to Injection Sinks
  • Hide page_info panel automatically
  • Fix page menu injection position
  • Use Chrome DevTools Protocol as UserScript engine
  • Use adb forward to support non-root users
  • Fully support WebView based browsers
  • Fix LSPatch for isolated process issue
  • Implement UserScript storage
  • Re-implement GM_xmlhttpRequest
  • Convert exported bookmarks to HTML format
  • Show executed scripts on current page
  • Make a YouTube presentation video
  • Support Samsung Internet browser
  • Implement GM_cookie
  • Improve valid UserScripts Url detection
  • Save and present script errors and GM_log logs
  • Use iframe and local server to run general WebExtensions
  • Bypass style-src rule for eruda, such as Mastodon
  • Support importing UserScripts from Tampermonkey exports
  • Support backup and restore
  • Add recommended UserScripts to the front end manager
  • Add chrome devtools front-end for Edge, see devtools_http_handler.cc as reference.
  • Hide inserted menu for non-page

chromext's People

Contributors

c0unt-zero avatar cesaryuan avatar dependabot[bot] avatar green1052 avatar jingmatrix avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chromext's Issues

Add Support For More APIs

Hi, i Have a Particular Script That Requires Some API Which is Not Supported by Chrome XT Unfortunately and I'm asking to support them.

Required APIs:
grant (GM_getValue, GM_setValue, GM_addValueChangeListener, GM_registerMenuCommand, GM_download)

PatternSyntaxException causes Chrome crashed

Chrome crashed, and the lsposed log shows

[ 2023-06-28T21:28:03.288    10153: 28117: 28117 I/LSPosed-Bridge  ]   Loading class org.matrix.chromext.MainHook
[ 2023-06-28T21:28:03.744    10153: 28018: 28157 I/LSPosed-Bridge  ] Crash unexpectedly: java.util.regex.PatternSyntaxException: Incorrectly nested parentheses in regexp pattern near index 41
\S*://(\S*\.)?investorschronicle\.co\.uk)
	at com.android.icu.util.regex.PatternNative.compileImpl(Native Method)
	at com.android.icu.util.regex.PatternNative.<init>(PatternNative.java:53)
	at com.android.icu.util.regex.PatternNative.create(PatternNative.java:49)
	at java.util.regex.Pattern.compile(Pattern.java:1446)
	at java.util.regex.Pattern.<init>(Pattern.java:1421)
	at java.util.regex.Pattern.compile(Pattern.java:972)
	at p.j.<init>(SourceFile:1)
	at a.a.g(Unknown Source:65)
	at r.l.a(SourceFile:65)
	at c.a.run(SourceFile:1)

the investorschronicle sinnpet comes from the userscript https://github.com/LegeBeker/bypass-paywalls-tampermonkey/blob/master/bypass-paywalls-tampermonkey.user.js

Dev tools blank space

If you open dev tools and start scrolling down of a webpage a blank space will appear under the dev tools as the one in the screenshot
Screenshot_20221228-135316_Chrome

How to use ChromeXt with Webview based browsers?

I have LSPosed (Zygisk version) installed, but the websites to manage the scripts tell me I don't have ChromeXt installed, nor there's a userscripts related option in the browser.

Hopefully this could be fixed in a future release, take your time and thanks for this module and your efforts in making it

module doesn't work

Chrome version
111.0.5563.116(Google Play)

ChromeXt version
2.1.0

Lsposed version
1.8.6 (6857)

system version
11 (API 30)

equipment
Xiaomi Mi 6

system structure
arm64-v8a

Script
https://greasyfork.org/zh-CN/scripts/438684-pagetual

Follow the instructions, click the Chrome menu to download the script, and open it as a text browser after the download is complete, instead of installing the script

Screenshot_20230402-105342_Pixelated_Launcher.png

[Suggestion] Edge support?

Since Microsoft Edge for android is also chromium, the only real problem would be the way Microsoft did the menu thing - but then again, you could just shove the control buttons somewhere else, i guess?

Broken on brave

Version: 1.52.126 Chromium: 114.0.5735.133 (Official Build) (64-bit)

Eruda console does not show in the menu whatsoever. Shows update option in developer options but that's it

Running UserScripts Indicator

I got a suggestion that might be interesting to add
• Add an indicator in the page menu that indicates which Usersctipts are running on that page.

求助

接下来该如何使用呢
Screenshot_2023-01-07-00-45-23-160_com android chrome

[Question] Target apps?

Just saw this pop up in the LSPosed list, seems exciting. Can this/will this target Chrome/ium Webview, or just Chrome itself?

Access to the file was denied

This happens when I activate chromext
I am using chrome v108
And to activate chromext in the firstplace i had to clear chrome data
Screenshot_20230403-230406133

Support for Bromite

I'm so glad to finally see a LSposed module supporting user scripts. Would it be possible to support Bromite?

License question

I just wonder what exact license is your module using? The code refers to a LICENSE file I could not find, and vaguely speaks of "a BSD-style license". Maybe you could add that LICENSE file to clarify? Thanks in advance!

Userscripts disappeared

After updating to non standard header and setting up adaway all of my Userscripts have disappeared and I can't install new Userscripts it doesn't show anything in the front end when i install them

What is the use case of the Module?

I want it to post in discussion section but didn't find so wanted to post it here. I am curious what is the use case of this module. Can someone briefly explain in simple words?

Improve Userscript Manager Front End

I have a couple suggestions for improving the front end:
• make deleting scripts deletes instantly rather than refreshing the page
• add @description @Version section under the script
• add ability to import Userscript from link/file
• add @updateURL ability for auto updating the Userscript
• add backup/restore ability
These are just suggestions not necessarily important and doesn't effect the performance but hopefully you add them

Not loading on Background Tabs

When opening a tab in the background if you don't go to the background tab immediately, Chromext won't load (Usersctipts & Eruda Element Hiding) on that tab until you reload the page although if you go immediately to that tab it will load.
Let me explain further by a screen recording example:
In the screen recording pay attention to the highlighted section in my first attempt when i open a tab in the background and I open it immediately it loads hiding element just fine as you can see it hides the "Open App" Element BUT in the second attempt when i wait a little bit before opening the tab it won't load them as you can see there "Open App" Element is shown but if i reload the page then it will load the hiding element as well as the usersctipt on that page.
https://photos.app.goo.gl/fqQ1xJiWRRK65nVh8

Eruda Console auto disables

Hi! Eruda console gets Disabled after jumping to other pages. Any way to make it stays shown after jumping to other pages? :)

Soul

Hi
i use "soul browser"
any chance to make it work ?

Bromite does not work for some reason

Device: Redmi Note 9S
ROM: Project Blaze 2.5
Android version: 13
Bromite: org.bromite.bromite
Bromite version: 108.0.5359.156 (F-Droid)

Confirmed to work on Chrome 112.0.5615.135 from Playstore.

Support for Bromite

I'm so glad to finally see a LSposed module supporting user scripts. Would it be possible to support Bromite?

Add Webview Support

Please consider adding webview support to project scope if possible. I tried using this on Mulch Webview but it did not work.

Page menu crash [Android 8.1]

System: Android 8.1, LSPosed (Zygisk), Latest Magisk (26.1)

Relevant log stuff:

LOG [ 2023-04-18T02:52:41.645 10090: 5787: 5787 I/LSPosed-Bridge ] Loading class org.matrix.chromext.MainHook [ 2023-04-18T02:52:41.838 10090: 5787: 5787 E/LSPosed-Bridge ] java.lang.ClassNotFoundException: Didn't find class "org.chromium.chrome.browser.ChromeTabbedActivity" on path: DexPathList[[zip file "/data/app/com.android.chrome-WEa_CdfEMQ5B0ogZsZN31g==/base.apk"],nativeLibraryDirectories=[/data/app/com.android.chrome-WEa_CdfEMQ5B0ogZsZN31g==/lib/arm, /data/app/com.android.chrome-WEa_CdfEMQ5B0ogZsZN31g==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at org.matrix.chromext.MainHook.handleLoadPackage(Unknown Source:101) at de.robv.android.xposed.IXposedHookLoadPackage$Wrapper.handleLoadPackage(Unknown Source:2) at de.robv.android.xposed.callbacks.XC_LoadPackage.call(Unknown Source:6) at de.robv.android.xposed.callbacks.XCallback.callAll(Unknown Source:26) at E.afterHookedMethod(Unknown Source:207) at de.robv.android.xposed.XposedBridge$AdditionalHookInfo.callback(Unknown Source:147) at LSPHooker_.getClassLoader(Unknown Source:8) at android.app.LoadedApk.getResources(LoadedApk.java:980) at android.app.ContextImpl.createAppContext(ContextImpl.java:2420) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5996) at android.app.ActivityThread.-wrap1(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1791) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:7000) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) [ 2023-04-18T02:52:57.952 10090: 6949: 6949 I/LSPosed-Bridge ] Loading module org.matrix.chromext from /data/app/org.matrix.chromext-_vW-2lai8-H6o19zX-B_9A==/base.apk [ 2023-04-18T02:52:57.963 10090: 6949: 6949 I/LSPosed-Bridge ] Loading class org.matrix.chromext.MainHook [ 2023-04-18T02:52:58.187 10090: 6949: 6949 E/LSPosed-Bridge ] java.lang.ClassNotFoundException: Didn't find class "org.chromium.chrome.browser.ChromeTabbedActivity" on path: DexPathList[[zip file "/data/app/com.android.chrome-WEa_CdfEMQ5B0ogZsZN31g==/base.apk"],nativeLibraryDirectories=[/data/app/com.android.chrome-WEa_CdfEMQ5B0ogZsZN31g==/lib/arm, /data/app/com.android.chrome-WEa_CdfEMQ5B0ogZsZN31g==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at org.matrix.chromext.MainHook.handleLoadPackage(Unknown Source:101) at de.robv.android.xposed.IXposedHookLoadPackage$Wrapper.handleLoadPackage(Unknown Source:2) at de.robv.android.xposed.callbacks.XC_LoadPackage.call(Unknown Source:6) at de.robv.android.xposed.callbacks.XCallback.callAll(Unknown Source:26) at E.afterHookedMethod(Unknown Source:207) at de.robv.android.xposed.XposedBridge$AdditionalHookInfo.callback(Unknown Source:147) at LSPHooker_.getClassLoader(Unknown Source:8) at android.app.LoadedApk.getResources(LoadedApk.java:980) at android.app.ContextImpl.createAppContext(ContextImpl.java:2420) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5996) at android.app.ActivityThread.-wrap1(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1791) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:7000) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

The issue seems to be:

java.lang.ClassNotFoundException: Didn't find class "org.chromium.chrome.browser.ChromeTabbedActivity"

But I have confirmed that the chrome apk does in fact have org.chromium.chrome.browser.ChromeTabbedActivity present. Any ideas?

Chrome v114 Eruda isn't showing

Hi! After updating to Chrome 114.0.5735.57 this morning i can't no longer access Eruda, can you check it? Or do you need any logs?

Support for Chrome v112 Update

The module works but I can't install any scripts, install prompt doesn't show.
Do you need log or v12 not supported yet?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.