Browse Source

Merge branch 'master' into t/ckeditor5-engine/1210

Szymon Kupś 7 years ago
parent
commit
36eff40ebe
52 changed files with 172 additions and 132 deletions
  1. 1 1
      packages/ckeditor5-link/.eslintrc.js
  2. 1 1
      packages/ckeditor5-link/LICENSE.md
  3. 1 1
      packages/ckeditor5-link/lang/translations/ast.po
  4. 1 1
      packages/ckeditor5-link/lang/translations/da.po
  5. 1 1
      packages/ckeditor5-link/lang/translations/de.po
  6. 1 1
      packages/ckeditor5-link/lang/translations/el.po
  7. 1 1
      packages/ckeditor5-link/lang/translations/en-au.po
  8. 1 1
      packages/ckeditor5-link/lang/translations/en.po
  9. 1 1
      packages/ckeditor5-link/lang/translations/eo.po
  10. 1 1
      packages/ckeditor5-link/lang/translations/es.po
  11. 1 1
      packages/ckeditor5-link/lang/translations/fi.po
  12. 1 1
      packages/ckeditor5-link/lang/translations/fr.po
  13. 1 1
      packages/ckeditor5-link/lang/translations/gl.po
  14. 1 1
      packages/ckeditor5-link/lang/translations/hr.po
  15. 1 1
      packages/ckeditor5-link/lang/translations/hu.po
  16. 1 1
      packages/ckeditor5-link/lang/translations/it.po
  17. 1 1
      packages/ckeditor5-link/lang/translations/ja.po
  18. 1 1
      packages/ckeditor5-link/lang/translations/km.po
  19. 1 1
      packages/ckeditor5-link/lang/translations/kn.po
  20. 1 1
      packages/ckeditor5-link/lang/translations/ko.po
  21. 1 1
      packages/ckeditor5-link/lang/translations/ku.po
  22. 1 1
      packages/ckeditor5-link/lang/translations/nb.po
  23. 1 1
      packages/ckeditor5-link/lang/translations/pl.po
  24. 1 1
      packages/ckeditor5-link/lang/translations/pt-br.po
  25. 1 1
      packages/ckeditor5-link/lang/translations/pt.po
  26. 1 1
      packages/ckeditor5-link/lang/translations/ro.po
  27. 1 1
      packages/ckeditor5-link/lang/translations/sk.po
  28. 1 1
      packages/ckeditor5-link/lang/translations/sv.po
  29. 1 1
      packages/ckeditor5-link/lang/translations/tr.po
  30. 1 1
      packages/ckeditor5-link/lang/translations/uk.po
  31. 1 1
      packages/ckeditor5-link/lang/translations/zh-cn.po
  32. 1 1
      packages/ckeditor5-link/lang/translations/zh.po
  33. 2 2
      packages/ckeditor5-link/package.json
  34. 1 1
      packages/ckeditor5-link/src/findlinkrange.js
  35. 10 10
      packages/ckeditor5-link/src/link.js
  36. 3 3
      packages/ckeditor5-link/src/linkcommand.js
  37. 0 20
      packages/ckeditor5-link/src/linkelement.js
  38. 4 11
      packages/ckeditor5-link/src/linkengine.js
  39. 1 1
      packages/ckeditor5-link/src/ui/linkformview.js
  40. 1 1
      packages/ckeditor5-link/src/unlinkcommand.js
  41. 38 0
      packages/ckeditor5-link/src/utils.js
  42. 1 1
      packages/ckeditor5-link/tests/findlinkrange.js
  43. 13 13
      packages/ckeditor5-link/tests/link.js
  44. 9 11
      packages/ckeditor5-link/tests/linkcommand.js
  45. 0 13
      packages/ckeditor5-link/tests/linkelement.js
  46. 5 4
      packages/ckeditor5-link/tests/linkengine.js
  47. 1 1
      packages/ckeditor5-link/tests/manual/link.js
  48. 1 1
      packages/ckeditor5-link/tests/manual/tickets/113/1.js
  49. 1 1
      packages/ckeditor5-link/tests/ui/linkformview.js
  50. 5 5
      packages/ckeditor5-link/tests/unlinkcommand.js
  51. 43 0
      packages/ckeditor5-link/tests/utils.js
  52. 1 1
      packages/ckeditor5-link/theme/linkform.css

