Skip to content

Commit

Permalink
@misteroneill fixed wrapping native and emulated MediaErrors. closes v…
Browse files Browse the repository at this point in the history
  • Loading branch information
misteroneill authored and Pravdina Elena committed Sep 6, 2016
1 parent c6d6ff4 commit 5026f91
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 23 deletions.
24 changes: 22 additions & 2 deletions CHANGELOG.md
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ CHANGELOG
=========

## HEAD (Unreleased)
_(none)_

--------------------

## 5.12.1 (2016-08-25)
_(none)_

## 5.13.0 (2016-08-25)
_(none)_

## 5.12.0 (2016-08-25)
* @misteroneill, @BrandonOCasey, and @pagarwal123 updates all the code to pass the linter ([view](https://github.com/videojs/video.js/pull/3459))
* @misteroneill added ghooks to run linter on git push ([view](https://github.com/videojs/video.js/pull/3459))
* @BrandonOCasey removed unused base-styles.js file ([view](https://github.com/videojs/video.js/pull/3486))
Expand All @@ -18,8 +29,17 @@ CHANGELOG
* greenkeeper updated uglify ([view](https://github.com/videojs/video.js/pull/3547))
* greenkeeper updated grunt-concurrent ([view](https://github.com/videojs/video.js/pull/3532))
* greenkeeper updated karma-chrome-launcher ([view](https://github.com/videojs/video.js/pull/3553))
* @gkatsev added tests for webpack and browserify bundling and node.js requiring ([view](https://github.com/videojs/video.js/pull/3558))
* @rlchung fixed tests that weren't disposing players when they finished ([view](https://github.com/videojs/video.js/pull/3524))

--------------------
## 5.11.6 (2016-08-25)
* @imbcmdth Added exception handling to event dispatcher ([view](https://github.com/videojs/video.js/pull/3580))

## 5.11.5 (2016-08-25)
* @misteroneill fixed wrapping native and emulated MediaErrors ([view](https://github.com/videojs/video.js/pull/3562))
* @snyderizer fixed switching between audio tracks. Fixes #3510 ([view](https://github.com/videojs/video.js/pull/3538))
* @jbarabander added title attribute to audio button. Fixes #3528 ([view](https://github.com/videojs/video.js/pull/3565))
* @misteroneill fixed IE8 media error test failure ([view](https://github.com/videojs/video.js/pull/3568))

## 5.11.4 (2016-08-16)
_(none)_
Expand Down Expand Up @@ -906,4 +926,4 @@ _(none)_
* 3.0.5 (2012-01-12) Removed deprecated event.layerX and layerY
* 3.0.6 (2012-01-12) Fixed wrong URL for CDN in docs
* 3.0.7 (2012-01-12) Fixed an ie8 breaking bug with the poster
* 3.0.8 (2012-01-23) Fixed issue with controls not hiding in IE due to no opacity support
* 3.0.8 (2012-01-23) Fixed issue with controls not hiding in IE due to no opacity support
43 changes: 33 additions & 10 deletions src/js/media-error.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,47 @@
import assign from 'object.assign';

/*
* Custom MediaError to mimic the HTML5 MediaError
* Custom MediaError class which mimics the standard HTML5 MediaError class.
*
* @param {Number} code The media error code
* @param {Number|String|Object|MediaError} value
* This can be of multiple types:
* - Number: should be a standard error code
* - String: an error message (the code will be 0)
* - Object: arbitrary properties
* - MediaError (native): used to populate a video.js MediaError object
* - MediaError (video.js): will return itself if it's already a
* video.js MediaError object.
*/
const MediaError = function(code) {
if (typeof code === 'number') {
this.code = code;
} else if (typeof code === 'string') {

function MediaError(value) {

// Allow redundant calls to this constructor to avoid having `instanceof`
// checks peppered around the code.
if (value instanceof MediaError) {
return value;
}

if (typeof value === 'number') {
this.code = value;
} else if (typeof value === 'string') {
// default code is zero, so this is a custom error
this.message = code;
} else if (typeof code === 'object') {
assign(this, code);
this.message = value;
} else if (typeof value === 'object') {

// We assign the `code` property manually because native MediaError objects
// do not expose it as an own/enumerable property of the object.
if (typeof value.code === 'number') {
this.code = value.code;
}

assign(this, value);

}

if (!this.message) {
this.message = MediaError.defaultMessages[this.code] || '';
}
};
}

/*
* The error code that refers two one of the defined
Expand Down
7 changes: 1 addition & 6 deletions src/js/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -2309,12 +2309,7 @@ class Player extends Component {
return this;
}

// error instance
if (err instanceof MediaError) {
this.error_ = err;
} else {
this.error_ = new MediaError(err);
}
this.error_ = new MediaError(err);

// add the vjs-error classname to the player
this.addClass('vjs-error');
Expand Down
6 changes: 1 addition & 5 deletions src/js/tech/tech.js
Original file line number Diff line number Diff line change
Expand Up @@ -309,11 +309,7 @@ class Tech extends Component {
*/
error(err) {
if (err !== undefined) {
if (err instanceof MediaError) {
this.error_ = err;
} else {
this.error_ = new MediaError(err);
}
this.error_ = new MediaError(err);
this.trigger('error');
}
return this.error_;
Expand Down
65 changes: 65 additions & 0 deletions test/unit/media-error.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/* eslint-env qunit */
import window from 'global/window';
import MediaError from '../../src/js/media-error';

/**
* Creates a real native MediaError object.
*
* @param {Number} code
* @param {String} [message]
* @return {MediaError}
*/
const createNativeMediaError = (code, message) => {
const err = Object.create(window.MediaError);

Object.defineProperty(err, 'code', {value: code});

if (message) {
err.message = message;
}

return err;
};

QUnit.module('MediaError');

QUnit.test('can be constructed from a number', function(assert) {
const mediaError = new MediaError(1);

assert.strictEqual(mediaError.code, 1);
assert.strictEqual(mediaError.message, MediaError.defaultMessages['1']);
});

QUnit.test('can be constructed from a string', function(assert) {
const mediaError = new MediaError('hello, world');

assert.strictEqual(mediaError.code, 0);
assert.strictEqual(mediaError.message, 'hello, world');
});

QUnit.test('can be constructed from an object', function(assert) {
const mediaError = new MediaError({code: 2});
const mediaErrorMsg = new MediaError({code: 2, message: 'hello, world'});

assert.strictEqual(mediaError.code, 2);
assert.strictEqual(mediaError.message, MediaError.defaultMessages['2']);
assert.strictEqual(mediaErrorMsg.code, 2);
assert.strictEqual(mediaErrorMsg.message, 'hello, world');
});

QUnit.test('can be constructed from a native MediaError object', function(assert) {
const mediaError = new MediaError(createNativeMediaError(3));
const mediaErrorMsg = new MediaError(createNativeMediaError(4, 'hello, world'));

assert.strictEqual(mediaError.code, 3);
assert.strictEqual(mediaError.message, MediaError.defaultMessages['3']);
assert.strictEqual(mediaErrorMsg.code, 4);
assert.strictEqual(mediaErrorMsg.message, 'hello, world');
});

QUnit.test('can be constructed redundantly', function(assert) {
const mediaError = new MediaError(2);
const redundantMediaError = new MediaError(mediaError);

assert.strictEqual(redundantMediaError, mediaError);
});

0 comments on commit 5026f91

Please sign in to comment.