From 0071ca0accdc5300f3d664280a7963a1bfcb3e6d Mon Sep 17 00:00:00 2001 From: "haibinlu@chromium.org" Date: Tue, 8 Oct 2013 00:24:28 +0000 Subject: Add cast transport API skeleton. BUG=301920 TBR=sky Review URL: https://codereview.chromium.org/23892027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@227401 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/common/extensions/api/_api_features.json | 8 ++ .../extensions/api/_permission_features.json | 4 + chrome/common/extensions/api/api.gyp | 2 + .../extensions/api/webrtc_cast_send_transport.idl | 144 +++++++++++++++++++++ .../common/extensions/api/webrtc_udp_transport.idl | 44 +++++++ .../common/extensions/permissions/api_permission.h | 1 + .../permissions/chrome_api_permissions.cc | 1 + .../permissions/permission_set_unittest.cc | 1 + chrome/renderer/extensions/dispatcher.cc | 4 + .../webrtc_cast_send_transport_custom_bindings.js | 18 +++ .../webrtc_udp_transport_custom_bindings.js | 18 +++ chrome/renderer/resources/renderer_resources.grd | 2 + extensions/common/manifest_constants.cc | 1 + 13 files changed, 248 insertions(+) create mode 100644 chrome/common/extensions/api/webrtc_cast_send_transport.idl create mode 100644 chrome/common/extensions/api/webrtc_udp_transport.idl create mode 100644 chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js create mode 100644 chrome/renderer/resources/extensions/webrtc_udp_transport_custom_bindings.js diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index 03d9593..94a616a 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json @@ -641,6 +641,14 @@ "dependencies": ["permission:webstorePrivate"], "contexts": ["blessed_extension"] }, + "webrtc.castSendTransport": { + "dependencies": ["permission:webrtc"], + "contexts": ["blessed_extension"] + }, + "webrtc.udpTransport": { + "dependencies": ["permission:webrtc"], + "contexts": ["blessed_extension"] + }, "webview": { "internal": true, "dependencies": ["permission:webview"], diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json index 1fd9853..b0531ec 100644 --- a/chrome/common/extensions/api/_permission_features.json +++ b/chrome/common/extensions/api/_permission_features.json @@ -777,6 +777,10 @@ "channel": "stable", "extension_types": ["extension", "legacy_packaged_app"] }, + "webrtc": { + "channel": "trunk", + "extension_types": ["extension"] + }, "webrtcLoggingPrivate": { "channel": "stable", "extension_types": ["extension"], diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp index b1b256d..8a14555 100644 --- a/chrome/common/extensions/api/api.gyp +++ b/chrome/common/extensions/api/api.gyp @@ -113,7 +113,9 @@ 'wallpaper_private.json', 'web_navigation.json', 'web_request.json', + 'webrtc_cast_send_transport.idl', 'webrtc_logging_private.idl', + 'webrtc_udp_transport.idl', 'webstore_private.json', 'webview.json', 'windows.json', diff --git a/chrome/common/extensions/api/webrtc_cast_send_transport.idl b/chrome/common/extensions/api/webrtc_cast_send_transport.idl new file mode 100644 index 0000000..1a851fd --- /dev/null +++ b/chrome/common/extensions/api/webrtc_cast_send_transport.idl @@ -0,0 +1,144 @@ +// Copyright 2013 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. + +// The chrome.webrtc.castSendTransport API takes a track as +// a source of media, and sends that media on the inner transport according to +// the given RtpParams. +namespace webrtc.castSendTransport { + // Params for audio and video codec. + dictionary CodecSpecificParam { + DOMString key; + DOMString value; + }; + + // RTP payload param. + dictionary RtpPayloadParam { + long payloadType; + + DOMString codecName; + + // Synchronization source identifier. + long? ssrc; + + long? clockRate; + + long? minBitrate; + + long? maxBitrate; + + // The number of channels. + long? channels; + + // Video width in pixels. + long? width; + + // Video height in pixels. + long? height; + + // A list of codec specific params. + CodecSpecificParam[] codecSpecficParams; + }; + + // Cast transport capabilities + dictionary CastTransportCaps { + // RTP payload params. + RtpPayloadParam[] payloads; + + DOMString[] rtcpFeatures; + + DOMString[] fecMechanisms; + }; + + // Cast transport params. + dictionary CastTransportParams { + // RTP payload params. + RtpPayloadParam[] payloads; + + DOMString[] rtcpFeatures; + + DOMString[] fecMechanisms; + }; + + // Result of create call. + dictionary CreateInfo { + // The ID of the newly created transport. + long id; + }; + + // Callback from the create method. + // |id| : The transport id. + // A null value indicates an error. + callback CreateCallback = void (CreateInfo id); + + // Callback from the createParams method. + // |params| : The cast transport params. + // A null value indicates an error. + callback CreateParamsCallback = void (CastTransportParams params); + + interface Functions { + // Creates a cast send transport. + // |innerTransportId| : the ID of the inner transport. The transport to be + // created will send data on the inner transport. + // |callback| : Called when the transport has been created. + [nocompile] static void create(long innerTransportId, + CreateCallback callback); + + // Creates suitable params given the capabilities. + // |caps| : the capabilities. + // |callback| : Called when the params has been created. + [nocompile] static void createParams(CastTransportCaps caps, + CreateParamsCallback callback); + + // Set the source of media. + // |transportId| : the transport ID. + // |track| : A media stream track. + [nocompile] static void setTrack(long transportId, + [instanceOf=MediaStreamTrack] object track); + + // Starts to use the transport by providing remote params info. + // |transportId| : The transport ID. + // |remoteParams| : The remote params. + [nocompile] static void start(long transportId, + CastTransportParams remoteParams); + + // Stops using the transport. + // |transportId| : The transport ID. + [nocompile] static void stop(long transportId); + + // Mutes the media track. + // |transportId| : The transport ID. + [nocompile] static void mute(long transportId); + + // Unmute the media track. + // |transportId| : The transport ID. + [nocompile] static void unmute(long transportId); + }; + + interface Events { + // Event fired when a cast send transport has started. + // |transportId| : The ID of the transport. + static void onStarted(long transportId); + + // Event fired when a cast send transport has connected. + // After this event, the transport is ready to send the track. + // |transportId| : The ID of the transport. + static void onConnected(long transportId); + + // Event fired when a cast send transport has stopped. + // |transportId| : The ID of the transport. + static void onStopped(long transportId); + + // Event fired when a cast send transport has timeout. + // This happens when network has been congested for a while, or one side + // left. + // |transportId| : The ID of the transport. + static void onTimeout(long transportId); + + // Event fired when a cast send transport has error. + // |transportId| : The ID of the transport. + // |errorString| : The error info. + static void onError(long transportId, DOMString errorString); + }; +}; + diff --git a/chrome/common/extensions/api/webrtc_udp_transport.idl b/chrome/common/extensions/api/webrtc_udp_transport.idl new file mode 100644 index 0000000..f118671 --- /dev/null +++ b/chrome/common/extensions/api/webrtc_udp_transport.idl @@ -0,0 +1,44 @@ +// Copyright 2013 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. + +// The chrome.webrtc.udpTransport API creates a UDP transport +// for outer transport to send and receive data. This API is not useful when +// standalone since it does not have send and receive methods. It should be +// used as an inner transport for other transports such as castSendTransport. +namespace webrtc.udpTransport { + // The UDP socket address and port. + dictionary UdpParams { + DOMString address; + long port; + }; + + // Result of create call. + dictionary CreateInfo { + // The ID of the newly created UDP transport. + long id; + + // The transport params. + UdpParams params; + }; + + // Callback from the create method. + // |createInfo| : The transport info. + // A null value indicates an error. + callback CreateCallback = void (CreateInfo createInfo); + + interface Functions { + // Creates a UDP transport. + // |callback| : Called when the transport has been created. + [nocompile] static void create(CreateCallback callback); + + // Starts to use the transport by providing remote UDP info. + // |transportId| : The transport ID. + // |remoteParams| : The address and port to send packets to. + [nocompile] static void start(long transportId, UdpParams remoteParams); + + // Stops using the transport. + // |transportId| : The transport ID. + [nocompile] static void stop(long transportId); + }; +}; diff --git a/chrome/common/extensions/permissions/api_permission.h b/chrome/common/extensions/permissions/api_permission.h index 10e3e8d..1debe6e 100644 --- a/chrome/common/extensions/permissions/api_permission.h +++ b/chrome/common/extensions/permissions/api_permission.h @@ -153,6 +153,7 @@ class APIPermission { kWebRequest, kWebRequestBlocking, kWebRequestInternal, + kWebRtc, kWebrtcLoggingPrivate, kWebstorePrivate, kWebView, diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc index 05ee590..55b10a9 100644 --- a/chrome/common/extensions/permissions/chrome_api_permissions.cc +++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc @@ -345,6 +345,7 @@ std::vector ChromeAPIPermissions::GetAllPermissions() { APIPermission::kPointerLock, "pointerLock" }, { APIPermission::kFullscreen, "fullscreen" }, { APIPermission::kAudio, "audio" }, + { APIPermission::kWebRtc, "webrtc" }, }; std::vector permissions; diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index c4cbfa3..9cbd689 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc @@ -663,6 +663,7 @@ TEST(PermissionsTest, PermissionMessages) { skip.insert(APIPermission::kSystemStorage); skip.insert(APIPermission::kTts); skip.insert(APIPermission::kUnlimitedStorage); + skip.insert(APIPermission::kWebRtc); skip.insert(APIPermission::kWebView); // TODO(erikkay) add a string for this permission. diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc index 822d5e5..a4f98f6 100644 --- a/chrome/renderer/extensions/dispatcher.cc +++ b/chrome/renderer/extensions/dispatcher.cc @@ -960,6 +960,10 @@ void Dispatcher::PopulateSourceMap() { source_map_.RegisterSource("webRequest", IDR_WEB_REQUEST_CUSTOM_BINDINGS_JS); source_map_.RegisterSource("webRequestInternal", IDR_WEB_REQUEST_INTERNAL_CUSTOM_BINDINGS_JS); + source_map_.RegisterSource("webrtc.castSendTransport", + IDR_WEBRTC_CAST_SEND_TRANSPORT_CUSTOM_BINDINGS_JS); + source_map_.RegisterSource("webrtc.udpTransport", + IDR_WEBRTC_UDP_TRANSPORT_CUSTOM_BINDINGS_JS); source_map_.RegisterSource("webstore", IDR_WEBSTORE_CUSTOM_BINDINGS_JS); source_map_.RegisterSource("windowControls", IDR_WINDOW_CONTROLS_JS); source_map_.RegisterSource("binding", IDR_BINDING_JS); diff --git a/chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js new file mode 100644 index 0000000..6ba4c6f --- /dev/null +++ b/chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js @@ -0,0 +1,18 @@ +// Copyright 2013 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 webrtc custom transport API. + +var binding = require('binding').Binding.create('webrtc.castSendTransport'); + +binding.registerCustomHook(function(bindingsAPI, extensionId) { + var apiFunctions = bindingsAPI.apiFunctions; + + apiFunctions.setHandleRequest('create', + function(innerTransportId, callback) { + // invoke impl here. + }); +}); + +exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/extensions/webrtc_udp_transport_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_udp_transport_custom_bindings.js new file mode 100644 index 0000000..3b0b42f --- /dev/null +++ b/chrome/renderer/resources/extensions/webrtc_udp_transport_custom_bindings.js @@ -0,0 +1,18 @@ +// Copyright 2013 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 webrtc custom transport API. + +var binding = require('binding').Binding.create('webrtc.udpTransport'); + +binding.registerCustomHook(function(bindingsAPI, extensionId) { + var apiFunctions = bindingsAPI.apiFunctions; + + apiFunctions.setHandleRequest('create', + function(callback) { + // invoke impl here. + }); +}); + +exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd index 2c1673f..fc0db75 100644 --- a/chrome/renderer/resources/renderer_resources.grd +++ b/chrome/renderer/resources/renderer_resources.grd @@ -89,6 +89,8 @@ without changes to the corresponding grd file. fb9 --> + + diff --git a/extensions/common/manifest_constants.cc b/extensions/common/manifest_constants.cc index fce206e..dccf628 100644 --- a/extensions/common/manifest_constants.cc +++ b/extensions/common/manifest_constants.cc @@ -148,6 +148,7 @@ const char kUrlHandlers[] = "url_handlers"; const char kUrlHandlerTitle[] = "title"; const char kVersion[] = "version"; const char kWebAccessibleResources[] = "web_accessible_resources"; +const char kWebRtc[] = "webrtc"; const char kWebURLs[] = "app.urls"; const char kWebview[] = "webview"; const char kWebviewAccessibleResources[] = "accessible_resources"; -- cgit v1.1