Skip to content

Commit

Permalink
Merge pull request #4053 from ajaxorg/c9-sync
Browse files Browse the repository at this point in the history
changes from cloud9
  • Loading branch information
nightwing committed Aug 12, 2019
2 parents c50e196 + e0e13f1 commit 902d1a0
Show file tree
Hide file tree
Showing 9 changed files with 227 additions and 113 deletions.
13 changes: 12 additions & 1 deletion lib/ace/clipboard.js
Expand Up @@ -31,6 +31,17 @@
define(function(require, exports, module) {
"use strict";

module.exports = { lineMode: false };
var $cancelT;
module.exports = {
lineMode: false,
pasteCancelled: function() {
if ($cancelT && $cancelT > Date.now() - 50)
return true;
return $cancelT = false;
},
cancel: function() {
$cancelT = Date.now();
}
};

});
2 changes: 1 addition & 1 deletion lib/ace/editor.js
Expand Up @@ -1096,7 +1096,7 @@ Editor.$uid = 0;
};

this.onCommandKey = function(e, hashId, keyCode) {
this.keyBinding.onCommandKey(e, hashId, keyCode);
return this.keyBinding.onCommandKey(e, hashId, keyCode);
};

/**
Expand Down
4 changes: 2 additions & 2 deletions lib/ace/keyboard/keybinding.js
Expand Up @@ -139,11 +139,11 @@ var KeyBinding = function(editor) {

this.onCommandKey = function(e, hashId, keyCode) {
var keyString = keyUtil.keyCodeToString(keyCode);
this.$callKeyboardHandlers(hashId, keyString, keyCode, e);
return this.$callKeyboardHandlers(hashId, keyString, keyCode, e);
};

this.onTextInput = function(text) {
this.$callKeyboardHandlers(-1, text);
return this.$callKeyboardHandlers(-1, text);
};

}).call(KeyBinding.prototype);
Expand Down
11 changes: 10 additions & 1 deletion lib/ace/keyboard/textinput.js
Expand Up @@ -35,6 +35,7 @@ var event = require("../lib/event");
var useragent = require("../lib/useragent");
var dom = require("../lib/dom");
var lang = require("../lib/lang");
var clipboard = require("../clipboard");
var BROKEN_SETDATA = useragent.isChrome < 18;
var USE_IE_MIME_TYPE = useragent.isIE;
var HAS_FOCUS_ARGS = useragent.isChrome > 63;
Expand Down Expand Up @@ -397,6 +398,8 @@ var TextInput = function(parentNode, host) {

var onPaste = function(e) {
var data = handleClipboardData(e);
if (clipboard.pasteCancelled())
return;
if (typeof data == "string") {
if (data)
host.onPaste(data, e);
Expand Down Expand Up @@ -687,7 +690,13 @@ var TextInput = function(parentNode, host) {
modifier |= MODS.shift;

if (key) {
host.onCommandKey(null, modifier, key);
var result = host.onCommandKey({}, modifier, key);
if (!result && host.commands) {
key = KEYS.keyCodeToString(key);
var command = host.commands.findKeyCommand(modifier, key);
if (command)
host.execCommand(command);
}
lastSelectionStart = selectionStart;
lastSelectionEnd = selectionEnd;
resetSelection("");
Expand Down
120 changes: 60 additions & 60 deletions lib/ace/keyboard/textinput_test.js
Expand Up @@ -37,10 +37,11 @@ if (typeof process !== "undefined") {
define(function(require, exports, module) {
"use strict";

var assert = require("./../test/assertions");
require("./../test/mockdom");
require("../test/mockdom");
var assert = require("../test/assertions");
var clipboard = require("../clipboard");
var ace = require("../ace");
var editor, changes, textarea;
var editor, changes, textarea, copiedValue;

var MouseEvent = function(type, opts) {
var e = document.createEvent("MouseEvents");
Expand All @@ -53,21 +54,30 @@ var MouseEvent = function(type, opts) {
return e;
};

function applyEvent(data) {
function sendEvent(type, data) {
if (!data)
data = {};
if (typeof data == "function")
return data();

var type = data._;
var event = new CustomEvent(type);
if (/cut|copy|paste/.test(type)) {
event.clipboardData = {
getData: function() { return copiedValue; },
setData: function(mime, text) { copiedValue = text; }
};
}
for (var i in data.key || {})
event[i] = data.key[i];
data.modifier && data.modifier.split("-").map(function(m) {
if (m) event[m + "Key"] = true;
});

if (/input|select|composition/.test(type) || data.key && /Esc/.test(data.key.key)) {
textarea.value = data.value;
textarea.selectionEnd = data.range[1];
textarea.selectionStart = data.range[0];
if (data.value != null)
textarea.value = data.value;
if (data.range)
textarea.setSelectionRange(data.range[0], data.range[1]);
}
textarea.dispatchEvent(event);
if (data.value != null)
Expand Down Expand Up @@ -109,6 +119,7 @@ module.exports = {
editor = textarea = null;
}
},

"test: simple text input": function() {
[
{ _: "input", range: [1,1], value: "a\n\n"},
Expand All @@ -120,7 +131,7 @@ module.exports = {
{ _: "keydown", range: [1,2], value: "aaaaa\n\n", key: { code: "ArrowLeft", key: "ArrowLeft", keyCode: 37}, modifier: "shift-"},
{ _: "input", range: [2,2], value: "aaaaa\n\n"}
].forEach(function(data) {
applyEvent(data);
sendEvent(data._, data);
});
editor.resize(true);
assert.equal(changes.filter(function(d) { return d.action == "insert"; }).length, 6);
Expand All @@ -139,7 +150,7 @@ module.exports = {
{ _: "input", range: [3,3], value: "x x\n\n"},
{ _: "keyup", range: [3,3], value: "x x\n\n"}
].forEach(function(data) {
applyEvent(data);
sendEvent(data._, data);
});
editor.resize(true);
assert.equal(editor.getValue(), "x x");
Expand Down Expand Up @@ -228,7 +239,7 @@ module.exports = {
editor.setValue("hello", 1);
editor.setOption("useTextareaForIME", true);
data.forEach(function(data) {
applyEvent(data);
sendEvent(data._, data);
});
assert.ok(!editor.renderer.$composition);
assert.notOk(/ace_composition/.test(textarea.className));
Expand Down Expand Up @@ -349,7 +360,7 @@ module.exports = {
editor.setValue("hello", 1);
editor.setOption("useTextareaForIME", false);
data.forEach(function(data) {
applyEvent(data);
sendEvent(data._, data);
});
assert.ok(!editor.renderer.$composition);
assert.notOk(/ace_composition/.test(textarea.className));
Expand All @@ -373,7 +384,7 @@ module.exports = {
{ _: "keydown", range: [3,8], value: "kinners\n\n\n", key: { code: "ArrowUp", key: "ArrowUp", keyCode: 38}, modifier: "shift-"},
{ _: "keydown", range: [3,12], value: "juhu\nkinners\n\n", key: { code: "ArrowUp", key: "ArrowUp", keyCode: 38}, modifier: "shift-"}
].forEach(function(data) {
applyEvent(data);
sendEvent(data._, data);
});
// test overflow
editor.session.setValue("0123456789".repeat(80));
Expand Down Expand Up @@ -510,57 +521,11 @@ module.exports = {
{ _: "keyup", range: [1,1], value: "4\n\n", key: { key: "4", keyCode: 100}},*/

].forEach(function(data, i) {

applyEvent(data);
sendEvent(data._, data);
});
assert.equal(editor.getValue(), "开iird");
},
/*
{ _: "keydown", range: [0,0], value: "\n\n", key: { key: "Backspace", keyCode: 8}},
{ _: "keyup", range: [0,0], value: "\n\n", key: { key: "Backspace", keyCode: 8}},
{ _: "keydown", range: [0,0], value: "\n\n", key: { key: "a", keyCode: 229}},
{ _: "compositionstart", range: [0,0], value: "\n\n"},
{ _: "compositionupdate", range: [1,1], value: "a\n\n"},
{ _: "input", range: [1,1], value: "a\n\n"},
{ _: "keyup", range: [1,1], value: "a\n\n", key: { key: "a", keyCode: 65}},
{ _: "keydown", range: [1,1], value: "a\n\n", key: { key: "s", keyCode: 229}},
{ _: "compositionupdate", range: [2,2], value: "as\n\n"},
{ _: "input", range: [2,2], value: "as\n\n"},
{ _: "keyup", range: [2,2], value: "as\n\n", key: { key: "s", keyCode: 83}},
{ _: "keydown", range: [2,2], value: "as\n\n", key: { key: "d", keyCode: 229}},
{ _: "compositionupdate", range: [3,3], value: "asd\n\n"},
{ _: "input", range: [3,3], value: "asd\n\n"},
{ _: "keyup", range: [3,3], value: "asd\n\n", key: { key: "d", keyCode: 68}},
{ _: "keydown", range: [3,3], value: "asd\n\n", key: { key: "1", keyCode: 229}},
{ _: "compositionupdate", range: [3,3], value: "阿苏大\n\n"},
{ _: "input", range: [3,3], value: "阿苏大\n\n"},
{ _: "keyup", range: [3,3], value: "阿苏大\n\n", key: { key: "1", keyCode: 97}},
{ _: "keydown", range: [3,3], value: "阿苏大\n\n", key: { key: "d", keyCode: 229}},
{ _: "compositionupdate", range: [4,4], value: "阿苏大d\n\n"},
{ _: "input", range: [4,4], value: "阿苏大d\n\n"},
{ _: "keyup", range: [4,4], value: "阿苏大d\n\n", key: { key: "d", keyCode: 68}},
{ _: "keydown", range: [4,4], value: "阿苏大d\n\n", key: { key: "a", keyCode: 229}},
{ _: "compositionupdate", range: [5,5], value: "阿苏大da\n\n"},
{ _: "input", range: [5,5], value: "阿苏大da\n\n"},
{ _: "keyup", range: [5,5], value: "阿苏大da\n\n", key: { key: "a", keyCode: 65}},
{ _: "keydown", range: [5,5], value: "阿苏大da\n\n", key: { key: "s", keyCode: 229}},
{ _: "compositionupdate", range: [6,6], value: "阿苏大das\n\n"},
{ _: "input", range: [6,6], value: "阿苏大das\n\n"},
{ _: "keyup", range: [6,6], value: "阿苏大das\n\n", key: { key: "s", keyCode: 83}},
{ _: "keydown", range: [6,6], value: "阿苏大das\n\n", key: { key: "d", keyCode: 229}},
{ _: "compositionupdate", range: [7,7], value: "阿苏大dasd\n\n"},
{ _: "input", range: [7,7], value: "阿苏大dasd\n\n"},
{ _: "keyup", range: [7,7], value: "阿苏大dasd\n\n", key: { key: "d", keyCode: 68}},
{ _: "keydown", range: [7,7], value: "阿苏大dasd\n\n", key: { key: "2", keyCode: 229}},
{ _: "compositionupdate", range: [6,6], value: "阿苏大大蒜d\n\n"},
{ _: "input", range: [6,6], value: "阿苏大大蒜d\n\n"},
{ _: "keyup", range: [6,6], value: "阿苏大大蒜d\n\n", key: { key: "2", keyCode: 98}},
{ _: "compositionupdate", range: [6,6], value: "阿苏大大蒜的\n\n"},
{ _: "compositionend", range: [6,6], value: "阿苏大大蒜的\n\n"},
{ _: "input", range: [6,6], value: "阿苏大大蒜的\n\n"},

*/
"test: contextmenu": function() {
var value = "juhu\nkinners\n";
editor.setValue(value);
Expand All @@ -580,6 +545,41 @@ module.exports = {
textarea.setSelectionRange(0, 0);
textarea.dispatchEvent(new CustomEvent("input"));
assert.equal(editor.getValue(), "");
},

"test clipboard": function() {
copiedValue = "x";
sendEvent("paste");
assert.equal(editor.getValue(), "x");
copiedValue = "--";
sendEvent("copy");
assert.equal(copiedValue, "--");
editor.setOption("copyWithEmptySelection", true);
sendEvent("copy");
assert.equal(copiedValue, "x\n");
editor.setValue("1\n2", -1);
sendEvent("paste");
assert.equal(editor.getValue(), "x\n1\n2");
textarea.select();
sendEvent("select");
sendEvent("cut");
assert.equal(copiedValue, "x\n1\n2");
editor.setValue("0", 1);
sendEvent("paste");
assert.equal(editor.getValue(), "0x\n1\n2");
editor.setValue("");
clipboard.cancel();
sendEvent("paste");
assert.equal(editor.getValue(), "");
},

"test inputType undo": function() {
editor.execCommand("insertstring", "x");
assert.equal(editor.getValue(), "x");
sendEvent("input", {key: {inputType: "historyUndo"}});
assert.equal(editor.getValue(), "");
sendEvent("input", {key: {inputType: "historyRedo"}});
assert.equal(editor.getValue(), "x");
}
};

