medium-editor
Advanced tools
Comparing version 5.5.3 to 5.5.4
@@ -0,1 +1,6 @@ | ||
5.5.4 / 2015-08-04 | ||
================== | ||
* Fix issue with anchor and selection inconsitencies in IE | ||
5.5.3 / 2015-08-03 | ||
@@ -2,0 +7,0 @@ ================== |
{ | ||
"name": "medium-editor", | ||
"version": "5.5.3", | ||
"version": "5.5.4", | ||
"author": "Davi Ferreira <hi@daviferreira.com>", | ||
@@ -5,0 +5,0 @@ "contributors": [ |
@@ -294,7 +294,55 @@ /*global MediumEditor, describe, it, expect, spyOn, | ||
// Make sure the <p> wasn't removed, and the <a> was added to the end | ||
expect(this.el.lastChild).toBe(lastP); | ||
expect(lastP.firstChild.nodeName.toLowerCase()).toBe('a'); | ||
// Make sure selection is only the link | ||
var range = window.getSelection().getRangeAt(0); | ||
expect(MediumEditor.util.isDescendant(lastP, range.startContainer, true)).toBe(true, 'The start of the selection is incorrect'); | ||
expect(MediumEditor.util.isDescendant(lastP, range.endContainer, true)).toBe(true, 'The end of the selection is incorrect'); | ||
expect(range.startOffset).toBe(0); | ||
expect(MediumEditor.util.isDescendant(lastP.firstChild, range.endContainer, true)).toBe(true, 'The end of the selection is not contained within the link'); | ||
}); | ||
it('should not remove the <p> container when adding a link inside a top-level <p> with a single text-node child', function () { | ||
spyOn(MediumEditor.prototype, 'createLink').and.callThrough(); | ||
this.el.innerHTML = '<p>Some text</p><p><br/></p><p><br/></p><p>some text link text</p>'; | ||
var editor = this.newMediumEditor('.editor'), | ||
lastP = this.el.lastChild, | ||
anchorExtension = editor.getExtensionByName('anchor'), | ||
toolbar = editor.getExtensionByName('toolbar'); | ||
// Select the text 'link text' in the last paragraph | ||
MediumEditor.selection.select(document, lastP.firstChild, 'some text '.length, lastP.firstChild, 'some text link text'.length); | ||
fireEvent(editor.elements[0], 'focus'); | ||
jasmine.clock().tick(1); | ||
// Click the 'anchor' button in the toolbar | ||
fireEvent(toolbar.getToolbarElement().querySelector('[data-action="createLink"]'), 'click'); | ||
// Input a url and save | ||
var input = anchorExtension.getInput(); | ||
input.value = 'http://www.example.com'; | ||
fireEvent(input, 'keyup', { | ||
keyCode: Util.keyCode.ENTER | ||
}); | ||
expect(editor.createLink).toHaveBeenCalledWith({ | ||
url: 'http://www.example.com', | ||
target: '_self' | ||
}); | ||
// Make sure the <p> wasn't removed, and the <a> was added to the end | ||
expect(this.el.lastChild).toBe(lastP); | ||
expect(lastP.lastChild.nodeName.toLowerCase()).toBe('a'); | ||
// Make sure selection is only the link | ||
var range = window.getSelection().getRangeAt(0); | ||
if (range.startContainer === lastP.lastChild.firstChild) { | ||
expect(range.startOffset).toBe(0, 'The start of the selection is not at the front of the link'); | ||
} else { | ||
expect(range.startContainer).toBe(lastP.firstChild); | ||
expect(range.startOffset).toBe('some text '.length, 'The start of the selection is not at the front of the link'); | ||
} | ||
expect(MediumEditor.util.isDescendant(lastP.lastChild, range.endContainer, true)).toBe(true, 'The end of the selection is incorrect'); | ||
}); | ||
}); | ||
@@ -301,0 +349,0 @@ |
@@ -114,3 +114,3 @@ /*global describe, it, expect, Util, | ||
} else { | ||
expect(placeholder).toBe('\'' + expectedValue + '\''); | ||
expect(placeholder).toMatch(new RegExp('^[\'"]' + expectedValue + '[\'"]$')); | ||
} | ||
@@ -117,0 +117,0 @@ } |
@@ -905,3 +905,5 @@ /*global Util, Selection, Extension, | ||
if (currentSelection) { | ||
var exportedSelection, | ||
var currRange = currentSelection.getRangeAt(0), | ||
commonAncestorContainer = currRange.commonAncestorContainer, | ||
exportedSelection, | ||
startContainerParentElement, | ||
@@ -911,6 +913,24 @@ endContainerParentElement, | ||
startContainerParentElement = Util.getClosestBlockContainer(currentSelection.getRangeAt(0).startContainer); | ||
endContainerParentElement = Util.getClosestBlockContainer(currentSelection.getRangeAt(0).endContainer); | ||
// If the selection is contained within a single text node | ||
// and the selection starts at the beginning of the text node, | ||
// MSIE still says the startContainer is the parent of the text node. | ||
// If the selection is contained within a single text node, we | ||
// want to just use the default browser 'createLink', so we need | ||
// to account for this case and adjust the commonAncestorContainer accordingly | ||
if (currRange.endContainer.nodeType === 3 && | ||
currRange.startContainer.nodeType !== 3 && | ||
currRange.startOffset === 0 && | ||
currRange.startContainer.firstChild === currRange.endContainer) { | ||
commonAncestorContainer = currRange.endContainer; | ||
} | ||
if (startContainerParentElement === endContainerParentElement) { | ||
startContainerParentElement = Util.getClosestBlockContainer(currRange.startContainer); | ||
endContainerParentElement = Util.getClosestBlockContainer(currRange.endContainer); | ||
// If the selection is not contained within a single text node | ||
// but the selection is contained within the same block element | ||
// we want to make sure we create a single link, and not multiple links | ||
// which can happen with the built in browser functionality | ||
if (commonAncestorContainer.nodeType !== 3 && startContainerParentElement === endContainerParentElement) { | ||
var currentEditor = Selection.getSelectionElement(this.options.contentWindow), | ||
@@ -939,3 +959,2 @@ parentElement = (startContainerParentElement || currentEditor), | ||
// an invented <br /> tag at the end in the same situation | ||
Selection.select( | ||
@@ -973,4 +992,6 @@ this.options.ownerDocument, | ||
Util.createLink(this.options.ownerDocument, textNodes, opts.url.trim()); | ||
// Chrome trims the leading whitespaces when inserting HTML, which messes up restoring the selection. | ||
var leadingWhitespacesCount = (fragment.firstChild.innerHTML.match(/^\s+/) || [''])[0].length; | ||
// Now move the created link back into the original document in a way to preserve undo/redo history | ||
@@ -977,0 +998,0 @@ Util.insertHTMLCommand(this.options.ownerDocument, fragment.firstChild.innerHTML.replace(/^\s+/, '')); |
@@ -333,4 +333,4 @@ /*global NodeFilter, Selection*/ | ||
selection = doc.defaultView.getSelection(); | ||
if (selection.getRangeAt && selection.rangeCount) { | ||
selection = doc.getSelection(); | ||
if (selection.rangeCount) { | ||
range = selection.getRangeAt(0); | ||
@@ -340,3 +340,3 @@ toReplace = range.commonAncestorContainer; | ||
// By moving up the DOM and selecting ancestors whose only child is the range | ||
if ((toReplace.nodeType === 3 && toReplace.nodeValue === range.toString()) || | ||
if ((toReplace.nodeType === 3 && range.startOffset === 0 && range.endOffset === toReplace.nodeValue.length) || | ||
(toReplace.nodeType !== 3 && toReplace.innerHTML === range.toString())) { | ||
@@ -343,0 +343,0 @@ while (toReplace.parentNode && |
@@ -20,3 +20,3 @@ /*global MediumEditor */ | ||
// grunt-bump looks for this: | ||
'version': '5.5.3' | ||
'version': '5.5.4' | ||
}).version); |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1502928
18426
123