Only attempt to type fully-composed strings.
@@ -1207,6 +1207,30 @@ Guacamole.Keyboard = function(element) {
}, true);
+ /**
+ * Returns whether the given string is fully composed. A string is fully
+ * composed if it does not end with combining characters.
+ *
+ * @private
+ * @param {String} str
+ * The string to test.
+ *
+ * @returns {Boolean}
+ * true of the string is fully composed, false otherwise.
+ */
+ var isComposed = function isComposed(str) {
+
+ // The empty string is fully composed
+ if (!str)
+ return true;
+
+ // Test whether the last character is within the "Combining
+ // Diacritical Marks" Unicode block (U+0300 through U+036F)
+ var lastCodepoint = str.charCodeAt(str.length - 1);
+ return !(lastCodepoint >= 0x0300 && lastCodepoint <= 0x036F);
+
+ };
+
/**
* Handles the given "input" event, typing the data within the input text.
* If the event is complete (text is provided), handling of "compositionend"
@@ -1222,7 +1246,7 @@ Guacamole.Keyboard = function(element) {
if (!guac_keyboard.onkeydown && !guac_keyboard.onkeyup) return;
// Type all content written
- if (e.data) {
+ if (e.data && isComposed(e.data)) {
element.removeEventListener("compositionend", handleComposition, false);
guac_keyboard.type(e.data);
}
@@ -1245,7 +1269,7 @@ Guacamole.Keyboard = function(element) {
if (!guac_keyboard.onkeydown && !guac_keyboard.onkeyup) return;
// Type all content written
- if (e.data) {
+ if (e.data && isComposed(e.data)) {
element.removeEventListener("input", handleInput, false);
guac_keyboard.type(e.data);
}