Expand Down
3 changes: 1 addition & 2 deletions lib/ace/layer/text.js
Expand Up @@ -381,13 +381,12 @@ var Text = function(parentEl) {
valueFragment.appendChild(span);
} else if (cjkSpace) {
// U+3000 is both invisible AND full-width, so must be handled uniquely
var space = self.showInvisibles ? self.SPACE_CHAR : "";
screenColumn += 1;

var span = this.dom.createElement("span");
span.style.width = (self.config.characterWidth * 2) + "px";
span.className = self.showInvisibles ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk";
span.textContent = self.showInvisibles ? self.SPACE_CHAR : "";
span.textContent = self.showInvisibles ? self.SPACE_CHAR : cjkSpace;
valueFragment.appendChild(span);
} else if (cjk) {
screenColumn += 1;
Expand Down
2 changes: 1 addition & 1 deletion lib/ace/layer/text_test.js
Expand Up @@ -75,7 +75,7 @@ module.exports = {

var parent = dom.createElement("div");
this.textLayer.$renderLine(parent, 0);
assert.domNode(parent, ["div", {}, ["span", {class: "ace_cjk", style: "width: 20px;"}]]);
assert.domNode(parent, ["div", {}, ["span", {class: "ace_cjk", style: "width: 20px;"}, "\u3000"]]);

this.textLayer.setShowInvisibles(true);
var parent = dom.createElement("div");
Expand Down

0 comments on commit 902d1a0

Please sign in to comment.