Skip to content

Commit

Permalink
Add a test for creating relative links
Browse files Browse the repository at this point in the history
  • Loading branch information
lqez committed Aug 21, 2018
1 parent 44f2dd8 commit 375921b
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 19 deletions.
8 changes: 3 additions & 5 deletions src/js/base/module/Editor.js
Expand Up @@ -185,7 +185,6 @@ export default class Editor {
let linkUrl = linkInfo.url;
const linkText = linkInfo.text;
const isNewWindow = linkInfo.isNewWindow;
const isRelativeUrl = linkInfo.isRelativeUrl;
let rng = linkInfo.range || this.createRange();
const isTextChanged = rng.toString() !== linkText;

Expand All @@ -197,8 +196,9 @@ export default class Editor {
if (this.options.onCreateLink) {
linkUrl = this.options.onCreateLink(linkUrl);
} else {
// if url doesn't match an URL schema, set http:// as default
if (!isRelativeUrl) {
// if url is not relative,
if (!/^\.?\/(.*)/.test(linkUrl)) {
// if url doesn't match an URL schema, set http:// as default
linkUrl = /^[A-Za-z][A-Za-z0-9+-.]*\:[\/\/]?/.test(linkUrl)
? linkUrl : 'http://' + linkUrl;
}
Expand Down Expand Up @@ -733,8 +733,6 @@ export default class Editor {
if ($anchor.length) {
// Set isNewWindow by checking its target.
linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
// And also whether the link is relative or not.
linkInfo.isRelativeUrl = !/^[A-Za-z][A-Za-z0-9+-.]*\:[\/\/]?/.test($anchor.attr('href'));
}

return linkInfo;
Expand Down
16 changes: 2 additions & 14 deletions src/js/base/module/LinkDialog.js
Expand Up @@ -33,12 +33,7 @@ export default class LinkDialog {
text: this.lang.link.openInNewWindow,
checked: true
}).render()).html()
: '',
$('<div/>').append(this.ui.checkbox({
id: 'sn-checkbox-is-relative-url',
text: this.lang.link.isRelativeUrl,
checked: false
}).render()).html()
: ''
].join('');

const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';
Expand Down Expand Up @@ -86,7 +81,6 @@ export default class LinkDialog {
const $linkUrl = this.$dialog.find('.note-link-url');
const $linkBtn = this.$dialog.find('.note-link-btn');
const $openInNewWindow = this.$dialog.find('#sn-checkbox-open-in-new-window');
const $isRelativeUrl = this.$dialog.find('#sn-checkbox-is-relative-url');

this.ui.onDialogShown(this.$dialog, () => {
this.context.triggerEvent('dialog.shown');
Expand Down Expand Up @@ -135,20 +129,14 @@ export default class LinkDialog {

$openInNewWindow.prop('checked', isNewWindowChecked);

const isRelativeUrl = linkInfo.isRelativeUrl !== undefined
? linkInfo.isRelativeUrl : this.context.options.linkRelativeUrl;

$isRelativeUrl.prop('checked', isRelativeUrl);

$linkBtn.one('click', (event) => {
event.preventDefault();

deferred.resolve({
range: linkInfo.range,
url: $linkUrl.val(),
text: $linkText.val(),
isNewWindow: $openInNewWindow.is(':checked'),
isRelativeUrl: $isRelativeUrl.is(':checked')
isNewWindow: $openInNewWindow.is(':checked')
});
this.ui.hideDialog(this.$dialog);
});
Expand Down
20 changes: 20 additions & 0 deletions test/unit/base/module/Editor.spec.js
Expand Up @@ -371,6 +371,26 @@ describe('Editor', () => {
expectContents(context, '<p><a href="http://summernote.org" target="_blank">summernote</a></p>');
});

it('should create a relative link without scheme', () => {
var text = 'hello';
var editable = context.layoutInfo.editable;
var pNode = editable.find('p')[0];
var textNode = pNode.childNodes[0];
var startIndex = textNode.wholeText.indexOf(text);
var endIndex = startIndex + text.length;

var rng = range.create(textNode, startIndex, textNode, endIndex);

editor.createLink({
url: '/relative/url',
text: 'summernote',
range: rng,
isNewWindow: true
});

expectContents(context, '<p><a href="/relative/url" target="_blank">summernote</a></p>');
});

it('should modify a link', () => {
context.invoke('code', '<p><a href="http://summernote.org">hello world</a></p>');

Expand Down
56 changes: 56 additions & 0 deletions test/unit/base/module/LinkDialog.spec.js
@@ -0,0 +1,56 @@
/**
* LinkDialog.spec.js
* (c) 2015~ Summernote Team
* summernote may be freely distributed under the MIT license./
*/
import chai from 'chai';
import $ from 'jquery';
import range from '../../../../src/js/base/core/range';
import Context from '../../../../src/js/base/Context';
import LinkDialog from '../../../../src/js/base/module/LinkDialog';

var expect = chai.expect;

describe('bs:module.LinkDialog', () => {
var context, dialog, $editable;

beforeEach(() => {
var options = $.extend({}, $.summernote.options);
options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);
options.toolbar = [
['insert', ['link']]
];
context = new Context(
$('<div>' +
'<p><a href="https://summernote.org/" target="_blank">hello</a></p>' +
'<p><a href="https://summernote.org/">world</a></p>' +
'</div>'),
options
);
context.initialize();

dialog = new LinkDialog(context);
dialog.initialize();

$editable = context.layoutInfo.editable;
$editable.appendTo('body');
});

describe('LinkDialog', () => {
it('should check new window when target=_blank', () => {
range.createFromNode($editable.find('a')[0]).normalize().select();
dialog.show();

var checked = dialog.$dialog.find('#sn-checkbox-open-in-new-window').is(':checked');
expect(checked).to.be.true;
});

it('should uncheck new window without target=_blank', () => {
range.createFromNode($editable.find('a')[1]).normalize().select();
dialog.show();

var checked = dialog.$dialog.find('#sn-checkbox-open-in-new-window').is(':checked');
expect(checked).to.be.false;
});
});
});

0 comments on commit 375921b

Please sign in to comment.