blob: 0f7b80dc90b5f5e22455f8f33613b536a3b119cf [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Custom binding for the Tab Capture API.
var binding = apiBridge || require('binding').Binding.create('tabCapture');
var jsLastError = bindingUtil ? undefined : require('lastError');
function runCallbackWithLastError(name, message, stack, callback, args) {
if (bindingUtil) {
bindingUtil.runCallbackWithLastError(message, function() {
$Function.apply(callback, null, args);
});
} else {
jsLastError.run(name, message, stack, callback, args);
}
}
binding.registerCustomHook(function(bindingsAPI, extensionId) {
var apiFunctions = bindingsAPI.apiFunctions;
function proxyToGetUserMedia(name, request, callback, response) {
if (!callback)
return;
if (!response) {
// When the response is missing, runtime.lastError has already been set.
// See chrome/browser/extensions/api/tab_capture/tab_capture_api.cc.
callback(null);
return;
}
// Convenience function for processing webkitGetUserMedia() error objects to
// provide runtime.lastError messages for the tab capture API.
function getErrorMessage(error, fallbackMessage) {
if (!error || (typeof error.message != 'string'))
return fallbackMessage;
return error.message.replace(/(navigator\.)?(webkit)?GetUserMedia/gi,
name);
}
var options = {};
if (response.audioConstraints)
options.audio = response.audioConstraints;
if (response.videoConstraints)
options.video = response.videoConstraints;
try {
navigator.webkitGetUserMedia(
options,
function onSuccess(media_stream) {
callback(media_stream);
},
function onError(error) {
runCallbackWithLastError(
name,
getErrorMessage(error, "Failed to start MediaStream."),
request.stack,
function() { callback(null); });
});
} catch (error) {
runCallbackWithLastError(
name, getErrorMessage(error, "Invalid argument(s)."), request.stack,
function() { callback(null); });
}
}
apiFunctions.setCustomCallback('capture', proxyToGetUserMedia);
apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia);
});
if (!apiBridge)
exports.$set('binding', binding.generate());