+ 1 - 1
packages/ckeditor5-link/.eslintrc.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-link/LICENSE.md

@@ -2,7 +2,7 @@ Software License Agreement
 ==========================
 
 **Link feature for CKEditor 5.** – https://github.com/ckeditor/ckeditor5-link <br>
-Copyright (c) 2003-2017, [CKSource](http://cksource.com) Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2018, [CKSource](http://cksource.com) Frederico Knabben. All rights reserved.
 
 Licensed under the terms of any of the following licenses at your choice:
 

+ 1 - 1
packages/ckeditor5-link/lang/translations/ast.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: ast\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/da.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: da\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/de.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: de\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/el.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: el\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/en-au.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: en_AU\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/en.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: \n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/eo.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: eo\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/es.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: es\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/fi.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: fi\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/fr.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: fr\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/gl.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: gl\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/hr.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: hr\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/hu.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: hu\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/it.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: it\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/ja.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: ja\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/km.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: km\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/kn.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: kn\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/ko.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: ko\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/ku.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: ku\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/nb.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: nb\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/pl.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: pl\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/pt-br.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: pt_BR\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/pt.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: pt\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/ro.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: ro\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/sk.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: sk\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/sv.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: sv\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/tr.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: tr\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/uk.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: uk\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/zh-cn.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: zh_CN\n"

+ 1 - 1
packages/ckeditor5-link/lang/translations/zh.po

@@ -1,4 +1,4 @@
-# Copyright (c) Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+# Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
 msgid ""
 msgstr ""
 "Language: zh_TW\n"

+ 2 - 2
packages/ckeditor5-link/package.json

@@ -20,10 +20,10 @@
     "@ckeditor/ckeditor5-typing": "^1.0.0-alpha.2",
     "@ckeditor/ckeditor5-undo": "^1.0.0-alpha.2",
     "@ckeditor/ckeditor5-utils": "^1.0.0-alpha.2",
-    "eslint": "^4.8.0",
+    "eslint": "^4.15.0",
     "eslint-config-ckeditor5": "^1.0.7",
     "husky": "^0.14.3",
-    "lint-staged": "^4.2.3"
+    "lint-staged": "^6.0.0"
   },
   "engines": {
     "node": ">=6.0.0",

+ 1 - 1
packages/ckeditor5-link/src/findlinkrange.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 10 - 10
packages/ckeditor5-link/src/link.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -11,7 +11,7 @@ import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import ClickObserver from '@ckeditor/ckeditor5-engine/src/view/observer/clickobserver';
 import Range from '@ckeditor/ckeditor5-engine/src/view/range';
 import LinkEngine from './linkengine';
-import LinkElement from './linkelement';
+import { isLinkElement } from './utils';
 import ContextualBalloon from '@ckeditor/ckeditor5-ui/src/panel/balloon/contextualballoon';
 
 import clickOutsideHandler from '@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler';
@@ -323,15 +323,15 @@ export default class Link extends Plugin {
 	}
 
 	/**
-	 * Returns the {@link module:link/linkelement~LinkElement} under
+	 * Returns the link {@link module:engine/view/attributeelement~AttributeElement} under
 	 * the {@link module:engine/view/document~Document editing view's} selection or `null`
 	 * if there is none.
 	 *
-	 * **Note**: For a non–collapsed selection the `LinkElement` is only returned when **fully**
+	 * **Note**: For a non–collapsed selection the link element is only returned when **fully**
 	 * selected and the **only** element within the selection boundaries.
 	 *
 	 * @private
-	 * @returns {module:link/linkelement~LinkElement|null}
+	 * @returns {module:engine/view/attributeelement~AttributeElement|null}
 	 */
 	_getSelectedLinkElement() {
 		const selection = this.editor.editing.view.selection;
@@ -340,7 +340,7 @@ export default class Link extends Plugin {
 			return findLinkElementAncestor( selection.getFirstPosition() );
 		} else {
 			// The range for fully selected link is usually anchored in adjacent text nodes.
-			// Trim it to get closer to the actual LinkElement.
+			// Trim it to get closer to the actual link element.
 			const range = selection.getFirstRange().getTrimmed();
 			const startLink = findLinkElementAncestor( range.start );
 			const endLink = findLinkElementAncestor( range.end );
@@ -349,7 +349,7 @@ export default class Link extends Plugin {
 				return null;
 			}
 
-			// Check if the LinkElement is fully selected.
+			// Check if the link element is fully selected.
 			if ( Range.createIn( startLink ).getTrimmed().isEqual( range ) ) {
 				return startLink;
 			} else {
@@ -359,11 +359,11 @@ export default class Link extends Plugin {
 	}
 }
 
-// Returns a `LinkElement` if there's one among the ancestors of the provided `Position`.
+// Returns a link element if there's one among the ancestors of the provided `Position`.
 //
 // @private
 // @param {module:engine/view/position~Position} View position to analyze.
-// @returns {module:link/linkelement~LinkElement|null} LinkElement at the position or null.
+// @returns {module:engine/view/attributeelement~AttributeElement|null} Link element at the position or null.
 function findLinkElementAncestor( position ) {
-	return position.getAncestors().find( ancestor => ancestor instanceof LinkElement );
+	return position.getAncestors().find( ancestor => isLinkElement( ancestor ) );
 }

+ 3 - 3
packages/ckeditor5-link/src/linkcommand.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -70,7 +70,7 @@ export default class LinkCommand extends Command {
 					writer.setAttribute( 'linkHref', href, linkRange );
 
 					// Create new range wrapping changed link.
-					selection.setRanges( [ linkRange ] );
+					writer.setSelection( linkRange );
 				}
 				// If not then insert text node with `linkHref` attribute in place of caret.
 				else {
@@ -83,7 +83,7 @@ export default class LinkCommand extends Command {
 					writer.insert( node, position );
 
 					// Create new range wrapping created node.
-					selection.setRanges( [ Range.createOn( node ) ] );
+					writer.setSelection( Range.createOn( node ) );
 				}
 			} else {
 				// If selection has non-collapsed ranges, we change attribute on nodes inside those ranges

+ 0 - 20
packages/ckeditor5-link/src/linkelement.js

@@ -1,20 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module link/linkelement
- */
-
-import AttributeElement from '@ckeditor/ckeditor5-engine/src/view/attributeelement';
-
-/**
- * This class is to mark a specific {@link module:engine/view/node~Node} as a {@link module:link/linkelement~LinkElement}.
- * For example, there could be a situation when different features will create nodes with the same names,
- * and hence they must be identified somehow.
- *
- * @extends module:engine/view/attributelement~AttributeElement
- */
-export default class LinkElement extends AttributeElement {
-}

+ 4 - 11
packages/ckeditor5-link/src/linkengine.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -10,9 +10,9 @@
 import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import buildModelConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildmodelconverter';
 import buildViewConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildviewconverter';
-import LinkElement from './linkelement';
 import LinkCommand from './linkcommand';
 import UnlinkCommand from './unlinkcommand';
+import { createLinkElement } from './utils';
 
 /**
  * The link engine feature.
@@ -36,19 +36,12 @@ export default class LinkEngine extends Plugin {
 		// Build converter from model to view for data and editing pipelines.
 		buildModelConverter().for( data.modelToView, editing.modelToView )
 			.fromAttribute( 'linkHref' )
-			.toElement( linkHref => {
-				const linkElement = new LinkElement( 'a', { href: linkHref } );
-
-				// https://github.com/ckeditor/ckeditor5-link/issues/121
-				linkElement.priority = 5;
-
-				return linkElement;
-			} );
+			.toElement( linkHref => createLinkElement( linkHref ) );
 
 		// Build converter from view to model for data pipeline.
 		buildViewConverter().for( data.viewToModel )
 			// Convert <a> with href (value doesn't matter).
-			.from( { name: 'a', attribute: { href: /.?/ } } )
+			.from( { name: 'a', attribute: { href: true } } )
 			.toAttribute( viewElement => ( {
 				key: 'linkHref',
 				value: viewElement.getAttribute( 'href' )

+ 1 - 1
packages/ckeditor5-link/src/ui/linkformview.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-link/src/unlinkcommand.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 38 - 0
packages/ckeditor5-link/src/utils.js

@@ -0,0 +1,38 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/**
+ * @module link/utils
+ */
+
+import AttributeElement from '@ckeditor/ckeditor5-engine/src/view/attributeelement';
+
+const linkElementSymbol = Symbol( 'linkElement' );
+
+/**
+ * Returns `true` if a given view node is the link element.
+ *
+ * @param {module:engine/view/node~Node} node
+ * @return {Boolean}
+ */
+export function isLinkElement( node ) {
+	return node.is( 'attributeElement' ) && !!node.getCustomProperty( linkElementSymbol );
+}
+
+/**
+ * Creates link {@link module:engine/view/attributeelement~AttributeElement} with provided `href` attribute.
+ *
+ * @param {String} href
+ * @return {module:engine/view/attributeelement~AttributeElement}
+ */
+export function createLinkElement( href ) {
+	const linkElement = new AttributeElement( 'a', { href } );
+	linkElement.setCustomProperty( linkElementSymbol, true );
+
+	// https://github.com/ckeditor/ckeditor5-link/issues/121
+	linkElement.priority = 5;
+
+	return linkElement;
+}

+ 1 - 1
packages/ckeditor5-link/tests/findlinkrange.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 13 - 13
packages/ckeditor5-link/tests/link.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -259,7 +259,7 @@ describe( 'Link', () => {
 				const text = root.getChild( 0 ).getChild( 0 ).getChild( 0 );
 
 				// Move selection to foo[].
-				viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 3, text, 3 ) ], true );
+				viewDocument.selection.setTo( Range.createFromParentsAndOffsets( text, 3, text, 3 ), true );
 				viewDocument.render();
 
 				sinon.assert.calledOnce( spy );
@@ -281,7 +281,7 @@ describe( 'Link', () => {
 				const root = viewDocument.getRoot();
 				const text = root.getChild( 0 ).getChild( 0 );
 
-				viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 3, text, 3 ) ], true );
+				viewDocument.selection.setTo( Range.createFromParentsAndOffsets( text, 3, text, 3 ), true );
 				viewDocument.render();
 
 				sinon.assert.calledOnce( spy );
@@ -305,7 +305,7 @@ describe( 'Link', () => {
 				const text = root.getChild( 0 ).getChild( 1 );
 
 				// Move selection to b[]ar.
-				viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 1 ) ], true );
+				viewDocument.selection.setTo( Range.createFromParentsAndOffsets( text, 1, text, 1 ), true );
 				viewDocument.render();
 
 				sinon.assert.calledOnce( spyHide );
@@ -330,7 +330,7 @@ describe( 'Link', () => {
 				const text = root.getChild( 0 ).getChild( 2 ).getChild( 0 );
 
 				// Move selection to b[]az.
-				viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 1 ) ], true );
+				viewDocument.selection.setTo( Range.createFromParentsAndOffsets( text, 1, text, 1 ), true );
 				viewDocument.render();
 
 				sinon.assert.calledOnce( spyHide );
