diff --git a/src/js/media/html5.js b/src/js/media/html5.js index d9461c25d3..5dcbb3ab99 100644 --- a/src/js/media/html5.js +++ b/src/js/media/html5.js @@ -110,6 +110,10 @@ vjs.Html5.prototype.setupTriggers = function(){ // Triggers removed using this.off when disposed vjs.Html5.prototype.eventHandler = function(e){ + // Prevent default action from being called on the target (the video element), + // as all events handled here originated from it. Fixes #620. + e.preventDefault(); + this.trigger(e); // No need for media events to bubble up. diff --git a/test/unit/media.html5.js b/test/unit/media.html5.js index 07c6e6a31b..e0451670c7 100644 --- a/test/unit/media.html5.js +++ b/test/unit/media.html5.js @@ -32,4 +32,23 @@ test('should re-link the player if the tech is moved', function(){ tech.createEl(); strictEqual(player, tech.el()['player']); +}); + +test('should not call default action on media event', function() { + expect(2); + var player = { + id: function() { return 'id'; }, + el: function() { return document.createElement('div'); }, + options_: {}, + trigger: function(event) { + ok(event.type === 'play', 'non-play media event fired'); + ok(event.isDefaultPrevented(), 'default action not prevented'); + }, + ready: function() {} + }; + var tech = new vjs.Html5(player, { el: vjs.TEST_VID }); + // Mediafaker doesn't support play/pause, so dispatch an event manually. + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('play', false /*bubbles*/, true /*cancelable*/, null); + tech.el_.dispatchEvent(event); }); \ No newline at end of file