From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Qiantan Hong Newsgroups: gmane.emacs.devel Subject: [PATCH] Add user content APIs for WebKit Xwidgets Date: Fri, 28 Aug 2020 02:25:22 +0000 Message-ID: Mime-Version: 1.0 Content-Type: multipart/signed; boundary="Apple-Mail=_9284D18D-F652-402C-A936-6DFBE3904B9C"; protocol="application/pkcs7-signature"; micalg=sha-256 Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="38322"; mail-complaints-to="usenet@ciao.gmane.io" To: "emacs-devel@gnu.org" Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Aug 28 07:17:48 2020 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kBWlm-0009qU-Ja for ged-emacs-devel@m.gmane-mx.org; Fri, 28 Aug 2020 07:17:46 +0200 Original-Received: from localhost ([::1]:60818 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBWll-0001p0-ME for ged-emacs-devel@m.gmane-mx.org; Fri, 28 Aug 2020 01:17:45 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:56074) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBU5R-0000xO-1r for emacs-devel@gnu.org; Thu, 27 Aug 2020 22:25:53 -0400 Original-Received: from outgoing-exchange-1.mit.edu ([18.9.28.15]:46072) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBU5N-0007Z6-MK for emacs-devel@gnu.org; Thu, 27 Aug 2020 22:25:52 -0400 Original-Received: from w92exedge3.exchange.mit.edu (W92EXEDGE3.EXCHANGE.MIT.EDU [18.7.73.15]) by outgoing-exchange-1.mit.edu (8.14.7/8.12.4) with ESMTP id 07S2P3rX021807 for ; Thu, 27 Aug 2020 22:25:46 -0400 Original-Received: from oc11expo16.exchange.mit.edu (18.9.4.47) by w92exedge3.exchange.mit.edu (18.7.73.15) with Microsoft SMTP Server (TLS) id 15.0.1293.2; Thu, 27 Aug 2020 22:25:09 -0400 Original-Received: from oc11expo16.exchange.mit.edu (18.9.4.47) by oc11expo16.exchange.mit.edu (18.9.4.47) with Microsoft SMTP Server (TLS) id 15.0.1365.1; Thu, 27 Aug 2020 22:25:22 -0400 Original-Received: from oc11expo16.exchange.mit.edu ([18.9.4.47]) by oc11expo16.exchange.mit.edu ([18.9.4.47]) with mapi id 15.00.1365.000; Thu, 27 Aug 2020 22:25:22 -0400 Thread-Topic: [PATCH] Add user content APIs for WebKit Xwidgets Thread-Index: AQHWfOJ7am7Xv+iKc0qrwK2HU9fUmQ== Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [18.18.245.17] Received-SPF: pass client-ip=18.9.28.15; envelope-from=qhong@mit.edu; helo=outgoing-exchange-1.mit.edu X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 22:25:47 X-ACL-Warn: Detected OS = Windows 7 (Websense crawler) X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, HTML_MESSAGE=0.001, MPART_ALT_DIFF_COUNT=1.112, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Fri, 28 Aug 2020 01:17:14 -0400 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:254347 Archived-At: --Apple-Mail=_9284D18D-F652-402C-A936-6DFBE3904B9C Content-Type: multipart/alternative; boundary="Apple-Mail=_0DF1F2CC-DAE0-4D99-9D7C-37B86173A20D" --Apple-Mail=_0DF1F2CC-DAE0-4D99-9D7C-37B86173A20D Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Hi, I implemented some primitives to expose some WebKit user content APIs (user script and script message handlers) for WebKit Xwidgets, both for WebKitGTK impl and NS/mac impl. The user script API makes it possible to reliable and predictable injecting script into a Webkit Xwidget, which is useful for customizing the WebView behavior. The script message handler API makes it possible to trigger event in emacs from JavaScript, and can be used to implement procedure calling from js to elisp. Currently only the other way around is possible. The patch is attached. Best, Qiantan qhong@mit.edu --Apple-Mail=_0DF1F2CC-DAE0-4D99-9D7C-37B86173A20D Content-Type: multipart/mixed; boundary="Apple-Mail=_813F598D-BB89-4737-B0ED-E14DEFA9E751" --Apple-Mail=_813F598D-BB89-4737-B0ED-E14DEFA9E751 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=us-ascii Hi,

