diff options
Diffstat (limited to 'src/web-view-schemes/about.c')
-rw-r--r-- | src/web-view-schemes/about.c | 130 |
1 files changed, 130 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, +}; |