diff --git a/src/lib/progress-bar/progress-bar.html b/src/lib/progress-bar/progress-bar.html index 642428d02e42..76b0f9575bdf 100644 --- a/src/lib/progress-bar/progress-bar.html +++ b/src/lib/progress-bar/progress-bar.html @@ -8,7 +8,7 @@ - +
diff --git a/src/lib/progress-bar/progress-bar.spec.ts b/src/lib/progress-bar/progress-bar.spec.ts index d4279137615d..9fb907143b21 100644 --- a/src/lib/progress-bar/progress-bar.spec.ts +++ b/src/lib/progress-bar/progress-bar.spec.ts @@ -96,7 +96,7 @@ describe('MatProgressBar', () => { it('should prefix SVG references with the current path', () => { const rect = fixture.debugElement.query(By.css('rect')).nativeElement; - expect(rect.getAttribute('fill')).toMatch(/^url\(\/fake-path#.*\)$/); + expect(rect.getAttribute('fill')).toMatch(/^url\(['"]\/fake-path#.*['"]\)$/); }); it('should not be able to tab into the underlying SVG element', () => { diff --git a/src/lib/progress-bar/progress-bar.ts b/src/lib/progress-bar/progress-bar.ts index bfde01c66c85..5124cd55b3cd 100644 --- a/src/lib/progress-bar/progress-bar.ts +++ b/src/lib/progress-bar/progress-bar.ts @@ -55,12 +55,6 @@ let progressbarId = 0; encapsulation: ViewEncapsulation.None, }) export class MatProgressBar extends _MatProgressBarMixinBase implements CanColor { - /** - * Current page path. Used to prefix SVG references which - * won't work on Safari unless they're prefixed with the path. - */ - _currentPath: string; - constructor(public _elementRef: ElementRef, @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string, /** @@ -69,7 +63,11 @@ export class MatProgressBar extends _MatProgressBarMixinBase implements CanColor */ @Optional() location?: Location) { super(_elementRef); - this._currentPath = location ? location.path() : ''; + + // We need to prefix the SVG reference with the current path, otherwise they won't work + // in Safari if the page has a `` tag. Note that we need quotes inside the `url()`, + // because named route URLs can contain parentheses (see #12338). + this._rectangleFillValue = `url('${location ? location.path() : ''}#${this.progressbarId}')`; } /** Value of the progress bar. Defaults to zero. Mirrored to aria-valuenow. */ @@ -93,9 +91,12 @@ export class MatProgressBar extends _MatProgressBarMixinBase implements CanColor */ @Input() mode: 'determinate' | 'indeterminate' | 'buffer' | 'query' = 'determinate'; - /** The id of the progress bar. */ + /** ID of the progress bar. */ progressbarId = `mat-progress-bar-${progressbarId++}`; + /** Attribute to be used for the `fill` attribute on the internal `rect` element. */ + _rectangleFillValue: string; + /** Gets the current transform value for the progress bar's primary indicator. */ _primaryTransform() { const scale = this.value / 100;