|
|
@@ -0,0 +1,110 @@
|
|
|
+/**
|
|
|
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
|
|
|
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
|
+ */
|
|
|
+
|
|
|
+/* globals window, document */
|
|
|
+
|
|
|
+import WidgetResize from '../src/widgetresize';
|
|
|
+
|
|
|
+import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';
|
|
|
+import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset';
|
|
|
+
|
|
|
+describe( 'WidgetResize', () => {
|
|
|
+ let editor, editorElement;
|
|
|
+
|
|
|
+ before( async () => {
|
|
|
+ editorElement = createEditorElement();
|
|
|
+ editor = await createEditor( editorElement );
|
|
|
+ } );
|
|
|
+
|
|
|
+ after( () => {
|
|
|
+ editorElement.remove();
|
|
|
+ return editor.destroy();
|
|
|
+ } );
|
|
|
+
|
|
|
+ describe( 'plugin', () => {
|
|
|
+ it( 'is loaded', () => {
|
|
|
+ expect( editor.plugins.get( WidgetResize ) ).to.be.instanceOf( WidgetResize );
|
|
|
+ } );
|
|
|
+ } );
|
|
|
+
|
|
|
+ describe( 'mouse listeners', () => {
|
|
|
+ it( 'doesnt break when called with unexpected element', () => {
|
|
|
+ const unrelatedElement = document.createElement( 'div' );
|
|
|
+
|
|
|
+ editor.plugins.get( WidgetResize )._mouseDownListener( {}, {
|
|
|
+ target: unrelatedElement
|
|
|
+ } );
|
|
|
+ } );
|
|
|
+ } );
|
|
|
+
|
|
|
+ describe( 'mouse listeners (stubbed)', () => {
|
|
|
+ let mouseListenerStubs, localEditor, localElement;
|
|
|
+
|
|
|
+ beforeEach( async () => {
|
|
|
+ mouseListenerStubs = {
|
|
|
+ down: sinon.stub( WidgetResize.prototype, '_mouseDownListener' ),
|
|
|
+ move: sinon.stub( WidgetResize.prototype, '_mouseMoveListener' ),
|
|
|
+ up: sinon.stub( WidgetResize.prototype, '_mouseUpListener' )
|
|
|
+ };
|
|
|
+
|
|
|
+ localElement = createEditorElement();
|
|
|
+ localEditor = await createEditor( localElement );
|
|
|
+ } );
|
|
|
+
|
|
|
+ afterEach( () => {
|
|
|
+ for ( const stub of Object.values( mouseListenerStubs ) ) {
|
|
|
+ stub.restore();
|
|
|
+ }
|
|
|
+
|
|
|
+ localElement.remove();
|
|
|
+
|
|
|
+ return localEditor.destroy();
|
|
|
+ } );
|
|
|
+
|
|
|
+ it( 'are detached when plugin is destroyed', async () => {
|
|
|
+ await localEditor.destroy();
|
|
|
+
|
|
|
+ // Trigger mouse event.
|
|
|
+ fireMouseEvent( document.body, 'mousedown', {} );
|
|
|
+ // Ensure nothing got called.
|
|
|
+ expect( mouseListenerStubs.down.callCount ).to.be.equal( 0 );
|
|
|
+ } );
|
|
|
+ } );
|
|
|
+
|
|
|
+ function createEditor( element ) {
|
|
|
+ return new Promise( ( resolve, reject ) => {
|
|
|
+ ClassicTestEditor
|
|
|
+ .create( element, {
|
|
|
+ plugins: [
|
|
|
+ ArticlePluginSet, WidgetResize
|
|
|
+ ]
|
|
|
+ } )
|
|
|
+ .then( newEditor => {
|
|
|
+ resolve( newEditor );
|
|
|
+ } )
|
|
|
+ .catch( reject );
|
|
|
+ } );
|
|
|
+ }
|
|
|
+
|
|
|
+ function createEditorElement() {
|
|
|
+ const element = document.createElement( 'div' );
|
|
|
+ document.body.appendChild( element );
|
|
|
+ return element;
|
|
|
+ }
|
|
|
+
|
|
|
+ function fireMouseEvent( target, eventType, eventData ) {
|
|
|
+ // Id of the left mouse button.
|
|
|
+ const MOUSE_BUTTON_MAIN = 0;
|
|
|
+
|
|
|
+ // Using initMouseEvent instead of MouseEvent constructor, as MouseEvent constructor doesn't support passing pageX
|
|
|
+ // and pageY. See https://stackoverflow.com/questions/45843458/setting-click-events-pagex-and-pagey-always-reverts-to-0
|
|
|
+ // However there's still a problem, that events created with `initMouseEvent` have **floored** pageX, pageY numbers.
|
|
|
+ const event = document.createEvent( 'MouseEvent' );
|
|
|
+ event.initMouseEvent( eventType, true, true, window, null, 0, 0, eventData.pageX, eventData.pageY, false, false, false, false,
|
|
|
+ MOUSE_BUTTON_MAIN, null );
|
|
|
+
|
|
|
+ target.dispatchEvent( event );
|
|
|
+ }
|
|
|
+} );
|