MediaStream API: Implement DTMF support in RTCPeerConnection
https://bugs.webkit.org/show_bug.cgi?id=106782

Reviewed by Adam Barth.

Source/Platform:

The WebRTC specification have added support for DTMF:
http://dev.w3.org/2011/webrtc/editor/webrtc.html#peer-to-peer-dtmf

Implementation wise this is implemented using the same pattern as RTCDataChannel;
where a RTCDTMFSenderHandler is created by the UA through a new method on
RTCPeerConnectionHandler.

* Platform.gypi:
* chromium/public/WebMediaStreamTrack.h:
(WebMediaStreamTrack):
* chromium/public/WebRTCDTMFSenderHandler.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebKit):
(WebRTCDTMFSenderHandler):
(WebKit::WebRTCDTMFSenderHandler::~WebRTCDTMFSenderHandler):
* chromium/public/WebRTCDTMFSenderHandlerClient.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebKit):
(WebRTCDTMFSenderHandlerClient):
(WebKit::WebRTCDTMFSenderHandlerClient::~WebRTCDTMFSenderHandlerClient):
* chromium/public/WebRTCPeerConnectionHandler.h:
(WebKit):
(WebKit::WebRTCPeerConnectionHandler::createDTMFSender):

Source/WebCore:

The WebRTC specification have added support for DTMF:
http://dev.w3.org/2011/webrtc/editor/webrtc.html#peer-to-peer-dtmf

Implementation wise this is implemented using the same pattern as RTCDataChannel;
where a RTCDTMFSenderHandler is created by the UA through a new method on
RTCPeerConnectionHandler.

Test: fast/mediastream/RTCPeerConnection-dtmf.html

* CMakeLists.txt:
* GNUmakefile.list.am:
* Modules/mediastream/RTCDTMFSender.cpp: Added.
(WebCore):
(WebCore::RTCDTMFSender::create):
(WebCore::RTCDTMFSender::RTCDTMFSender):
(WebCore::RTCDTMFSender::~RTCDTMFSender):
(WebCore::RTCDTMFSender::canInsertDTMF):
(WebCore::RTCDTMFSender::track):
(WebCore::RTCDTMFSender::toneBuffer):
(WebCore::RTCDTMFSender::insertDTMF):
(WebCore::RTCDTMFSender::didPlayTone):
(WebCore::RTCDTMFSender::interfaceName):
(WebCore::RTCDTMFSender::scriptExecutionContext):
(WebCore::RTCDTMFSender::stop):
(WebCore::RTCDTMFSender::eventTargetData):
(WebCore::RTCDTMFSender::ensureEventTargetData):
(WebCore::RTCDTMFSender::scheduleDispatchEvent):
(WebCore::RTCDTMFSender::scheduledEventTimerFired):
* Modules/mediastream/RTCDTMFSender.h: Added.
(WebCore):
(RTCDTMFSender):
(WebCore::RTCDTMFSender::duration):
(WebCore::RTCDTMFSender::interToneGap):
* Modules/mediastream/RTCDTMFSender.idl: Added.
* Modules/mediastream/RTCDTMFToneChangeEvent.cpp: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebCore):
(WebCore::RTCDTMFToneChangeEvent::create):
(WebCore::RTCDTMFToneChangeEvent::RTCDTMFToneChangeEvent):
(WebCore::RTCDTMFToneChangeEvent::~RTCDTMFToneChangeEvent):
(WebCore::RTCDTMFToneChangeEvent::tone):
(WebCore::RTCDTMFToneChangeEvent::interfaceName):
* Modules/mediastream/RTCDTMFToneChangeEvent.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebCore):
(RTCDTMFToneChangeEventInit):
(RTCDTMFToneChangeEvent):
* Modules/mediastream/RTCDTMFToneChangeEvent.idl: Added.
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::createDataChannel):
(WebCore):
(WebCore::RTCPeerConnection::getStreamByTrackId):
(WebCore::RTCPeerConnection::createDTMFSender):
* Modules/mediastream/RTCPeerConnection.h:
(WebCore):
(RTCPeerConnection):
* Modules/mediastream/RTCPeerConnection.idl:
* WebCore.gypi:
* dom/EventNames.h:
(WebCore):
* dom/EventNames.in:
* dom/EventTargetFactory.in:
* platform/chromium/support/WebMediaStreamTrack.cpp:
(WebKit::WebMediaStreamTrack::WebMediaStreamTrack):
(WebKit):
* platform/mediastream/RTCDTMFSenderHandler.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebCore):
(RTCDTMFSenderHandler):
(WebCore::RTCDTMFSenderHandler::~RTCDTMFSenderHandler):
* platform/mediastream/RTCDTMFSenderHandlerClient.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebCore):
(RTCDTMFSenderHandlerClient):
(WebCore::RTCDTMFSenderHandlerClient::~RTCDTMFSenderHandlerClient):
* platform/mediastream/RTCPeerConnectionHandler.h:
(WebCore):
(RTCPeerConnectionHandler):
* platform/mediastream/chromium/RTCDTMFSenderHandlerChromium.cpp: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebCore):
(WebCore::RTCDTMFSenderHandlerChromium::create):
(WebCore::RTCDTMFSenderHandlerChromium::RTCDTMFSenderHandlerChromium):
(WebCore::RTCDTMFSenderHandlerChromium::~RTCDTMFSenderHandlerChromium):
(WebCore::RTCDTMFSenderHandlerChromium::setClient):
(WebCore::RTCDTMFSenderHandlerChromium::currentToneBuffer):
(WebCore::RTCDTMFSenderHandlerChromium::canInsertDTMF):
(WebCore::RTCDTMFSenderHandlerChromium::insertDTMF):
(WebCore::RTCDTMFSenderHandlerChromium::didPlayTone):
* platform/mediastream/chromium/RTCDTMFSenderHandlerChromium.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(WebCore):
(RTCDTMFSenderHandlerChromium):
* platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp:
(WebCore::RTCPeerConnectionHandlerChromium::createDTMFSender):
(WebCore):
* platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h:
(RTCPeerConnectionHandlerChromium):

