Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit 31d81ad

Browse files
authored
fix(ripple): Expose focus/blur handlers (#2905)
1 parent 14cb0bf commit 31d81ad

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

packages/mdc-ripple/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ Method Signature | Description
150150
`activate() => void` | Proxies to the foundation's `activate` method
151151
`deactivate() => void` | Proxies to the foundation's `deactivate` method
152152
`layout() => void` | Proxies to the foundation's `layout` method
153+
`handleFocus() => void` | Handles focus event on the ripple surface
154+
`handleBlur() => void` | Handles blur event on the ripple surface
153155

154156
### `MDCRippleAdapter`
155157

packages/mdc-ripple/foundation.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,10 @@ class MDCRippleFoundation extends MDCFoundation {
132132
this.deactivateHandler_ = (e) => this.deactivate_(e);
133133

134134
/** @private {function(?Event=)} */
135-
this.focusHandler_ = () => requestAnimationFrame(
136-
() => this.adapter_.addClass(MDCRippleFoundation.cssClasses.BG_FOCUSED)
137-
);
135+
this.focusHandler_ = () => this.handleFocus();
138136

139137
/** @private {function(?Event=)} */
140-
this.blurHandler_ = () => requestAnimationFrame(
141-
() => this.adapter_.removeClass(MDCRippleFoundation.cssClasses.BG_FOCUSED)
142-
);
138+
this.blurHandler_ = () => this.handleBlur();
143139

144140
/** @private {!Function} */
145141
this.resizeHandler_ = () => this.layout();
@@ -587,6 +583,16 @@ class MDCRippleFoundation extends MDCFoundation {
587583
this.adapter_.removeClass(UNBOUNDED);
588584
}
589585
}
586+
587+
handleFocus() {
588+
requestAnimationFrame(() =>
589+
this.adapter_.addClass(MDCRippleFoundation.cssClasses.BG_FOCUSED));
590+
}
591+
592+
handleBlur() {
593+
requestAnimationFrame(() =>
594+
this.adapter_.removeClass(MDCRippleFoundation.cssClasses.BG_FOCUSED));
595+
}
590596
}
591597

592598
export default MDCRippleFoundation;

test/unit/mdc-ripple/mdc-ripple.test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import td from 'testdouble';
2222
import {MDCRipple} from '../../../packages/mdc-ripple';
2323
import {cssClasses} from '../../../packages/mdc-ripple/constants';
2424
import * as util from '../../../packages/mdc-ripple/util';
25+
import {createMockRaf} from '../helpers/raf';
2526

2627
suite('MDCRipple');
2728

@@ -222,3 +223,22 @@ test('adapter#getWindowPageOffset returns page{X,Y}Offset as {x,y} respectively'
222223
y: window.pageYOffset,
223224
});
224225
});
226+
227+
test(`handleFocus() adds class ${cssClasses.BG_FOCUSED}`, () => {
228+
const raf = createMockRaf();
229+
const {root, component} = setupTest();
230+
component.foundation_.handleFocus();
231+
raf.flush();
232+
assert.isTrue(root.classList.contains(cssClasses.BG_FOCUSED));
233+
raf.restore();
234+
});
235+
236+
test(`handleBlur() removes class ${cssClasses.BG_FOCUSED}`, () => {
237+
const raf = createMockRaf();
238+
const {root, component} = setupTest();
239+
root.classList.add(cssClasses.BG_FOCUSED);
240+
component.foundation_.handleBlur();
241+
raf.flush();
242+
assert.isFalse(root.classList.contains(cssClasses.BG_FOCUSED));
243+
raf.restore();
244+
});

0 commit comments

Comments
 (0)