From febe151d826c11948bd6c3c643776cbc99f69d5c Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Sun, 13 Nov 2016 15:13:57 -0500 Subject: [PATCH 1/2] Fix backspacing into a block from offset 0 in Firefox --- src/trix/observers/mutation_observer.coffee | 26 +++++++++++++++------ test/src/system/mutation_input_test.coffee | 12 ++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/trix/observers/mutation_observer.coffee b/src/trix/observers/mutation_observer.coffee index 5944e4f56..d28ed83a1 100644 --- a/src/trix/observers/mutation_observer.coffee +++ b/src/trix/observers/mutation_observer.coffee @@ -1,4 +1,4 @@ -{defer, findClosestElementFromNode, nodeIsEmptyTextNode, normalizeSpaces, summarizeStringChange, tagName} = Trix +{defer, findClosestElementFromNode, nodeIsEmptyTextNode, nodeIsBlockStartComment, normalizeSpaces, summarizeStringChange, tagName} = Trix class Trix.MutationObserver extends Trix.BasicObject mutableAttributeName = "data-trix-mutable" @@ -82,12 +82,24 @@ class Trix.MutationObserver extends Trix.BasicObject mutation for mutation in @mutations when mutation.type is type getTextChangesFromChildList: -> - textAdded = [] - textRemoved = [] - - for {addedNodes, removedNodes} in @getMutationsByType("childList") - textAdded.push(getTextForNodes(addedNodes)...) - textRemoved.push(getTextForNodes(removedNodes)...) + addedNodes = [] + removedNodes = [] + + for mutation in @getMutationsByType("childList") + addedNodes.push(mutation.addedNodes...) + removedNodes.push(mutation.removedNodes...) + + singleBlockCommentRemoved = + addedNodes.length is 0 and + removedNodes.length is 1 and + nodeIsBlockStartComment(removedNodes[0]) + + if singleBlockCommentRemoved + textAdded = [] + textRemoved = ["\n"] + else + textAdded = getTextForNodes(addedNodes) + textRemoved = getTextForNodes(removedNodes) additions: (normalizeSpaces(text) for text, index in textAdded when text isnt textRemoved[index]) deletions: (normalizeSpaces(text) for text, index in textRemoved when text isnt textAdded[index]) diff --git a/test/src/system/mutation_input_test.coffee b/test/src/system/mutation_input_test.coffee index 970e56b6f..ad680aabb 100644 --- a/test/src/system/mutation_input_test.coffee +++ b/test/src/system/mutation_input_test.coffee @@ -46,6 +46,18 @@ testGroup "Mutation input", template: "editor_empty", -> assert.locationRange index: 0, offset: 0 expectDocument("\n") + test "backspacing a block comment node", (expectDocument) -> + element = getEditorElement() + element.editor.loadHTML("""
a
b
""") + defer -> + element.editor.setSelectedRange(2) + triggerEvent(element, "keydown", charCode: 0, keyCode: 8, which: 8) + commentNode = element.lastChild.firstChild + commentNode.parentNode.removeChild(commentNode) + defer -> + assert.locationRange index: 0, offset: 1 + expectDocument("ab\n") + test "typing formatted text with autocapitalization on", (expectDocument) -> element = getEditorElement() From b47cf4bbca35223aec5a5acd90534161153be288 Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Mon, 14 Nov 2016 09:46:09 -0500 Subject: [PATCH 2/2] Own rendering when backspacing from offset 0 --- src/trix/models/composition.coffee | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/trix/models/composition.coffee b/src/trix/models/composition.coffee index fb865a989..5ef270808 100644 --- a/src/trix/models/composition.coffee +++ b/src/trix/models/composition.coffee @@ -1,7 +1,7 @@ #= require trix/models/document #= require trix/models/line_break_insertion -{normalizeRange, rangesAreEqual, objectsAreEqual, arrayStartsWith, summarizeArrayChange, getAllAttributeNames, getBlockConfig, getTextConfig, extend} = Trix +{normalizeRange, rangesAreEqual, rangeIsCollapsed, objectsAreEqual, arrayStartsWith, summarizeArrayChange, getAllAttributeNames, getBlockConfig, getTextConfig, extend} = Trix class Trix.Composition extends Trix.BasicObject constructor: -> @@ -118,23 +118,26 @@ class Trix.Composition extends Trix.BasicObject @insertText(text) deleteInDirection: (direction) -> - range = [startPosition, endPosition] = @getSelectedRange() + range = @getSelectedRange() + selectionIsCollapsed = rangeIsCollapsed(range) block = @getBlock() - if startPosition is endPosition - startLocation = @document.locationFromPosition(startPosition) - if direction is "backward" and startLocation.offset is 0 - if @canDecreaseBlockAttributeLevel() - if block.isListItem() - @decreaseListLevel() - else - @decreaseBlockAttributeLevel() + if selectionIsCollapsed and direction is "backward" + {offset} = @document.locationFromPosition(range[0]) + deletingIntoPreviousBlock = offset is 0 - @setSelection(startPosition) - return if block.isEmpty() + if deletingIntoPreviousBlock + if @canDecreaseBlockAttributeLevel() + if block.isListItem() + @decreaseListLevel() + else + @decreaseBlockAttributeLevel() - range = @getExpandedRangeInDirection(direction) + @setSelection(range[0]) + return false if block.isEmpty() + if selectionIsCollapsed + range = @getExpandedRangeInDirection(direction) if direction is "backward" attachment = @getAttachmentAtRange(range) @@ -144,7 +147,7 @@ class Trix.Composition extends Trix.BasicObject else @setDocument(@document.removeTextAtRange(range)) @setSelection(range[0]) - false if block.isListItem() + false if deletingIntoPreviousBlock moveTextFromRange: (range) -> [position] = @getSelectedRange()