Explorar el Código

Fix: DomConverter should actively prevent window scroll on focus in WebKit. Closes #951.

Aleksander Nowodzinski hace 8 años
padre
commit
6aefc1b07c

+ 10 - 0
packages/ckeditor5-engine/src/view/domconverter.js

@@ -18,6 +18,9 @@ import ViewDocumentFragment from './documentfragment';
 import ViewTreeWalker from './treewalker';
 import { BR_FILLER, INLINE_FILLER_LENGTH, isBlockFiller, isInlineFiller, startsWithFiller, getDataWithoutFiller } from './filler';
 
+import global from '@ckeditor/ckeditor5-utils/src/dom/global';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+
 import indexOf from '@ckeditor/ckeditor5-utils/src/dom/indexof';
 import getAncestors from '@ckeditor/ckeditor5-utils/src/dom/getancestors';
 import getCommonAncestor from '@ckeditor/ckeditor5-utils/src/dom/getcommonancestor';
@@ -734,7 +737,14 @@ export default class DomConverter {
 		const domEditable = this.getCorrespondingDomElement( viewEditable );
 
 		if ( domEditable && domEditable.ownerDocument.activeElement !== domEditable ) {
+			const { scrollX, scrollY } = global.window;
+
 			domEditable.focus();
+
+			// https://github.com/ckeditor/ckeditor5-engine/issues/951
+			if ( env.webkit ) {
+				global.window.scrollTo( scrollX, scrollY );
+			}
 		}
 	}
 

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

@@ -11,6 +11,9 @@ import ViewDocument from '../../../src/view/document';
 import { BR_FILLER, NBSP_FILLER } from '../../../src/view/filler';
 import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
+import global from '@ckeditor/ckeditor5-utils/src/dom/global';
+import env from '@ckeditor/ckeditor5-utils/src/env';
+
 testUtils.createSinonSandbox();
 
 describe( 'DomConverter', () => {
@@ -66,6 +69,27 @@ describe( 'DomConverter', () => {
 
 			expect( focusSpy.calledOnce ).to.be.true;
 		} );
+
+		// https://github.com/ckeditor/ckeditor5-engine/issues/951
+		it( 'should actively prevent window scroll in WebKit', () => {
+			const spy = testUtils.sinon.stub( global.window, 'scrollTo' );
+			const initialEnvWebkit = env.webkit;
+
+			env.webkit = true;
+
+			global.window.scrollX = 10;
+			global.window.scrollY = 100;
+
+			converter.focus( viewEditable );
+			sinon.assert.calledWithExactly( spy, 10, 100 );
+
+			env.webkit = false;
+
+			converter.focus( viewEditable );
+			sinon.assert.calledOnce( spy );
+
+			env.webkit = initialEnvWebkit;
+		} );
 	} );
 
 	describe( 'DOM nodes type checking', () => {