Browse Source

Merge pull request #17933 from Mugen87/dev29

LoadingManager: Make .getHandler() more robust.
Mr.doob 5 years ago
parent
commit
bf8f1e7024
2 changed files with 25 additions and 0 deletions
  1. 2 0
      src/loaders/LoadingManager.js
  2. 23 0
      test/unit/src/loaders/LoadingManager.tests.js

+ 2 - 0
src/loaders/LoadingManager.js

@@ -121,6 +121,8 @@ function LoadingManager( onLoad, onProgress, onError ) {
 			var regex = handlers[ i ];
 			var loader = handlers[ i + 1 ];
 
+			if ( regex.global ) regex.lastIndex = 0; // see #17920
+
 			if ( regex.test( file ) ) {
 
 				return loader;

+ 23 - 0
test/unit/src/loaders/LoadingManager.tests.js

@@ -4,6 +4,7 @@
 /* global QUnit */
 
 import { LoadingManager } from '../../../../src/loaders/LoadingManager';
+import { Loader } from '../../../../src/loaders/Loader';
 
 export default QUnit.module( 'Loaders', () => {
 
@@ -59,6 +60,28 @@ export default QUnit.module( 'Loaders', () => {
 
 		} );
 
+		QUnit.test( "getHandler", ( assert ) => {
+
+			const loadingManager = new LoadingManager();
+			const loader = new Loader();
+
+			const regex1 = /\.jpg$/i;
+			const regex2 = /\.jpg$/gi;
+
+			loadingManager.addHandler( regex1, loader );
+
+			assert.equal( loadingManager.getHandler( 'foo.jpg' ), loader, 'Returns the expected loader.' );
+			assert.equal( loadingManager.getHandler( 'foo.jpg.png' ), null, 'Returns null since the correct file extension is not at the end of the file name.' );
+			assert.equal( loadingManager.getHandler( 'foo.jpeg' ), null, 'Returns null since file extension is wrong.' );
+
+			loadingManager.removeHandler( regex1 );
+			loadingManager.addHandler( regex2, loader );
+
+			assert.equal( loadingManager.getHandler( 'foo.jpg' ), loader, 'Returns the expected loader when using a regex with "g" flag.' );
+			assert.equal( loadingManager.getHandler( 'foo.jpg' ), loader, 'Returns the expected loader when using a regex with "g" flag. Test twice, see #17920.' );
+
+		} );
+
 	} );
 
 } );