diff --git a/addon/src/dom/trigger-event.ts b/addon/src/dom/trigger-event.ts index bc33d61f4..d0b74ba0d 100644 --- a/addon/src/dom/trigger-event.ts +++ b/addon/src/dom/trigger-event.ts @@ -18,6 +18,7 @@ registerHook('triggerEvent', 'start', (target: Target, eventType: string) => { * @param {string|Element|IDOMElementDescriptor} target the element, selector, or descriptor to trigger the event on * @param {string} eventType the type of event to trigger * @param {Object} options additional properties to be set on the event + * @param {boolean} force if true, will bypass availability checks (false by default) * @return {Promise} resolves when the application is settled * * @example @@ -58,6 +59,7 @@ export default function triggerEvent( target: Target, eventType: string, options?: Record, + force: boolean = false, ): Promise { return Promise.resolve() .then(() => { @@ -82,7 +84,7 @@ export default function triggerEvent( ); } - if (isFormControl(element) && element.disabled) { + if (!force && isFormControl(element) && element.disabled) { throw new Error(`Can not \`triggerEvent\` on disabled ${element}`); } diff --git a/test-app/tests/unit/dom/trigger-event-test.js b/test-app/tests/unit/dom/trigger-event-test.js index 50dfa1a65..6a73a0d7c 100644 --- a/test-app/tests/unit/dom/trigger-event-test.js +++ b/test-app/tests/unit/dom/trigger-event-test.js @@ -177,6 +177,24 @@ module('DOM Helper: triggerEvent', function (hooks) { ); }); + test('allows triggering events on disabled form control when `force` is true', async function (assert) { + element = buildInstrumentedElement('textarea'); + element.setAttribute('disabled', true); + + element.addEventListener('fliberty', (e) => { + assert.step('fliberty'); + assert.ok( + e instanceof Event, + `fliberty listener receives a native event` + ); + }); + + await setupContext(context); + await triggerEvent(element, 'fliberty', {}, true); + + assert.verifySteps(['fliberty']); + }); + test('events properly bubble upwards', async function (assert) { await setupContext(context); element = buildInstrumentedElement('div'); diff --git a/type-tests/api.ts b/type-tests/api.ts index 0504ec57c..9f9edca2d 100644 --- a/type-tests/api.ts +++ b/type-tests/api.ts @@ -122,7 +122,8 @@ expectTypeOf(triggerEvent).toEqualTypeOf< ( target: Target, eventType: string, - options?: Record + options?: Record, + force?: boolean, ) => Promise >(); expectTypeOf(triggerKeyEvent).toEqualTypeOf<