Skip to content

Commit 6cfe5c4

Browse files
crisbetojelbourn
authored andcommitted
feat: move FocusMonitor into cdk (#6921)
Moves the `FocusOriginMonitor` into `@angular/cdk/a11y`, renames it to `FocusMonitor`, deprecates the `StyleModule` and updates all the references. BREAKING CHANGE: `FocusOriginMonitor` has been renamed to `FocusMonitor`.
1 parent e4a9323 commit 6cfe5c4

27 files changed

+118
-126
lines changed

src/lib/core/style/focus-origin-monitor.spec.ts renamed to src/cdk/a11y/focus-monitor.spec.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
import {ComponentFixture, inject, TestBed, fakeAsync, tick} from '@angular/core/testing';
22
import {Component, Renderer2} from '@angular/core';
3-
import {StyleModule} from './index';
3+
import {A11yModule} from './index';
44
import {By} from '@angular/platform-browser';
5-
import {TAB} from '../keyboard/keycodes';
6-
import {FocusOrigin, FocusOriginMonitor, TOUCH_BUFFER_MS} from './focus-origin-monitor';
5+
import {TAB} from '@angular/cdk/keycodes';
6+
import {FocusOrigin, FocusMonitor, TOUCH_BUFFER_MS} from './focus-monitor';
77
import {dispatchFakeEvent, dispatchKeyboardEvent, dispatchMouseEvent} from '@angular/cdk/testing';
88

99

10-
describe('FocusOriginMonitor', () => {
10+
describe('FocusMonitor', () => {
1111
let fixture: ComponentFixture<PlainButton>;
1212
let buttonElement: HTMLElement;
1313
let buttonRenderer: Renderer2;
14-
let focusOriginMonitor: FocusOriginMonitor;
14+
let focusMonitor: FocusMonitor;
1515
let changeHandler: (origin: FocusOrigin) => void;
1616

1717
beforeEach(() => {
1818
TestBed.configureTestingModule({
19-
imports: [StyleModule],
19+
imports: [A11yModule],
2020
declarations: [
2121
PlainButton,
2222
],
2323
}).compileComponents();
2424
});
2525

26-
beforeEach(inject([FocusOriginMonitor], (fom: FocusOriginMonitor) => {
26+
beforeEach(inject([FocusMonitor], (fm: FocusMonitor) => {
2727
fixture = TestBed.createComponent(PlainButton);
2828
fixture.detectChanges();
2929

3030
buttonElement = fixture.debugElement.query(By.css('button')).nativeElement;
3131
buttonRenderer = fixture.componentInstance.renderer;
32-
focusOriginMonitor = fom;
32+
focusMonitor = fm;
3333

3434
changeHandler = jasmine.createSpy('focus origin change handler');
35-
focusOriginMonitor.monitor(buttonElement, buttonRenderer, false).subscribe(changeHandler);
35+
focusMonitor.monitor(buttonElement, buttonRenderer, false).subscribe(changeHandler);
3636
patchElementFocus(buttonElement);
3737
}));
3838

@@ -110,7 +110,7 @@ describe('FocusOriginMonitor', () => {
110110
}));
111111

112112
it('focusVia keyboard should simulate keyboard focus', fakeAsync(() => {
113-
focusOriginMonitor.focusVia(buttonElement, 'keyboard');
113+
focusMonitor.focusVia(buttonElement, 'keyboard');
114114
tick();
115115

116116
expect(buttonElement.classList.length)
@@ -123,7 +123,7 @@ describe('FocusOriginMonitor', () => {
123123
}));
124124

125125
it('focusVia mouse should simulate mouse focus', fakeAsync(() => {
126-
focusOriginMonitor.focusVia(buttonElement, 'mouse');
126+
focusMonitor.focusVia(buttonElement, 'mouse');
127127
fixture.detectChanges();
128128
tick();
129129

@@ -137,7 +137,7 @@ describe('FocusOriginMonitor', () => {
137137
}));
138138

139139
it('focusVia mouse should simulate mouse focus', fakeAsync(() => {
140-
focusOriginMonitor.focusVia(buttonElement, 'touch');
140+
focusMonitor.focusVia(buttonElement, 'touch');
141141
fixture.detectChanges();
142142
tick();
143143

@@ -151,7 +151,7 @@ describe('FocusOriginMonitor', () => {
151151
}));
152152

153153
it('focusVia program should simulate programmatic focus', fakeAsync(() => {
154-
focusOriginMonitor.focusVia(buttonElement, 'program');
154+
focusMonitor.focusVia(buttonElement, 'program');
155155
fixture.detectChanges();
156156
tick();
157157

@@ -175,7 +175,7 @@ describe('FocusOriginMonitor', () => {
175175

176176
// Call `blur` directly because invoking `buttonElement.blur()` does not always trigger the
177177
// handler on IE11 on SauceLabs.
178-
focusOriginMonitor._onBlur({} as any, buttonElement);
178+
focusMonitor._onBlur({} as any, buttonElement);
179179
fixture.detectChanges();
180180

181181
expect(buttonElement.classList.length)
@@ -191,7 +191,7 @@ describe('FocusOriginMonitor', () => {
191191
expect(buttonElement.classList.length)
192192
.toBe(2, 'button should have exactly 2 focus classes');
193193

194-
focusOriginMonitor.stopMonitoring(buttonElement);
194+
focusMonitor.stopMonitoring(buttonElement);
195195
fixture.detectChanges();
196196

197197
expect(buttonElement.classList.length).toBe(0, 'button should not have any focus classes');
@@ -202,7 +202,7 @@ describe('FocusOriginMonitor', () => {
202202
describe('cdkMonitorFocus', () => {
203203
beforeEach(() => {
204204
TestBed.configureTestingModule({
205-
imports: [StyleModule],
205+
imports: [A11yModule],
206206
declarations: [
207207
ButtonWithFocusClasses,
208208
ComplexComponentWithMonitorElementFocus,

src/lib/core/style/focus-origin-monitor.ts renamed to src/cdk/a11y/focus-monitor.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import {
1818
Renderer2,
1919
SkipSelf,
2020
} from '@angular/core';
21+
import {Platform} from '@angular/cdk/platform';
2122
import {Observable} from 'rxjs/Observable';
2223
import {Subject} from 'rxjs/Subject';
2324
import {Subscription} from 'rxjs/Subscription';
24-
import {Platform} from '../platform/platform';
2525
import {of as observableOf} from 'rxjs/observable/of';
2626

2727

@@ -43,11 +43,11 @@ type MonitoredElementInfo = {
4343

4444
/** Monitors mouse and keyboard events to determine the cause of focus events. */
4545
@Injectable()
46-
export class FocusOriginMonitor {
46+
export class FocusMonitor {
4747
/** The focus origin that the next focus event is a result of. */
4848
private _origin: FocusOrigin = null;
4949

50-
/** The FocusOrigin of the last focus event tracked by the FocusOriginMonitor. */
50+
/** The FocusOrigin of the last focus event tracked by the FocusMonitor. */
5151
private _lastFocusOrigin: FocusOrigin;
5252

5353
/** Whether the window has just been focused. */
@@ -320,30 +320,30 @@ export class CdkMonitorFocus implements OnDestroy {
320320
private _monitorSubscription: Subscription;
321321
@Output() cdkFocusChange = new EventEmitter<FocusOrigin>();
322322

323-
constructor(private _elementRef: ElementRef, private _focusOriginMonitor: FocusOriginMonitor,
323+
constructor(private _elementRef: ElementRef, private _focusMonitor: FocusMonitor,
324324
renderer: Renderer2) {
325-
this._monitorSubscription = this._focusOriginMonitor.monitor(
325+
this._monitorSubscription = this._focusMonitor.monitor(
326326
this._elementRef.nativeElement, renderer,
327327
this._elementRef.nativeElement.hasAttribute('cdkMonitorSubtreeFocus'))
328328
.subscribe(origin => this.cdkFocusChange.emit(origin));
329329
}
330330

331331
ngOnDestroy() {
332-
this._focusOriginMonitor.stopMonitoring(this._elementRef.nativeElement);
332+
this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);
333333
this._monitorSubscription.unsubscribe();
334334
}
335335
}
336336

337337
/** @docs-private */
338-
export function FOCUS_ORIGIN_MONITOR_PROVIDER_FACTORY(
339-
parentDispatcher: FocusOriginMonitor, ngZone: NgZone, platform: Platform) {
340-
return parentDispatcher || new FocusOriginMonitor(ngZone, platform);
338+
export function FOCUS_MONITOR_PROVIDER_FACTORY(
339+
parentDispatcher: FocusMonitor, ngZone: NgZone, platform: Platform) {
340+
return parentDispatcher || new FocusMonitor(ngZone, platform);
341341
}
342342

343343
/** @docs-private */
344-
export const FOCUS_ORIGIN_MONITOR_PROVIDER = {
345-
// If there is already a FocusOriginMonitor available, use that. Otherwise, provide a new one.
346-
provide: FocusOriginMonitor,
347-
deps: [[new Optional(), new SkipSelf(), FocusOriginMonitor], NgZone, Platform],
348-
useFactory: FOCUS_ORIGIN_MONITOR_PROVIDER_FACTORY
344+
export const FOCUS_MONITOR_PROVIDER = {
345+
// If there is already a FocusMonitor available, use that. Otherwise, provide a new one.
346+
provide: FocusMonitor,
347+
deps: [[new Optional(), new SkipSelf(), FocusMonitor], NgZone, Platform],
348+
useFactory: FOCUS_MONITOR_PROVIDER_FACTORY
349349
};

src/cdk/a11y/public_api.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,19 @@ import {InteractivityChecker} from './interactivity-checker';
1313
import {CommonModule} from '@angular/common';
1414
import {PlatformModule} from '@angular/cdk/platform';
1515
import {AriaDescriber, ARIA_DESCRIBER_PROVIDER} from './aria-describer';
16+
import {CdkMonitorFocus, FOCUS_MONITOR_PROVIDER} from './focus-monitor';
1617

1718
@NgModule({
1819
imports: [CommonModule, PlatformModule],
19-
declarations: [FocusTrapDirective, FocusTrapDeprecatedDirective],
20-
exports: [FocusTrapDirective, FocusTrapDeprecatedDirective],
20+
declarations: [FocusTrapDirective, FocusTrapDeprecatedDirective, CdkMonitorFocus],
21+
exports: [FocusTrapDirective, FocusTrapDeprecatedDirective, CdkMonitorFocus],
2122
providers: [
2223
InteractivityChecker,
2324
FocusTrapFactory,
2425
AriaDescriber,
2526
LIVE_ANNOUNCER_PROVIDER,
26-
ARIA_DESCRIBER_PROVIDER
27+
ARIA_DESCRIBER_PROVIDER,
28+
FOCUS_MONITOR_PROVIDER,
2729
]
2830
})
2931
export class A11yModule {}
@@ -36,3 +38,4 @@ export * from './focus-trap';
3638
export * from './interactivity-checker';
3739
export * from './list-key-manager';
3840
export * from './live-announcer';
41+
export * from './focus-monitor';

src/demo-app/demo-app/demo-app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export class DemoApp {
7878
{name: 'Toolbar', route: '/toolbar'},
7979
{name: 'Tooltip', route: '/tooltip'},
8080
{name: 'Platform', route: '/platform'},
81-
{name: 'Style', route: '/style'},
81+
{name: 'Focus Origin', route: '/focus-origin'},
8282
{name: 'Typography', route: '/typography'}
8383
];
8484

src/demo-app/demo-app/demo-module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import {FoggyTabContent, RainyTabContent, SunnyTabContent, TabsDemo} from '../ta
3434
import {PlatformDemo} from '../platform/platform-demo';
3535
import {AutocompleteDemo} from '../autocomplete/autocomplete-demo';
3636
import {InputDemo} from '../input/input-demo';
37-
import {StyleDemo} from '../style/style-demo';
37+
import {FocusOriginDemo} from '../focus-origin/focus-origin-demo';
3838
import {TableDemo} from '../table/table-demo';
3939
import {PeopleDatabase} from '../table/people-database';
4040
import {DatepickerDemo} from '../datepicker/datepicker-demo';
@@ -94,7 +94,7 @@ import {TableHeaderDemo} from '../table/table-header-demo';
9494
SlideToggleDemo,
9595
SpagettiPanel,
9696
StepperDemo,
97-
StyleDemo,
97+
FocusOriginDemo,
9898
TableHeaderDemo,
9999
ToolbarDemo,
100100
TooltipDemo,

src/demo-app/demo-app/routes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {TABS_DEMO_ROUTES} from '../tabs/routes';
3131
import {PlatformDemo} from '../platform/platform-demo';
3232
import {AutocompleteDemo} from '../autocomplete/autocomplete-demo';
3333
import {InputDemo} from '../input/input-demo';
34-
import {StyleDemo} from '../style/style-demo';
34+
import {FocusOriginDemo} from '../focus-origin/focus-origin-demo';
3535
import {DatepickerDemo} from '../datepicker/datepicker-demo';
3636
import {TableDemo} from '../table/table-demo';
3737
import {TypographyDemo} from '../typography/typography-demo';
@@ -76,7 +76,7 @@ export const DEMO_APP_ROUTES: Routes = [
7676
{path: 'tooltip', component: TooltipDemo},
7777
{path: 'snack-bar', component: SnackBarDemo},
7878
{path: 'platform', component: PlatformDemo},
79-
{path: 'style', component: StyleDemo},
79+
{path: 'focus-origin', component: FocusOriginDemo},
8080
{path: 'typography', component: TypographyDemo},
8181
{path: 'expansion', component: ExpansionDemo},
8282
{path: 'stepper', component: StepperDemo}

src/demo-app/demo-material-module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
MdTooltipModule,
3232
MdStepperModule,
3333
} from '@angular/material';
34-
import {StyleModule, MdNativeDateModule, MdRippleModule} from '@angular/material';
34+
import {MdNativeDateModule, MdRippleModule} from '@angular/material';
3535
import {CdkTableModule} from '@angular/cdk/table';
3636
import {A11yModule} from '@angular/cdk/a11y';
3737
import {BidiModule} from '@angular/cdk/bidi';
@@ -78,7 +78,6 @@ import {PortalModule} from '@angular/cdk/portal';
7878
MdTooltipModule,
7979
MdNativeDateModule,
8080
CdkTableModule,
81-
StyleModule,
8281
A11yModule,
8382
BidiModule,
8483
ObserversModule,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import {Component} from '@angular/core';
2+
import {FocusMonitor} from '@angular/cdk/a11y';
3+
4+
5+
@Component({
6+
moduleId: module.id,
7+
selector: 'focus-origin-demo',
8+
templateUrl: 'focus-origin-demo.html',
9+
styleUrls: ['focus-origin-demo.css'],
10+
})
11+
export class FocusOriginDemo {
12+
constructor(public fom: FocusMonitor) {}
13+
}

src/demo-app/style/style-demo.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/lib/button-toggle/button-toggle.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ import {
2727
} from '@angular/core';
2828
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';
2929
import {coerceBooleanProperty} from '@angular/cdk/coercion';
30-
import {UniqueSelectionDispatcher, FocusOriginMonitor} from '@angular/material/core';
30+
import {UniqueSelectionDispatcher} from '@angular/material/core';
3131
import {CanDisable, mixinDisabled} from '@angular/material/core';
32+
import {FocusMonitor} from '@angular/cdk/a11y';
3233

3334
/** Acceptable types for a button toggle. */
3435
export type ToggleType = 'checkbox' | 'radio';
@@ -371,7 +372,7 @@ export class MdButtonToggle implements OnInit, OnDestroy {
371372
private _buttonToggleDispatcher: UniqueSelectionDispatcher,
372373
private _renderer: Renderer2,
373374
private _elementRef: ElementRef,
374-
private _focusOriginMonitor: FocusOriginMonitor) {
375+
private _focusMonitor: FocusMonitor) {
375376

376377
this.buttonToggleGroup = toggleGroup;
377378
this.buttonToggleGroupMultiple = toggleGroupMultiple;
@@ -404,7 +405,7 @@ export class MdButtonToggle implements OnInit, OnDestroy {
404405
if (this.buttonToggleGroup && this._value == this.buttonToggleGroup.value) {
405406
this._checked = true;
406407
}
407-
this._focusOriginMonitor.monitor(this._elementRef.nativeElement, this._renderer, true);
408+
this._focusMonitor.monitor(this._elementRef.nativeElement, this._renderer, true);
408409
}
409410

410411
/** Focuses the button. */

src/lib/button-toggle/public_api.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,12 @@
88

99
import {NgModule} from '@angular/core';
1010
import {MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle} from './button-toggle';
11-
import {
12-
UNIQUE_SELECTION_DISPATCHER_PROVIDER,
13-
MdCommonModule,
14-
StyleModule,
15-
} from '@angular/material/core';
11+
import {UNIQUE_SELECTION_DISPATCHER_PROVIDER, MdCommonModule} from '@angular/material/core';
12+
import {A11yModule} from '@angular/cdk/a11y';
1613

1714

1815
@NgModule({
19-
imports: [MdCommonModule, StyleModule],
16+
imports: [MdCommonModule, A11yModule],
2017
exports: [
2118
MdButtonToggleGroup,
2219
MdButtonToggleGroupMultiple,

src/lib/button/button.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ import {
2424
CanColor,
2525
CanDisable,
2626
CanDisableRipple,
27-
FocusOriginMonitor,
2827
mixinColor,
2928
mixinDisabled,
3029
mixinDisableRipple
3130
} from '@angular/material/core';
31+
import {FocusMonitor} from '@angular/cdk/a11y';
3232

3333

3434
// TODO(kara): Convert attribute selectors to classes when attr maps become available
@@ -142,13 +142,13 @@ export class MdButton extends _MdButtonMixinBase
142142
constructor(renderer: Renderer2,
143143
elementRef: ElementRef,
144144
private _platform: Platform,
145-
private _focusOriginMonitor: FocusOriginMonitor) {
145+
private _focusMonitor: FocusMonitor) {
146146
super(renderer, elementRef);
147-
this._focusOriginMonitor.monitor(this._elementRef.nativeElement, this._renderer, true);
147+
this._focusMonitor.monitor(this._elementRef.nativeElement, this._renderer, true);
148148
}
149149

150150
ngOnDestroy() {
151-
this._focusOriginMonitor.stopMonitoring(this._elementRef.nativeElement);
151+
this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);
152152
}
153153

154154
/** Focuses the button. */
@@ -206,10 +206,10 @@ export class MdButton extends _MdButtonMixinBase
206206
export class MdAnchor extends MdButton {
207207
constructor(
208208
platform: Platform,
209-
focusOriginMonitor: FocusOriginMonitor,
209+
focusMonitor: FocusMonitor,
210210
elementRef: ElementRef,
211211
renderer: Renderer2) {
212-
super(renderer, elementRef, platform, focusOriginMonitor);
212+
super(renderer, elementRef, platform, focusMonitor);
213213
}
214214

215215
_haltDisabledEvents(event: Event) {

0 commit comments

Comments
 (0)