diff --git a/modules/core/src/lib/deck.ts b/modules/core/src/lib/deck.ts index 9cff26cb0e9..3c30f5c30fe 100644 --- a/modules/core/src/lib/deck.ts +++ b/modules/core/src/lib/deck.ts @@ -1381,14 +1381,14 @@ export default class Deck { touchAction: this.props.touchAction, recognizers: Object.keys(RECOGNIZERS).map((eventName: string) => { // Resolve recognizer settings - const [RecognizerConstructor, defaultOptions, recognizeWith, requestFailure] = + const [RecognizerConstructor, defaultOptions, recognizeWith, requireFailure] = RECOGNIZERS[eventName]; const optionsOverride = this.props.eventRecognizerOptions?.[eventName]; const options = {...defaultOptions, ...optionsOverride, event: eventName}; return { recognizer: new RecognizerConstructor(options), recognizeWith, - requestFailure + requireFailure }; }), events: { diff --git a/test/modules/core/lib/deck.spec.ts b/test/modules/core/lib/deck.spec.ts index 2e3702d1f9d..7a985516d8f 100644 --- a/test/modules/core/lib/deck.spec.ts +++ b/test/modules/core/lib/deck.spec.ts @@ -131,6 +131,40 @@ test('Deck#constructor', async () => { console.log('Deck constructor did not throw'); }); +test('Deck wires mjolnir requireFailure between recognizers', async () => { + // Regression guard: deck.gl previously emitted `requestFailure` instead of + // `requireFailure`, which mjolnir silently dropped — so pinch/pan/click no + // longer waited for their blocking recognizer to fail. + await new Promise((resolve, reject) => { + const deck = new Deck({ + device, + width: 1, + height: 1, + viewState: {longitude: 0, latitude: 0, zoom: 0}, + layers: [], + controller: true, + onLoad: () => { + try { + const recognizers = (deck as any).eventManager?.manager?.recognizers ?? []; + const requiredFailures = (event: string): string[] => + (recognizers.find(r => r.options.event === event)?.requireFail ?? []).map( + (r: any) => r.options.event + ); + + expect(requiredFailures('pinch'), 'pinch waits for multipan').toContain('multipan'); + expect(requiredFailures('pan'), 'pan waits for multipan').toContain('multipan'); + expect(requiredFailures('click'), 'click waits for dblclick').toContain('dblclick'); + + deck.finalize(); + resolve(); + } catch (error) { + reject(error); + } + } + }); + }); +}); + test('Deck#abort', async () => { const deck = new Deck({ device,