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

Commit c97aeaf

Browse files
committed
WIP
1 parent 0f3a059 commit c97aeaf

File tree

4 files changed

+98
-22
lines changed

4 files changed

+98
-22
lines changed

packages/mdc-snackbar/README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,18 @@ The adapter for snackbars must provide the following functions, with correct sig
198198
| `removeClass(className: string) => void` | Removes a class from the root element. |
199199
| `setAriaHidden() => void` | Sets `aria-hidden="true"` on the root element. |
200200
| `unsetAriaHidden() => void` | Removes the `aria-hidden` attribute from the root element. |
201-
| `setMessageText(message: string) => void` | Set the text content of the message element. |
202-
| `setActionText(actionText: string) => void` | Set the text content of the action element. |
203201
| `setActionAriaHidden() => void` | Sets `aria-hidden="true"` on the action element. |
204202
| `unsetActionAriaHidden() => void` | Removes the `aria-hidden` attribute from the action element. |
205-
| `registerFocusHandler(handler: EventListener) => void` | Registers an event handler to be called when a `focus` event is triggered on the `body` |
206-
| `deregisterFocusHandler(handler: EventListener) => void` | Deregisters a `focus` event handler from the `body` |
203+
| `setActionText(actionText: string) => void` | Set the text content of the action element. |
204+
| `setMessageText(message: string) => void` | Set the text content of the message element. |
205+
| `setFocus() => void` | Sets focus on the action button. |
206+
| `visibilityIsHidden() => boolean` | Returns document.hidden property. |
207207
| `registerBlurHandler(handler: EventListener) => void` | Registers an event handler to be called when a `blur` event is triggered on the action button |
208208
| `deregisterBlurHandler(handler: EventListener) => void` | Deregisters a `blur` event handler from the actionButton |
209209
| `registerVisibilityChangeHandler(handler: EventListener) => void` | Registers an event handler to be called when a 'visibilitychange' event occurs |
210210
| `deregisterVisibilityChangeHandler(handler: EventListener) => void` | Deregisters an event handler to be called when a 'visibilitychange' event occurs |
211+
| `registerCapturedInteractionHandler(evtType: string, handler: EventListener) => void` | Registers an event handler to be called when the given event type is triggered on the `body` |
212+
| `deregisterCapturedInteractionHandler(evtType: string, handler: EventListener) => void` | Deregisters an event handler from the `body` |
211213
| `registerActionClickHandler(handler: EventListener) => void` | Registers an event handler to be called when a `click` event is triggered on the action element. |
212214
| `deregisterActionClickHandler(handler: EventListener) => void` | Deregisters an event handler from a `click` event on the action element. This will only be called with handlers that have previously been passed to `registerActionClickHandler` calls. |
213215
| `registerTransitionEndHandler(handler: EventListener) => void` | Registers an event handler to be called when an `transitionend` event is triggered on the root element. Note that you must account for vendor prefixes in order for this to work correctly. |