I = implemented some primitives to expose some WebKit user content = APIs
(user script and script message handlers) for = WebKit Xwidgets, both
for WebKitGTK impl and NS/mac = impl.

The user = script API makes it possible to reliable and predictable = injecting
script into a Webkit Xwidget, which is = useful for customizing the WebView
behavior.

The script message handler API makes it possible to trigger = event in emacs
from JavaScript, and can be used to = implement procedure calling from
js to elisp. = Currently only the other way around is possible.

The patch is attached.
= --Apple-Mail=_813F598D-BB89-4737-B0ED-E14DEFA9E751 Content-Disposition: attachment; filename=0002-Implment-some-user-content-APIs-for-WebKit-Xwidgets.txt Content-Type: text/plain; x-unix-mode=0644; name="0002-Implment-some-user-content-APIs-for-WebKit-Xwidgets.txt" Content-Transfer-Encoding: quoted-printable =46rom cac4d244ef78e2bd77c758c4f13a501b07b28e33 Mon Sep 17 00:00:00 2001 From: Qiantan Hong Date: Thu, 27 Aug 2020 17:02:18 -0400 Subject: [PATCH 2/2] Implment some user content APIs for WebKit Xwidgets Implement WebKit user scripts and script message handlers. * src/xwidget.h (store_xwidget_script_message_event): store script message event into event queue * src/xwidget.c (store_xwidget_script_message_event, make-xwidget, webkit_script_message_cb, xwidget-webkit-add-user-script, xwidget-webkit-remove-all-user-scripts, xwidget-webkit-register-script-message, xwidget-webkit-unregister-script-message): Implement user script and script message handler primitives. * src/nsxwidget.c (nsxwidget_webkit_add_user_script, nsxwidget_webkit_remove_all_user_scripts, nsxwidget_webkit_register_script_message, nsxwidget_webkit_unregister_script_message, initWithFrame, initialize, userContentController): NS implementation. Changed naming of a previous used script message handler to avoid namespace pollution. * src/nsxwidget.h (nsxwidget_webkit_add_user_script, nsxwidget_webkit_remove_all_user_scripts, nsxwidget_webkit_register_script_message, nsxwidget_webkit_unregister_script_message): NS implementation * lisp/xwidget.el (xwidget-webkit-callback, xwidget-webkit-add-script-message-handler, xwidget-webkit-remove-script-message-handler): let lisp recognize and dispatch script message events --- lisp/xwidget.el | 22 ++++++ src/nsxwidget.h | 5 ++ src/nsxwidget.m | 80 +++++++++++++++++++-- src/xwidget.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++- src/xwidget.h | 5 ++ 5 files changed, 285 insertions(+), 8 deletions(-) diff --git a/lisp/xwidget.el b/lisp/xwidget.el index 074320855c..0c202e5bc5 100644 --- a/lisp/xwidget.el +++ b/lisp/xwidget.el @@ -298,8 +298,30 @@ xwidget-webkit-callback (let ((proc (nth 3 last-input-event)) (arg (nth 4 last-input-event))) (funcall proc arg))) + ((eq xwidget-event-type 'script-message) + (let ((name (nth 3 last-input-event)) + (value (nth 4 last-input-event))) + (let ((handler-pair (assq name (xwidget-get xwidget = 'script-message-handlers)))) + (if handler-pair + (funcall (cdr handler-pair) xwidget value) + (xwidget-log "unhandled script message:%s" name))))) (t (xwidget-log "unhandled event:%s" = xwidget-event-type)))))) =20 +(defun xwidget-webkit-add-script-message-handler (xwidget name handler) + "Associate HANDLER with script messages of NAME for Webkit XWIDGET." + (xwidget-put xwidget 'script-message-handlers + (cons (cons name handler) (xwidget-get xwidget = 'script-message-handlers)))) + +(defun xwidget-webkit-remove-script-message-handler (xwidget name) + "Remove a handler associated with NAME for Webkit XWIDGET. +Returns the removed (NAME . HANDLER) pair, or NIL if such handler is = not found." + (let* ((old-alist (xwidget-get xwidget 'script-message-handlers)) + (handler-pair (assq name old-alist))) + (when handler-pair + (xwidget-put xwidget 'script-message-handlers + (delq handler-pair old-alist)) + handler-pair))) + (defvar bookmark-make-record-function) (when (memq window-system '(mac ns)) (defvar xwidget-webkit-enable-plugins nil diff --git a/src/nsxwidget.h b/src/nsxwidget.h index 3d91594c34..f1dc53019a 100644 --- a/src/nsxwidget.h +++ b/src/nsxwidget.h @@ -40,6 +40,11 @@ #define NSXWIDGET_H_INCLUDED void nsxwidget_webkit_execute_script (struct xwidget *xw, const char = *script, Lisp_Object fun); =20 +void nsxwidget_webkit_add_user_script (struct xwidget *xw, const char = *script, + int injection_time_start, int = main_frame_only); +void nsxwidget_webkit_remove_all_user_scripts (struct xwidget *xw); +Lisp_Object nsxwidget_webkit_register_script_message (struct xwidget = *xw, const char *name); +void nsxwidget_webkit_unregister_script_message (struct xwidget *xw, = const char *name); /* Functions for xwidget model. */ =20 #ifdef __OBJC__ diff --git a/src/nsxwidget.m b/src/nsxwidget.m index e81ca7fc0c..6c9fb497e4 100644 --- a/src/nsxwidget.m +++ b/src/nsxwidget.m @@ -85,7 +85,7 @@ - (id)initWithFrame:(CGRect)frame @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)" @" AppleWebKit/603.3.8 (KHTML, like Gecko)" @" Version/11.0.1 Safari/603.3.8"; - [scriptor addScriptMessageHandler:self name:@"keyDown"]; + [scriptor addScriptMessageHandler:self = name:@"__xwidget_internal_keyDown"]; [scriptor addUserScript:[[WKUserScript alloc] initWithSource:xwScript injectionTime: @@ -272,23 +272,34 @@ + (void)initialize @"}" @"function xwKeyDown(event) {" @" if (event.ctrlKey && event.key =3D=3D 'g') {" - @" window.webkit.messageHandlers.keyDown.postMessage('C-g');" + @" = window.webkit.messageHandlers.__xwidget_internal_keyDown.postMessage('C-g'= );" @" }" @"}" @"document.addEventListener('keydown', xwKeyDown);" ; } =20 +static Lisp_Object js_to_lisp (id value); + /* Confirming to WKScriptMessageHandler, listens concerning keyDown in webkit. Currently 'C-g'. */ - (void)userContentController:(WKUserContentController = *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { - if ([message.body isEqualToString:@"C-g"]) + if ([message.name isEqualToString:@"__xwidget_internal_keyDown"]) { - /* Just give up focus, no relay "C-g" to emacs, another "C-g" - follows will be handled by emacs. */ - [self.window makeFirstResponder:self.xw->xv->emacswindow]; + if ([message.body isEqualToString:@"C-g"]) + { + /* Just give up focus, no relay "C-g" to emacs, another "C-g" + follows will be handled by emacs. */ + [self.window makeFirstResponder:self.xw->xv->emacswindow]; + } + } + else + { + store_xwidget_script_message_event (self.xw, + message.name.UTF8String, + js_to_lisp (message.body)); } } =20 @@ -445,6 +456,61 @@ - = (void)userContentController:(WKUserContentController = *)userContentController }]; } =20 +void +nsxwidget_webkit_add_user_script (struct xwidget *xw, const char = *script, + int injection_time_start, int = main_frame_only) +{ + XwWebView *xwWebView =3D (XwWebView *) xw->xwWidget; + WKUserContentController *scriptor =3D = xwWebView.configuration.userContentController; + + NSString *javascriptString =3D [NSString = stringWithUTF8String:script]; + WKUserScriptInjectionTime injectionTime =3D injection_time_start? + WKUserScriptInjectionTimeAtDocumentStart : = WKUserScriptInjectionTimeAtDocumentEnd; + WKUserScript *userScript =3D [[WKUserScript alloc] + initWithSource: javascriptString + injectionTime: injectionTime + forMainFrameOnly: main_frame_only]; + [scriptor addUserScript: userScript]; +} + +void +nsxwidget_webkit_remove_all_user_scripts (struct xwidget *xw) +{ + XwWebView *xwWebView =3D (XwWebView *) xw->xwWidget; + WKUserContentController *scriptor =3D = xwWebView.configuration.userContentController; + + [scriptor removeAllUserScripts]; +} + +Lisp_Object +nsxwidget_webkit_register_script_message (struct xwidget *xw, const = char *name) +{ + XwWebView *xwWebView =3D (XwWebView *) xw->xwWidget; + WKUserContentController *scriptor =3D = xwWebView.configuration.userContentController; + + NSString *messageName =3D [NSString stringWithUTF8String:name]; + + @try + { + [scriptor addScriptMessageHandler:xw->xwWidget name:messageName]; + } + @catch (NSException *e) + { + return Qnil; + } + return Qt; +} + +void +nsxwidget_webkit_unregister_script_message (struct xwidget *xw, const = char *name) +{ + XwWebView *xwWebView =3D (XwWebView *) xw->xwWidget; + WKUserContentController *scriptor =3D = xwWebView.configuration.userContentController; + + NSString *messageName =3D [NSString stringWithUTF8String:name]; + [scriptor removeScriptMessageHandlerForName:messageName]; +} + /* Window containing an xwidget. */ =20 @implementation XwWindow @@ -477,7 +543,7 @@ - (BOOL)isFlipped { return YES; } WKUserContentController *scriptor =3D ((XwWebView *) = xw->xwWidget).configuration.userContentController; [scriptor removeAllUserScripts]; - [scriptor removeScriptMessageHandlerForName:@"keyDown"]; + [scriptor = removeScriptMessageHandlerForName:@"__xwidget_internal_keyDown"]; [scriptor release]; if (xw->xv) xw->xv->model =3D Qnil; /* Make sure related view stale. */ diff --git a/src/xwidget.c b/src/xwidget.c index 154b3e9c82..d3524acd68 100644 --- a/src/xwidget.c +++ b/src/xwidget.c @@ -70,6 +70,15 @@ webkit_decide_policy_cb (WebKitWebView *, WebKitPolicyDecision *, WebKitPolicyDecisionType, gpointer); + +struct webkit_script_message_cb_data +{ + struct xwidget *xw; + char name[0]; +}; +static void webkit_script_message_cb (WebKitUserContentManager *, + WebKitJavascriptResult *, + gpointer); #endif =20 =20 @@ -120,7 +129,8 @@ DEFUN ("make-xwidget", =20 if (EQ (xw->type, Qwebkit)) { - xw->widget_osr =3D webkit_web_view_new (); + WebKitUserContentManager *scriptor =3D = webkit_user_content_manager_new (); + xw->widget_osr =3D = webkit_web_view_new_with_user_content_manager (scriptor); } =20 gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), = xw->width, @@ -293,6 +303,21 @@ store_xwidget_js_callback_event (struct xwidget = *xw, kbd_buffer_store_event (&event); } =20 +void +store_xwidget_script_message_event (struct xwidget *xw, + const char *name, + Lisp_Object body) +{ + struct input_event event; + Lisp_Object xwl; + XSETXWIDGET (xwl, xw); + EVENT_INIT (event); + event.kind =3D XWIDGET_EVENT; + event.frame_or_window =3D Qnil; + event.arg =3D list4 (intern ("script-message"), xwl, intern (name), = body); + kbd_buffer_store_event (&event); +} + =20 #ifdef USE_GTK void @@ -481,6 +506,18 @@ webkit_decide_policy_cb (WebKitWebView *webView, } } =20 +static void webkit_script_message_cb (WebKitUserContentManager = *scriptor, + WebKitJavascriptResult = *js_result, + gpointer data) +{ + JSCValue *value =3D webkit_javascript_result_get_js_value = (js_result); + struct webkit_script_message_cb_data *arg =3D data; + + Lisp_Object lisp_value =3D webkit_js_to_lisp (value); + store_xwidget_script_message_event (arg->xw, arg->name, lisp_value); +} + + =20 /* For gtk3 offscreen rendered widgets. */ static gboolean @@ -922,6 +959,140 @@ DEFUN ("xwidget-webkit-execute-script", return Qnil; } =20 +DEFUN ("xwidget-webkit-add-user-script", + Fxwidget_webkit_add_user_script, = Sxwidget_webkit_add_user_script, + 4, 4, 0, + doc: /* Add user SCRIPT to the Webkit XWIDGET. +INJECTION-TIME is a symbol which can take one of the following values: + +- start: SCRIPT is injected when document starts loading +- end: SCRIPT is injected when document finishes loading + +If MAIN_FRAME_ONLY is nil, SCRIPT is injected to all frames. +Otherwise, SCRIPT is only injected to top frames.*/) + (Lisp_Object xwidget, Lisp_Object script, + Lisp_Object injection_time, Lisp_Object main_frame_only) +{ + WEBKIT_FN_INIT (); + CHECK_STRING (script); + CHECK_SYMBOL (injection_time); + + script =3D ENCODE_SYSTEM(script); + + int injection_time_start, mfo; + mfo =3D !NILP (main_frame_only); + if (EQ (injection_time, Qstart)) + injection_time_start =3D 1; + else if (EQ (injection_time, Qend)) + injection_time_start =3D 0; + else + error ("Unknown Xwidget Webkit user script injection time: %s", + SDATA (SYMBOL_NAME (injection_time))); + +#ifdef USE_GTK + WebKitWebView *wkwv =3D WEBKIT_WEB_VIEW (xw->widget_osr); + WebKitUserContentManager *scriptor =3D = webkit_web_view_get_user_content_manager (wkwv); + + int webkit_injected_frames =3D mfo? + WEBKIT_USER_CONTENT_INJECT_TOP_FRAME : = WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES; + int webkit_injection_time =3D injection_time_start? + WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START : = WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_END; + WebKitUserScript *userScript =3D webkit_user_script_new (SSDATA = (script), + = webkit_injected_frames, + = webkit_injection_time, + NULL, NULL); + webkit_user_content_manager_add_script (scriptor, userScript); + webkit_user_script_unref (userScript); +#elif defined NS_IMPL_COCOA + nsxwidget_webkit_add_user_script (xw, SSDATA (script), = injection_time_start, mfo); +#endif + return Qnil; +} + +DEFUN ("xwidget-webkit-remove-all-user-scripts", + Fxwidget_webkit_remove_all_user_scripts, = Sxwidget_webkit_remove_all_user_scripts, + 1, 1, 0, + doc: /* Remove all user scripts from XWIDGET. */) + (Lisp_Object xwidget) +{ + WEBKIT_FN_INIT (); + +#ifdef USE_GTK + WebKitWebView *wkwv =3D WEBKIT_WEB_VIEW (xw->widget_osr); + WebKitUserContentManager *scriptor =3D = webkit_web_view_get_user_content_manager (wkwv); + + webkit_user_content_manager_remove_all_scripts (scriptor); +#elif defined NS_IMPL_COCOA + nsxwidget_webkit_remove_all_user_scripts(xw); +#endif + return Qnil; +} + +DEFUN ("xwidget-webkit-register-script-message", + Fxwidget_webkit_register_script_message, = Sxwidget_webkit_register_script_message, + 2, 2, 0, + doc: /* Register script message with symbol NAME in Webkit = XWIDGET. +Returns T if the operation is successful, NIL otherwise. +The cause of failure is usually that NAME has already been registered = for XWIDGET. */) + (Lisp_Object xwidget, Lisp_Object name) +{ + WEBKIT_FN_INIT (); + CHECK_SYMBOL (name); + const char *sname =3D SDATA( SYMBOL_NAME (name)); + +#ifdef USE_GTK + WebKitWebView *wkwv =3D WEBKIT_WEB_VIEW (xw->widget_osr); + WebKitUserContentManager *scriptor =3D = webkit_web_view_get_user_content_manager (wkwv); + + gchar *signal_name =3D g_strconcat ("script-message-received::", = sname, NULL); + size_t name_length =3D strlen (sname) + 1; + struct webkit_script_message_cb_data *arg =3D malloc (sizeof *arg + = name_length); + arg->xw =3D xw; + g_strlcpy (arg->name, sname, name_length); + g_signal_connect_data(scriptor, signal_name, G_CALLBACK = (webkit_script_message_cb), + arg, (GClosureNotify)free, 0); + g_free (signal_name); + if (webkit_user_content_manager_register_script_message_handler = (scriptor, sname)) + { + return Qt; + } + else + { + g_signal_handlers_disconnect_matched (scriptor, + G_SIGNAL_MATCH_DATA, + 0, 0, 0, 0, arg); + return Qnil; + } +#elif defined NS_IMPL_COCOA + return nsxwidget_webkit_register_script_message(xw, sname); +#endif +} + +DEFUN ("xwidget-webkit-unregister-script-message", + Fxwidget_webkit_unregister_script_message, = Sxwidget_webkit_unregister_script_message, + 2, 2, 0, + doc: /* Unregister script message with symbol NAME in Webkit = XWIDGET. */) + (Lisp_Object xwidget, Lisp_Object name) +{ + WEBKIT_FN_INIT (); + CHECK_SYMBOL (name); + const char *sname =3D SSDATA( SYMBOL_NAME (name)); + +#ifdef USE_GTK + WebKitWebView *wkwv =3D WEBKIT_WEB_VIEW (xw->widget_osr); + WebKitUserContentManager *scriptor =3D = webkit_web_view_get_user_content_manager (wkwv); + + webkit_user_content_manager_unregister_script_message_handler = (scriptor, sname); + g_signal_handlers_disconnect_matched (scriptor, + G_SIGNAL_MATCH_FUNC, + 0, g_quark_from_string = (sname), 0, + G_CALLBACK = (webkit_script_message_cb), 0); +#elif defined NS_IMPL_COCOA + nsxwidget_webkit_unregister_script_message(xw, sname); +#endif + return Qnil; +} + DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: /* Resize XWIDGET to NEW_WIDTH, NEW_HEIGHT. */ ) (Lisp_Object xwidget, Lisp_Object new_width, Lisp_Object new_height) @@ -1189,6 +1360,14 @@ syms_of_xwidget (void) defsubr (&Sxwidget_webkit_execute_script); DEFSYM (Qwebkit, "webkit"); =20 + defsubr (&Sxwidget_webkit_add_user_script); + DEFSYM (Qstart, "start"); + DEFSYM (Qend, "end"); + defsubr (&Sxwidget_webkit_remove_all_user_scripts); + + defsubr (&Sxwidget_webkit_register_script_message); + defsubr (&Sxwidget_webkit_unregister_script_message); + defsubr (&Sxwidget_size_request); defsubr (&Sdelete_xwidget_view); =20 diff --git a/src/xwidget.h b/src/xwidget.h index 40ad8ae833..cfd0ebced6 100644 --- a/src/xwidget.h +++ b/src/xwidget.h @@ -162,6 +162,11 @@ #define XG_XWIDGET_VIEW "emacs_xwidget_view" void store_xwidget_js_callback_event (struct xwidget *xw, Lisp_Object proc, Lisp_Object argument); + +void store_xwidget_script_message_event (struct xwidget *xw, + const char *name, + Lisp_Object value); + #else INLINE_HEADER_BEGIN INLINE void syms_of_xwidget (void) {} --=20 2.20.1 (Apple Git-117) --Apple-Mail=_813F598D-BB89-4737-B0ED-E14DEFA9E751 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=us-ascii

Best,
Qiantan




= --Apple-Mail=_813F598D-BB89-4737-B0ED-E14DEFA9E751-- --Apple-Mail=_0DF1F2CC-DAE0-4D99-9D7C-37B86173A20D-- --Apple-Mail=_9284D18D-F652-402C-A936-6DFBE3904B9C Content-Disposition: attachment; filename="smime.p7s" Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCCA70w ggO5MIIDIqADAgECAhAaql39NsO1qLVjkS2hl517MA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNVBAYT AlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMS4wLAYDVQQKEyVNYXNzYWNodXNldHRzIEluc3Rp dHV0ZSBvZiBUZWNobm9sb2d5MRUwEwYDVQQLEwxDbGllbnQgQ0EgdjEwHhcNMjAwODAzMDEyNDIz WhcNMjEwODAxMDEyNDIzWjCBoTELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMx LjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxFTATBgNVBAsT DENsaWVudCBDQSB2MTEVMBMGA1UEAxMMUWlhbnRhbiBIb25nMRwwGgYJKoZIhvcNAQkBFg1xaG9u Z0BNSVQuRURVMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylUlEQdK4BSXKzoGh6As CKN/TpLmC0kjhPdxUKMj1/86Xl6GDCla4h95uISDOWVAKdu3cIlA8m9zRLT2jNEIkt1DVpXP6c9h y8RRyfJm0qlrvr6tsHi5AmO4Li6s2dEGaTxbakPL6vEn7ZYr86t5orq56nubki77Z8ZvRv9/fWdF bF/YBNGDayLNk0NbXIEQdCHiz1l+bxfw+GHHRmdOge3MKWSg463+GGMdxtLQ61AbtR2vm47FIJBt c0X6ptcInWUg4Nf/9vSNGl6KvREvfbEWKCT6TfL5ncIFlitf6ZWKue2PZ4ULFfIQ3/7EsEk03xxr S7sTOy7e2dbPboe/WwIDAQABo4GhMIGeMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMB0G A1UdJQQWMBQGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYDVR0OBBYEFDeb9Jlj XSm+y0CD872IhzRDIGv1MDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jYS5taXQuZWR1L2NhL21p dGNsaWVudC5jcmwwDQYJKoZIhvcNAQELBQADgYEApBTx4tBbD5rQ+bNGd/Z3OBV07qFsm5QHNg0+ 6lxJ3j7q5zMMq35o6y5cBIhcFG6t+MFqJIdERZ3EprDturyqozQsIBMHFnqh+iZcMg0uQyssEqKZ hrzIdw8GuY4Z6jNewdGy5mwwG9yjpEbzWWgdofSM5rnezZz7EvCQu9ilt1sxggNDMIIDPwIBATCB gDBsMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMlTWFzc2Fj aHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEVMBMGA1UECxMMQ2xpZW50IENBIHYxAhAa ql39NsO1qLVjkS2hl517MA0GCWCGSAFlAwQCAQUAoIIBkzAYBgkqhkiG9w0BCQMxCwYJKoZIhvcN AQcBMBwGCSqGSIb3DQEJBTEPFw0yMDA4MjgwMjI1MjNaMC8GCSqGSIb3DQEJBDEiBCBItaQBklWu kmVs7KPLbSAy9IWI3GYc/r3Lok6GecukMDCBkQYJKwYBBAGCNxAEMYGDMIGAMGwxCzAJBgNVBAYT AlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMS4wLAYDVQQKEyVNYXNzYWNodXNldHRzIEluc3Rp dHV0ZSBvZiBUZWNobm9sb2d5MRUwEwYDVQQLEwxDbGllbnQgQ0EgdjECEBqqXf02w7WotWORLaGX nXswgZMGCyqGSIb3DQEJEAILMYGDoIGAMGwxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNo dXNldHRzMS4wLAYDVQQKEyVNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MRUw EwYDVQQLEwxDbGllbnQgQ0EgdjECEBqqXf02w7WotWORLaGXnXswDQYJKoZIhvcNAQEBBQAEggEA C/YQ6FvdDzymic/3KhlOu6bfVmDKIDOPlmJU3omUqOKUYMntTa85qOG+U3ItpIhkUNjToILEOnuO TqJCPKpQFpj2pYP2JHqk3+rdKQiUJxdwyRWZKyBQs8TBJ7gfukhydZaHyYiEbyP5Obkz+/Z9CVt8 lknGEugBTcJBKvSKwzZnmQQ1USFo6fw1tQOkxkW8EIBRrs9e+dPshy0El2CVV3v1dPS3OIVTVa4o o16tvvcRgddwFOUsWLBzD0I0Ahq5jI3Iom0ur6DxtbTjNpCSuvfcKrY/tCjbe0EptaNn0xgSqf4E qPOrz9cQ8B3XdWGOrYuHCgOr9dZdUvYr/tjPXwAAAAAAAA== --Apple-Mail=_9284D18D-F652-402C-A936-6DFBE3904B9C--