Tools:

Adding Mock functionality for the DTMFSender.

* DumpRenderTree/DumpRenderTree.gypi:
* DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.cpp: Added.
(DTMFSenderToneTask):
(DTMFSenderToneTask::DTMFSenderToneTask):
(MockWebRTCDTMFSenderHandler::MockWebRTCDTMFSenderHandler):
(MockWebRTCDTMFSenderHandler::setClient):
(MockWebRTCDTMFSenderHandler::currentToneBuffer):
(MockWebRTCDTMFSenderHandler::canInsertDTMF):
(MockWebRTCDTMFSenderHandler::insertDTMF):
* DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
(MockWebRTCDTMFSenderHandler):
(MockWebRTCDTMFSenderHandler::taskList):
(MockWebRTCDTMFSenderHandler::clearToneBuffer):
* DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
(MockWebRTCPeerConnectionHandler::createDTMFSender):
* DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h:
(MockWebRTCPeerConnectionHandler):

LayoutTests:

* fast/mediastream/RTCPeerConnection-dtmf-expected.txt: Added.
* fast/mediastream/RTCPeerConnection-dtmf.html: Added.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@141984 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/GNUmakefile.list.am b/Source/WebCore/GNUmakefile.list.am
index aae5c3b..6e7d6f7 100644
--- a/Source/WebCore/GNUmakefile.list.am
+++ b/Source/WebCore/GNUmakefile.list.am
@@ -631,6 +631,10 @@
 	DerivedSources/WebCore/JSRequestAnimationFrameCallback.h \
 	DerivedSources/WebCore/JSRGBColor.cpp \
 	DerivedSources/WebCore/JSRGBColor.h \
+	DerivedSources/WebCore/JSRTCDTMFSender.cpp \
+	DerivedSources/WebCore/JSRTCDTMFSender.h \
+	DerivedSources/WebCore/JSRTCDTMFToneChangeEvent.cpp \
+	DerivedSources/WebCore/JSRTCDTMFToneChangeEvent.h \
 	DerivedSources/WebCore/JSRTCDataChannel.cpp \
 	DerivedSources/WebCore/JSRTCDataChannel.h \
 	DerivedSources/WebCore/JSRTCDataChannelEvent.cpp \
@@ -1243,6 +1247,8 @@
 	$(WebCore)/Modules/mediastream/NavigatorUserMediaError.idl \
 	$(WebCore)/Modules/mediastream/NavigatorUserMediaErrorCallback.idl \
 	$(WebCore)/Modules/mediastream/NavigatorUserMediaSuccessCallback.idl \
+	$(WebCore)/Modules/mediastream/RTCDTMFSender.idl \
+	$(WebCore)/Modules/mediastream/RTCDTMFToneChangeEvent.idl \
 	$(WebCore)/Modules/mediastream/RTCDataChannel.idl \
 	$(WebCore)/Modules/mediastream/RTCDataChannelEvent.idl \
 	$(WebCore)/Modules/mediastream/RTCErrorCallback.idl \
@@ -1937,6 +1943,10 @@
 	Source/WebCore/Modules/mediastream/NavigatorUserMediaError.h \
 	Source/WebCore/Modules/mediastream/NavigatorUserMediaErrorCallback.h \
 	Source/WebCore/Modules/mediastream/NavigatorUserMediaSuccessCallback.h \
+	Source/WebCore/Modules/mediastream/RTCDTMFSender.cpp \
+	Source/WebCore/Modules/mediastream/RTCDTMFSender.h \
+	Source/WebCore/Modules/mediastream/RTCDTMFToneChangeEvent.cpp \
+	Source/WebCore/Modules/mediastream/RTCDTMFToneChangeEvent.h \
 	Source/WebCore/Modules/mediastream/RTCDataChannel.cpp \
 	Source/WebCore/Modules/mediastream/RTCDataChannel.h \
 	Source/WebCore/Modules/mediastream/RTCDataChannelEvent.cpp \
@@ -5762,6 +5772,8 @@
 	Source/WebCore/platform/mediastream/MediaStreamSource.h \
 	Source/WebCore/platform/mediastream/MediaStreamSourcesQueryClient.h \
 	Source/WebCore/platform/mediastream/RTCConfiguration.h \
+	Source/WebCore/platform/mediastream/RTCDTMFSenderHandler.h \
+	Source/WebCore/platform/mediastream/RTCDTMFSenderHandlerClient.h \
 	Source/WebCore/platform/mediastream/RTCDataChannelHandler.h \
 	Source/WebCore/platform/mediastream/RTCDataChannelHandlerClient.h \
 	Source/WebCore/platform/mediastream/RTCIceCandidateDescriptor.cpp \