From 5089d0cd1f2046aa0fe04bb983aa834a2c6ed5c328996685e4336418f915282a Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Mon, 12 Jun 2017 11:54:58 +0000 Subject: [PATCH] Accepting request 500808 from home:Zaitor:branches:editors - Add conditional emacs-25.2-xwidget.patch, and pkgconfig(webkit2gtk-4.0) BuildRequires; depend on latest webkitgtk for Tumbleweed. OBS-URL: https://build.opensuse.org/request/show/500808 OBS-URL: https://build.opensuse.org/package/show/editors/emacs?expand=0&rev=232 --- emacs-25.2-xwidget.patch | 303 +++++++++++++++++++++++++++++++++++++++ emacs.changes | 7 + emacs.spec | 9 +- 3 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 emacs-25.2-xwidget.patch diff --git a/emacs-25.2-xwidget.patch b/emacs-25.2-xwidget.patch new file mode 100644 index 0000000..7c85525 --- /dev/null +++ b/emacs-25.2-xwidget.patch @@ -0,0 +1,303 @@ +commit d781662873f228b110a128f7a2b6583a4d5e0a3a +Author: Ricardo Wurmus +Date: Tue Oct 25 23:00:35 2016 -0700 + + xwidget: Use WebKit2 API + + * configure.ac: Check for webkit2gtk-4.0. + * src/xwidget.c: Adjust to use WebKit2 API. + * lisp/xwidget.el (xwidget-webkit-callback): Adjust matches for + `xwidget-event-type'. + +diff --git a/configure.ac b/configure.ac +index 998ff52..46fd434 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2630,8 +2630,8 @@ if test "$with_xwidgets" != "no"; then + test "$USE_GTK_TOOLKIT" = "GTK3" && test "$window_system" != "none" || + AC_MSG_ERROR([xwidgets requested but gtk3 not used.]) + +- WEBKIT_REQUIRED=1.4.0 +- WEBKIT_MODULES="webkitgtk-3.0 >= $WEBKIT_REQUIRED" ++ WEBKIT_REQUIRED=2.12 ++ WEBKIT_MODULES="webkit2gtk-4.0 >= $WEBKIT_REQUIRED" + EMACS_CHECK_MODULES([WEBKIT], [$WEBKIT_MODULES]) + HAVE_XWIDGETS=$HAVE_WEBKIT + test $HAVE_XWIDGETS = yes || +diff --git a/lisp/xwidget.el b/lisp/xwidget.el +index 7a0ca8b..1bae6bb 100644 +--- a/lisp/xwidget.el ++++ b/lisp/xwidget.el +@@ -187,7 +187,7 @@ XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." + "error: callback called for xwidget with dead buffer") + (with-current-buffer (xwidget-buffer xwidget) + (let* ((strarg (nth 3 last-input-event))) +- (cond ((eq xwidget-event-type 'document-load-finished) ++ (cond ((eq xwidget-event-type 'load-changed) + (xwidget-log "webkit finished loading: '%s'" + (xwidget-webkit-get-title xwidget)) + ;;TODO - check the native/internal scroll +@@ -196,8 +196,7 @@ XWIDGET instance, XWIDGET-EVENT-TYPE depends on the originating xwidget." + (rename-buffer (format "*xwidget webkit: %s *" + (xwidget-webkit-get-title xwidget))) + (pop-to-buffer (current-buffer))) +- ((eq xwidget-event-type +- 'navigation-policy-decision-requested) ++ ((eq xwidget-event-type 'decide-policy) + (if (string-match ".*#\\(.*\\)" strarg) + (xwidget-webkit-show-id-or-named-element + xwidget +diff --git a/src/xwidget.c b/src/xwidget.c +index f5f4da0..78349a8 100644 +--- a/src/xwidget.c ++++ b/src/xwidget.c +@@ -98,13 +98,7 @@ along with GNU Emacs. If not, see + +-#include +-#include +-#include +-#include +-#include +-#include +-#include ++#include + + static struct xwidget * + allocate_xwidget (void) +@@ -50,34 +47,16 @@ allocate_xwidget_view (void) + + static struct xwidget_view *xwidget_view_lookup (struct xwidget *, + struct window *); +-static void webkit_document_load_finished_cb (WebKitWebView *, WebKitWebFrame *, +- gpointer); +-static gboolean webkit_download_cb (WebKitWebView *, WebKitDownload *, gpointer); ++static void webkit_view_load_changed_cb (WebKitWebView *, ++ WebKitLoadEvent, ++ gpointer); ++static gboolean webkit_download_cb (WebKitWebContext *, WebKitDownload *, gpointer); + + static gboolean +-webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *, +- WebKitWebFrame *, +- WebKitNetworkRequest *, +- gchar *, +- WebKitWebPolicyDecision *, +- gpointer); +- +-static gboolean +-webkit_new_window_policy_decision_requested_cb (WebKitWebView *, +- WebKitWebFrame *, +- WebKitNetworkRequest *, +- WebKitWebNavigationAction *, +- WebKitWebPolicyDecision *, +- gpointer); +- +-static gboolean +-webkit_navigation_policy_decision_requested_cb (WebKitWebView *, +- WebKitWebFrame *, +- WebKitNetworkRequest *, +- WebKitWebNavigationAction *, +- WebKitWebPolicyDecision *, +- gpointer); +- ++webkit_decide_policy_cb (WebKitWebView *, ++ WebKitPolicyDecision *, ++ WebKitPolicyDecisionType, ++ gpointer); + + + DEFUN ("make-xwidget", +@@ -168,29 +147,17 @@ Returns the newly constructed xwidget, or nil if construction fails. */) + if (EQ (xw->type, Qwebkit)) + { + g_signal_connect (G_OBJECT (xw->widget_osr), +- "document-load-finished", +- G_CALLBACK (webkit_document_load_finished_cb), xw); ++ "load-changed", ++ G_CALLBACK (webkit_view_load_changed_cb), xw); + +- g_signal_connect (G_OBJECT (xw->widget_osr), +- "download-requested", ++ g_signal_connect (G_OBJECT (webkit_web_context_get_default ()), ++ "download-started", + G_CALLBACK (webkit_download_cb), xw); + + g_signal_connect (G_OBJECT (xw->widget_osr), +- "mime-type-policy-decision-requested", +- G_CALLBACK +- (webkit_mime_type_policy_typedecision_requested_cb), +- xw); +- +- g_signal_connect (G_OBJECT (xw->widget_osr), +- "new-window-policy-decision-requested", +- G_CALLBACK +- (webkit_new_window_policy_decision_requested_cb), +- xw); +- +- g_signal_connect (G_OBJECT (xw->widget_osr), +- "navigation-policy-decision-requested", ++ "decide-policy", + G_CALLBACK +- (webkit_navigation_policy_decision_requested_cb), ++ (webkit_decide_policy_cb), + xw); + } + +@@ -284,81 +251,83 @@ store_xwidget_event_string (struct xwidget *xw, const char *eventname, + kbd_buffer_store_event (&event); + } + +-/* TODO deprecated, use load-status. */ + void +-webkit_document_load_finished_cb (WebKitWebView *webkitwebview, +- WebKitWebFrame *arg1, +- gpointer data) ++webkit_view_load_changed_cb (WebKitWebView *webkitwebview, ++ WebKitLoadEvent load_event, ++ gpointer data) + { +- struct xwidget *xw = g_object_get_data (G_OBJECT (webkitwebview), +- XG_XWIDGET); +- +- store_xwidget_event_string (xw, "document-load-finished", ""); ++ switch (load_event) { ++ case WEBKIT_LOAD_FINISHED: ++ { ++ struct xwidget *xw = g_object_get_data (G_OBJECT (webkitwebview), ++ XG_XWIDGET); ++ store_xwidget_event_string (xw, "load-changed", ""); ++ break; ++ } ++ default: ++ break; ++ } + } + + gboolean +-webkit_download_cb (WebKitWebView *webkitwebview, ++webkit_download_cb (WebKitWebContext *webkitwebcontext, + WebKitDownload *arg1, + gpointer data) + { +- struct xwidget *xw = g_object_get_data (G_OBJECT (webkitwebview), ++ WebKitWebView *view = webkit_download_get_web_view(arg1); ++ WebKitURIRequest *request = webkit_download_get_request(arg1); ++ struct xwidget *xw = g_object_get_data (G_OBJECT (view), + XG_XWIDGET); +- store_xwidget_event_string (xw, "download-requested", +- webkit_download_get_uri (arg1)); ++ ++ store_xwidget_event_string (xw, "download-started", ++ webkit_uri_request_get_uri(request)); + return FALSE; + } + + static gboolean +-webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *webView, +- WebKitWebFrame *frame, +- WebKitNetworkRequest *request, +- gchar *mimetype, +- WebKitWebPolicyDecision *policy_decision, +- gpointer user_data) ++webkit_decide_policy_cb (WebKitWebView *webView, ++ WebKitPolicyDecision *decision, ++ WebKitPolicyDecisionType type, ++ gpointer user_data) + { +- /* This function makes webkit send a download signal for all unknown +- mime types. TODO: Defer the decision to Lisp, so that it's +- possible to make Emacs handle mime text for instance. */ +- if (!webkit_web_view_can_show_mime_type (webView, mimetype)) ++ switch (type) { ++ case WEBKIT_POLICY_DECISION_TYPE_RESPONSE: ++ /* This function makes webkit send a download signal for all unknown ++ mime types. TODO: Defer the decision to Lisp, so that it's ++ possible to make Emacs handle mime text for instance. */ + { +- webkit_web_policy_decision_download (policy_decision); +- return TRUE; ++ WebKitResponsePolicyDecision *response = ++ WEBKIT_RESPONSE_POLICY_DECISION (decision); ++ if (!webkit_response_policy_decision_is_mime_type_supported (response)) ++ { ++ webkit_policy_decision_download (decision); ++ return TRUE; ++ } ++ else ++ return FALSE; ++ break; + } +- else ++ case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: ++ case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: ++ { ++ WebKitNavigationPolicyDecision *navigation_decision = ++ WEBKIT_NAVIGATION_POLICY_DECISION (decision); ++ WebKitNavigationAction *navigation_action = ++ webkit_navigation_policy_decision_get_navigation_action (navigation_decision); ++ WebKitURIRequest *request = ++ webkit_navigation_action_get_request (navigation_action); ++ ++ struct xwidget *xw = g_object_get_data (G_OBJECT (webView), XG_XWIDGET); ++ store_xwidget_event_string (xw, "decide-policy", ++ webkit_uri_request_get_uri (request)); ++ return FALSE; ++ break; ++ } ++ default: + return FALSE; ++ } + } + +-static gboolean +-webkit_new_window_policy_decision_requested_cb (WebKitWebView *webView, +- WebKitWebFrame *frame, +- WebKitNetworkRequest *request, +- WebKitWebNavigationAction *navigation_action, +- WebKitWebPolicyDecision *policy_decision, +- gpointer user_data) +-{ +- struct xwidget *xw = g_object_get_data (G_OBJECT (webView), XG_XWIDGET); +- webkit_web_navigation_action_get_original_uri (navigation_action); +- +- store_xwidget_event_string (xw, "new-window-policy-decision-requested", +- webkit_web_navigation_action_get_original_uri +- (navigation_action)); +- return FALSE; +-} +- +-static gboolean +-webkit_navigation_policy_decision_requested_cb (WebKitWebView *webView, +- WebKitWebFrame *frame, +- WebKitNetworkRequest *request, +- WebKitWebNavigationAction *navigation_action, +- WebKitWebPolicyDecision *policy_decision, +- gpointer user_data) +-{ +- struct xwidget *xw = g_object_get_data (G_OBJECT (webView), XG_XWIDGET); +- store_xwidget_event_string (xw, "navigation-policy-decision-requested", +- webkit_web_navigation_action_get_original_uri +- (navigation_action)); +- return FALSE; +-} + + /* For gtk3 offscreen rendered widgets. */ + static gboolean +@@ -599,8 +568,13 @@ DEFUN ("xwidget-webkit-execute-script", + { + WEBKIT_FN_INIT (); + CHECK_STRING (script); +- webkit_web_view_execute_script (WEBKIT_WEB_VIEW (xw->widget_osr), +- SSDATA (script)); ++ // TODO: provide callback function to do something with the return ++ // value! This allows us to get rid of the title hack. ++ webkit_web_view_run_javascript (WEBKIT_WEB_VIEW (xw->widget_osr), ++ SSDATA (script), ++ NULL, /*cancellable*/ ++ NULL, /*callback*/ ++ NULL /*user data*/); + return Qnil; + } + diff --git a/emacs.changes b/emacs.changes index 2fb8a3c..405f9ca 100644 --- a/emacs.changes +++ b/emacs.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Fri Jun 2 21:42:04 UTC 2017 - zaitor@opensuse.org + +- Add conditional emacs-25.2-xwidget.patch, and + pkgconfig(webkit2gtk-4.0) BuildRequires; depend on latest + webkitgtk for Tumbleweed. + ------------------------------------------------------------------- Tue May 2 11:02:57 UTC 2017 - werner@suse.de diff --git a/emacs.spec b/emacs.spec index 911e098..1cb5639 100644 --- a/emacs.spec +++ b/emacs.spec @@ -68,7 +68,9 @@ BuildRequires: libtiff-devel %if 0%{?suse_version} > 1140 BuildRequires: libudev-devel %endif -%if 0%{?suse_version} > 1130 +%if 0%{?suse_version} > 1320 +BuildRequires: pkgconfig(webkit2gtk-4.0) >= 2.12 +%else BuildRequires: libwebkitgtk3-devel %endif BuildRequires: libxml2-devel @@ -129,6 +131,8 @@ Patch23: emacs-25.1-custom-fonts.patch Patch24: emacs-25.2-ImageMagick7.patch # PATCH-FIX-UPSTREAM-GNULIB CVE-2017-7476 Patch25: gnulib.git-94e01571.patch +# http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=d781662873f228b110a128f7a2b6583a4d5e0a3a +Patch26: emacs-25.2-xwidget.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %{expand: %%global include_info %(test -s /usr/share/info/info.info* && echo 0 || echo 1)} @@ -244,6 +248,9 @@ and most assembler-like syntaxes. %patch23 -p0 -b .custfnt %patch24 -p1 %patch25 -p0 +%if 0%{?suse_version} > 1320 +%patch26 -p1 +%endif %patch -p0 -b .0 %if %{without autoconf}