Procházet zdrojové kódy

Added useCapture member to DomEventObserver.

Szymon Kupś před 9 roky
rodič
revize
7915f09358

+ 12 - 1
packages/ckeditor5-engine/src/view/observer/domeventobserver.js

@@ -52,6 +52,17 @@ export default class DomEventObserver extends Observer {
 	 * @method #onDomEvent
 	 */
 
+	constructor( document ) {
+		super( document );
+		/**
+		 * If set to `true` DOM events will be listened on capturing phase.
+		 * Default value is `false`.
+		 *
+		 * @member {Boolean} #useCapture
+		 */
+		this.useCapture = false;
+	}
+
 	/**
 	 * @inheritDoc
 	 */
@@ -63,7 +74,7 @@ export default class DomEventObserver extends Observer {
 				if ( this.isEnabled ) {
 					this.onDomEvent( domEvent );
 				}
-			} );
+			}, { useCapture: this.useCapture } );
 		} );
 	}
 

+ 1 - 0
packages/ckeditor5-engine/src/view/observer/focusobserver.js

@@ -24,6 +24,7 @@ export default class FocusObserver extends DomEventObserver {
 		super( document );
 
 		this.domEventType = [ 'focus', 'blur' ];
+		this.useCapture = true;
 
 		document.on( 'focus', () => {
 			document.isFocused = true;

+ 24 - 0
packages/ckeditor5-engine/tests/view/observer/domeventobserver.js

@@ -33,6 +33,14 @@ class MultiObserver extends DomEventObserver {
 	}
 }
 
+class ClickCapturingObserver extends ClickObserver {
+	constructor( document ) {
+		super( document );
+
+		this.useCapture = true;
+	}
+}
+
 describe( 'DomEventObserver', () => {
 	let viewDocument;
 
@@ -129,6 +137,22 @@ describe( 'DomEventObserver', () => {
 		expect( evtSpy.calledOnce ).to.be.true;
 	} );
 
+	it( 'should allow to listen events on capturing phase', ( done ) => {
+		const domElement = document.createElement( 'div' );
+		const childDomElement = document.createElement( 'p' );
+		const domEvent = new MouseEvent( 'click' );
+		domElement.appendChild( childDomElement );
+		viewDocument.createRoot( domElement, 'root' );
+		viewDocument.addObserver( ClickCapturingObserver );
+
+		viewDocument.on( 'click', ( evt, domEventData ) => {
+			expect( domEventData.domEvent.eventPhase ).to.equal( MouseEvent.CAPTURING_PHASE );
+			done();
+		} );
+
+		childDomElement.dispatchEvent( domEvent );
+	} );
+
 	describe( 'fire', () => {
 		it( 'should do nothing if observer is disabled', () => {
 			const testObserver = new ClickObserver( viewDocument );

+ 4 - 0
packages/ckeditor5-engine/tests/view/observer/focusobserver.js

@@ -25,6 +25,10 @@ describe( 'FocusObserver', () => {
 		expect( observer.domEventType ).to.deep.equal( [ 'focus', 'blur' ] );
 	} );
 
+	it( 'should use capturing phase', () => {
+		expect( observer.useCapture ).to.be.true;
+	} );
+
 	describe( 'onDomEvent', () => {
 		it( 'should fire focus with the right event data', () => {
 			const spy = sinon.spy();