@@ -352,7 +352,7 @@ describe( 'Link', () => {
 				const text = root.getChild( 0 ).getChild( 0 ).getChild( 0 );
 
 				// Move selection to f[o]o.
-				viewDocument.selection.setRanges( [ Range.createFromParentsAndOffsets( text, 1, text, 2 ) ], true );
+				viewDocument.selection.setTo( Range.createFromParentsAndOffsets( text, 1, text, 2 ), true );
 				viewDocument.render();
 
 				sinon.assert.calledOnce( spyHide );
@@ -606,14 +606,14 @@ describe( 'Link', () => {
 				sinon.assert.calledWithExactly( spy );
 			} );
 
-			it( 'should open when selection exclusively encloses a LinkElement (#1)', () => {
+			it( 'should open when selection exclusively encloses a link element (#1)', () => {
 				setModelData( editor.model, '[<$text linkHref="url">foo</$text>]' );
 
 				observer.fire( 'click', { target: {} } );
 				sinon.assert.calledWithExactly( spy );
 			} );
 
-			it( 'should open when selection exclusively encloses a LinkElement (#2)', () => {
+			it( 'should open when selection exclusively encloses a link element (#2)', () => {
 				setModelData( editor.model, '<$text linkHref="url">[foo]</$text>' );
 
 				observer.fire( 'click', { target: {} } );
@@ -627,35 +627,35 @@ describe( 'Link', () => {
 				sinon.assert.notCalled( spy );
 			} );
 
-			it( 'should not open when selection is non-collapsed and doesn\'t enclose a LinkElement (#1)', () => {
+			it( 'should not open when selection is non-collapsed and doesn\'t enclose a link element (#1)', () => {
 				setModelData( editor.model, '<$text linkHref="url">f[o]o</$text>' );
 
 				observer.fire( 'click', { target: {} } );
 				sinon.assert.notCalled( spy );
 			} );
 
-			it( 'should not open when selection is non-collapsed and doesn\'t enclose a LinkElement (#2)', () => {
+			it( 'should not open when selection is non-collapsed and doesn\'t enclose a link element (#2)', () => {
 				setModelData( editor.model, '<$text linkHref="url">[fo]o</$text>' );
 
 				observer.fire( 'click', { target: {} } );
 				sinon.assert.notCalled( spy );
 			} );
 
-			it( 'should not open when selection is non-collapsed and doesn\'t enclose a LinkElement (#3)', () => {
+			it( 'should not open when selection is non-collapsed and doesn\'t enclose a link element (#3)', () => {
 				setModelData( editor.model, '<$text linkHref="url">f[oo]</$text>' );
 
 				observer.fire( 'click', { target: {} } );
 				sinon.assert.notCalled( spy );
 			} );
 
-			it( 'should not open when selection is non-collapsed and doesn\'t enclose a LinkElement (#4)', () => {
+			it( 'should not open when selection is non-collapsed and doesn\'t enclose a link element (#4)', () => {
 				setModelData( editor.model, 'ba[r<$text linkHref="url">foo]</$text>' );
 
 				observer.fire( 'click', { target: {} } );
 				sinon.assert.notCalled( spy );
 			} );
 
-			it( 'should not open when selection is non-collapsed and doesn\'t enclose a LinkElement (#5)', () => {
+			it( 'should not open when selection is non-collapsed and doesn\'t enclose a link element (#5)', () => {
 				setModelData( editor.model, 'ba[r<$text linkHref="url">foo</$text>]' );
 
 				observer.fire( 'click', { target: {} } );

+ 9 - 11
packages/ckeditor5-link/tests/linkcommand.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -37,12 +37,11 @@ describe( 'LinkCommand', () => {
 		beforeEach( () => {
 			model.schema.register( 'x', { inheritAllFrom: '$block' } );
 
-			model.schema.on( 'checkAttribute', ( evt, args ) => {
-				if ( args[ 0 ].endsWith( 'x $text' ) && args[ 1 ] == 'linkHref' ) {
-					evt.stop();
-					evt.return = false;
+			model.schema.addAttributeCheck( ( ctx, attributeName ) => {
+				if ( ctx.endsWith( 'x $text' ) && attributeName == 'linkHref' ) {
+					return false;
 				}
-			}, { priority: 'high' } );
+			} );
 		} );
 
 		describe( 'when selection is collapsed', () => {
@@ -238,12 +237,11 @@ describe( 'LinkCommand', () => {
 			} );
 
 			it( 'should not insert text with `linkHref` attribute when is not allowed in parent', () => {
-				model.schema.on( 'checkAttribute', ( evt, args ) => {
-					if ( args[ 0 ].endsWith( 'p $text' ) && args[ 1 ] == 'linkHref' ) {
-						evt.stop();
-						evt.return = false;
+				model.schema.addAttributeCheck( ( ctx, attributeName ) => {
+					if ( ctx.endsWith( 'p $text' ) && attributeName == 'linkHref' ) {
+						return false;
 					}
-				}, { priority: 'high' } );
+				} );
 
 				setData( model, '<p>foo[]bar</p>' );
 

+ 0 - 13
packages/ckeditor5-link/tests/linkelement.js

@@ -1,13 +0,0 @@
-/**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-import LinkElement from '../src/linkelement';
-import AttributeElement from '@ckeditor/ckeditor5-engine/src/view/attributeelement';
-
-describe( 'LinkElement', () => {
-	it( 'should extend AttributeElement', () => {
-		expect( new LinkElement( 'a' ) ).to.instanceof( AttributeElement );
-	} );
-} );

+ 5 - 4
packages/ckeditor5-link/tests/linkengine.js

@@ -1,17 +1,17 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 import LinkEngine from '../src/linkengine';
 import LinkCommand from '../src/linkcommand';
-import LinkElement from '../src/linkelement';
 import UnlinkCommand from '../src/unlinkcommand';
 
 import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
 import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
 import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
+import { isLinkElement } from '../src/utils';
 
 import buildModelConverter from '@ckeditor/ckeditor5-engine/src/conversion/buildmodelconverter';
 
@@ -99,10 +99,11 @@ describe( 'LinkEngine', () => {
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) ).to.equal( '<p><a href="url">foo</a>bar</p>' );
 		} );
 
-		it( 'should convert to `LinkElement` instance', () => {
+		it( 'should convert to link element instance', () => {
 			setModelData( model, '<paragraph><$text linkHref="url">foo</$text>bar</paragraph>' );
 
-			expect( editor.editing.view.getRoot().getChild( 0 ).getChild( 0 ) ).to.be.instanceof( LinkElement );
+			const element = editor.editing.view.getRoot().getChild( 0 ).getChild( 0 );
+			expect( isLinkElement( element ) ).to.be.true;
 		} );
 
 		// https://github.com/ckeditor/ckeditor5-link/issues/121

+ 1 - 1
packages/ckeditor5-link/tests/manual/link.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-link/tests/manual/tickets/113/1.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-link/tests/ui/linkformview.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 5 - 5
packages/ckeditor5-link/tests/unlinkcommand.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -36,16 +36,16 @@ describe( 'UnlinkCommand', () => {
 
 	describe( 'isEnabled', () => {
 		it( 'should be true when selection has `linkHref` attribute', () => {
-			model.change( () => {
-				document.selection.setAttribute( 'linkHref', 'value' );
+			model.change( writer => {
+				writer.setSelectionAttribute( 'linkHref', 'value' );
 			} );
 
 			expect( command.isEnabled ).to.true;
 		} );
 
 		it( 'should be false when selection doesn\'t have `linkHref` attribute', () => {
-			model.change( () => {
-				document.selection.removeAttribute( 'linkHref' );
+			model.change( writer => {
+				writer.removeSelectionAttribute( 'linkHref' );
 			} );
 
 			expect( command.isEnabled ).to.false;

+ 43 - 0
packages/ckeditor5-link/tests/utils.js

@@ -0,0 +1,43 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+import AttributeElement from '@ckeditor/ckeditor5-engine/src/view/attributeelement';
+import ContainerElement from '@ckeditor/ckeditor5-engine/src/view/containerelement';
+import Text from '@ckeditor/ckeditor5-engine/src/view/text';
+
+import { createLinkElement, isLinkElement } from '../src/utils';
+
+describe( 'utils', () => {
+	describe( 'isLinkElement', () => {
+		it( 'should return true for elements created by createLinkElement', () => {
+			const element = createLinkElement( 'http://ckeditor.com' );
+
+			expect( isLinkElement( element ) ).to.be.true;
+		} );
+
+		it( 'should return false for other AttributeElements', () => {
+			expect( isLinkElement( new AttributeElement( 'a' ) ) ).to.be.false;
+		} );
+
+		it( 'should return false for ContainerElements', () => {
+			expect( isLinkElement( new ContainerElement( 'p' ) ) ).to.be.false;
+		} );
+
+		it( 'should return false for text nodes', () => {
+			expect( isLinkElement( new Text( 'foo' ) ) ).to.be.false;
+		} );
+	} );
+
+	describe( 'createLinkElement', () => {
+		it( 'should create link AttributeElement', () => {
+			const element = createLinkElement( 'http://cksource.com' );
+
+			expect( isLinkElement( element ) ).to.be.true;
+			expect( element.priority ).to.equal( 5 );
+			expect( element.getAttribute( 'href' ) ).to.equal( 'http://cksource.com' );
+			expect( element.name ).to.equal( 'a' );
+		} );
+	} );
+} );

+ 1 - 1
packages/ckeditor5-link/theme/linkform.css

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */