commit aba79c47b4243397dea6d38b8f3ef65286438c68 Author: yutent Date: Fri Jul 21 19:13:51 2023 +0800 init diff --git a/.httpserver b/.httpserver new file mode 100644 index 0000000..b118066 --- /dev/null +++ b/.httpserver @@ -0,0 +1,4 @@ +{ + "enabled": true, + "port": 10086 +} diff --git a/app.js b/app.js new file mode 100644 index 0000000..4764271 --- /dev/null +++ b/app.js @@ -0,0 +1,34 @@ +/** + * {} + * @author yutent + * @date 2023/07/20 14:19:13 + */ + +import 'es.shim' +import { $, bind } from 'wkit' + +async function test1() { + try { + var result = await window.webkit.messageHandlers.app.postMessage({ + value: 'Test 1' + }) + $('#output').innerHTML = 'output: ' + result + } catch (err) { + alert(err) + } +} +async function test2() { + let key = 'cb_' + Math.random().toString().slice(2) + + window.$on(key, function (v) { + $('#output').innerHTML = v + }) + window.webkit.messageHandlers.app.postMessage({ + value: new Date(), + key + }) + $('#output').innerHTML = result +} + +bind($('.btn1'), 'click', test1) +bind($('.btn2'), 'click', test2) diff --git a/index.html b/index.html new file mode 100644 index 0000000..5312038 --- /dev/null +++ b/index.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + +打开控制台 + +
loading...
+ + + + + \ No newline at end of file diff --git a/inject.js b/inject.js new file mode 100644 index 0000000..abda9e4 --- /dev/null +++ b/inject.js @@ -0,0 +1,52 @@ +/** + * {注入的js} + * @author yutent + * @date 2023/07/21 17:38:11 + */ + +Object.assign(window, { + // + __events__: Object.create(null), + + $on(name, fn) { + if (this.__events__[name]) { + this.__events__[name].push(fn) + } else { + this.__events__[name] = [fn] + } + }, + + $once(name, fn) { + fn.__once__ = true + this.$on(name, fn) + }, + + $off(name, fn) { + if (this.__events__[name]) { + if (fn) { + this.__events__[name] = this.__events__[name].filter(it => it !== fn) + } else { + this.__events__[name] = [] + } + } + }, + + $emit(name, ...args) { + if (this.__events__[name]) { + for (let fn of this.__events__[name]) { + try { + fn.apply(this, args) + if (fn.__once__) { + this.$off(name, fn) + } + } catch (e) { + console.error(e) + } + } + } + }, + + $destroy() { + this.__events__ = Object.create(null) + } +}) diff --git a/main.py b/main.py new file mode 100755 index 0000000..80390a5 --- /dev/null +++ b/main.py @@ -0,0 +1,92 @@ +#!/usr/bin/python3 + +import gi, json, os + +gi.require_version("Gtk", "3.0") +gi.require_version("WebKit2", "4.1") +# gi.require_version("JavaScriptCore", "4.1") + +from gi.repository import Gtk, WebKit2, JavaScriptCore + +class MyScriptMessageHandler(WebKit2.ScriptMessageReply): + def __init__(self): + super().__init__() + +class WebKitWindow(Gtk.Window): + def __init__(self): + + Gtk.Window.__init__(self, title="WebKit Example") + + self.set_default_size(800, 600) + + settings = WebKit2.Settings() + settings.set_enable_page_cache(True) + settings.set_enable_offline_web_application_cache(True) + + settings.set_property('javascript-can-access-clipboard', True) + settings.set_property('javascript-can-open-windows-automatically', True) + + settings.set_property("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) weapp/1.0.0 Version/16.4 Safari/605.1.15") + + manager = WebKit2.UserContentManager() + + script = open(self.file_path('./inject.js'), 'r').read() + frame = WebKit2.UserContentInjectedFrames.ALL_FRAMES + time = WebKit2.UserScriptInjectionTime.END + script = WebKit2.UserScript(script, frame, time, None, None) + + manager.add_script(script) + + manager.connect('script-message-received::app', self.on_script_message) + manager.register_script_message_handler('app') + + self.webview = WebKit2.WebView.new_with_user_content_manager(manager) + self.webview.set_settings(settings) + + + self.webview.connect("decide-policy", self.on_decide_policy) + + self.webview.load_uri("http://127.0.0.1:10086/index.html") + # self.webview.load_uri("https://benchmark.wkit.fun") + + + + + self.add(self.webview) + + def file_path(self, filepath): + root = os.path.dirname(os.path.realpath(__file__)) + return os.path.join(root, filepath) + + + def on_script_message(self, webview, message): + data = message.get_js_value() + data = json.loads(data.to_json(0)) + print('这是py收到的值: ',data) + key = data.get('key') + + if key : + scripts = '$emit("' + key + '", "这是py返回的值 ' + data.get('value') + '")' + self.webview.evaluate_javascript(scripts, -1) + + + + def on_decide_policy(self, webview, decision, decision_type): + if decision_type == WebKit2.PolicyDecisionType.NAVIGATION_ACTION: + navigation_action = decision.get_navigation_action() + request = navigation_action.get_request() + uri = request.get_uri() + if uri == "about:blank": + # Open the developer tools window + inspector = webview.get_inspector() + inspector.show() + else: + decision.use() + + + +win = WebKitWindow() +win.connect("destroy", Gtk.main_quit) +win.show_all() + +Gtk.main() \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..fc15974 --- /dev/null +++ b/setup.py @@ -0,0 +1,22 @@ +#!/usr/bin/python3 + +from setuptools import setup + +setup( + name='myapp', + version='0.1', + description='My GTK3 + WebKit2 application', + author='Your Name', + author_email='your@email.com', + url='https://github.com/yourusername/myapp', + py_modules=['main'], + install_requires=[ + 'gi', + 'webkit2gtk', + ], + entry_points={ + 'gui_scripts': [ + 'myapp=main:WebKitWindow' + ] + }, +) \ No newline at end of file