Skip to content

Commit 0512c0b

Browse files
authored
Don't apply type button to non button elements (#1772)
1 parent b1c3b3b commit 0512c0b

File tree

4 files changed

+35
-3
lines changed

4 files changed

+35
-3
lines changed

packages/@react-aria/button/src/useButton.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,12 @@ export function useButton(props: AriaButtonProps<ElementType>, ref: RefObject<an
6464
type = 'button'
6565
} = props;
6666
let additionalProps;
67-
if (elementType !== 'button') {
67+
if (elementType === 'button') {
68+
additionalProps = {
69+
type,
70+
disabled: isDisabled
71+
};
72+
} else {
6873
additionalProps = {
6974
role: 'button',
7075
tabIndex: isDisabled ? undefined : 0,
@@ -98,8 +103,6 @@ export function useButton(props: AriaButtonProps<ElementType>, ref: RefObject<an
98103
'aria-expanded': props['aria-expanded'],
99104
'aria-controls': props['aria-controls'],
100105
'aria-pressed': props['aria-pressed'],
101-
disabled: isDisabled,
102-
type,
103106
onClick: (e) => {
104107
if (deprecatedOnClick) {
105108
deprecatedOnClick(e);

packages/@react-aria/button/test/useButton.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ describe('useButton tests', function () {
3030
expect(typeof result.current.buttonProps.onKeyDown).toBe('function');
3131
expect(result.current.buttonProps.rel).toBeUndefined();
3232
});
33+
it('handles elements other than button disabled', function () {
34+
let props = {elementType: 'a', isDisabled: true};
35+
let {result} = renderHook(() => useButton(props));
36+
expect(result.current.buttonProps.role).toBe('button');
37+
expect(result.current.buttonProps.tabIndex).toBeUndefined();
38+
expect(result.current.buttonProps['aria-disabled']).toBeTruthy();
39+
expect(result.current.buttonProps.href).toBeUndefined();
40+
expect(typeof result.current.buttonProps.onKeyDown).toBe('function');
41+
expect(result.current.buttonProps.rel).toBeUndefined();
42+
});
3343
it('handles the rel attribute on anchors', function () {
3444
let props = {elementType: 'a', rel: 'noopener noreferrer'};
3545
let {result} = renderHook(() => useButton(props));
@@ -40,4 +50,15 @@ describe('useButton tests', function () {
4050
let {result} = renderHook(() => useButton(props));
4151
expect(result.current.buttonProps.rel).toBe('search');
4252
});
53+
it('handles input elements', function () {
54+
let props = {elementType: 'input', isDisabled: true};
55+
let {result} = renderHook(() => useButton(props));
56+
expect(result.current.buttonProps.role).toBe('button');
57+
expect(result.current.buttonProps.tabIndex).toBeUndefined();
58+
expect(result.current.buttonProps['aria-disabled']).toBeUndefined();
59+
expect(result.current.buttonProps.disabled).toBeTruthy();
60+
expect(result.current.buttonProps.href).toBeUndefined();
61+
expect(typeof result.current.buttonProps.onKeyDown).toBe('function');
62+
expect(result.current.buttonProps.rel).toBeUndefined();
63+
});
4364
});

packages/@react-spectrum/button/test/Button.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ describe('Button', function () {
156156

157157
let button = getByRole('button');
158158
expect(button).toHaveAttribute('tabindex', '0');
159+
expect(button).not.toHaveAttribute('type', 'button');
159160
triggerPress(button);
160161
expect(onPressSpy).toHaveBeenCalledTimes(1);
161162

@@ -196,6 +197,7 @@ describe('Button', function () {
196197

197198
let button = getByRole('button');
198199
triggerPress(button);
200+
expect(button).toBeDisabled();
199201
expect(onPressSpy).not.toHaveBeenCalled();
200202
});
201203

packages/@react-spectrum/numberfield/test/NumberField.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ describe('NumberField', function () {
8787
expect(textField).toHaveAttribute('inputMode', 'numeric');
8888
expect(incrementButton).toBeTruthy();
8989
expect(decrementButton).toBeTruthy();
90+
expect(incrementButton).toHaveAttribute('tabIndex', '-1');
91+
expect(decrementButton).toHaveAttribute('tabIndex', '-1');
9092
});
9193

9294
it('attaches a user provided ref to the outer div', function () {
@@ -1442,6 +1444,10 @@ describe('NumberField', function () {
14421444
expect(textField).toHaveAttribute('value', '100');
14431445
expect(incrementButton).toHaveAttribute('aria-disabled');
14441446
expect(decrementButton).toHaveAttribute('aria-disabled');
1447+
// they are aria-disabled, but don't have the attribute disabled because they are not buttons or inputs
1448+
// should they be made buttons again after the Safari bug is fixed, this will need to be reversed
1449+
expect(incrementButton).not.toBeDisabled();
1450+
expect(decrementButton).not.toBeDisabled();
14451451
});
14461452

14471453
it.each`

0 commit comments

Comments
 (0)