@@ -52,6 +52,7 @@ import {MatFormFieldLineRipple} from './directives/line-ripple';
5252import { MatFormFieldNotchedOutline } from './directives/notched-outline' ;
5353import { MAT_PREFIX , MatPrefix } from './directives/prefix' ;
5454import { MAT_SUFFIX , MatSuffix } from './directives/suffix' ;
55+ import { DOCUMENT } from '@angular/common' ;
5556
5657/** Type for the available floatLabel values. */
5758export type FloatLabelType = 'always' | 'auto' ;
@@ -308,7 +309,8 @@ export class MatFormField implements AfterViewInit, OnDestroy, AfterContentCheck
308309 private _platform : Platform ,
309310 @Optional ( ) @Inject ( MAT_FORM_FIELD_DEFAULT_OPTIONS )
310311 private _defaults ?: MatFormFieldDefaultOptions ,
311- @Optional ( ) @Inject ( ANIMATION_MODULE_TYPE ) public _animationMode ?: string ) {
312+ @Optional ( ) @Inject ( ANIMATION_MODULE_TYPE ) public _animationMode ?: string ,
313+ @Inject ( DOCUMENT ) private _document ?: any ) {
312314 if ( _defaults && _defaults . appearance ) {
313315 this . appearance = _defaults . appearance ;
314316 } else if ( _defaults && _defaults . hideRequiredMarker ) {
@@ -341,6 +343,20 @@ export class MatFormField implements AfterViewInit, OnDestroy, AfterContentCheck
341343 // Initial notch width update. This is needed in case the text-field label floats
342344 // on initialization, and renders inside of the notched outline.
343345 this . _refreshOutlineNotchWidth ( ) ;
346+ // Make sure fonts are loaded before calculating the width.
347+ // zone.js currently doesn't patch the FontFaceSet API so two calls to
348+ // _refreshOutlineNotchWidth is needed for this to work properly in async tests.
349+ // Furthermore if the font takes a long time to load we want the outline notch to be close
350+ // to the correct width from the start then correct itself when the fonts load.
351+ if ( this . _document ?. fonts ?. ready ) {
352+ this . _document . fonts . ready . then ( ( ) => {
353+ this . _refreshOutlineNotchWidth ( ) ;
354+ this . _changeDetectorRef . markForCheck ( ) ;
355+ } ) ;
356+ } else {
357+ // FontFaceSet is not supported in IE
358+ setTimeout ( ( ) => this . _refreshOutlineNotchWidth ( ) , 100 ) ;
359+ }
344360 // Enable animations now. This ensures we don't animate on initial render.
345361 this . _subscriptAnimationState = 'enter' ;
346362 // Because the above changes a value used in the template after it was checked, we need
0 commit comments