From 06c2784fcf96b70ec936b4d8f8877cefb229645b Mon Sep 17 00:00:00 2001 From: Ron Lapushner Date: Mon, 21 Sep 2020 18:52:29 +0300 Subject: [PATCH 1/2] fix(youtube-player): YT.Player is not a constructor fixes a race condition where window.YT would be truthy but window.YT.Player would not be ready. Fixes #20598 --- src/youtube-player/youtube-player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/youtube-player/youtube-player.ts b/src/youtube-player/youtube-player.ts index a34a7f5b624a..8fa42c288acd 100644 --- a/src/youtube-player/youtube-player.ts +++ b/src/youtube-player/youtube-player.ts @@ -210,7 +210,7 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy, OnInit { } let iframeApiAvailableObs: Observable = observableOf(true); - if (!window.YT) { + if (!window.YT || !window.YT.Player) { if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) { throw new Error('Namespace YT not found, cannot construct embedded youtube player. ' + 'Please install the YouTube Player API Reference for iframe Embeds: ' + From 40024bd604df6e69112ab481a1fbea600a4ad258 Mon Sep 17 00:00:00 2001 From: Ron Lapushner Date: Tue, 29 Sep 2020 02:07:11 +0300 Subject: [PATCH 2/2] fix(youtube-player): YT.Player is not a constructor test added a test to prevent reggression, the test mimics a possible state of the YT object when loading, when window.YT exists but window.YT.Player does not. Fixes angular#20598 --- src/youtube-player/youtube-player.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/youtube-player/youtube-player.spec.ts b/src/youtube-player/youtube-player.spec.ts index 84bc1b947efd..864b6ac89d18 100644 --- a/src/youtube-player/youtube-player.spec.ts +++ b/src/youtube-player/youtube-player.spec.ts @@ -6,6 +6,7 @@ import {createFakeYtNamespace} from './fake-youtube-player'; import {Subscription} from 'rxjs'; const VIDEO_ID = 'a12345'; +const YT_LOADING_STATE_MOCK = {loading: 1, loaded: 0}; describe('YoutubePlayer', () => { let playerCtorSpy: jasmine.Spy; @@ -381,6 +382,8 @@ describe('YoutubePlayer', () => { }); it('waits until the api is ready before initializing', () => { + (window.YT as any) = YT_LOADING_STATE_MOCK; + fixture = TestBed.createComponent(TestApp); testComponent = fixture.debugElement.componentInstance; fixture.detectChanges();