Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add browser.IS_SMART_TV and class names for CSS targeting devices #8676

Merged
merged 1 commit into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/js/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,19 @@ class Player extends Component {
// Default state of video is paused
this.addClass('vjs-paused');

const deviceClassNames = [
'IS_SMART_TV',
'IS_TIZEN',
'IS_WEBOS',
'IS_ANDROID',
'IS_IPAD',
'IS_IPHONE'
].filter(key => browser[key]).map(key => {
return 'vjs-device-' + key.substring(3).toLowerCase().replace(/\_/g, '-');
});

this.addClass(...deviceClassNames);

// Add a style element in the player that we'll use to set the width/height
// of the player in a way that's still overridable by CSS, just like the
// video element
Expand Down
12 changes: 11 additions & 1 deletion src/js/utils/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,14 @@ export let IS_TIZEN = false;
*/
export let IS_WEBOS = false;

/**
* Whether or not this is a Smart TV (Tizen or WebOS) device.
*
* @static
* @type {Boolean}
*/
export let IS_SMART_TV = false;

/**
* Whether or not this device is touch-enabled.
*
Expand Down Expand Up @@ -255,7 +263,9 @@ if (!IS_CHROMIUM) {

IS_WEBOS = (/Web0S/i).test(USER_AGENT);

IS_SAFARI = (/Safari/i).test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE && !IS_TIZEN && !IS_WEBOS;
IS_SMART_TV = IS_TIZEN || IS_WEBOS;

IS_SAFARI = (/Safari/i).test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE && !IS_SMART_TV;

IS_WINDOWS = (/Windows/i).test(USER_AGENT);

Expand Down
79 changes: 79 additions & 0 deletions test/unit/player.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,84 @@ QUnit.test('should add a touch-enabled classname when touch is supported', funct
player.dispose();
});

QUnit.test('should add smart-tv classname when on smart tv', function(assert) {
assert.expect(1);

browser.stub_IS_SMART_TV(true);

const player = TestHelpers.makePlayer({});

assert.ok(player.hasClass('vjs-device-smart-tv'), 'smart-tv classname added');

browser.reset_IS_SMART_TV();
player.dispose();
});

QUnit.test('should add webos classname when on webos', function(assert) {
assert.expect(1);

browser.stub_IS_WEBOS(true);

const player = TestHelpers.makePlayer({});

assert.ok(player.hasClass('vjs-device-webos'), 'webos classname added');

browser.reset_IS_WEBOS();
player.dispose();
});

QUnit.test('should add tizen classname when on tizen', function(assert) {
assert.expect(1);

browser.stub_IS_TIZEN(true);

const player = TestHelpers.makePlayer({});

assert.ok(player.hasClass('vjs-device-tizen'), 'tizen classname added');

browser.reset_IS_TIZEN();
player.dispose();
});

QUnit.test('should add android classname when on android', function(assert) {
assert.expect(1);

browser.stub_IS_ANDROID(true);

const player = TestHelpers.makePlayer({});

assert.ok(player.hasClass('vjs-device-android'), 'android classname added');

browser.reset_IS_ANDROID();
player.dispose();
});

QUnit.test('should add ipad classname when on ipad', function(assert) {
assert.expect(1);

browser.stub_IS_IPAD(true);

const player = TestHelpers.makePlayer({});

assert.ok(player.hasClass('vjs-device-ipad'), 'ipad classname added');

browser.reset_IS_IPAD();
player.dispose();
});

QUnit.test('should add iphone classname when on iphone', function(assert) {
assert.expect(1);

browser.stub_IS_IPHONE(true);

const player = TestHelpers.makePlayer({});

assert.ok(player.hasClass('vjs-device-iphone'), 'iphone classname added');

browser.reset_IS_IPHONE();
player.dispose();
});

QUnit.test('should add a svg-icons-enabled classname when svg icons are supported', function(assert) {
// Stub a successful parsing of the SVG sprite.
sinon.stub(window.DOMParser.prototype, 'parseFromString').returns({
Expand Down Expand Up @@ -3492,3 +3570,4 @@ QUnit.test('smooth seeking set to true should update the display time components
seekBarUpdate.restore();
player.dispose();
});

Loading