Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix backspacing into a block from offset 0 in Firefox #338

Merged
merged 2 commits into from Nov 15, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 17 additions & 14 deletions 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: ->
Expand Down Expand Up @@ -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)

Expand All @@ -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()
Expand Down
26 changes: 19 additions & 7 deletions 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"
Expand Down Expand Up @@ -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])
Expand Down
12 changes: 12 additions & 0 deletions test/src/system/mutation_input_test.coffee
Expand Up @@ -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("""<blockquote>a</blockquote><div>b</div>""")
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()

Expand Down