/* * 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 . */ /* * This scheme reuses the normal-scheme structure and context_menu() and * save_file() methods. */ #include "schemes.h" #include #include #include #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, };