Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit fa6be12

Browse files
committed
Merge branch 'master' into t/ckeditor5/488
2 parents 40b1e20 + c897101 commit fa6be12

File tree

5 files changed

+101
-82
lines changed

5 files changed

+101
-82
lines changed

src/highlightstack.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ export default class HighlightStack {
3434
*
3535
* @fires change:top
3636
* @param {module:engine/conversion/downcast-converters~HighlightDescriptor} descriptor
37+
* @param {module:engine/view/writer~Writer} writer
3738
*/
38-
add( descriptor ) {
39+
add( descriptor, writer ) {
3940
const stack = this._stack;
4041

4142
// Save top descriptor and insert new one. If top is changed - fire event.
@@ -47,7 +48,8 @@ export default class HighlightStack {
4748
if ( oldTop !== newTop && !compareDescriptors( oldTop, newTop ) ) {
4849
this.fire( 'change:top', {
4950
oldDescriptor: oldTop,
50-
newDescriptor: newTop
51+
newDescriptor: newTop,
52+
writer
5153
} );
5254
}
5355
}
@@ -57,8 +59,9 @@ export default class HighlightStack {
5759
*
5860
* @fires change:top
5961
* @param {String} id Id of the descriptor to remove.
62+
* @param {module:engine/view/writer~Writer} writer
6063
*/
61-
remove( id ) {
64+
remove( id, writer ) {
6265
const stack = this._stack;
6366

6467
const oldTop = stack[ 0 ];
@@ -69,7 +72,8 @@ export default class HighlightStack {
6972
if ( oldTop !== newTop && !compareDescriptors( oldTop, newTop ) ) {
7073
this.fire( 'change:top', {
7174
oldDescriptor: oldTop,
72-
newDescriptor: newTop
75+
newDescriptor: newTop,
76+
writer
7377
} );
7478
}
7579
}
@@ -168,4 +172,5 @@ function classesToString( classes ) {
168172
* descriptor. It will be `undefined` when last descriptor is removed from the stack.
169173
* @param {module:engine/conversion/downcast-converters~HighlightDescriptor} [data.oldDescriptor] Old highlight
170174
* descriptor. It will be `undefined` when first descriptor is added to the stack.
175+
* @param {module:engine/view/writer~Writer} writer View writer that can be used to modify element.
171176
*/

src/utils.js

+24-20
Original file line numberDiff line numberDiff line change
@@ -45,25 +45,27 @@ export function isWidget( element ) {
4545
* * implements `addHighlight` and `removeHighlight` custom properties to handle view highlight on widgets.
4646
*
4747
* @param {module:engine/view/element~Element} element
48+
* @param {module:engine/view/writer~Writer} writer
4849
* @param {Object} [options={}]
4950
* @param {String|Function} [options.label] Element's label provided to {@link ~setLabel} function. It can be passed as
5051
* a plain string or a function returning a string.
5152
* @returns {module:engine/view/element~Element} Returns same element.
5253
*/
53-
export function toWidget( element, options = {} ) {
54-
element.setAttribute( 'contenteditable', 'false' );
54+
export function toWidget( element, writer, options = {} ) {
55+
writer.setAttribute( 'contenteditable', 'false', element );
56+
writer.addClass( WIDGET_CLASS_NAME, element );
57+
writer.setCustomProperty( widgetSymbol, true, element );
5558
element.getFillerOffset = getFillerOffset;
56-
element.addClass( WIDGET_CLASS_NAME );
57-
element.setCustomProperty( widgetSymbol, true );
5859

5960
if ( options.label ) {
60-
setLabel( element, options.label );
61+
setLabel( element, options.label, writer );
6162
}
6263

6364
setHighlightHandling(
6465
element,
65-
( element, descriptor ) => element.addClass( ...normalizeToArray( descriptor.class ) ),
66-
( element, descriptor ) => element.removeClass( ...normalizeToArray( descriptor.class ) )
66+
writer,
67+
( element, descriptor, writer ) => writer.addClass( normalizeToArray( descriptor.class ), element ),
68+
( element, descriptor, writer ) => writer.removeClass( normalizeToArray( descriptor.class ), element )
6769
);
6870

6971
return element;
@@ -79,24 +81,25 @@ export function toWidget( element, options = {} ) {
7981
* properly determine which highlight descriptor should be used at given time.
8082
*
8183
* @param {module:engine/view/element~Element} element
84+
* @param {module:engine/view/writer~Writer} writer
8285
* @param {Function} add
8386
* @param {Function} remove
8487
*/
85-
export function setHighlightHandling( element, add, remove ) {
88+
export function setHighlightHandling( element, writer, add, remove ) {
8689
const stack = new HighlightStack();
8790

8891
stack.on( 'change:top', ( evt, data ) => {
8992
if ( data.oldDescriptor ) {
90-
remove( element, data.oldDescriptor );
93+
remove( element, data.oldDescriptor, data.writer );
9194
}
9295

9396
if ( data.newDescriptor ) {
94-
add( element, data.newDescriptor );
97+
add( element, data.newDescriptor, data.writer );
9598
}
9699
} );
97100

98-
element.setCustomProperty( 'addHighlight', ( element, descriptor ) => stack.add( descriptor ) );
99-
element.setCustomProperty( 'removeHighlight', ( element, id ) => stack.remove( id ) );
101+
writer.setCustomProperty( 'addHighlight', ( element, descriptor, writer ) => stack.add( descriptor, writer ), element );
102+
writer.setCustomProperty( 'removeHighlight', ( element, id, writer ) => stack.remove( id, writer ), element );
100103
}
101104

102105
/**
@@ -106,9 +109,10 @@ export function setHighlightHandling( element, add, remove ) {
106109
*
107110
* @param {module:engine/view/element~Element} element
108111
* @param {String|Function} labelOrCreator
112+
* * @param {module:engine/view/writer~Writer} writer
109113
*/
110-
export function setLabel( element, labelOrCreator ) {
111-
element.setCustomProperty( labelSymbol, labelOrCreator );
114+
export function setLabel( element, labelOrCreator, writer ) {
115+
writer.setCustomProperty( labelSymbol, labelOrCreator, element );
112116
}
113117

114118
/**
@@ -137,22 +141,22 @@ export function getLabel( element ) {
137141
* @param {module:engine/view/editableelement~EditableElement} editable
138142
* @returns {module:engine/view/editableelement~EditableElement} Returns same element that was provided in `editable` param.
139143
*/
140-
export function toWidgetEditable( editable ) {
141-
editable.addClass( 'ck-editable' );
144+
export function toWidgetEditable( editable, writer ) {
145+
writer.addClass( 'ck-editable', editable );
142146

143147
// Set initial contenteditable value.
144-
editable.setAttribute( 'contenteditable', editable.isReadOnly ? 'false' : 'true' );
148+
writer.setAttribute( 'contenteditable', editable.isReadOnly ? 'false' : 'true', editable );
145149

146150
// Bind contenteditable property to element#isReadOnly.
147151
editable.on( 'change:isReadOnly', ( evt, property, is ) => {
148-
editable.setAttribute( 'contenteditable', is ? 'false' : 'true' );
152+
writer.setAttribute( 'contenteditable', is ? 'false' : 'true', editable );
149153
} );
150154

151155
editable.on( 'change:isFocused', ( evt, property, is ) => {
152156
if ( is ) {
153-
editable.addClass( 'ck-editable_focused' );
157+
writer.addClass( 'ck-editable_focused', editable );
154158
} else {
155-
editable.removeClass( 'ck-editable_focused' );
159+
writer.removeClass( 'ck-editable_focused', editable );
156160
}
157161
} );
158162

src/widget.js

+18-12
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ export default class Widget extends Plugin {
4242
* @inheritDoc
4343
*/
4444
init() {
45-
const viewDocument = this.editor.editing.view;
45+
const view = this.editor.editing.view;
46+
const viewDocument = view.document;
4647

4748
/**
4849
* Holds previously selected widgets.
@@ -54,32 +55,33 @@ export default class Widget extends Plugin {
5455

5556
// Model to view selection converter.
5657
// Converts selection placed over widget element to fake selection
57-
this.editor.editing.downcastDispatcher.on( 'selection', ( evt, data, consumable, conversionApi ) => {
58+
this.editor.editing.downcastDispatcher.on( 'selection', ( evt, data, conversionApi ) => {
5859
// Remove selected class from previously selected widgets.
59-
this._clearPreviouslySelectedWidgets();
60+
this._clearPreviouslySelectedWidgets( conversionApi.writer );
6061

61-
const viewSelection = conversionApi.viewSelection;
62+
const viewWriter = conversionApi.writer;
63+
const viewSelection = viewWriter.document.selection;
6264
const selectedElement = viewSelection.getSelectedElement();
6365

6466
for ( const range of viewSelection.getRanges() ) {
6567
for ( const value of range ) {
6668
const node = value.item;
6769

6870
if ( node.is( 'element' ) && isWidget( node ) ) {
69-
node.addClass( WIDGET_SELECTED_CLASS_NAME );
71+
viewWriter.addClass( WIDGET_SELECTED_CLASS_NAME, node );
7072
this._previouslySelected.add( node );
7173

7274
// Check if widget is a single element selected.
7375
if ( node == selectedElement ) {
74-
viewSelection.setFake( true, { label: getLabel( selectedElement ) } );
76+
viewWriter.setFakeSelection( true, { label: getLabel( selectedElement ) } );
7577
}
7678
}
7779
}
7880
}
7981
}, { priority: 'low' } );
8082

8183
// If mouse down is pressed on widget - create selection over whole widget.
82-
viewDocument.addObserver( MouseObserver );
84+
view.addObserver( MouseObserver );
8385
this.listenTo( viewDocument, 'mousedown', ( ...args ) => this._onMousedown( ...args ) );
8486

8587
// Handle custom keydown behaviour.
@@ -103,7 +105,8 @@ export default class Widget extends Plugin {
103105
*/
104106
_onMousedown( eventInfo, domEventData ) {
105107
const editor = this.editor;
106-
const viewDocument = editor.editing.view;
108+
const view = editor.editing.view;
109+
const viewDocument = view.document;
107110
let element = domEventData.target;
108111

109112
// Do nothing if inside nested editable.
@@ -124,7 +127,7 @@ export default class Widget extends Plugin {
124127

125128
// Focus editor if is not focused already.
126129
if ( !viewDocument.isFocused ) {
127-
viewDocument.focus();
130+
view.focus();
128131
}
129132

130133
// Create model selection over widget.
@@ -280,7 +283,8 @@ export default class Widget extends Plugin {
280283
_selectAllContent() {
281284
const model = this.editor.model;
282285
const editing = this.editor.editing;
283-
const viewDocument = editing.view;
286+
const view = editing.view;
287+
const viewDocument = view.document;
284288
const viewSelection = viewDocument.selection;
285289

286290
const selectedElement = viewSelection.getSelectedElement();
@@ -341,11 +345,13 @@ export default class Widget extends Plugin {
341345

342346
/**
343347
* Removes CSS class from previously selected widgets.
348+
*
344349
* @private
350+
* @param {module:engine/view/writer~Writer} writer
345351
*/
346-
_clearPreviouslySelectedWidgets() {
352+
_clearPreviouslySelectedWidgets( writer ) {
347353
for ( const widget of this._previouslySelected ) {
348-
widget.removeClass( WIDGET_SELECTED_CLASS_NAME );
354+
writer.removeClass( WIDGET_SELECTED_CLASS_NAME, widget );
349355
}
350356

351357
this._previouslySelected.clear();

0 commit comments

Comments
 (0)