diff --git a/static/js/services/playpromise.js b/static/js/services/playpromise.js new file mode 100644 index 00000000..1fe121a1 --- /dev/null +++ b/static/js/services/playpromise.js @@ -0,0 +1,53 @@ +/* + * Spreed WebRTC. + * Copyright (C) 2013-2015 struktur AG + * + * This file is part of Spreed WebRTC. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +"use strict"; +define(["underscore"], function(_) { + function noopThen() { + // Automatic playback started. + } + function noopCatch(error) { + // Automatic playback failed. + } + + // playPromise + return function() { + return function(elem, thenFunc, catchFunc) { + // Starting with Chome 50 play() returns a promise. + // https://developers.google.com/web/updates/2016/03/play-returns-promise + var playPromise = elem.play() + if (playPromise !== undefined) { + if (!thenFunc) { + thenFunc = noopThen; + } + if (!catchFunc) { + catchFunc = noopCatch; + } + playPromise.then(thenFunc).catch(catchFunc); + } else { + if (thenFunc) { + _.defer(thenFunc); + } + } + return playPromise; + } + }; +}); diff --git a/static/js/services/services.js b/static/js/services/services.js index 4fa9919a..a42445f9 100644 --- a/static/js/services/services.js +++ b/static/js/services/services.js @@ -70,7 +70,8 @@ define([ 'services/mediadevices', 'services/sandbox', 'services/dummystream', - 'services/usermedia'], function(_, + 'services/usermedia', + 'services/playpromise'], function(_, desktopNotify, playSound, safeApply, @@ -118,7 +119,8 @@ modules, mediaDevices, sandbox, dummyStream, -userMedia) { +userMedia, +playPromise) { var services = { desktopNotify: desktopNotify, @@ -168,7 +170,8 @@ userMedia) { mediaDevices: mediaDevices, sandbox: sandbox, dummyStream: dummyStream, - userMedia: userMedia + userMedia: userMedia, + playPromise: playPromise }; var initialize = function(angModule) { diff --git a/static/js/services/videolayout.js b/static/js/services/videolayout.js index a607900a..6c0b52ab 100644 --- a/static/js/services/videolayout.js +++ b/static/js/services/videolayout.js @@ -59,7 +59,7 @@ define(["jquery", "underscore", "modernizr", "injectCSS"], function($, _, Modern var objectFitSupport = Modernizr["object-fit"] && true; // videoLayout - return ["$window", function($window) { + return ["$window", "playPromise", function($window, playPromise) { // Invisible layout (essentially shows nothing). var Invisible = function(container, scope, controller) {}; @@ -189,7 +189,7 @@ define(["jquery", "underscore", "modernizr", "injectCSS"], function($, _, Modern var $mini = $(scope.mini); this.miniParent = $mini.parent(); $mini.prependTo(scope.remoteVideos); - $mini.find("video")[0].play(); + playPromise($mini.find("video")[0]); this.countSelfAsRemote = true; } Democrazy.prototype = Object.create(OnePeople.prototype); @@ -199,7 +199,7 @@ define(["jquery", "underscore", "modernizr", "injectCSS"], function($, _, Modern OnePeople.prototype.close.call(this, container, scope, controller); var $mini = $(scope.mini); $mini.appendTo(this.miniParent); - $mini.find("video")[0].play(); + playPromise($mini.find("video")[0]); this.miniParent = null; }; @@ -232,12 +232,12 @@ define(["jquery", "underscore", "modernizr", "injectCSS"], function($, _, Modern if (this.big) { // Add old video back. this.big.insertAfter(remoteVideo); - this.big.find("video")[0].play(); + playPromise(this.big.find("video")[0]); } this.big = remoteVideo; remoteVideo.appendTo(this.bigVideo); - remoteVideo.find("video")[0].play(); + playPromise(remoteVideo.find("video")[0]); }; @@ -292,7 +292,7 @@ define(["jquery", "underscore", "modernizr", "injectCSS"], function($, _, Modern this.closed = true; if (this.big) { this.remoteVideos.append(this.big); - this.big.find("video")[0].play(); + playPromise(this.big.find("video")[0]); } this.big = null; this.bigVideo.remove()