Skip to content

Commit eca1357

Browse files
asyncLizcopybara-github
authored andcommitted
fix: rename and move internal/controller/events
Split `internal/controller/events` into `internal/events/redispatch-event` and `internal/events/form-label-activation` PiperOrigin-RevId: 592350371
1 parent 57168f6 commit eca1357

File tree

13 files changed

+147
-116
lines changed

13 files changed

+147
-116
lines changed

button/internal/button.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
import {
2121
dispatchActivationClick,
2222
isActivationClick,
23-
} from '../../internal/events/events.js';
23+
} from '../../internal/events/form-label-activation.js';
2424
import {
2525
internals,
2626
mixinElementInternals,

checkbox/internal/checkbox.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import {requestUpdateOnAriaChange} from '../../internal/aria/delegate.js';
1616
import {
1717
dispatchActivationClick,
1818
isActivationClick,
19-
redispatchEvent,
20-
} from '../../internal/events/events.js';
19+
} from '../../internal/events/form-label-activation.js';
20+
import {redispatchEvent} from '../../internal/events/redispatch-event.js';
2121
import {
2222
createValidator,
2323
getValidityAnchor,

chips/internal/filter-chip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {html, nothing} from 'lit';
1010
import {property, query} from 'lit/decorators.js';
1111

1212
import {ARIAMixinStrict} from '../../internal/aria/aria.js';
13-
import {redispatchEvent} from '../../internal/events/events.js';
13+
import {redispatchEvent} from '../../internal/events/redispatch-event.js';
1414

1515
import {MultiActionChip} from './multi-action-chip.js';
1616
import {renderRemoveButton} from './trailing-icons.js';

dialog/internal/dialog.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {classMap} from 'lit/directives/class-map.js';
1212

1313
import {ARIAMixinStrict} from '../../internal/aria/aria.js';
1414
import {requestUpdateOnAriaChange} from '../../internal/aria/delegate.js';
15-
import {redispatchEvent} from '../../internal/events/events.js';
15+
import {redispatchEvent} from '../../internal/events/redispatch-event.js';
1616

1717
import {
1818
DIALOG_DEFAULT_CLOSE_ANIMATION,

internal/events/events.ts renamed to internal/events/form-label-activation.ts

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,6 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
/**
8-
* Re-dispatches an event from the provided element.
9-
*
10-
* This function is useful for forwarding non-composed events, such as `change`
11-
* events.
12-
*
13-
* @example
14-
* class MyInput extends LitElement {
15-
* render() {
16-
* return html`<input @change=${this.redispatchEvent}>`;
17-
* }
18-
*
19-
* protected redispatchEvent(event: Event) {
20-
* redispatchEvent(this, event);
21-
* }
22-
* }
23-
*
24-
* @param element The element to dispatch the event from.
25-
* @param event The event to re-dispatch.
26-
* @return Whether or not the event was dispatched (if cancelable).
27-
*/
28-
export function redispatchEvent(element: Element, event: Event) {
29-
// For bubbling events in SSR light DOM (or composed), stop their propagation
30-
// and dispatch the copy.
31-
if (event.bubbles && (!element.shadowRoot || event.composed)) {
32-
event.stopPropagation();
33-
}
34-
35-
const copy = Reflect.construct(event.constructor, [event.type, event]);
36-
const dispatched = element.dispatchEvent(copy);
37-
if (!dispatched) {
38-
event.preventDefault();
39-
}
40-
41-
return dispatched;
42-
}
43-
447
/**
458
* Dispatches a click event to the given element that triggers a native action,
469
* but is not composed and therefore is not seen outside the element.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/**
2+
* @license
3+
* Copyright 2021 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
// import 'jasmine'; (google3-only)
8+
9+
import {
10+
dispatchActivationClick,
11+
isActivationClick,
12+
} from './form-label-activation.js';
13+
14+
describe('label events', () => {
15+
let instance: HTMLDivElement;
16+
17+
beforeEach(() => {
18+
instance = document.createElement('div');
19+
instance
20+
.attachShadow({mode: 'open'})
21+
.append(document.createElement('slot'));
22+
// To have event.target set correctly, the EventTarget instance must be
23+
// attached to the DOM.
24+
document.body.appendChild(instance);
25+
});
26+
27+
afterEach(() => {
28+
document.body.removeChild(instance);
29+
});
30+
31+
describe('isActivationClick()', () => {
32+
it('returns true for click on listener', () => {
33+
const listener = jasmine.createSpy('listener', isActivationClick);
34+
listener.and.callThrough();
35+
instance.addEventListener('click', listener);
36+
instance.dispatchEvent(
37+
new MouseEvent('click', {bubbles: true, composed: true}),
38+
);
39+
expect(listener).toHaveBeenCalledTimes(1);
40+
expect(listener.calls.mostRecent().returnValue).toBe(true);
41+
});
42+
43+
it('returns false for click on element listener shadowRoot', () => {
44+
const listener = jasmine.createSpy('listener', isActivationClick);
45+
listener.and.callThrough();
46+
instance.addEventListener('click', listener);
47+
const innerEl = document.createElement('div');
48+
instance.shadowRoot!.append(innerEl);
49+
innerEl.dispatchEvent(
50+
new MouseEvent('click', {bubbles: true, composed: true}),
51+
);
52+
expect(listener).toHaveBeenCalledTimes(1);
53+
expect(listener.calls.mostRecent().returnValue).toBe(false);
54+
});
55+
56+
it('returns false for click on element listener child', () => {
57+
const listener = jasmine.createSpy('listener', isActivationClick);
58+
listener.and.callThrough();
59+
instance.addEventListener('click', listener);
60+
const slottedEl = document.createElement('div');
61+
instance.append(slottedEl);
62+
63+
slottedEl.dispatchEvent(
64+
new MouseEvent('click', {bubbles: true, composed: true}),
65+
);
66+
expect(listener).toHaveBeenCalledTimes(1);
67+
expect(listener.calls.mostRecent().returnValue).toBe(false);
68+
});
69+
});
70+
71+
describe('dispatchActivationClick()', () => {
72+
it('dispatches an event', () => {
73+
const innerEl = document.createElement('div');
74+
instance.shadowRoot!.append(innerEl);
75+
const listener = jasmine.createSpy('listener');
76+
innerEl.addEventListener('click', listener);
77+
dispatchActivationClick(innerEl);
78+
expect(listener).toHaveBeenCalledTimes(1);
79+
dispatchActivationClick(innerEl);
80+
expect(listener).toHaveBeenCalledTimes(2);
81+
});
82+
83+
it('dispatches an event that cannot be heard outside dispatching scope', () => {
84+
const innerEl = document.createElement('div');
85+
instance.shadowRoot!.append(innerEl);
86+
const listener = jasmine.createSpy('listener');
87+
instance.addEventListener('click', listener);
88+
dispatchActivationClick(innerEl);
89+
expect(listener).toHaveBeenCalledTimes(0);
90+
});
91+
});
92+
});

internal/events/redispatch-event.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* @license
3+
* Copyright 2021 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/**
8+
* Re-dispatches an event from the provided element.
9+
*
10+
* This function is useful for forwarding non-composed events, such as `change`
11+
* events.
12+
*
13+
* @example
14+
* class MyInput extends LitElement {
15+
* render() {
16+
* return html`<input @change=${this.redispatchEvent}>`;
17+
* }
18+
*
19+
* protected redispatchEvent(event: Event) {
20+
* redispatchEvent(this, event);
21+
* }
22+
* }
23+
*
24+
* @param element The element to dispatch the event from.
25+
* @param event The event to re-dispatch.
26+
* @return Whether or not the event was dispatched (if cancelable).
27+
*/
28+
export function redispatchEvent(element: Element, event: Event) {
29+
// For bubbling events in SSR light DOM (or composed), stop their propagation
30+
// and dispatch the copy.
31+
if (event.bubbles && (!element.shadowRoot || event.composed)) {
32+
event.stopPropagation();
33+
}
34+
35+
const copy = Reflect.construct(event.constructor, [event.type, event]);
36+
const dispatched = element.dispatchEvent(copy);
37+
if (!dispatched) {
38+
event.preventDefault();
39+
}
40+
41+
return dispatched;
42+
}

internal/events/events_test.ts renamed to internal/events/redispatch-event_test.ts

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66

77
// import 'jasmine'; (google3-only)
88

9-
import {
10-
dispatchActivationClick,
11-
isActivationClick,
12-
redispatchEvent,
13-
} from './events.js';
9+
import {redispatchEvent} from './redispatch-event.js';
1410

1511
describe('events', () => {
1612
let instance: HTMLDivElement;
@@ -119,66 +115,4 @@ describe('events', () => {
119115
.toBe('bar');
120116
});
121117
});
122-
123-
describe('isActivationClick()', () => {
124-
it('returns true for click on listener', () => {
125-
const listener = jasmine.createSpy('listener', isActivationClick);
126-
listener.and.callThrough();
127-
instance.addEventListener('click', listener);
128-
instance.dispatchEvent(
129-
new MouseEvent('click', {bubbles: true, composed: true}),
130-
);
131-
expect(listener).toHaveBeenCalledTimes(1);
132-
expect(listener.calls.mostRecent().returnValue).toBe(true);
133-
});
134-
135-
it('returns false for click on element listener shadowRoot', () => {
136-
const listener = jasmine.createSpy('listener', isActivationClick);
137-
listener.and.callThrough();
138-
instance.addEventListener('click', listener);
139-
const innerEl = document.createElement('div');
140-
instance.shadowRoot!.append(innerEl);
141-
innerEl.dispatchEvent(
142-
new MouseEvent('click', {bubbles: true, composed: true}),
143-
);
144-
expect(listener).toHaveBeenCalledTimes(1);
145-
expect(listener.calls.mostRecent().returnValue).toBe(false);
146-
});
147-
148-
it('returns false for click on element listener child', () => {
149-
const listener = jasmine.createSpy('listener', isActivationClick);
150-
listener.and.callThrough();
151-
instance.addEventListener('click', listener);
152-
const slottedEl = document.createElement('div');
153-
instance.append(slottedEl);
154-
155-
slottedEl.dispatchEvent(
156-
new MouseEvent('click', {bubbles: true, composed: true}),
157-
);
158-
expect(listener).toHaveBeenCalledTimes(1);
159-
expect(listener.calls.mostRecent().returnValue).toBe(false);
160-
});
161-
});
162-
163-
describe('dispatchActivationClick()', () => {
164-
it('dispatches an event', () => {
165-
const innerEl = document.createElement('div');
166-
instance.shadowRoot!.append(innerEl);
167-
const listener = jasmine.createSpy('listener');
168-
innerEl.addEventListener('click', listener);
169-
dispatchActivationClick(innerEl);
170-
expect(listener).toHaveBeenCalledTimes(1);
171-
dispatchActivationClick(innerEl);
172-
expect(listener).toHaveBeenCalledTimes(2);
173-
});
174-
175-
it('dispatches an event that cannot be heard outside dispatching scope', () => {
176-
const innerEl = document.createElement('div');
177-
instance.shadowRoot!.append(innerEl);
178-
const listener = jasmine.createSpy('listener');
179-
instance.addEventListener('click', listener);
180-
dispatchActivationClick(innerEl);
181-
expect(listener).toHaveBeenCalledTimes(0);
182-
});
183-
});
184118
});

radio/internal/radio.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {html, isServer, LitElement} from 'lit';
1111
import {property, query} from 'lit/decorators.js';
1212
import {classMap} from 'lit/directives/class-map.js';
1313

14-
import {isActivationClick} from '../../internal/events/events.js';
14+
import {isActivationClick} from '../../internal/events/form-label-activation.js';
1515
import {
1616
createValidator,
1717
getValidityAnchor,

select/internal/select.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {html as staticHtml, StaticValue} from 'lit/static-html.js';
1515
import {Field} from '../../field/internal/field.js';
1616
import {ARIAMixinStrict} from '../../internal/aria/aria.js';
1717
import {requestUpdateOnAriaChange} from '../../internal/aria/delegate.js';
18-
import {redispatchEvent} from '../../internal/events/events.js';
18+
import {redispatchEvent} from '../../internal/events/redispatch-event.js';
1919
import {
2020
createValidator,
2121
getValidityAnchor,

0 commit comments

Comments
 (0)