widgetresize.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /**
  2. * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  4. */
  5. /* globals window, document */
  6. import WidgetResize from '../src/widgetresize';
  7. import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';
  8. import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset';
  9. describe( 'WidgetResize', () => {
  10. let editor, editorElement;
  11. before( async () => {
  12. editorElement = createEditorElement();
  13. editor = await createEditor( editorElement );
  14. } );
  15. after( () => {
  16. editorElement.remove();
  17. return editor.destroy();
  18. } );
  19. describe( 'plugin', () => {
  20. it( 'is loaded', () => {
  21. expect( editor.plugins.get( WidgetResize ) ).to.be.instanceOf( WidgetResize );
  22. } );
  23. } );
  24. describe( 'mouse listeners', () => {
  25. it( 'doesnt break when called with unexpected element', () => {
  26. const unrelatedElement = document.createElement( 'div' );
  27. editor.plugins.get( WidgetResize )._mouseDownListener( {}, {
  28. target: unrelatedElement
  29. } );
  30. } );
  31. } );
  32. describe( 'mouse listeners (stubbed)', () => {
  33. let mouseListenerStubs, localEditor, localElement;
  34. beforeEach( async () => {
  35. mouseListenerStubs = {
  36. down: sinon.stub( WidgetResize.prototype, '_mouseDownListener' ),
  37. move: sinon.stub( WidgetResize.prototype, '_mouseMoveListener' ),
  38. up: sinon.stub( WidgetResize.prototype, '_mouseUpListener' )
  39. };
  40. localElement = createEditorElement();
  41. localEditor = await createEditor( localElement );
  42. } );
  43. afterEach( () => {
  44. for ( const stub of Object.values( mouseListenerStubs ) ) {
  45. stub.restore();
  46. }
  47. localElement.remove();
  48. return localEditor.destroy();
  49. } );
  50. it( 'are detached when plugin is destroyed', async () => {
  51. await localEditor.destroy();
  52. // Trigger mouse event.
  53. fireMouseEvent( document.body, 'mousedown', {} );
  54. // Ensure nothing got called.
  55. expect( mouseListenerStubs.down.callCount ).to.be.equal( 0 );
  56. } );
  57. } );
  58. function createEditor( element ) {
  59. return new Promise( ( resolve, reject ) => {
  60. ClassicTestEditor
  61. .create( element, {
  62. plugins: [
  63. ArticlePluginSet, WidgetResize
  64. ]
  65. } )
  66. .then( newEditor => {
  67. resolve( newEditor );
  68. } )
  69. .catch( reject );
  70. } );
  71. }
  72. function createEditorElement() {
  73. const element = document.createElement( 'div' );
  74. document.body.appendChild( element );
  75. return element;
  76. }
  77. function fireMouseEvent( target, eventType, eventData ) {
  78. // Id of the left mouse button.
  79. const MOUSE_BUTTON_MAIN = 0;
  80. // Using initMouseEvent instead of MouseEvent constructor, as MouseEvent constructor doesn't support passing pageX
  81. // and pageY. See https://stackoverflow.com/questions/45843458/setting-click-events-pagex-and-pagey-always-reverts-to-0
  82. // However there's still a problem, that events created with `initMouseEvent` have **floored** pageX, pageY numbers.
  83. const event = document.createEvent( 'MouseEvent' );
  84. event.initMouseEvent( eventType, true, true, window, null, 0, 0, eventData.pageX, eventData.pageY, false, false, false, false,
  85. MOUSE_BUTTON_MAIN, null );
  86. target.dispatchEvent( event );
  87. }
  88. } );