From 92a292d5fb043ef84d017cd3e9be83b79fde25a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?= Date: Thu, 18 Jan 2018 11:45:47 +0100 Subject: [PATCH 1/4] Focus the new editing host to workaround FF's errors. --- src/view/renderer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/view/renderer.js b/src/view/renderer.js index fe915e44c..10e7ef4f9 100644 --- a/src/view/renderer.js +++ b/src/view/renderer.js @@ -628,6 +628,10 @@ export default class Renderer { const anchor = this.domConverter.viewPositionToDom( this.selection.anchor ); const focus = this.domConverter.viewPositionToDom( this.selection.focus ); + // Focus the new editing host. + // Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721). + domRoot.focus(); + domSelection.collapse( anchor.parent, anchor.offset ); domSelection.extend( focus.parent, focus.offset ); } From c1b2e32482a819dc82affb2e23b15ecde2540d9c Mon Sep 17 00:00:00 2001 From: Maciej Bukowski Date: Tue, 13 Feb 2018 14:11:40 +0100 Subject: [PATCH 2/4] Added manual test for ckeditor5#721. --- tests/manual/tickets/721/1.html | 3 ++ tests/manual/tickets/721/1.js | 67 +++++++++++++++++++++++++++++++++ tests/manual/tickets/721/1.md | 11 ++++++ 3 files changed, 81 insertions(+) create mode 100644 tests/manual/tickets/721/1.html create mode 100644 tests/manual/tickets/721/1.js create mode 100644 tests/manual/tickets/721/1.md diff --git a/tests/manual/tickets/721/1.html b/tests/manual/tickets/721/1.html new file mode 100644 index 000000000..bf383218e --- /dev/null +++ b/tests/manual/tickets/721/1.html @@ -0,0 +1,3 @@ +
+

This is an editor instance.

+
diff --git a/tests/manual/tickets/721/1.js b/tests/manual/tickets/721/1.js new file mode 100644 index 000000000..8e3946c69 --- /dev/null +++ b/tests/manual/tickets/721/1.js @@ -0,0 +1,67 @@ +/** + * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md. + */ + +/* globals console, window, document */ + +import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor'; +import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials'; +import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph'; +import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold'; +import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils'; +import Widget from '@ckeditor/ckeditor5-widget/src/widget'; + +import AttributeContainer from '../../../../src/view/attributeelement'; +import ViewContainer from '../../../../src/view/containerelement'; +import { downcastElementToElement } from '../../../../src/conversion/downcast-converters'; +import { setData } from '../../../../src/dev-utils/model'; +import ViewEditable from '../../../../src/view/editableelement'; + +ClassicEditor + .create( document.querySelector( '#editor' ), { + plugins: [ Essentials, Paragraph, Bold, Widget ], + toolbar: [ 'undo', 'redo' ] + } ) + .then( editor => { + window.editor = editor; + + const model = editor.model; + + model.schema.register( 'widget', { + inheritAllFrom: '$block', + isObject: true + } ); + + model.schema.extend( '$text', { + allowIn: 'nested' + } ); + + model.schema.register( 'nested', { + allowIn: 'widget', + isLimit: true + } ); + + editor.conversion.for( 'downcast' ) + .add( downcastElementToElement( { + model: 'widget', + view: () => { + const b = new AttributeContainer( 'b' ); + const div = new ViewContainer( 'div', null, b ); + + return toWidget( div, { label: 'element label' } ); + } + } ) ) + .add( downcastElementToElement( { + model: 'nested', + view: () => new ViewEditable( 'figcaption', { contenteditable: true } ) + } ) ); + + setData( editor.model, + 'foo[]' + + 'bar' + ); + } ) + .catch( err => { + console.error( err.stack ); + } ); diff --git a/tests/manual/tickets/721/1.md b/tests/manual/tickets/721/1.md new file mode 100644 index 000000000..de8d353bf --- /dev/null +++ b/tests/manual/tickets/721/1.md @@ -0,0 +1,11 @@ +## Renderer should handle nested editables [FF] ckeditor5#721 + +1. Put the caret in the first paragraph and type something. +1. Put the caret inside the widget (where is `bar` already). +1. Click `Undo`. + +**Expected**: + +No error in the console. + + From 58b6dea1baa72c56a711986c5f553ca8ac61c1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?= Date: Tue, 13 Feb 2018 16:29:36 +0100 Subject: [PATCH 3/4] Extended the manual test. --- tests/manual/tickets/721/1.html | 6 ++++++ tests/manual/tickets/721/1.js | 3 ++- tests/manual/tickets/721/1.md | 9 +++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/manual/tickets/721/1.html b/tests/manual/tickets/721/1.html index bf383218e..f3a6d6e16 100644 --- a/tests/manual/tickets/721/1.html +++ b/tests/manual/tickets/721/1.html @@ -1,3 +1,9 @@ + +

This is an editor instance.

diff --git a/tests/manual/tickets/721/1.js b/tests/manual/tickets/721/1.js index 8e3946c69..1a5c1c7e7 100644 --- a/tests/manual/tickets/721/1.js +++ b/tests/manual/tickets/721/1.js @@ -59,7 +59,8 @@ ClassicEditor setData( editor.model, 'foo[]' + - 'bar' + 'bar' + + 'bom' ); } ) .catch( err => { diff --git a/tests/manual/tickets/721/1.md b/tests/manual/tickets/721/1.md index de8d353bf..00425e7c0 100644 --- a/tests/manual/tickets/721/1.md +++ b/tests/manual/tickets/721/1.md @@ -1,11 +1,16 @@ ## Renderer should handle nested editables [FF] ckeditor5#721 +### TC1 + 1. Put the caret in the first paragraph and type something. -1. Put the caret inside the widget (where is `bar` already). -1. Click `Undo`. +1. Put the caret inside the widget (in "bar"). +1. Click "Undo" or press Ctrl+Z (check both). **Expected**: No error in the console. +### TC2 + +Try the same TC as above but use both nested editables. See if the focus is correctly moved between them. From 3b2737e4475b805a49af0919e2f16e9ef04f8a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?= Date: Tue, 13 Feb 2018 16:35:49 +0100 Subject: [PATCH 4/4] Moved tests to a directory which indicates that this is ckeditor5#721. --- tests/manual/tickets/{721 => ckeditor5-721}/1.html | 0 tests/manual/tickets/{721 => ckeditor5-721}/1.js | 0 tests/manual/tickets/{721 => ckeditor5-721}/1.md | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename tests/manual/tickets/{721 => ckeditor5-721}/1.html (100%) rename tests/manual/tickets/{721 => ckeditor5-721}/1.js (100%) rename tests/manual/tickets/{721 => ckeditor5-721}/1.md (100%) diff --git a/tests/manual/tickets/721/1.html b/tests/manual/tickets/ckeditor5-721/1.html similarity index 100% rename from tests/manual/tickets/721/1.html rename to tests/manual/tickets/ckeditor5-721/1.html diff --git a/tests/manual/tickets/721/1.js b/tests/manual/tickets/ckeditor5-721/1.js similarity index 100% rename from tests/manual/tickets/721/1.js rename to tests/manual/tickets/ckeditor5-721/1.js diff --git a/tests/manual/tickets/721/1.md b/tests/manual/tickets/ckeditor5-721/1.md similarity index 100% rename from tests/manual/tickets/721/1.md rename to tests/manual/tickets/ckeditor5-721/1.md