{"action":"created","comment":{"url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/comments/85291152","pull_request_review_id":6014421,"id":85291152,"diff_hunk":"@@ -0,0 +1,606 @@\n+/**\n+ * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.\n+ * For licensing, see LICENSE.md.\n+ */\n+\n+/* bender-tags: model */\n+\n+import Document from '/ckeditor5/engine/model/document.js';\n+import DataController from '/ckeditor5/engine/datacontroller.js';\n+import insertContent from '/ckeditor5/engine/datacontroller/insertcontent.js';\n+\n+import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';\n+import ModelDocumentFragment from '/ckeditor5/engine/model/documentfragment.js';\n+import Text from '/ckeditor5/engine/model/text.js';\n+\n+import { setData, getData, parse } from '/ckeditor5/engine/dev-utils/model.js';\n+\n+describe( 'DataController', () => {\n+\tlet doc, dataController;\n+\n+\tdescribe( 'insertContent', () => {\n+\t\tdescribe( 'in simple scenarios', () => {\n+\t\t\tbeforeEach( () => {\n+\t\t\t\tdoc = new Document();\n+\t\t\t\tdoc.createRoot();\n+\n+\t\t\t\tdataController = new DataController( doc );\n+\n+\t\t\t\tconst schema = doc.schema;\n+\n+\t\t\t\tschema.registerItem( 'image', '$inline' );\n+\t\t\t\tschema.registerItem( 'disallowedElement' );\n+\n+\t\t\t\tschema.allow( { name: '$text', inside: '$root' } );\n+\t\t\t\tschema.allow( { name: 'image', inside: '$root' } );\n+\t\t\t\t// Otherwise it won't be passed to the temporary model fragment used inside insertContent().\n+\t\t\t\tschema.allow( { name: 'disallowedElement', inside: '$clipboardHolder' } );\n+\n+\t\t\t\tschema.objects.add( 'image' );\n+\t\t\t} );\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts one text node',\n+\t\t\t\t'xyz',\n+\t\t\t\t'f[]oo',\n+\t\t\t\t'fxyz[]oo'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts one text node (at the end)',\n+\t\t\t\t'xyz',\n+\t\t\t\t'foo[]',\n+\t\t\t\t'fooxyz[]'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts an element',\n+\t\t\t\t'<image></image>',\n+\t\t\t\t'f[]oo',\n+\t\t\t\t'f<image></image>[]oo'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts a text and an element',\n+\t\t\t\t'xyz<image></image>',\n+\t\t\t\t'f[]oo',\n+\t\t\t\t'fxyz<image></image>[]oo'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'strips a disallowed element',\n+\t\t\t\t'<disallowedElement>xyz</disallowedElement>',\n+\t\t\t\t'f[]oo',\n+\t\t\t\t'fxyz[]oo'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'deletes selection before inserting the content',\n+\t\t\t\t'x',\n+\t\t\t\t'f[abc]oo',\n+\t\t\t\t'fx[]oo'\n+\t\t\t);\n+\n+\t\t\tdescribe( 'spaces handling', () => {\n+\t\t\t\t// Note: spaces in the view are not encoded like in the DOM, so subsequent spaces must be\n+\t\t\t\t// inserted into the model as is. The conversion to nbsps happen on view<=>DOM conversion.\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one space',\n+\t\t\t\t\tnew Text( ' ' ),\n+\t\t\t\t\t'f[]oo',\n+\t\t\t\t\t'f []oo'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts three spaces',\n+\t\t\t\t\tnew Text( '   ' ),\n+\t\t\t\t\t'f[]oo',\n+\t\t\t\t\t'f   []oo'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts spaces at the end',\n+\t\t\t\t\tnew Text( '   ' ),\n+\t\t\t\t\t'foo[]',\n+\t\t\t\t\t'foo   []'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one nbsp',\n+\t\t\t\t\tnew Text( '\\u200a' ),\n+\t\t\t\t\t'f[]oo',\n+\t\t\t\t\t'f\\u200a[]oo'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts word surrounded by spaces',\n+\t\t\t\t\tnew Text( ' xyz  ' ),\n+\t\t\t\t\t'f[]oo',\n+\t\t\t\t\t'f xyz  []oo'\n+\t\t\t\t);\n+\t\t\t} );\n+\t\t} );\n+\n+\t\tdescribe( 'in blocks', () => {\n+\t\t\tbeforeEach( () => {\n+\t\t\t\tdoc = new Document();\n+\t\t\t\tdoc.createRoot();\n+\n+\t\t\t\tdataController = new DataController( doc );\n+\n+\t\t\t\tconst schema = doc.schema;\n+\n+\t\t\t\tschema.registerItem( 'paragraph', '$block' );\n+\t\t\t\tschema.registerItem( 'heading1', '$block' );\n+\t\t\t\tschema.registerItem( 'heading2', '$block' );\n+\t\t\t\tschema.registerItem( 'blockWidget' );\n+\t\t\t\tschema.registerItem( 'inlineWidget' );\n+\t\t\t\tschema.registerItem( 'listItem', '$block' );\n+\n+\t\t\t\tschema.allow( { name: 'blockWidget', inside: '$root' } );\n+\t\t\t\tschema.allow( { name: 'inlineWidget', inside: '$block' } );\n+\t\t\t\tschema.allow( { name: 'inlineWidget', inside: '$clipboardHolder' } );\n+\t\t\t\tschema.allow( {\n+\t\t\t\t\tname: 'listItem',\n+\t\t\t\t\tinside: '$root',\n+\t\t\t\t\tattributes: [ 'type', 'indent' ]\n+\t\t\t\t} );\n+\t\t\t\tschema.requireAttributes( 'listItem', [ 'type', 'indent' ] );\n+\n+\t\t\t\tschema.objects.add( 'blockWidget' );\n+\t\t\t\tschema.objects.add( 'inlineWidget' );\n+\t\t\t} );\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts one text node',\n+\t\t\t\t'xyz',\n+\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t'<paragraph>fxyz[]oo</paragraph>'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts one text node to fully selected paragraph',\n+\t\t\t\t'xyz',\n+\t\t\t\t'<paragraph>[foo]</paragraph>',\n+\t\t\t\t'<paragraph>xyz[]</paragraph>'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts one text node to fully selected paragraphs (from outside)',\n+\t\t\t\t'xyz',\n+\t\t\t\t'[<paragraph>foo</paragraph><paragraph>bar</paragraph>]',\n+\t\t\t\t'<paragraph>xyz[]</paragraph>'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'merges two blocks before inserting content (p+p)',\n+\t\t\t\t'xyz',\n+\t\t\t\t'<paragraph>fo[o</paragraph><paragraph>b]ar</paragraph>',\n+\t\t\t\t'<paragraph>foxyz[]ar</paragraph>'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'inserts inline widget and text',\n+\t\t\t\t'xyz<inlineWidget></inlineWidget>',\n+\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t'<paragraph>fxyz<inlineWidget></inlineWidget>[]oo</paragraph>'\n+\t\t\t);\n+\n+\t\t\t// Note: In CKEditor 4 the blocks are not merged, but to KISS we're merging here\n+\t\t\t// because that's what deleteContent() does.\n+\t\t\ttest(\n+\t\t\t\t'merges two blocks before inserting content (h+p)',\n+\t\t\t\t'xyz',\n+\t\t\t\t'<heading1>fo[o</heading1><paragraph>b]ar</paragraph>',\n+\t\t\t\t'<heading1>foxyz[]ar</heading1>'\n+\t\t\t);\n+\n+\t\t\tdescribe( 'block to block handling', () => {\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one paragraph',\n+\t\t\t\t\t'<paragraph>xyz</paragraph>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxyz[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one paragraph (at the end)',\n+\t\t\t\t\t'<paragraph>xyz</paragraph>',\n+\t\t\t\t\t'<paragraph>foo[]</paragraph>',\n+\t\t\t\t\t'<paragraph>fooxyz[]</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one paragraph into an empty paragraph',\n+\t\t\t\t\t'<paragraph>xyz</paragraph>',\n+\t\t\t\t\t'<paragraph>[]</paragraph>',\n+\t\t\t\t\t'<paragraph>xyz[]</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one block into a fully selected content',\n+\t\t\t\t\t'<heading2>xyz</heading2>',\n+\t\t\t\t\t'<heading1>[foo</heading1><paragraph>bar]</paragraph>',\n+\t\t\t\t\t'<heading2>xyz[]</heading2>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one heading',\n+\t\t\t\t\t'<heading1>xyz</heading1>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxyz[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts two headings',\n+\t\t\t\t\t'<heading1>xxx</heading1><heading1>yyy</heading1>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxxx</paragraph><heading1>yyy[]oo</heading1>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one object',\n+\t\t\t\t\t'<blockWidget></blockWidget>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>f</paragraph>[<blockWidget></blockWidget>]<paragraph>oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one object (at the end)',\n+\t\t\t\t\t'<blockWidget></blockWidget>',\n+\t\t\t\t\t'<paragraph>foo[]</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one object (at the beginning)',\n+\t\t\t\t\t'<blockWidget></blockWidget>',\n+\t\t\t\t\t'<paragraph>[]bar</paragraph>',\n+\t\t\t\t\t'[<blockWidget></blockWidget>]<paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts one list item',\n+\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">xyz</listItem>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxyz[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts list item to empty element',\n+\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">xyz</listItem>',\n+\t\t\t\t\t'<paragraph>[]</paragraph>',\n+\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">xyz[]</listItem>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts three list items at the end of paragraph',\n+\t\t\t\t\t(\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">xxx</listItem>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">yyy</listItem>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">zzz</listItem>'\n+\t\t\t\t\t),\n+\t\t\t\t\t'<paragraph>foo[]</paragraph>',\n+\t\t\t\t\t(\n+\t\t\t\t\t\t'<paragraph>fooxxx</paragraph>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">yyy</listItem>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">zzz[]</listItem>'\n+\t\t\t\t\t)\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts two list items to an empty paragraph',\n+\t\t\t\t\t(\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">xxx</listItem>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">yyy</listItem>'\n+\t\t\t\t\t),\n+\t\t\t\t\t'<paragraph>a</paragraph><paragraph>[]</paragraph><paragraph>b</paragraph>',\n+\t\t\t\t\t(\n+\t\t\t\t\t\t'<paragraph>a</paragraph>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">xxx</listItem>' +\n+\t\t\t\t\t\t'<listItem indent=\"0\" type=\"bulleted\">yyy[]</listItem>' +\n+\t\t\t\t\t\t'<paragraph>b</paragraph>'\n+\t\t\t\t\t)\n+\t\t\t\t);\n+\t\t\t} );\n+\n+\t\t\tdescribe( 'mixed content to block', () => {\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + paragraph',\n+\t\t\t\t\t'xxx<paragraph>yyy</paragraph>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxxx</paragraph><paragraph>yyy[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + inlineWidget + text + paragraph',\n+\t\t\t\t\t'xxx<inlineWidget></inlineWidget>yyy<paragraph>zzz</paragraph>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxxx<inlineWidget></inlineWidget>yyy</paragraph><paragraph>zzz[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + paragraph (at the beginning)',\n+\t\t\t\t\t'xxx<paragraph>yyy</paragraph>',\n+\t\t\t\t\t'<paragraph>[]foo</paragraph>',\n+\t\t\t\t\t'<paragraph>xxx</paragraph><paragraph>yyy[]foo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + paragraph (at the end)',\n+\t\t\t\t\t'xxx<paragraph>yyy</paragraph>',\n+\t\t\t\t\t'<paragraph>foo[]</paragraph>',\n+\t\t\t\t\t'<paragraph>fooxxx</paragraph><paragraph>yyy[]</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph + text',\n+\t\t\t\t\t'<paragraph>yyy</paragraph>xxx',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fyyy</paragraph><paragraph>xxx[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\t// This is the expected result, but it was so hard to achieve at this stage that I\n+\t\t\t\t// decided to go with the what the next test represents.\n+\t\t\t\t// test(\n+\t\t\t\t// \t'inserts paragraph + text + inlineWidget + text',\n+\t\t\t\t// \t'<paragraph>yyy</paragraph>xxx<inlineWidget></inlineWidget>zzz',\n+\t\t\t\t// \t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t// \t'<paragraph>fyyy</paragraph><paragraph>xxx<inlineWidget></inlineWidget>zzz[]oo</paragraph>'\n+\t\t\t\t// );\n+\n+\t\t\t\t// See the comment above.\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph + text + inlineWidget + text',\n+\t\t\t\t\t'<paragraph>yyy</paragraph>xxx<inlineWidget></inlineWidget>zzz',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t(\n+\t\t\t\t\t\t'<paragraph>fyyy</paragraph><paragraph>xxx</paragraph>' +\n+\t\t\t\t\t\t'<paragraph><inlineWidget></inlineWidget></paragraph>' +\n+\t\t\t\t\t\t'<paragraph>zzz[]oo</paragraph>'\n+\t\t\t\t\t)\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph + text + paragraph',\n+\t\t\t\t\t'<paragraph>yyy</paragraph>xxx<paragraph>zzz</paragraph>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fyyy</paragraph><paragraph>xxx</paragraph><paragraph>zzz[]oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph + text (at the beginning)',\n+\t\t\t\t\t'<paragraph>yyy</paragraph>xxx',\n+\t\t\t\t\t'<paragraph>[]foo</paragraph>',\n+\t\t\t\t\t'<paragraph>yyy</paragraph><paragraph>xxx[]foo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph + text (at the end)',\n+\t\t\t\t\t'<paragraph>yyy</paragraph>xxx',\n+\t\t\t\t\t'<paragraph>foo[]</paragraph>',\n+\t\t\t\t\t'<paragraph>fooyyy</paragraph><paragraph>xxx[]</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + heading',\n+\t\t\t\t\t'xxx<heading1>yyy</heading1>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxxx</paragraph><heading1>yyy[]oo</heading1>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph + object',\n+\t\t\t\t\t'<paragraph>xxx</paragraph><blockWidget></blockWidget>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>fxxx</paragraph>[<blockWidget></blockWidget>]<paragraph>oo</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts object + paragraph',\n+\t\t\t\t\t'<blockWidget></blockWidget><paragraph>xxx</paragraph>',\n+\t\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t\t'<paragraph>f</paragraph><blockWidget></blockWidget><paragraph>xxx[]oo</paragraph>'\n+\t\t\t\t);\n+\t\t\t} );\n+\n+\t\t\tdescribe( 'content over a block object', () => {\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text',\n+\t\t\t\t\t'xxx',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph><paragraph>xxx[]</paragraph><paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph',\n+\t\t\t\t\t'<paragraph>xxx</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph><paragraph>xxx[]</paragraph><paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + paragraph',\n+\t\t\t\t\t'yyy<paragraph>xxx</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph><paragraph>yyy</paragraph><paragraph>xxx[]</paragraph><paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts two blocks',\n+\t\t\t\t\t'<heading1>xxx</heading1><paragraph>yyy</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph><heading1>xxx</heading1><paragraph>yyy[]</paragraph><paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts block object',\n+\t\t\t\t\t'<blockWidget></blockWidget>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>' // It's enough, don't worry.\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts inline object',\n+\t\t\t\t\t'<inlineWidget></inlineWidget>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph><paragraph><inlineWidget></inlineWidget>[]</paragraph><paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\t\t\t} );\n+\n+\t\t\tdescribe( 'content over an inline object', () => {\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text',\n+\t\t\t\t\t'xxx',\n+\t\t\t\t\t'<paragraph>foo[<inlineWidget></inlineWidget>]bar</paragraph>',\n+\t\t\t\t\t'<paragraph>fooxxx[]bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts paragraph',\n+\t\t\t\t\t'<paragraph>xxx</paragraph>',\n+\t\t\t\t\t'<paragraph>foo[<inlineWidget></inlineWidget>]bar</paragraph>',\n+\t\t\t\t\t'<paragraph>fooxxx[]bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts text + paragraph',\n+\t\t\t\t\t'yyy<paragraph>xxx</paragraph>',\n+\t\t\t\t\t'<paragraph>foo[<inlineWidget></inlineWidget>]bar</paragraph>',\n+\t\t\t\t\t'<paragraph>fooyyy</paragraph><paragraph>xxx[]bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts two blocks',\n+\t\t\t\t\t'<heading1>xxx</heading1><paragraph>yyy</paragraph>',\n+\t\t\t\t\t'<paragraph>foo[<inlineWidget></inlineWidget>]bar</paragraph>',\n+\t\t\t\t\t'<paragraph>fooxxx</paragraph><paragraph>yyy[]bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts inline object',\n+\t\t\t\t\t'<inlineWidget></inlineWidget>',\n+\t\t\t\t\t'<paragraph>foo[<inlineWidget></inlineWidget>]bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo<inlineWidget></inlineWidget>[]bar</paragraph>'\n+\t\t\t\t);\n+\n+\t\t\t\ttest(\n+\t\t\t\t\t'inserts block object',\n+\t\t\t\t\t'<blockWidget></blockWidget>',\n+\t\t\t\t\t'<paragraph>foo[<inlineWidget></inlineWidget>]bar</paragraph>',\n+\t\t\t\t\t'<paragraph>foo</paragraph>[<blockWidget></blockWidget>]<paragraph>bar</paragraph>'\n+\t\t\t\t);\n+\t\t\t} );\n+\t\t} );\n+\n+\t\tdescribe( 'filtering out', () => {\n+\t\t\tbeforeEach( () => {\n+\t\t\t\tdoc = new Document();\n+\t\t\t\tdoc.createRoot();\n+\n+\t\t\t\tdataController = new DataController( doc );\n+\n+\t\t\t\tconst schema = doc.schema;\n+\n+\t\t\t\tschema.registerItem( 'paragraph', '$block' );\n+\n+\t\t\t\t// Let's use table as an example of content which needs to be filtered out.\n+\t\t\t\tschema.registerItem( 'table' );\n+\t\t\t\tschema.registerItem( 'td' );\n+\t\t\t\tschema.registerItem( 'disallowedWidget' );\n+\n+\t\t\t\tschema.allow( { name: 'table', inside: '$clipboardHolder' } );\n+\t\t\t\tschema.allow( { name: 'td', inside: '$clipboardHolder' } );\n+\t\t\t\tschema.allow( { name: '$block', inside: 'td' } );\n+\t\t\t\tschema.allow( { name: '$text', inside: 'td' } );\n+\n+\t\t\t\tschema.allow( { name: 'disallowedWidget', inside: '$clipboardHolder' } );\n+\t\t\t\tschema.allow( { name: '$text', inside: 'disallowedWidget' } );\n+\t\t\t\tschema.objects.add( 'disallowedWidget' );\n+\t\t\t} );\n+\n+\t\t\ttest(\n+\t\t\t\t'filters out disallowed elements and leaves out the text',\n+\t\t\t\t'<table><td>xxx</td><td>yyy</td></table>',\n+\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t'<paragraph>fxxxyyy[]oo</paragraph>'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'filters out disallowed elements and leaves out the paragraphs',\n+\t\t\t\t'<table><td><paragraph>xxx</paragraph><paragraph>yyy</paragraph><paragraph>zzz</paragraph></td></table>',\n+\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t'<paragraph>fxxx</paragraph><paragraph>yyy</paragraph><paragraph>zzz[]oo</paragraph>'\n+\t\t\t);\n+\n+\t\t\ttest(\n+\t\t\t\t'filters out disallowed objects',\n+\t\t\t\t'<disallowedWidget>xxx</disallowedWidget>',\n+\t\t\t\t'<paragraph>f[]oo</paragraph>',\n+\t\t\t\t'<paragraph>f[]oo</paragraph>'\n+\t\t\t);","path":"tests/datacontroller/insertcontent.js","position":542,"original_position":542,"commit_id":"bae5e90989656867c30043e4ff7d11551d2ed409","original_commit_id":"bae5e90989656867c30043e4ff7d11551d2ed409","user":{"login":"pjasiun","id":1166967,"avatar_url":"https://avatars.githubusercontent.com/u/1166967?v=3","gravatar_id":"","url":"https://api.github.com/users/pjasiun","html_url":"https://github.com/pjasiun","followers_url":"https://api.github.com/users/pjasiun/followers","following_url":"https://api.github.com/users/pjasiun/following{/other_user}","gists_url":"https://api.github.com/users/pjasiun/gists{/gist_id}","starred_url":"https://api.github.com/users/pjasiun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pjasiun/subscriptions","organizations_url":"https://api.github.com/users/pjasiun/orgs","repos_url":"https://api.github.com/users/pjasiun/repos","events_url":"https://api.github.com/users/pjasiun/events{/privacy}","received_events_url":"https://api.github.com/users/pjasiun/received_events","type":"User","site_admin":false},"body":"You know that \"helpers better then magic\" is true also in tests? Such tests are very hard  to maintain. You already had to create a `options.beforeCallback` method which is not very readable. In fact, these tests are not readable at all. And I think that it's worth to make code even longer if it is more readable thanks to it, but in this case, code is even shorter:\r\n\r\n```js\r\nit( 'filters out disallowed objects', () => {\r\n\tsetData( doc, '<disallowedWidget>xxx</disallowedWidget>' );\r\n\tinsertHelper( '<paragraph>f[]oo</paragraph>' );\r\n\texpect( getData( doc ) ).to.equal( '<paragraph>f[]oo</paragraph>' );\r\n} );\r\n\r\nfunction insertHelper( content ) {\r\n\t\tif ( typeof content == 'string' ) {\r\n\t\t\tcontent = parse( content, doc.schema, {\r\n\t\t\t\tcontext: [ '$clipboardHolder' ]\r\n\t\t\t} );\r\n\t\t}\r\n\r\n\t\tif ( !( content instanceof ModelDocumentFragment ) ) {\r\n\t\t\tcontent = new ModelDocumentFragment( [ content ] );\r\n\t\t}\r\n\r\n\t\t// Override the convertion so we get exactly the model that we defined in the content param.\r\n\t\t// This way we avoid the need to write converters for everything we want to test.\r\n\t\tdataController.viewToModel.convert = () => {\r\n\t\t\treturn content;\r\n\t\t};\r\n\r\n\t\tinsertContent( dataController, doc.batch(), doc.selection, new ViewDocumentFragment() );\r\n}\r\n```","created_at":"2016-10-27T08:42:01Z","updated_at":"2016-10-27T08:42:01Z","html_url":"https://github.com/ckeditor/ckeditor5-engine/pull/656#discussion_r85291152","pull_request_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656","_links":{"self":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/comments/85291152"},"html":{"href":"https://github.com/ckeditor/ckeditor5-engine/pull/656#discussion_r85291152"},"pull_request":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656"}}},"pull_request":{"url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656","id":91036638,"html_url":"https://github.com/ckeditor/ckeditor5-engine/pull/656","diff_url":"https://github.com/ckeditor/ckeditor5-engine/pull/656.diff","patch_url":"https://github.com/ckeditor/ckeditor5-engine/pull/656.patch","issue_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/656","number":656,"state":"open","locked":false,"title":"Introduces DataController.insertContent","user":{"login":"Reinmar","id":156149,"avatar_url":"https://avatars.githubusercontent.com/u/156149?v=3","gravatar_id":"","url":"https://api.github.com/users/Reinmar","html_url":"https://github.com/Reinmar","followers_url":"https://api.github.com/users/Reinmar/followers","following_url":"https://api.github.com/users/Reinmar/following{/other_user}","gists_url":"https://api.github.com/users/Reinmar/gists{/gist_id}","starred_url":"https://api.github.com/users/Reinmar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Reinmar/subscriptions","organizations_url":"https://api.github.com/users/Reinmar/orgs","repos_url":"https://api.github.com/users/Reinmar/repos","events_url":"https://api.github.com/users/Reinmar/events{/privacy}","received_events_url":"https://api.github.com/users/Reinmar/received_events","type":"User","site_admin":false},"body":"Fixed #648. Covers big part of #652.\r\n\r\nWhat can I say? Not the prettiest code in the world – written in 2.5 days (including tests). Certainly, we'll have to work on this more, but it's ok for now. While working on the tests I decided to cover also big part of #652. We'll see with time whether I missed something important\r\n\r\nYou can test this code on https://github.com/ckeditor/ckeditor5-clipboard/tree/t/1.","created_at":"2016-10-26T16:07:09Z","updated_at":"2016-10-27T08:42:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4446841d5ad2560e2d5d8d86d1fb6d4ac52ae55e","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656/commits","review_comments_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656/comments","review_comment_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/656/comments","statuses_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/statuses/bae5e90989656867c30043e4ff7d11551d2ed409","head":{"label":"ckeditor:t/648","ref":"t/648","sha":"bae5e90989656867c30043e4ff7d11551d2ed409","user":{"login":"ckeditor","id":825710,"avatar_url":"https://avatars.githubusercontent.com/u/825710?v=3","gravatar_id":"","url":"https://api.github.com/users/ckeditor","html_url":"https://github.com/ckeditor","followers_url":"https://api.github.com/users/ckeditor/followers","following_url":"https://api.github.com/users/ckeditor/following{/other_user}","gists_url":"https://api.github.com/users/ckeditor/gists{/gist_id}","starred_url":"https://api.github.com/users/ckeditor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ckeditor/subscriptions","organizations_url":"https://api.github.com/users/ckeditor/orgs","repos_url":"https://api.github.com/users/ckeditor/repos","events_url":"https://api.github.com/users/ckeditor/events{/privacy}","received_events_url":"https://api.github.com/users/ckeditor/received_events","type":"Organization","site_admin":false},"repo":{"id":28972890,"name":"ckeditor5-engine","full_name":"ckeditor/ckeditor5-engine","owner":{"login":"ckeditor","id":825710,"avatar_url":"https://avatars.githubusercontent.com/u/825710?v=3","gravatar_id":"","url":"https://api.github.com/users/ckeditor","html_url":"https://github.com/ckeditor","followers_url":"https://api.github.com/users/ckeditor/followers","following_url":"https://api.github.com/users/ckeditor/following{/other_user}","gists_url":"https://api.github.com/users/ckeditor/gists{/gist_id}","starred_url":"https://api.github.com/users/ckeditor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ckeditor/subscriptions","organizations_url":"https://api.github.com/users/ckeditor/orgs","repos_url":"https://api.github.com/users/ckeditor/repos","events_url":"https://api.github.com/users/ckeditor/events{/privacy}","received_events_url":"https://api.github.com/users/ckeditor/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ckeditor/ckeditor5-engine","description":"CKEditor 5 Editing Engine.","fork":false,"url":"https://api.github.com/repos/ckeditor/ckeditor5-engine","forks_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/forks","keys_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/teams","hooks_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/hooks","issue_events_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/events{/number}","events_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/events","assignees_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/assignees{/user}","branches_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/branches{/branch}","tags_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/tags","blobs_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/refs{/sha}","trees_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/statuses/{sha}","languages_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/languages","stargazers_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/stargazers","contributors_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/contributors","subscribers_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/subscribers","subscription_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/subscription","commits_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/commits{/sha}","git_commits_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/commits{/sha}","comments_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/comments{/number}","issue_comment_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/comments{/number}","contents_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/contents/{+path}","compare_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/merges","archive_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/downloads","issues_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues{/number}","pulls_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls{/number}","milestones_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/milestones{/number}","notifications_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/labels{/name}","releases_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/releases{/id}","deployments_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/deployments","created_at":"2015-01-08T15:47:45Z","updated_at":"2016-09-09T06:22:50Z","pushed_at":"2016-10-27T08:08:49Z","git_url":"git://github.com/ckeditor/ckeditor5-engine.git","ssh_url":"git@github.com:ckeditor/ckeditor5-engine.git","clone_url":"https://github.com/ckeditor/ckeditor5-engine.git","svn_url":"https://github.com/ckeditor/ckeditor5-engine","homepage":"https://ckeditor5.github.io","size":4146,"stargazers_count":27,"watchers_count":27,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":106,"forks":14,"open_issues":106,"watchers":27,"default_branch":"master"}},"base":{"label":"ckeditor:master","ref":"master","sha":"98e3d4fb230c8bcf6d66fc816fe8704cf6263f2a","user":{"login":"ckeditor","id":825710,"avatar_url":"https://avatars.githubusercontent.com/u/825710?v=3","gravatar_id":"","url":"https://api.github.com/users/ckeditor","html_url":"https://github.com/ckeditor","followers_url":"https://api.github.com/users/ckeditor/followers","following_url":"https://api.github.com/users/ckeditor/following{/other_user}","gists_url":"https://api.github.com/users/ckeditor/gists{/gist_id}","starred_url":"https://api.github.com/users/ckeditor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ckeditor/subscriptions","organizations_url":"https://api.github.com/users/ckeditor/orgs","repos_url":"https://api.github.com/users/ckeditor/repos","events_url":"https://api.github.com/users/ckeditor/events{/privacy}","received_events_url":"https://api.github.com/users/ckeditor/received_events","type":"Organization","site_admin":false},"repo":{"id":28972890,"name":"ckeditor5-engine","full_name":"ckeditor/ckeditor5-engine","owner":{"login":"ckeditor","id":825710,"avatar_url":"https://avatars.githubusercontent.com/u/825710?v=3","gravatar_id":"","url":"https://api.github.com/users/ckeditor","html_url":"https://github.com/ckeditor","followers_url":"https://api.github.com/users/ckeditor/followers","following_url":"https://api.github.com/users/ckeditor/following{/other_user}","gists_url":"https://api.github.com/users/ckeditor/gists{/gist_id}","starred_url":"https://api.github.com/users/ckeditor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ckeditor/subscriptions","organizations_url":"https://api.github.com/users/ckeditor/orgs","repos_url":"https://api.github.com/users/ckeditor/repos","events_url":"https://api.github.com/users/ckeditor/events{/privacy}","received_events_url":"https://api.github.com/users/ckeditor/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ckeditor/ckeditor5-engine","description":"CKEditor 5 Editing Engine.","fork":false,"url":"https://api.github.com/repos/ckeditor/ckeditor5-engine","forks_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/forks","keys_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/teams","hooks_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/hooks","issue_events_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/events{/number}","events_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/events","assignees_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/assignees{/user}","branches_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/branches{/branch}","tags_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/tags","blobs_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/refs{/sha}","trees_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/statuses/{sha}","languages_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/languages","stargazers_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/stargazers","contributors_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/contributors","subscribers_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/subscribers","subscription_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/subscription","commits_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/commits{/sha}","git_commits_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/git/commits{/sha}","comments_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/comments{/number}","issue_comment_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/comments{/number}","contents_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/contents/{+path}","compare_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/merges","archive_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/downloads","issues_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues{/number}","pulls_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls{/number}","milestones_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/milestones{/number}","notifications_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/labels{/name}","releases_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/releases{/id}","deployments_url":"https://api.github.com/repos/ckeditor/ckeditor5-engine/deployments","created_at":"2015-01-08T15:47:45Z","updated_at":"2016-09-09T06:22:50Z","pushed_at":"2016-10-27T08:08:49Z","git_url":"git://github.com/ckeditor/ckeditor5-engine.git","ssh_url":"git@github.com:ckeditor/ckeditor5-engine.git","clone_url":"https://github.com/ckeditor/ckeditor5-engine.git","svn_url":"https://github.com/ckeditor/ckeditor5-engine","homepage":"https://ckeditor5.github.io","size":4146,"stargazers_count":27,"watchers_count":27,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":106,"forks":14,"open_issues":106,"watchers":27,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656"},"html":{"href":"https://github.com/ckeditor/ckeditor5-engine/pull/656"},"issue":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/656"},"comments":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/issues/656/comments"},"review_comments":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656/comments"},"review_comment":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/pulls/656/commits"},"statuses":{"href":"https://api.github.com/repos/ckeditor/ckeditor5-engine/statuses/bae5e90989656867c30043e4ff7d11551d2ed409"}}}}
{"actor":{"display_login":"pjasiun"}}