Chame funções nativas dinamicamente no escopo correto

Provavelmente, em algum momento, você tentou usar uma função ‘nativa’ do navegador de forma dinâmica e recebeu um erro de invocação ilegal como agradecimento por isso.

var userMedia = (function() {
navigator
.getUserMedia() || navigator.webkitGetUserMedia()
})();

userMedia
.call(this, args...);
// => illegal invocation error

Entre criá userMedia-lo e chamá-lo como uma função, as duas getUserMediafunções não estão mais vinculadas ao escopo correto. A solução é simples:

var userMedia = (function() {
navigator
.getUserMedia().bind(navigator) ||
navigator
.webkitGetUserMedia().bind(navigator)
})();

Vincular explicitamente esses métodos ao seu contexto original resolverá o problema.