186 lines
7.5 KiB
Diff
186 lines
7.5 KiB
Diff
|
From 3655f4896f2b33f47a94c8e7dc4f9623ba42fc2e Mon Sep 17 00:00:00 2001
|
||
|
From: Michael Gratton <mike@vee.net>
|
||
|
Date: Fri, 28 Aug 2020 11:38:06 +1000
|
||
|
Subject: [PATCH 076/124] =?UTF-8?q?Composer.WebView:=20Convert=20to=20usin?=
|
||
|
=?UTF-8?q?g=20messages=20for=20JS=20=E2=86=92=20client=20comms?=
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
---
|
||
|
src/client/composer/composer-web-view.vala | 75 ++++++++++------------
|
||
|
ui/composer-web-view.js | 18 ++++--
|
||
|
2 files changed, 45 insertions(+), 48 deletions(-)
|
||
|
|
||
|
diff --git a/src/client/composer/composer-web-view.vala b/src/client/composer/composer-web-view.vala
|
||
|
index 24a2740c..57b7e1e4 100644
|
||
|
--- a/src/client/composer/composer-web-view.vala
|
||
|
+++ b/src/client/composer/composer-web-view.vala
|
||
|
@@ -33,8 +33,8 @@ public class Composer.WebView : Components.WebView {
|
||
|
private const string SPACER = "<div><br /></div>";
|
||
|
|
||
|
// WebKit message handler names
|
||
|
- private const string CURSOR_CONTEXT_CHANGED = "cursorContextChanged";
|
||
|
- private const string DRAG_DROP_RECEIVED = "dragDropReceived";
|
||
|
+ private const string CURSOR_CONTEXT_CHANGED = "cursor_context_changed";
|
||
|
+ private const string DRAG_DROP_RECEIVED = "drag_drop_received";
|
||
|
|
||
|
/**
|
||
|
* Encapsulates editing-related state for a specific DOM node.
|
||
|
@@ -152,8 +152,8 @@ public class Composer.WebView : Components.WebView {
|
||
|
this.user_content_manager.add_style_sheet(WebView.app_style);
|
||
|
this.user_content_manager.add_script(WebView.app_script);
|
||
|
|
||
|
- register_message_handler(CURSOR_CONTEXT_CHANGED, on_cursor_context_changed);
|
||
|
- register_message_handler(DRAG_DROP_RECEIVED, on_drag_drop_received);
|
||
|
+ register_message_callback(CURSOR_CONTEXT_CHANGED, on_cursor_context_changed);
|
||
|
+ register_message_callback(DRAG_DROP_RECEIVED, on_drag_drop_received);
|
||
|
|
||
|
// XXX this is a bit of a hack given the docs for is_empty,
|
||
|
// above
|
||
|
@@ -530,50 +530,43 @@ public class Composer.WebView : Components.WebView {
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
- private void on_cursor_context_changed(WebKit.JavascriptResult result) {
|
||
|
- try {
|
||
|
- cursor_context_changed(
|
||
|
- new EditContext(Util.JS.to_string(result.get_js_value()))
|
||
|
- );
|
||
|
- } catch (Util.JS.Error err) {
|
||
|
- debug("Could not get text cursor style: %s", err.message);
|
||
|
+ private void on_cursor_context_changed(GLib.Variant? parameters) {
|
||
|
+ if (parameters != null && parameters.classify() == STRING) {
|
||
|
+ cursor_context_changed(new EditContext(parameters as string));
|
||
|
+ } else {
|
||
|
+ warning("Could not get text cursor style");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Handle a dropped image
|
||
|
*/
|
||
|
- private void on_drag_drop_received(WebKit.JavascriptResult result) {
|
||
|
-
|
||
|
- try {
|
||
|
- JSC.Value object = result.get_js_value();
|
||
|
- string filename = Util.JS.to_string(
|
||
|
- Util.JS.get_property(object, "fileName")
|
||
|
- );
|
||
|
- string filename_unescaped = GLib.Uri.unescape_string(filename);
|
||
|
-
|
||
|
- string file_type = Util.JS.to_string(
|
||
|
- Util.JS.get_property(object, "fileType")
|
||
|
- );
|
||
|
-
|
||
|
- string content_base64 = Util.JS.to_string(
|
||
|
- Util.JS.get_property(object, "content")
|
||
|
- );
|
||
|
- uint8[] image = GLib.Base64.decode(content_base64);
|
||
|
-
|
||
|
- if (image.length == 0) {
|
||
|
- warning("%s is empty", filename);
|
||
|
- return;
|
||
|
- }
|
||
|
+ private void on_drag_drop_received(GLib.Variant? parameters) {
|
||
|
+ var dict = new GLib.VariantDict(parameters);
|
||
|
+ string file_name = dict.lookup_value(
|
||
|
+ "fileName", GLib.VariantType.STRING
|
||
|
+ ).get_string();
|
||
|
+ string file_name_unescaped = GLib.Uri.unescape_string(file_name);
|
||
|
+
|
||
|
+ string file_type = dict.lookup_value(
|
||
|
+ "fileType", GLib.VariantType.STRING
|
||
|
+ ).get_string();
|
||
|
+
|
||
|
+ string content_base64 = dict.lookup_value(
|
||
|
+ "content", GLib.VariantType.STRING
|
||
|
+ ).get_string();
|
||
|
+ uint8[] image = GLib.Base64.decode(content_base64);
|
||
|
+
|
||
|
+ if (image.length == 0) {
|
||
|
+ warning("%s is empty", file_name);
|
||
|
+ return;
|
||
|
+ }
|
||
|
|
||
|
- // A simple check to see if the file looks like an image. A problem here
|
||
|
- // will be this accepting types which won't be supported by WebKit
|
||
|
- // or recipients.
|
||
|
- if (file_type.index_of("image/") == 0) {
|
||
|
- image_file_dropped(filename_unescaped, file_type, image);
|
||
|
- }
|
||
|
- } catch (Util.JS.Error err) {
|
||
|
- debug("Could not get deceptive link param: %s", err.message);
|
||
|
+ // A simple check to see if the file looks like an image. A problem here
|
||
|
+ // will be this accepting types which won't be supported by WebKit
|
||
|
+ // or recipients.
|
||
|
+ if (file_type.index_of("image/") == 0) {
|
||
|
+ image_file_dropped(file_name_unescaped, file_type, image);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
diff --git a/ui/composer-web-view.js b/ui/composer-web-view.js
|
||
|
index ca918990..4fe34ad0 100644
|
||
|
--- a/ui/composer-web-view.js
|
||
|
+++ b/ui/composer-web-view.js
|
||
|
@@ -1,6 +1,6 @@
|
||
|
/*
|
||
|
- * Copyright 2016 Software Freedom Conservancy Inc.
|
||
|
- * Copyright 2016 Michael Gratton <mike@vee.net>
|
||
|
+ * Copyright © 2016 Software Freedom Conservancy Inc.
|
||
|
+ * Copyright © 2016-2020 Michael Gratton <mike@vee.net>
|
||
|
*
|
||
|
* This software is licensed under the GNU Lesser General Public License
|
||
|
* (version 2.1 or later). See the COPYING file in this distribution.
|
||
|
@@ -35,6 +35,9 @@ ComposerPageState.prototype = {
|
||
|
this.nextSelectionId = 0;
|
||
|
this.cursorContext = null;
|
||
|
|
||
|
+ this._cursorContextChanged = MessageSender("cursor_context_changed");
|
||
|
+ this._dragDropReceived = MessageSender("drag_drop_received");
|
||
|
+
|
||
|
document.addEventListener("click", function(e) {
|
||
|
if (e.target.tagName == "A") {
|
||
|
e.preventDefault();
|
||
|
@@ -99,7 +102,9 @@ ComposerPageState.prototype = {
|
||
|
}, true);
|
||
|
|
||
|
// Handle file drag & drop
|
||
|
- document.body.addEventListener("drop", state.handleFileDrop, true);
|
||
|
+ document.body.addEventListener("drop", function(e) {
|
||
|
+ state.handleFileDrop(e);
|
||
|
+ }, true);
|
||
|
document.body.addEventListener("allowDrop", function(e) {
|
||
|
ev.preventDefault();
|
||
|
}, true);
|
||
|
@@ -346,9 +351,7 @@ ComposerPageState.prototype = {
|
||
|
let newContext = new EditContext(cursor);
|
||
|
if (!newContext.equals(this.cursorContext)) {
|
||
|
this.cursorContext = newContext;
|
||
|
- window.webkit.messageHandlers.cursorContextChanged.postMessage(
|
||
|
- newContext.encode()
|
||
|
- );
|
||
|
+ this._cursorContextChanged(newContext.encode());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -396,13 +399,14 @@ ComposerPageState.prototype = {
|
||
|
continue;
|
||
|
|
||
|
const reader = new FileReader();
|
||
|
+ const state = this;
|
||
|
reader.onload = (function(filename, imageType) { return function(loadEvent) {
|
||
|
// Remove prefixed file type and encoding type
|
||
|
var parts = loadEvent.target.result.split(",");
|
||
|
if (parts.length < 2)
|
||
|
return;
|
||
|
|
||
|
- window.webkit.messageHandlers.dragDropReceived.postMessage({
|
||
|
+ state._dragDropReceived({
|
||
|
fileName: encodeURIComponent(filename),
|
||
|
fileType: imageType,
|
||
|
content: parts[1]
|
||
|
--
|
||
|
2.29.2
|
||
|
|