Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
it( 'should skip filler', () => {
// eslint-disable-next-line new-cap
const domFiller = BR_FILLER( document );
const domP = createElement( document, 'p', null, domFiller );
const viewChildren = Array.from( converter.domChildrenToView( domP ) );
expect( viewChildren.length ).to.equal( 0 );
} );
it( 'do nothing when another key is pressed', () => {
// fooxxx{}bar
const p = new ViewContainerElement( 'p', null, [ foo, ui, bar ] );
viewRoot._appendChild( p );
view.change( writer => {
writer.setSelection( [ ViewRange._createFromParentsAndOffsets( bar, 0, bar, 0 ) ] );
} );
renderAndFireKeydownEvent( { keyCode: keyCodes.arrowleft } );
testUtils.checkAssertions(
() => check( 'bar', 0 ),
// Safari renders selection at the end of the text node.
() => check( 'xxx', 3 )
);
} );
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
/* global console */
import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
import Enter from '@ckeditor/ckeditor5-enter/src/enter';
import Typing from '@ckeditor/ckeditor5-typing/src/typing';
import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
import Undo from '@ckeditor/ckeditor5-undo/src/undo';
import Heading from '@ckeditor/ckeditor5-heading/src/heading';
import global from '@ckeditor/ckeditor5-utils/src/dom/global';
import { enablePlaceholder } from '../../src/view/placeholder';
ClassicEditor
.create( global.document.querySelector( '#editor' ), {
plugins: [ Enter, Typing, Paragraph, Undo, Heading ],
toolbar: [ 'heading', '|', 'undo', 'redo' ]
} )
.then( editor => {
const view = editor.editing.view;
const viewDoc = view.document;
const header = viewDoc.getRoot().getChild( 0 );
const paragraph = viewDoc.getRoot().getChild( 1 );
enablePlaceholder( {
view,
element: header,
text: 'Type some header text...'
} );
enablePlaceholder( {
.then( editor => {
newEditor = editor;
balloon = newEditor.plugins.get( 'ContextualBalloon' );
balloonToolbar = newEditor.plugins.get( 'BalloonToolbar' );
const button = new View();
button.element = global.document.createElement( 'div' );
// There must be at least one toolbar items which is not disabled to show it.
// https://github.com/ckeditor/ckeditor5-ui/issues/269
balloonToolbar.toolbarView.items.add( button );
newEditor.editing.view.isFocused = true;
newEditor.editing.view.getDomRoot().focus();
} );
} );
beforeEach( () => {
// Most tests assume non-edge environment but we do not set `contenteditable=false` on Edge so stub `env.isEdge`.
testUtils.sinon.stub( env, 'isEdge' ).get( () => false );
editorElement = global.document.createElement( 'div' );
global.document.body.appendChild( editorElement );
return ClassicTestEditor
.create( editorElement, {
plugins: [ Image ]
} )
.then( newEditor => {
editor = newEditor;
model = editor.model;
document = model.document;
view = editor.editing.view;
viewDocument = editor.editing.view.document;
} );
} );
const clock = testUtils.sinon.useFakeTimers();
const spy = sinon.spy();
viewDocument.on( 'selectionChangeDone', spy );
// Change selection.
changeFakeSelectionPressing( keyCodes.arrowdown );
// Wait 100ms.
clock.tick( 100 );
// Check if spy was called.
sinon.assert.notCalled( spy );
// Change selection one more time.
changeFakeSelectionPressing( keyCodes.arrowdown );
// Wait 210ms (debounced function should be called).
clock.tick( 210 );
sinon.assert.calledOnce( spy );
} );
move( range, itemOrPosition, offset ) {
this._assertWriterUsedCorrectly();
if ( !( range instanceof Range ) ) {
/**
* Invalid range to move.
*
* @error writer-move-invalid-range
*/
throw new CKEditorError( 'writer-move-invalid-range: Invalid range to move.', this );
}
if ( !range.isFlat ) {
/**
* Range to move is not flat.
*
* @error writer-move-range-not-flat
*/
throw new CKEditorError( 'writer-move-range-not-flat: Range to move is not flat.', this );
}
const position = Position._createAt( itemOrPosition, offset );
// Do not move anything if the move target is same as moved range start.
if ( position.isEqual( range.start ) ) {
return;
if ( !( range instanceof Range ) ) {
/**
* Invalid range to move.
*
* @error writer-move-invalid-range
*/
throw new CKEditorError( 'writer-move-invalid-range: Invalid range to move.', this );
}
if ( !range.isFlat ) {
/**
* Range to move is not flat.
*
* @error writer-move-range-not-flat
*/
throw new CKEditorError( 'writer-move-range-not-flat: Range to move is not flat.', this );
}
const position = Position._createAt( itemOrPosition, offset );
// Do not move anything if the move target is same as moved range start.
if ( position.isEqual( range.start ) ) {
return;
}
// If part of the marker is removed, create additional marker operation for undo purposes.
this._addOperationForAffectedMarkers( 'move', range );
if ( !isSameTree( range.root, position.root ) ) {
/**
* Range is going to be moved within not the same document. Please use
* {@link module:engine/model/writer~Writer#insert insert} instead.
return;
}
const hasUsingOperationDefined = typeof options.usingOperation == 'boolean';
const affectsDataDefined = typeof options.affectsData == 'boolean';
// Use previously defined marker's affectsData if the property is not provided.
const affectsData = affectsDataDefined ? options.affectsData : currentMarker.affectsData;
if ( !hasUsingOperationDefined && !options.range && !affectsDataDefined ) {
/**
* One of the options is required - provide range, usingOperations or affectsData.
*
* @error writer-updateMarker-wrong-options
*/
throw new CKEditorError(
'writer-updateMarker-wrong-options: One of the options is required - provide range, usingOperations or affectsData.',
this
);
}
const currentRange = currentMarker.getRange();
const updatedRange = options.range ? options.range : currentRange;
if ( hasUsingOperationDefined && options.usingOperation !== currentMarker.managedUsingOperations ) {
// The marker type is changed so it's necessary to create proper operations.
if ( options.usingOperation ) {
// If marker changes to a managed one treat this as synchronizing existing marker.
// Create `MarkerOperation` with `oldRange` set to `null`, so reverse operation will remove the marker.
applyMarkerOperation( this, markerName, null, updatedRange, affectsData );
} else {
// If marker changes to a marker that do not use operations then we need to create additional operation
register( itemName, rules ) {
if ( this._sourceRules[ itemName ] ) {
// TODO docs
throw new CKEditorError( 'schema-cannot-register-item-twice: A single item cannot be registered twice in the schema.' );
}
this._sourceRules[ itemName ] = [
Object.assign( {}, rules )
];
this._clearCache();
}