+ if(e.which >= 37 && e.which <= 40) {
+ var element = canvas.getCursor().getPosition().element,
+ caretTo = false;
+ if(!element) {
+ // Chrome hack
+ var direction;
+ if(e.which === KEYS.ARROW_LEFT || e.which === KEYS.ARROW_UP) {
+ direction = 'above';
+ caretTo = 'end';
+ } else {
+ direction = 'below';
+ caretTo = 'start';
+ }
+ element = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]:visible', direction, window.getSelection().focusNode));
+ }
+ canvas.setCurrentElement(element, {caretTo: caretTo});
+ }
+ });
+
+ this.wrapper.on('keydown', function(e) {
+ if(e.which >= 37 && e.which <= 40) {
+ var position = canvas.getCursor().getPosition(),
+ element = position.element;
+ if(element && (element instanceof documentElement.DocumentTextElement)) {
+ if(element.isEmpty()) {
+ var direction, caretTo;
+ if(e.which === KEYS.ARROW_LEFT || e.which === KEYS.ARROW_UP) {
+ direction = 'above';
+ caretTo = 'end';
+ } else {
+ direction = 'below';
+ caretTo = 'start';
+ }
+ var el = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, window.getSelection().focusNode))
+ canvas.setCurrentElement(element, {caretTo: caretTo});
+ } else {
+ var txt = element.dom().contents()[0].data;
+ if(e.which === KEYS.ARROW_LEFT && position.offset > 1 && txt.charAt(position.offset-2) === utils.unicode.ZWS) {
+ e.preventDefault();
+ canvas._moveCaretToTextElement(element, position.offset-2);
+ }
+ if(e.which === KEYS.ARROW_RIGHT && position.offset < txt.length - 1 && txt.charAt(position.offset+1) === utils.unicode.ZWS) {
+ e.preventDefault();
+ canvas._moveCaretToTextElement(element, position.offset+2);
+ }
+ }
+ }
+
+
+ }
+ });
+
+ this.wrapper.on('click', '[document-node-element], [document-text-element]', function(e) {
+ e.stopPropagation();
+ canvas.setCurrentElement(canvas.getDocumentElement(e.currentTarget), {caretTo: false});
+ });
+
+ var observer = new MutationObserver(function(mutations) {
+ mutations.forEach(function(mutation) {
+ if(documentElement.DocumentTextElement.isContentContainer(mutation.target) && mutation.target.data === '')
+ mutation.target.data = utils.unicode.ZWS;
+ });