};
// todo: whileRemoveWholetext
var keyEventHandlers = [
+ {
+ applies: function(e, s) {
+ return s.type === 'caret' &&
+ s.element.wlxmlNode.parent().is({tagName: 'span'}) &&
+ s.element.wlxmlNode.getText().length === 1 &&
+ s.offset === 1 &&
+ (e.key === KEYS.BACKSPACE);
+ },
+ run: function(e, s) {
+ var params = {},
+ prevTextNode = s.element.canvas.getPreviousTextElement(s.element).wlxmlNode;
+ e.preventDefault();
+ s.element.wlxmlNode.parent().detach(params);
+ s.canvas.setCurrentElement(
+ (params.ret && params.ret.mergedTo) || prevTextNode,
+ {caretTo: params.ret ? params.ret.previousLen : (prevTextNode ? prevTextNode.getText().length : 0)});
+ }
+ },
{
applies: function(e, s) {
return s.type === 'caret' && (
describe('backspace at the beginning of a span', function() {
afterEach(removeCanvas);
+ it('deletes span if it contains only one character', function() {
+ var c = getCanvasFromXML('<section>Alice<span class="emp">h</span>a cat</section>'),
+ k = new Keyboard(c);
+
+ k.withCaret('h|').press(K.BACKSPACE);
+
+ var rootContents = c.wlxmlDocument.root.contents();
+ expect(rootContents.length).to.equal(1);
+ expect(rootContents[0].getText()).to.equal('Alicea cat');
+
+ var selection = c.getSelection();
+ expect(selection.type).to.equal('caret');
+ expect(selection.element.sameNode(getTextElement('Alicea cat', c))).to.equal(true);
+ expect(selection.offset).to.equal(5);
+ });
+
it('deletes from the end of the preceding text element', function() {
var c = getCanvasFromXML('<section>Alice<span>has a cat</span></section>'),
k = new Keyboard(c);