packages/mdc-snackbar/foundation.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ export default class MDCSnackbarFoundation extends MDCFoundation {
3232
removeClass: (/* className: string */) => {},
3333
setAriaHidden: () => {},
3434
unsetAriaHidden: () => {},
35-
setMessageText: (/* message: string */) => {},
36-
setActionText: (/* actionText: string */) => {},
3735
setActionAriaHidden: () => {},
3836
unsetActionAriaHidden: () => {},
37+
setActionText: (/* actionText: string */) => {},
38+
setMessageText: (/* message: string */) => {},
39+
setFocus: () => {},
3940
visibilityIsHidden: () => /* boolean */ false,
4041
registerBlurHandler: (/* handler: EventListener */) => {},
4142
deregisterBlurHandler: (/* handler: EventListener */) => {},
@@ -102,7 +103,7 @@ export default class MDCSnackbarFoundation extends MDCFoundation {
102103

103104
destroy() {
104105
this.adapter_.deregisterActionClickHandler(this.actionClickHandler_);
105-
this.adapter_.deregisterBlurHandler(this.focusHandler_);
106+
this.adapter_.deregisterBlurHandler(this.blurHandler_);
106107
this.adapter_.deregisterVisibilityChangeHandler(this.visibilitychangeHandler_);
107108
['touchstart', 'mousedown', 'focus'].forEach((evtType) => {
108109
this.adapter_.deregisterCapturedInteractionHandler(evtType, this.interactionHandler_);

test/unit/mdc-snackbar/foundation.test.js

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,19 @@ test('defaultAdapter returns a complete adapter implementation', () => {
4343

4444
assert.equal(methods.length, Object.keys(defaultAdapter).length, 'Every adapter key must be a function');
4545
assert.deepEqual(methods, [
46-
'addClass', 'removeClass', 'setAriaHidden', 'unsetAriaHidden', 'setMessageText',
47-
'setActionText', 'setActionAriaHidden', 'unsetActionAriaHidden', 'visibilityIsHidden',
46+
'addClass', 'removeClass', 'setAriaHidden', 'unsetAriaHidden', 'setActionAriaHidden',
47+
'unsetActionAriaHidden', 'setActionText', 'setMessageText', 'setFocus', 'visibilityIsHidden',
4848
'registerBlurHandler', 'deregisterBlurHandler', 'registerVisibilityChangeHandler',
4949
'deregisterVisibilityChangeHandler', 'registerCapturedInteractionHandler',
5050
'deregisterCapturedInteractionHandler', 'registerActionClickHandler',
51-
'deregisterActionClickHandler', 'registerTransitionEndHandler', 'deregisterTransitionEndHandler',
51+
'deregisterActionClickHandler', 'registerTransitionEndHandler',
52+
'deregisterTransitionEndHandler',
5253
]);
5354
// Test default methods
5455
methods.forEach((m) => assert.doesNotThrow(defaultAdapter[m]));
5556
});
5657

57-
test('#init calls adapter.registerActionClickHandler() with a action click handler function', () => {
58+
test('#init calls adapter.registerActionClickHandler() with an action click handler function', () => {
5859
const {foundation, mockAdapter} = setupTest();
5960
const {isA} = td.matchers;
6061

@@ -76,6 +77,30 @@ test('#destroy calls adapter.deregisterActionClickHandler() with a registerActio
7677
td.verify(mockAdapter.deregisterActionClickHandler(changeHandler));
7778
});
7879

80+
test('#destroy calls adapter.deregisterVisibilityChangeHandler() with a function', () => {
81+
const {foundation, mockAdapter} = setupTest();
82+
const {isA} = td.matchers;
83+
84+
foundation.destroy();
85+
td.verify(mockAdapter.deregisterVisibilityChangeHandler(isA(Function)));
86+
});
87+
88+
test('#destroy calls adapter.deregisterBlurHandler() with a function', () => {
89+
const {foundation, mockAdapter} = setupTest();
90+
const {isA} = td.matchers;
91+
92+
foundation.destroy();
93+
td.verify(mockAdapter.deregisterBlurHandler(isA(Function)));
94+
});
95+
96+
test('#destroy calls adapter.deregisterCapturedInteractionHandler() with an event type and function 3 times', () => {
97+
const {foundation, mockAdapter} = setupTest();
98+
const {isA} = td.matchers;
99+
100+
foundation.destroy();
101+
td.verify(mockAdapter.deregisterCapturedInteractionHandler(isA(String), isA(Function)), {times: 3});
102+
});
103+
79104
test('#init calls adapter.setAriaHidden to ensure snackbar starts hidden', () => {
80105
const {foundation, mockAdapter} = setupTest();
81106

@@ -313,6 +338,30 @@ test('#show will clean up snackbar after the timeout and transition end', () =>
313338
clock.uninstall();
314339
});
315340

341+
test('#show calls adapter.registerVisibilityChangeHandler() with a function', () => {
342+
const {foundation, mockAdapter} = setupTest();
343+
const {isA} = td.matchers;
344+
345+
foundation.show({message: 'foo'});
346+
td.verify(mockAdapter.registerVisibilityChangeHandler(isA(Function)));
347+
});
348+
349+
test('#show calls adapter.registerBlurHandler() with a function', () => {
350+
const {foundation, mockAdapter} = setupTest();
351+
const {isA} = td.matchers;
352+
353+
foundation.show({message: 'foo'});
354+
td.verify(mockAdapter.registerBlurHandler(isA(Function)));
355+
});
356+
357+
test('#show calls adapter.registerCapturedInteractionHandler() with an event type and function 3 times', () => {
358+
const {foundation, mockAdapter} = setupTest();
359+
const {isA} = td.matchers;
360+
361+
foundation.show({message: 'foo'});
362+
td.verify(mockAdapter.registerCapturedInteractionHandler(isA(String), isA(Function)), {times: 3});
363+
});
364+
316365
test('snackbar is dismissed after action button is pressed', () => {
317366
const {foundation, mockAdapter} = setupTest();
318367
const {isA} = td.matchers;
@@ -363,3 +412,23 @@ test('snackbar is not dismissed after action button is pressed if setDismissOnAc
363412

364413
td.verify(mockAdapter.removeClass(cssClasses.ACTIVE), {times: 0});
365414
});
415+
416+
test('snackbar is not dismissed if action button gets focus', () => {
417+
const {foundation, mockAdapter} = setupTest();
418+
const evtType = 'focus';
419+
const mockEvent = {type: 'focus'};
420+
let focusEvent;
421+
422+
td.when(mockAdapter.registerCapturedInteractionHandler(evtType, td.matchers.isA(Function)))
423+
.thenDo((evtType, handler) => {
424+
focusEvent = handler;
425+
});
426+
427+
foundation.init();
428+
foundation.show({message: 'foo'});
429+
focusEvent(mockEvent);
430+
431+
foundation.show({message: 'foo'});
432+
433+
td.verify(mockAdapter.removeClass(cssClasses.ACTIVE), {times: 0});
434+
});

test/unit/mdc-snackbar/mdc-snackbar.test.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,20 +118,24 @@ test('foundationAdapter#unsetActionAriaHidden removes "aria-hidden" from the act
118118
assert.isNotOk(actionButton.getAttribute('aria-hidden'));
119119
});
120120

121-
// TODO: return to this
122121
test('adapter#setFocus sets focus on the action button', () => {
123-
const {actionButton, component} = setupTest();
122+
const {root, actionButton, component} = setupTest();
123+
const handler = td.func('fixture focus handler');
124+
root.addEventListener('focus', handler);
125+
document.body.appendChild(root);
126+
124127
component.getDefaultFoundation().adapter_.setFocus();
128+
125129
assert.equal(document.activeElement, actionButton);
130+
document.body.removeChild(root);
126131
});
127132

128-
// TODO: return to this
129-
test.only('adapter#visibilityIsHidden returns the document.hidden property', () => {
133+
test('adapter#visibilityIsHidden returns the document.hidden property', () => {
130134
const {component} = setupTest();
131-
assert.isTrue(component.getDefaultFoundation().adapter_.visibilityIsHidden());
135+
assert.isFalse(component.getDefaultFoundation().adapter_.visibilityIsHidden());
132136
});
133137

134-
test.only('adapter#registerBlurHandler adds a handler to be called on a blur event', () => {
138+
test('adapter#registerBlurHandler adds a handler to be called on a blur event', () => {
135139
const {actionButton, component} = setupTest();
136140
const handler = td.func('blurHandler');
137141

@@ -141,7 +145,7 @@ test.only('adapter#registerBlurHandler adds a handler to be called on a blur eve
141145
td.verify(handler(td.matchers.anything()));
142146
});
143147

144-
test.only('adapter#deregisterBlurHandler removes a handler to be called on a blur event', () => {
148+
test('adapter#deregisterBlurHandler removes a handler to be called on a blur event', () => {
145149
const {actionButton, component} = setupTest();
146150
const handler = td.func('blurHandler');
147151

@@ -152,7 +156,7 @@ test.only('adapter#deregisterBlurHandler removes a handler to be called on a blu
152156
td.verify(handler(td.matchers.anything()), {times: 0});
153157
});
154158

155-
test.only('adapter#registerVisibilityChangeHandler adds a handler to be called on a visibilitychange event', () => {
159+
test('adapter#registerVisibilityChangeHandler adds a handler to be called on a visibilitychange event', () => {
156160
const {component} = setupTest();
157161
const handler = td.func('visibilitychangeHandler');
158162

@@ -162,7 +166,7 @@ test.only('adapter#registerVisibilityChangeHandler adds a handler to be called o
162166
td.verify(handler(td.matchers.anything()));
163167
});
164168

165-
test.only('adapter#deregisterVisibilityChangeHandler removes a handler to be called on a visibilitychange event', () => {
169+
test('adapter#deregisterVisibilityChangeHandler removes a handler to be called on a visibilitychange event', () => {
166170
const {component} = setupTest();
167171
const handler = td.func('visibilitychangeHandler');
168172

@@ -173,7 +177,7 @@ test.only('adapter#deregisterVisibilityChangeHandler removes a handler to be cal
173177
td.verify(handler(td.matchers.anything()), {times: 0});
174178
});
175179

176-
test.only('adapter#registerCapturedInteractionHandler adds a handler to be called when a given event occurs', () => {
180+
test('adapter#registerCapturedInteractionHandler adds a handler to be called when a given event occurs', () => {
177181
const {component} = setupTest();
178182
const handler = td.func('interactionHandler');
179183
const mockEvent = 'click';
@@ -184,7 +188,7 @@ test.only('adapter#registerCapturedInteractionHandler adds a handler to be calle
184188
td.verify(handler(td.matchers.anything()));
185189
});
186190

187-
test.only('adapter#deregisterCapturedInteractionHandler removes a handler to be called when a given event occurs', () => {
191+
test('adapter#deregisterCapturedInteractionHandler removes a handler to be called when a given event occurs', () => {
188192
const {component} = setupTest();
189193
const handler = td.func('interactionHandler');
190194
const mockEvent = 'click';

0 commit comments

Comments
 (0)