summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/web-view-schemes/about.c130
-rw-r--r--src/web-view-schemes/local.mk1
-rw-r--r--src/web-view-schemes/methods.c2
-rw-r--r--src/web-view-schemes/schemes.h1
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