Skip to content

Commit b4ab526

Browse files
authored
perf: Prevent CastSender initialization on CastProxy on unsupported browsers (#7995)
1 parent 455163f commit b4ab526

File tree

2 files changed

+53
-10
lines changed

2 files changed

+53
-10
lines changed

lib/cast/cast_proxy.js

+48-10
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,21 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
8181
this.compiledToExternNames_ = new Map();
8282

8383
/** @private {shaka.cast.CastSender} */
84-
this.sender_ = new shaka.cast.CastSender(
85-
receiverAppId,
86-
() => this.onCastStatusChanged_(),
87-
() => this.onFirstCastStateUpdate_(),
88-
(targetName, event) => this.onRemoteEvent_(targetName, event),
89-
() => this.onResumeLocal_(),
90-
() => this.getInitState_(),
91-
androidReceiverCompatible);
92-
84+
this.sender_ = null;
9385

94-
this.init_();
86+
if (window.chrome) {
87+
this.sender_ = new shaka.cast.CastSender(
88+
receiverAppId,
89+
() => this.onCastStatusChanged_(),
90+
() => this.onFirstCastStateUpdate_(),
91+
(targetName, event) => this.onRemoteEvent_(targetName, event),
92+
() => this.onResumeLocal_(),
93+
() => this.getInitState_(),
94+
androidReceiverCompatible);
95+
this.init_();
96+
} else {
97+
this.initWithoutSender_();
98+
}
9599
}
96100

97101
/**
@@ -163,6 +167,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
163167
* @export
164168
*/
165169
canCast() {
170+
if (!this.sender_) {
171+
return false;
172+
}
166173
return this.sender_.apiReady() && this.sender_.hasReceivers();
167174
}
168175

@@ -171,6 +178,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
171178
* @export
172179
*/
173180
isCasting() {
181+
if (!this.sender_) {
182+
return false;
183+
}
174184
return this.sender_.isCasting();
175185
}
176186

@@ -179,6 +189,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
179189
* @export
180190
*/
181191
receiverName() {
192+
if (!this.sender_) {
193+
return '';
194+
}
182195
return this.sender_.receiverName();
183196
}
184197

@@ -188,6 +201,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
188201
* @export
189202
*/
190203
async cast() {
204+
if (!this.sender_) {
205+
return;
206+
}
191207
// TODO: transfer manually-selected tracks?
192208
// TODO: transfer side-loaded text tracks?
193209

@@ -208,6 +224,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
208224
* @export
209225
*/
210226
setAppData(appData) {
227+
if (!this.sender_) {
228+
return;
229+
}
211230
this.sender_.setAppData(appData);
212231
}
213232

@@ -216,6 +235,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
216235
* @export
217236
*/
218237
suggestDisconnect() {
238+
if (!this.sender_) {
239+
return;
240+
}
219241
this.sender_.showDisconnectDialog();
220242
}
221243

@@ -224,6 +246,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
224246
* @export
225247
*/
226248
forceDisconnect() {
249+
if (!this.sender_) {
250+
return;
251+
}
227252
this.sender_.forceDisconnect();
228253
}
229254

@@ -243,6 +268,10 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
243268
this.receiverAppId_ = newAppId;
244269
this.androidReceiverCompatible_ = newCastAndroidReceiver;
245270

271+
if (!this.sender_) {
272+
return;
273+
}
274+
246275
// Destroy the old sender
247276
this.sender_.forceDisconnect();
248277
await this.sender_.destroy();
@@ -262,6 +291,15 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
262291
this.sender_.init();
263292
}
264293

294+
/**
295+
* Initialize the Proxies without Cast sender.
296+
* @private
297+
*/
298+
initWithoutSender_() {
299+
this.videoProxy_ = /** @type {Object} */(this.localVideo_);
300+
this.playerProxy_ = /** @type {Object} */(this.localPlayer_);
301+
}
302+
265303
/**
266304
* Initialize the Proxies and the Cast sender.
267305
* @private

test/cast/cast_proxy_unit.js

+5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ describe('CastProxy', () => {
2323
/** @type {shaka.cast.CastProxy} */
2424
let proxy;
2525

26+
const originalWindowChrome = window.chrome;
27+
2628
beforeEach(() => {
29+
window['chrome'] = originalWindowChrome || {};
30+
2731
mockCastSenderConstructor = jasmine.createSpy('CastSender constructor');
2832
mockCastSenderConstructor.and.callFake(createMockCastSender);
2933
shaka.cast.CastSender = Util.spyFunc(mockCastSenderConstructor);
@@ -42,6 +46,7 @@ describe('CastProxy', () => {
4246
} finally {
4347
shaka.cast.CastSender = originalCastSender;
4448
}
49+
window['chrome'] = originalWindowChrome;
4550
});
4651

4752
describe('constructor', () => {

0 commit comments

Comments
 (0)