diff options
-rw-r--r-- | src/web-view-schemes/about.c | 130 | ||||
-rw-r--r-- | src/web-view-schemes/local.mk | 1 | ||||
-rw-r--r-- | src/web-view-schemes/methods.c | 2 | ||||
-rw-r--r-- | src/web-view-schemes/schemes.h | 1 |
4 files changed, 134 insertions, 0 deletions
diff --git a/src/web-view-schemes/about.c b/src/web-view-schemes/about.c new file mode 100644 index 0000000..538fc23 --- /dev/null +++ b/src/web-view-schemes/about.c @@ -0,0 +1,130 @@ +/* + * Web view members and methods for the "about" ("mq-about" internally) scheme + * + * Copyright (C) 2017 Patrick McDermott + * + * This file is part of Marquee. + * + * Marquee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Marquee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Marquee. If not, see <http://www.gnu.org/licenses/>. + */ + +/* + * This scheme reuses the normal-scheme structure and context_menu() and + * save_file() methods. + */ + +#include "schemes.h" + +#include <string.h> + +#include <glib.h> +#include <webkit2/webkit2.h> + +#include "../config/config.h" +#include "../config/settings.h" +#include "../web-view.h" + +static MqSettings *settings = NULL; + +static gboolean +match_uri(const gchar *uri) +{ + return uri && (g_str_has_prefix(uri, "about:") || + g_str_has_prefix(uri, "mq-about:")); +} + +static void +init_settings(MqConfig *config) +{ + if (settings) { + return; + } + + settings = mq_settings_new(); + mq_settings_set_web_context(settings, webkit_web_context_get_default()); + mq_settings_override_bool(settings, "permissions.javascript.enable", + TRUE); + mq_settings_connect_config(settings, config); +} + +static void +initialize(MqWebView *web_view, MqWebViewScheme G_GNUC_UNUSED *scheme, + const gchar G_GNUC_UNUSED *uri) +{ + init_settings(mq_web_view_get_config(web_view)); + + webkit_web_view_set_settings(WEBKIT_WEB_VIEW(web_view), + WEBKIT_SETTINGS(settings)); +} + +static void +finalize(MqWebViewScheme *scheme) +{ + memset(&scheme->normal, 0, sizeof(scheme->normal)); +} + +static gchar * +rewrite_uri(MqWebView G_GNUC_UNUSED *web_view, + MqWebViewScheme G_GNUC_UNUSED *scheme, const gchar *uri) +{ + if (g_str_has_prefix(uri, "about:")) { + return g_strconcat("mq-about:", uri + strlen("about:"), NULL); + } else { + return g_strdup(uri); + } +} + +static gchar * +display_uri(MqWebView G_GNUC_UNUSED *web_view, + MqWebViewScheme G_GNUC_UNUSED *scheme, const gchar *uri) +{ + gchar *rw_uri; + gchar *query; + + if (g_str_has_prefix(uri, "mq-about:")) { + rw_uri = g_strconcat("about:", uri + strlen("mq-about:"), NULL); + query = strchr(rw_uri, '?'); + if (query) { + query[0] = '\0'; + } + return rw_uri; + } else { + return g_strdup(uri); + } +} + +static gboolean +context_menu(MqWebView *web_view, MqWebViewScheme *scheme, + WebKitContextMenu *context_menu, GdkEvent *event, + WebKitHitTestResult *hit_test_result) +{ + return mq_web_view_normal_scheme_methods.context_menu(web_view, scheme, + context_menu, event, hit_test_result); +} + +static void +save_file(MqWebView *web_view, MqWebViewScheme *scheme) +{ + mq_web_view_normal_scheme_methods.save_file(web_view, scheme); +} + +MqWebViewSchemeMethods mq_web_view_about_scheme_methods = { + .match_uri = match_uri, + .initialize = initialize, + .finalize = finalize, + .rewrite_uri = rewrite_uri, + .display_uri = display_uri, + .context_menu = context_menu, + .save_file = save_file, +}; diff --git a/src/web-view-schemes/local.mk b/src/web-view-schemes/local.mk index 4728608..1c782a9 100644 --- a/src/web-view-schemes/local.mk +++ b/src/web-view-schemes/local.mk @@ -1,4 +1,5 @@ marquee_SOURCES += \ + %reldir%/about.c \ %reldir%/methods.c \ %reldir%/normal.c \ %reldir%/view-source.c diff --git a/src/web-view-schemes/methods.c b/src/web-view-schemes/methods.c index 0a682a3..89c7fb5 100644 --- a/src/web-view-schemes/methods.c +++ b/src/web-view-schemes/methods.c @@ -48,6 +48,8 @@ mq_web_view_scheme_set_methods(MqWebView *web_view, MqWebViewScheme *scheme, check_and_set_methods(web_view, scheme, methods, uri, &mq_web_view_normal_scheme_methods) || check_and_set_methods(web_view, scheme, methods, uri, + &mq_web_view_about_scheme_methods) || + check_and_set_methods(web_view, scheme, methods, uri, &mq_web_view_view_source_scheme_methods); #pragma GCC diagnostic pop diff --git a/src/web-view-schemes/schemes.h b/src/web-view-schemes/schemes.h index f0abaec..0bb58a9 100644 --- a/src/web-view-schemes/schemes.h +++ b/src/web-view-schemes/schemes.h @@ -63,6 +63,7 @@ typedef struct { } MqWebViewSchemeMethods; extern MqWebViewSchemeMethods mq_web_view_normal_scheme_methods; +extern MqWebViewSchemeMethods mq_web_view_about_scheme_methods; extern MqWebViewSchemeMethods mq_web_view_view_source_scheme_methods; void |