<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[190072] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/190072">190072</a></dd>
<dt>Author</dt> <dd>eric.carlson@apple.com</dd>
<dt>Date</dt> <dd>2015-09-21 13:09:51 -0700 (Mon, 21 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[MediaStream] Clean up MediaStream private interfaces
https://bugs.webkit.org/show_bug.cgi?id=149381

Reviewed by Jer Noble.

No new tests, no functional change.

* Modules/mediastream/MediaStream.cpp:
(WebCore::MediaStream::create):
(WebCore::MediaStream::MediaStream):
(WebCore::MediaStream::clone):
(WebCore::MediaStream::getTrackById):
(WebCore::MediaStream::getAudioTracks):
(WebCore::MediaStream::getVideoTracks):
(WebCore::MediaStream::getTracks):
(WebCore::MediaStream::activeStatusChanged):
(WebCore::MediaStream::didAddTrack):
(WebCore::MediaStream::didRemoveTrack):
(WebCore::MediaStream::registry):
(WebCore::MediaStream::trackVectorForType):
(WebCore::MediaStream::didAddTrackToPrivate): Deleted.
(WebCore::MediaStream::didRemoveTrackFromPrivate): Deleted.
* Modules/mediastream/MediaStream.h:

* Modules/mediastream/MediaStreamRegistry.cpp:
(WebCore::MediaStreamRegistry::lookup):
(WebCore::MediaStreamRegistry::MediaStreamRegistry):
* Modules/mediastream/MediaStreamRegistry.h:

* Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::MediaStreamTrack::MediaStreamTrack):
(WebCore::MediaStreamTrack::~MediaStreamTrack):
(WebCore::MediaStreamTrack::kind):
(WebCore::MediaStreamTrack::removeObserver):
(WebCore::MediaStreamTrack::trackEnded):
(WebCore::MediaStreamTrack::trackMutedChanged):
(WebCore::MediaStreamTrack::trackStatesChanged):
(WebCore::MediaStreamTrack::configureTrackRendering):
* Modules/mediastream/MediaStreamTrack.h:

* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsType):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::load):

* platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h:
* platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm:
(WebCore::MediaStreamPrivateAVFObjC::create):
(WebCore::MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC):

* platform/mediastream/MediaStreamPrivate.cpp:
(WebCore::MediaStreamPrivate::create):
(WebCore::MediaStreamPrivate::MediaStreamPrivate):
(WebCore::MediaStreamPrivate::~MediaStreamPrivate):
(WebCore::MediaStreamPrivate::tracks):
(WebCore::MediaStreamPrivate::addTrack):
(WebCore::MediaStreamPrivate::removeTrack):
* platform/mediastream/MediaStreamPrivate.h:
(WebCore::MediaStreamPrivateClient::~MediaStreamPrivateClient):
(WebCore::MediaStreamPrivate::id):
(WebCore::MediaStreamPrivate::active):
(WebCore::MediaStreamPrivate::MediaStreamPrivate): Deleted.
(WebCore::MediaStreamPrivate::~MediaStreamPrivate): Deleted.

* platform/mediastream/MediaStreamTrackPrivate.cpp:
(WebCore::MediaStreamTrackPrivate::MediaStreamTrackPrivate):
(WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate):
(WebCore::MediaStreamTrackPrivate::addObserver):
(WebCore::MediaStreamTrackPrivate::removeObserver):
(WebCore::MediaStreamTrackPrivate::label):
(WebCore::MediaStreamTrackPrivate::endTrack):
(WebCore::MediaStreamTrackPrivate::sourceStopped):
(WebCore::MediaStreamTrackPrivate::sourceMutedChanged):
(WebCore::MediaStreamTrackPrivate::sourceStatesChanged):
(WebCore::MediaStreamTrackPrivate::preventSourceFromStopping):
* platform/mediastream/MediaStreamTrackPrivate.h:
(WebCore::MediaStreamTrackPrivate::Observer::~Observer):
(WebCore::MediaStreamTrackPrivate::ended):
(WebCore::MediaStreamTrackPrivate::startProducingData):
(WebCore::MediaStreamTrackPrivate::stopProducingData):
(WebCore::MediaStreamTrackPrivate::setMuted):
(WebCore::MediaStreamTrackPrivateClient::~MediaStreamTrackPrivateClient): Deleted.
(WebCore::MediaStreamTrackPrivate::setClient): Deleted.
(WebCore::MediaStreamTrackPrivate::client): Deleted.

* platform/mediastream/MediaStreamTrackSourcesRequestClient.h:
(WebCore::TrackSourceInfo::create):
(WebCore::TrackSourceInfo::id):
(WebCore::TrackSourceInfo::label):
(WebCore::TrackSourceInfo::groupId):
(WebCore::TrackSourceInfo::kind):
(WebCore::TrackSourceInfo::TrackSourceInfo):
(WebCore::TrackSourceInfo::deviceId): Deleted.

* platform/mediastream/RealtimeMediaSource.cpp:
(WebCore::RealtimeMediaSource::RealtimeMediaSource):
(WebCore::RealtimeMediaSource::reset):
(WebCore::RealtimeMediaSource::setMuted):
(WebCore::RealtimeMediaSource::statesDidChanged):
(WebCore::RealtimeMediaSource::readonly):
* platform/mediastream/RealtimeMediaSource.h:
(WebCore::RealtimeMediaSource::id):
(WebCore::RealtimeMediaSource::persistentId):
(WebCore::RealtimeMediaSource::setPersistentId):
(WebCore::RealtimeMediaSource::type):
(WebCore::RealtimeMediaSource::stopped):
* platform/mediastream/RealtimeMediaSourceCenter.h:
* platform/mediastream/mac/AVCaptureDeviceManager.mm:
(WebCore::AVCaptureDeviceManager::getSourcesInfo):

* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
(WebCore::RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac):
(WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints):
(WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
(WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:

* platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp:
(WebCore::RealtimeMediaSourceCenterOwr::~RealtimeMediaSourceCenterOwr):
(WebCore::RealtimeMediaSourceCenterOwr::validateRequestConstraints):
* platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h:

* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::registerMockRealtimeMediaSourceCenter):
(WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints):
(WebCore::MockRealtimeMediaSourceCenter::createMediaStream):
(WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
* platform/mock/MockRealtimeMediaSourceCenter.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaStreamcpp">trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaStreamh">trunk/Source/WebCore/Modules/mediastream/MediaStream.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaStreamRegistrycpp">trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaStreamRegistryh">trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaStreamTrackcpp">trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaStreamTrackh">trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivatecpp">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamTrackPrivatecpp">trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamTrackPrivateh">trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamTrackSourcesRequestClienth">trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamRealtimeMediaSourcecpp">trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamRealtimeMediaSourceh">trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamRealtimeMediaSourceCenterh">trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacAVCaptureDeviceManagermm">trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp">trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMach">trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrcpp">trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrh">trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCenterh">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/ChangeLog        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -1,3 +1,133 @@
</span><ins>+2015-09-21  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] Clean up MediaStream private interfaces
+        https://bugs.webkit.org/show_bug.cgi?id=149381
+
+        Reviewed by Jer Noble.
+
+        No new tests, no functional change.
+
+        * Modules/mediastream/MediaStream.cpp:
+        (WebCore::MediaStream::create):
+        (WebCore::MediaStream::MediaStream):
+        (WebCore::MediaStream::clone):
+        (WebCore::MediaStream::getTrackById):
+        (WebCore::MediaStream::getAudioTracks):
+        (WebCore::MediaStream::getVideoTracks):
+        (WebCore::MediaStream::getTracks):
+        (WebCore::MediaStream::activeStatusChanged):
+        (WebCore::MediaStream::didAddTrack):
+        (WebCore::MediaStream::didRemoveTrack):
+        (WebCore::MediaStream::registry):
+        (WebCore::MediaStream::trackVectorForType):
+        (WebCore::MediaStream::didAddTrackToPrivate): Deleted.
+        (WebCore::MediaStream::didRemoveTrackFromPrivate): Deleted.
+        * Modules/mediastream/MediaStream.h:
+
+        * Modules/mediastream/MediaStreamRegistry.cpp:
+        (WebCore::MediaStreamRegistry::lookup):
+        (WebCore::MediaStreamRegistry::MediaStreamRegistry):
+        * Modules/mediastream/MediaStreamRegistry.h:
+
+        * Modules/mediastream/MediaStreamTrack.cpp:
+        (WebCore::MediaStreamTrack::MediaStreamTrack):
+        (WebCore::MediaStreamTrack::~MediaStreamTrack):
+        (WebCore::MediaStreamTrack::kind):
+        (WebCore::MediaStreamTrack::removeObserver):
+        (WebCore::MediaStreamTrack::trackEnded):
+        (WebCore::MediaStreamTrack::trackMutedChanged):
+        (WebCore::MediaStreamTrack::trackStatesChanged):
+        (WebCore::MediaStreamTrack::configureTrackRendering):
+        * Modules/mediastream/MediaStreamTrack.h:
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::supportsType):
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::load):
+
+        * platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h:
+        * platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm:
+        (WebCore::MediaStreamPrivateAVFObjC::create):
+        (WebCore::MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC):
+
+        * platform/mediastream/MediaStreamPrivate.cpp:
+        (WebCore::MediaStreamPrivate::create):
+        (WebCore::MediaStreamPrivate::MediaStreamPrivate):
+        (WebCore::MediaStreamPrivate::~MediaStreamPrivate):
+        (WebCore::MediaStreamPrivate::tracks):
+        (WebCore::MediaStreamPrivate::addTrack):
+        (WebCore::MediaStreamPrivate::removeTrack):
+        * platform/mediastream/MediaStreamPrivate.h:
+        (WebCore::MediaStreamPrivateClient::~MediaStreamPrivateClient):
+        (WebCore::MediaStreamPrivate::id):
+        (WebCore::MediaStreamPrivate::active):
+        (WebCore::MediaStreamPrivate::MediaStreamPrivate): Deleted.
+        (WebCore::MediaStreamPrivate::~MediaStreamPrivate): Deleted.
+
+        * platform/mediastream/MediaStreamTrackPrivate.cpp:
+        (WebCore::MediaStreamTrackPrivate::MediaStreamTrackPrivate):
+        (WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate):
+        (WebCore::MediaStreamTrackPrivate::addObserver):
+        (WebCore::MediaStreamTrackPrivate::removeObserver):
+        (WebCore::MediaStreamTrackPrivate::label):
+        (WebCore::MediaStreamTrackPrivate::endTrack):
+        (WebCore::MediaStreamTrackPrivate::sourceStopped):
+        (WebCore::MediaStreamTrackPrivate::sourceMutedChanged):
+        (WebCore::MediaStreamTrackPrivate::sourceStatesChanged):
+        (WebCore::MediaStreamTrackPrivate::preventSourceFromStopping):
+        * platform/mediastream/MediaStreamTrackPrivate.h:
+        (WebCore::MediaStreamTrackPrivate::Observer::~Observer):
+        (WebCore::MediaStreamTrackPrivate::ended):
+        (WebCore::MediaStreamTrackPrivate::startProducingData):
+        (WebCore::MediaStreamTrackPrivate::stopProducingData):
+        (WebCore::MediaStreamTrackPrivate::setMuted):
+        (WebCore::MediaStreamTrackPrivateClient::~MediaStreamTrackPrivateClient): Deleted.
+        (WebCore::MediaStreamTrackPrivate::setClient): Deleted.
+        (WebCore::MediaStreamTrackPrivate::client): Deleted.
+
+        * platform/mediastream/MediaStreamTrackSourcesRequestClient.h:
+        (WebCore::TrackSourceInfo::create):
+        (WebCore::TrackSourceInfo::id):
+        (WebCore::TrackSourceInfo::label):
+        (WebCore::TrackSourceInfo::groupId):
+        (WebCore::TrackSourceInfo::kind):
+        (WebCore::TrackSourceInfo::TrackSourceInfo):
+        (WebCore::TrackSourceInfo::deviceId): Deleted.
+
+        * platform/mediastream/RealtimeMediaSource.cpp:
+        (WebCore::RealtimeMediaSource::RealtimeMediaSource):
+        (WebCore::RealtimeMediaSource::reset):
+        (WebCore::RealtimeMediaSource::setMuted):
+        (WebCore::RealtimeMediaSource::statesDidChanged):
+        (WebCore::RealtimeMediaSource::readonly):
+        * platform/mediastream/RealtimeMediaSource.h:
+        (WebCore::RealtimeMediaSource::id):
+        (WebCore::RealtimeMediaSource::persistentId):
+        (WebCore::RealtimeMediaSource::setPersistentId):
+        (WebCore::RealtimeMediaSource::type):
+        (WebCore::RealtimeMediaSource::stopped):
+        * platform/mediastream/RealtimeMediaSourceCenter.h:
+        * platform/mediastream/mac/AVCaptureDeviceManager.mm:
+        (WebCore::AVCaptureDeviceManager::getSourcesInfo):
+
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+        (WebCore::RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac):
+        (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints):
+        (WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
+        (WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources):
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
+
+        * platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp:
+        (WebCore::RealtimeMediaSourceCenterOwr::~RealtimeMediaSourceCenterOwr):
+        (WebCore::RealtimeMediaSourceCenterOwr::validateRequestConstraints):
+        * platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h:
+
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::registerMockRealtimeMediaSourceCenter):
+        (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints):
+        (WebCore::MockRealtimeMediaSourceCenter::createMediaStream):
+        (WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
+        * platform/mock/MockRealtimeMediaSourceCenter.h:
+
</ins><span class="cx"> 2015-09-21  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix the !ENABLE(TEMPLATE_ELEMENT) build after r189945
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;MediaStream&gt; MediaStream::create(ScriptExecutionContext&amp; context)
</span><span class="cx"> {
</span><del>-    return MediaStream::create(context, MediaStreamPrivate::create());
</del><ins>+    return MediaStream::create(context);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;MediaStream&gt; MediaStream::create(ScriptExecutionContext&amp; context, MediaStream* stream)
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx">     return adoptRef(*new MediaStream(context, stream-&gt;getTracks()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;MediaStream&gt; MediaStream::create(ScriptExecutionContext&amp; context, const Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt;&amp; tracks)
</del><ins>+Ref&lt;MediaStream&gt; MediaStream::create(ScriptExecutionContext&amp; context, const MediaStreamTrackVector&amp; tracks)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(*new MediaStream(context, tracks));
</span><span class="cx"> }
</span><span class="lines">@@ -78,13 +78,13 @@
</span><span class="cx">     return adoptRef(*new MediaStream(context, WTF::move(streamPrivate)));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-MediaStream::MediaStream(ScriptExecutionContext&amp; context, const Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt;&amp; tracks)
</del><ins>+MediaStream::MediaStream(ScriptExecutionContext&amp; context, const MediaStreamTrackVector&amp; tracks)
</ins><span class="cx">     : ContextDestructionObserver(&amp;context)
</span><span class="cx">     , m_activityEventTimer(*this, &amp;MediaStream::activityEventTimerFired)
</span><span class="cx"> {
</span><span class="cx">     // This constructor preserves MediaStreamTrack instances and must be used by calls originating
</span><span class="cx">     // from the JavaScript MediaStream constructor.
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; trackPrivates;
</del><ins>+    MediaStreamTrackPrivateVector trackPrivates;
</ins><span class="cx">     trackPrivates.reserveCapacity(tracks.size());
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; track : tracks) {
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;MediaStream&gt; MediaStream::clone()
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; clonedTracks;
</del><ins>+    MediaStreamTrackVector clonedTracks;
</ins><span class="cx">     clonedTracks.reserveCapacity(m_trackSet.size());
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; track : m_trackSet.values())
</span><span class="lines">@@ -157,19 +157,19 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; MediaStream::getAudioTracks()
</del><ins>+MediaStreamTrackVector MediaStream::getAudioTracks() const
</ins><span class="cx"> {
</span><span class="cx">     return trackVectorForType(RealtimeMediaSource::Audio);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; MediaStream::getVideoTracks()
</del><ins>+MediaStreamTrackVector MediaStream::getVideoTracks() const
</ins><span class="cx"> {
</span><span class="cx">     return trackVectorForType(RealtimeMediaSource::Video);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; MediaStream::getTracks() const
</del><ins>+MediaStreamTrackVector MediaStream::getTracks() const
</ins><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; tracks;
</del><ins>+    MediaStreamTrackVector tracks;
</ins><span class="cx">     tracks.reserveCapacity(m_trackSet.size());
</span><span class="cx">     copyValuesToVector(m_trackSet, tracks);
</span><span class="cx"> 
</span><span class="lines">@@ -193,7 +193,7 @@
</span><span class="cx">     scheduleActiveStateChange();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaStream::didAddTrackToPrivate(MediaStreamTrackPrivate&amp; trackPrivate)
</del><ins>+void MediaStream::didAddTrack(MediaStreamTrackPrivate&amp; trackPrivate)
</ins><span class="cx"> {
</span><span class="cx">     ScriptExecutionContext* context = scriptExecutionContext();
</span><span class="cx">     if (!context)
</span><span class="lines">@@ -202,7 +202,7 @@
</span><span class="cx">     internalAddTrack(MediaStreamTrack::create(*context, trackPrivate), StreamModifier::Platform);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaStream::didRemoveTrackFromPrivate(MediaStreamTrackPrivate&amp; trackPrivate)
</del><ins>+void MediaStream::didRemoveTrack(MediaStreamTrackPrivate&amp; trackPrivate)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;MediaStreamTrack&gt; track = getTrackById(trackPrivate.id());
</span><span class="cx">     internalRemoveTrack(WTF::move(track), StreamModifier::Platform);
</span><span class="lines">@@ -266,9 +266,9 @@
</span><span class="cx">     return MediaStreamRegistry::registry();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; MediaStream::trackVectorForType(RealtimeMediaSource::Type filterType) const
</del><ins>+MediaStreamTrackVector MediaStream::trackVectorForType(RealtimeMediaSource::Type filterType) const
</ins><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; tracks;
</del><ins>+    MediaStreamTrackVector tracks;
</ins><span class="cx">     for (auto&amp; track : m_trackSet.values()) {
</span><span class="cx">         if (track-&gt;source()-&gt;type() == filterType)
</span><span class="cx">             tracks.append(track);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStream.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> 
</span><span class="cx">     static Ref&lt;MediaStream&gt; create(ScriptExecutionContext&amp;);
</span><span class="cx">     static Ref&lt;MediaStream&gt; create(ScriptExecutionContext&amp;, MediaStream*);
</span><del>-    static Ref&lt;MediaStream&gt; create(ScriptExecutionContext&amp;, const Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt;&amp;);
</del><ins>+    static Ref&lt;MediaStream&gt; create(ScriptExecutionContext&amp;, const MediaStreamTrackVector&amp;);
</ins><span class="cx">     static Ref&lt;MediaStream&gt; create(ScriptExecutionContext&amp;, RefPtr&lt;MediaStreamPrivate&gt;&amp;&amp;);
</span><span class="cx">     virtual ~MediaStream();
</span><span class="cx"> 
</span><span class="lines">@@ -67,9 +67,9 @@
</span><span class="cx">     void removeTrack(MediaStreamTrack*);
</span><span class="cx">     MediaStreamTrack* getTrackById(String);
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; getAudioTracks();
-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; getVideoTracks();
-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; getTracks() const;
</del><ins>+    MediaStreamTrackVector getAudioTracks() const;
+    MediaStreamTrackVector getVideoTracks() const;
+    MediaStreamTrackVector getTracks() const;
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;MediaStream&gt; clone();
</span><span class="cx"> 
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx">     void removeObserver(Observer*);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    MediaStream(ScriptExecutionContext&amp;, const Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt;&amp;);
</del><ins>+    MediaStream(ScriptExecutionContext&amp;, const MediaStreamTrackVector&amp;);
</ins><span class="cx">     MediaStream(ScriptExecutionContext&amp;, RefPtr&lt;MediaStreamPrivate&gt;&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     // ContextDestructionObserver
</span><span class="lines">@@ -109,8 +109,8 @@
</span><span class="cx"> 
</span><span class="cx">     // MediaStreamPrivateClient
</span><span class="cx">     virtual void activeStatusChanged() override final;
</span><del>-    virtual void didAddTrackToPrivate(MediaStreamTrackPrivate&amp;) override final;
-    virtual void didRemoveTrackFromPrivate(MediaStreamTrackPrivate&amp;) override final;
</del><ins>+    virtual void didAddTrack(MediaStreamTrackPrivate&amp;) override final;
+    virtual void didRemoveTrack(MediaStreamTrackPrivate&amp;) override final;
</ins><span class="cx"> 
</span><span class="cx">     bool internalAddTrack(RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, StreamModifier);
</span><span class="cx">     bool internalRemoveTrack(RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, StreamModifier);
</span><span class="lines">@@ -118,7 +118,7 @@
</span><span class="cx">     void scheduleActiveStateChange();
</span><span class="cx">     void activityEventTimerFired();
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; trackVectorForType(RealtimeMediaSource::Type) const;
</del><ins>+    MediaStreamTrackVector trackVectorForType(RealtimeMediaSource::Type) const;
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;MediaStreamPrivate&gt; m_private;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamRegistrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -62,6 +62,11 @@
</span><span class="cx">     return m_mediaStreams.get(url);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+MediaStreamRegistry::MediaStreamRegistry()
+{
+    MediaStream::setRegistry(*this);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(MEDIA_STREAM)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamRegistry.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -40,6 +40,8 @@
</span><span class="cx"> 
</span><span class="cx"> class MediaStreamRegistry final : public URLRegistry {
</span><span class="cx"> public:
</span><ins>+    friend class NeverDestroyed&lt;MediaStreamRegistry&gt;;
+
</ins><span class="cx">     // Returns a single instance of MediaStreamRegistry.
</span><span class="cx">     static MediaStreamRegistry&amp; registry();
</span><span class="cx"> 
</span><span class="lines">@@ -50,6 +52,7 @@
</span><span class="cx">     virtual URLRegistrable* lookup(const String&amp;) const override;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    MediaStreamRegistry();
</ins><span class="cx">     HashMap&lt;String, RefPtr&lt;MediaStream&gt;&gt; m_mediaStreams;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -59,12 +59,12 @@
</span><span class="cx"> {
</span><span class="cx">     suspendIfNeeded();
</span><span class="cx"> 
</span><del>-    m_private-&gt;setClient(this);
</del><ins>+    m_private-&gt;addObserver(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> MediaStreamTrack::~MediaStreamTrack()
</span><span class="cx"> {
</span><del>-    m_private-&gt;setClient(nullptr);
</del><ins>+    m_private-&gt;removeObserver(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const AtomicString&amp; MediaStreamTrack::kind() const
</span><span class="lines">@@ -190,7 +190,7 @@
</span><span class="cx">         m_observers.remove(pos);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaStreamTrack::trackEnded()
</del><ins>+void MediaStreamTrack::trackEnded(MediaStreamTrackPrivate&amp;)
</ins><span class="cx"> {
</span><span class="cx">     dispatchEvent(Event::create(eventNames().endedEvent, false, false));
</span><span class="cx"> 
</span><span class="lines">@@ -200,7 +200,7 @@
</span><span class="cx">     configureTrackRendering();
</span><span class="cx"> }
</span><span class="cx">     
</span><del>-void MediaStreamTrack::trackMutedChanged()
</del><ins>+void MediaStreamTrack::trackMutedChanged(MediaStreamTrackPrivate&amp;)
</ins><span class="cx"> {
</span><span class="cx">     AtomicString eventType = muted() ? eventNames().muteEvent : eventNames().unmuteEvent;
</span><span class="cx">     dispatchEvent(Event::create(eventType, false, false));
</span><span class="lines">@@ -208,6 +208,11 @@
</span><span class="cx">     configureTrackRendering();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaStreamTrack::trackStatesChanged(MediaStreamTrackPrivate&amp;)
+{
+    configureTrackRendering();
+}
+
</ins><span class="cx"> void MediaStreamTrack::configureTrackRendering()
</span><span class="cx"> {
</span><span class="cx">     // 4.3.1
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaStreamTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -42,13 +42,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class AudioSourceProvider;
</ins><span class="cx"> class Dictionary;
</span><span class="cx"> class MediaConstraintsImpl;
</span><span class="cx"> class MediaSourceStates;
</span><span class="cx"> class MediaStreamCapabilities;
</span><span class="cx"> class MediaTrackConstraints;
</span><span class="cx"> 
</span><del>-class MediaStreamTrack final : public RefCounted&lt;MediaStreamTrack&gt;, public ScriptWrappable, public ActiveDOMObject, public EventTargetWithInlineData, public MediaStreamTrackPrivateClient {
</del><ins>+class MediaStreamTrack final : public RefCounted&lt;MediaStreamTrack&gt;, public ScriptWrappable, public ActiveDOMObject, public EventTargetWithInlineData, public MediaStreamTrackPrivate::Observer {
</ins><span class="cx"> public:
</span><span class="cx">     class Observer {
</span><span class="cx">     public:
</span><span class="lines">@@ -111,9 +112,10 @@
</span><span class="cx">     virtual void refEventTarget() override final { ref(); }
</span><span class="cx">     virtual void derefEventTarget() override final { deref(); }
</span><span class="cx"> 
</span><del>-    // MediaStreamTrackPrivateClient
-    void trackEnded() override;
-    void trackMutedChanged() override;
</del><ins>+    // MediaStreamTrackPrivate::Observer
+    void trackEnded(MediaStreamTrackPrivate&amp;) override;
+    void trackMutedChanged(MediaStreamTrackPrivate&amp;) override;
+    void trackStatesChanged(MediaStreamTrackPrivate&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;Observer*&gt; m_observers;
</span><span class="cx">     Ref&lt;MediaStreamTrackPrivate&gt; m_private;
</span><span class="lines">@@ -121,6 +123,8 @@
</span><span class="cx">     RefPtr&lt;MediaConstraintsImpl&gt; m_constraints;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+typedef Vector&lt;RefPtr&lt;MediaStreamTrack&gt;&gt; MediaStreamTrackVector;
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(MEDIA_STREAM)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -124,21 +124,22 @@
</span><span class="cx"> 
</span><span class="cx"> MediaPlayer::SupportsType MediaPlayerPrivateMediaStreamAVFObjC::supportsType(const MediaEngineSupportParameters&amp; parameters)
</span><span class="cx"> {
</span><del>-    // This engine does not support non-media-stream sources.
</del><span class="cx">     if (parameters.isMediaStream)
</span><span class="cx">         return MediaPlayer::IsSupported;
</span><ins>+
</ins><span class="cx">     return MediaPlayer::IsNotSupported;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #pragma mark -
</span><span class="cx"> #pragma mark MediaPlayerPrivateInterface Overrides
</span><span class="cx"> 
</span><del>-void MediaPlayerPrivateMediaStreamAVFObjC::load(MediaStreamPrivate&amp; client)
</del><ins>+void MediaPlayerPrivateMediaStreamAVFObjC::load(MediaStreamPrivate&amp; stream)
</ins><span class="cx"> {
</span><del>-    m_MediaStreamPrivate = MediaStreamPrivateAVFObjC::create(*this, *client.client());
-    for (auto track : client.tracks()) {
-        m_MediaStreamPrivate-&gt;addTrack(WTF::move(track), MediaStreamPrivate::NotifyClientOption::DontNotify);
-        m_MediaStreamPrivate-&gt;client()-&gt;didAddTrackToPrivate(*track);
</del><ins>+    LOG(Media, &quot;MediaPlayerPrivateMediaStreamAVFObjC::load(%p)&quot;, this);
+
+    m_MediaStreamPrivate = MediaStreamPrivateAVFObjC::create(*this, stream);
+    for (auto track : stream.tracks()) {
+        m_MediaStreamPrivate-&gt;addTrack(WTF::move(track));
</ins><span class="cx">         if (!track-&gt;ended()) {
</span><span class="cx">             track-&gt;source()-&gt;startProducingData();
</span><span class="cx">             track-&gt;setEnabled(true);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> 
</span><span class="cx"> class MediaStreamPrivateAVFObjC final : public MediaStreamPrivate {
</span><span class="cx"> public:
</span><del>-    static RefPtr&lt;MediaStreamPrivateAVFObjC&gt; create(MediaPlayerPrivateMediaStreamAVFObjC&amp;, MediaStreamPrivateClient&amp;);
</del><ins>+    static RefPtr&lt;MediaStreamPrivateAVFObjC&gt; create(MediaPlayerPrivateMediaStreamAVFObjC&amp;, MediaStreamPrivate&amp;);
</ins><span class="cx">     virtual ~MediaStreamPrivateAVFObjC();
</span><span class="cx"> 
</span><span class="cx">     MediaPlayerPrivateMediaStreamAVFObjC* player() const { return m_player; }
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx">     MediaPlayer::ReadyState readyState() const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    MediaStreamPrivateAVFObjC(MediaPlayerPrivateMediaStreamAVFObjC&amp;, MediaStreamPrivateClient&amp;);
</del><ins>+    MediaStreamPrivateAVFObjC(MediaPlayerPrivateMediaStreamAVFObjC&amp;, MediaStreamPrivate&amp;);
</ins><span class="cx"> 
</span><span class="cx">     MediaPlayerPrivateMediaStreamAVFObjC* m_player;
</span><span class="cx">     RefPtr&lt;MediaStreamPrivateClient&gt; m_client;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaStreamPrivateAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaStreamPrivateAVFObjC.mm        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -43,14 +43,14 @@
</span><span class="cx"> #pragma mark -
</span><span class="cx"> #pragma mark MediaStreamPrivateAVFObjC
</span><span class="cx"> 
</span><del>-RefPtr&lt;MediaStreamPrivateAVFObjC&gt; MediaStreamPrivateAVFObjC::create(MediaPlayerPrivateMediaStreamAVFObjC&amp; parent, MediaStreamPrivateClient&amp; client)
</del><ins>+RefPtr&lt;MediaStreamPrivateAVFObjC&gt; MediaStreamPrivateAVFObjC::create(MediaPlayerPrivateMediaStreamAVFObjC&amp; parent, MediaStreamPrivate&amp; stream)
</ins><span class="cx"> {
</span><del>-    return adoptRef(new MediaStreamPrivateAVFObjC(parent, client));
</del><ins>+    return adoptRef(new MediaStreamPrivateAVFObjC(parent, stream));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC(MediaPlayerPrivateMediaStreamAVFObjC&amp; parent, MediaStreamPrivateClient&amp; client)
-    : m_player(&amp;parent)
-    , m_client(&amp;client)
</del><ins>+MediaStreamPrivateAVFObjC::MediaStreamPrivateAVFObjC(MediaPlayerPrivateMediaStreamAVFObjC&amp; parent, MediaStreamPrivate&amp; stream)
+    : MediaStreamPrivate(*stream.client())
+    , m_player(&amp;parent)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;MediaStreamPrivate&gt; MediaStreamPrivate::create(const Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt;&amp; audioSources, const Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt;&amp; videoSources)
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; tracks;
</del><ins>+    MediaStreamTrackPrivateVector tracks;
</ins><span class="cx">     tracks.reserveCapacity(audioSources.size() + videoSources.size());
</span><span class="cx"> 
</span><span class="cx">     for (auto source : audioSources)
</span><span class="lines">@@ -56,32 +56,36 @@
</span><span class="cx">     return MediaStreamPrivate::create(tracks);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;MediaStreamPrivate&gt; MediaStreamPrivate::create(const Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt;&amp; tracks)
</del><ins>+RefPtr&lt;MediaStreamPrivate&gt; MediaStreamPrivate::create(const MediaStreamTrackPrivateVector&amp; tracks)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(new MediaStreamPrivate(createCanonicalUUIDString(), tracks));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;MediaStreamPrivate&gt; MediaStreamPrivate::create()
</del><ins>+MediaStreamPrivate::MediaStreamPrivate(const String&amp; id, const MediaStreamTrackPrivateVector&amp; tracks)
+    : m_id(id)
</ins><span class="cx"> {
</span><del>-    return MediaStreamPrivate::create(Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt;());
-}
</del><ins>+    ASSERT(!m_id.isEmpty());
</ins><span class="cx"> 
</span><del>-MediaStreamPrivate::MediaStreamPrivate(const String&amp; id, const Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt;&amp; tracks)
-    : m_client(0)
-    , m_id(id)
-    , m_isActive(false)
-{
-    ASSERT(m_id.length());
-
</del><span class="cx">     for (auto&amp; track : tracks)
</span><span class="cx">         m_trackSet.add(track-&gt;id(), track);
</span><span class="cx"> 
</span><span class="cx">     updateActiveState(NotifyClientOption::DontNotify);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; MediaStreamPrivate::tracks() const
</del><ins>+MediaStreamPrivate::MediaStreamPrivate(MediaStreamPrivateClient&amp; client)
+    : m_client(&amp;client)
</ins><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; tracks;
</del><ins>+}
+
+MediaStreamPrivate::~MediaStreamPrivate()
+{
+    m_client = nullptr;
+    m_isActive = false;
+}
+
+MediaStreamTrackPrivateVector MediaStreamPrivate::tracks() const
+{
+    MediaStreamTrackPrivateVector tracks;
</ins><span class="cx">     tracks.reserveCapacity(m_trackSet.size());
</span><span class="cx">     copyValuesToVector(m_trackSet, tracks);
</span><span class="cx"> 
</span><span class="lines">@@ -112,12 +116,13 @@
</span><span class="cx">     if (m_trackSet.contains(track-&gt;id()))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    track-&gt;addObserver(*this);
</ins><span class="cx">     m_trackSet.add(track-&gt;id(), track);
</span><span class="cx"> 
</span><span class="cx">     if (m_client &amp;&amp; notifyClientOption == NotifyClientOption::Notify)
</span><del>-        m_client-&gt;didAddTrackToPrivate(*track.get());
</del><ins>+        m_client-&gt;didAddTrack(*track.get());
</ins><span class="cx"> 
</span><del>-    updateActiveState(NotifyClientOption::Notify);
</del><ins>+    updateActiveState(notifyClientOption);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaStreamPrivate::removeTrack(MediaStreamTrackPrivate&amp; track, NotifyClientOption notifyClientOption)
</span><span class="lines">@@ -125,8 +130,10 @@
</span><span class="cx">     if (!m_trackSet.remove(track.id()))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    track.removeObserver(*this);
+
</ins><span class="cx">     if (m_client &amp;&amp; notifyClientOption == NotifyClientOption::Notify)
</span><del>-        m_client-&gt;didRemoveTrackFromPrivate(track);
</del><ins>+        m_client-&gt;didRemoveTrack(track);
</ins><span class="cx"> 
</span><span class="cx">     updateActiveState(NotifyClientOption::Notify);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -51,18 +51,16 @@
</span><span class="cx">     virtual ~MediaStreamPrivateClient() { }
</span><span class="cx"> 
</span><span class="cx">     virtual void activeStatusChanged() = 0;
</span><del>-    virtual void didAddTrackToPrivate(MediaStreamTrackPrivate&amp;) = 0;
-    virtual void didRemoveTrackFromPrivate(MediaStreamTrackPrivate&amp;) = 0;
</del><ins>+    virtual void didAddTrack(MediaStreamTrackPrivate&amp;) = 0;
+    virtual void didRemoveTrack(MediaStreamTrackPrivate&amp;) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-class MediaStreamPrivate : public RefCounted&lt;MediaStreamPrivate&gt; {
</del><ins>+class MediaStreamPrivate : public MediaStreamTrackPrivate::Observer, public RefCounted&lt;MediaStreamPrivate&gt; {
</ins><span class="cx"> public:
</span><span class="cx">     static RefPtr&lt;MediaStreamPrivate&gt; create(const Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt;&amp; audioSources, const Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt;&amp; videoSources);
</span><del>-    static RefPtr&lt;MediaStreamPrivate&gt; create(const Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt;&amp;);
-    static RefPtr&lt;MediaStreamPrivate&gt; create();
</del><ins>+    static RefPtr&lt;MediaStreamPrivate&gt; create(const MediaStreamTrackPrivateVector&amp;);
</ins><span class="cx"> 
</span><del>-    MediaStreamPrivate() { }
-    virtual ~MediaStreamPrivate() { }
</del><ins>+    virtual ~MediaStreamPrivate();
</ins><span class="cx"> 
</span><span class="cx">     enum class NotifyClientOption { Notify, DontNotify };
</span><span class="cx"> 
</span><span class="lines">@@ -71,20 +69,27 @@
</span><span class="cx"> 
</span><span class="cx">     String id() const { return m_id; }
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; tracks() const;
</del><ins>+    MediaStreamTrackPrivateVector tracks() const;
</ins><span class="cx"> 
</span><span class="cx">     bool active() const { return m_isActive; }
</span><span class="cx">     void updateActiveState(NotifyClientOption);
</span><span class="cx"> 
</span><del>-    void addTrack(RefPtr&lt;MediaStreamTrackPrivate&gt;&amp;&amp;, NotifyClientOption);
-    void removeTrack(MediaStreamTrackPrivate&amp;, NotifyClientOption);
</del><ins>+    void addTrack(RefPtr&lt;MediaStreamTrackPrivate&gt;&amp;&amp;, NotifyClientOption = NotifyClientOption::Notify);
+    void removeTrack(MediaStreamTrackPrivate&amp;, NotifyClientOption = NotifyClientOption::Notify);
</ins><span class="cx"> 
</span><ins>+protected:
+    explicit MediaStreamPrivate(MediaStreamPrivateClient&amp;);
+
</ins><span class="cx"> private:
</span><del>-    MediaStreamPrivate(const String&amp; id, const Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt;&amp;);
</del><ins>+    MediaStreamPrivate(const String&amp;, const MediaStreamTrackPrivateVector&amp;);
</ins><span class="cx"> 
</span><del>-    MediaStreamPrivateClient* m_client;
</del><ins>+    void trackEnded(MediaStreamTrackPrivate&amp;) override { }
+    void trackMutedChanged(MediaStreamTrackPrivate&amp;) override { }
+    void trackStatesChanged(MediaStreamTrackPrivate&amp;) override { }
+
+    MediaStreamPrivateClient* m_client { nullptr };
</ins><span class="cx">     String m_id;
</span><del>-    bool m_isActive;
</del><ins>+    bool m_isActive { false };
</ins><span class="cx"> 
</span><span class="cx">     HashMap&lt;String, RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; m_trackSet;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamTrackPrivatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -25,11 +25,11 @@
</span><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><ins>+#include &quot;MediaStreamTrackPrivate.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><span class="cx"> 
</span><del>-#include &quot;MediaStreamTrackPrivate.h&quot;
-
</del><ins>+#include &quot;AudioSourceProvider.h&quot;
</ins><span class="cx"> #include &quot;MediaSourceStates.h&quot;
</span><span class="cx"> #include &quot;MediaStreamCapabilities.h&quot;
</span><span class="cx"> #include &quot;UUID.h&quot;
</span><span class="lines">@@ -50,7 +50,6 @@
</span><span class="cx"> MediaStreamTrackPrivate::MediaStreamTrackPrivate(const MediaStreamTrackPrivate&amp; other)
</span><span class="cx">     : RefCounted()
</span><span class="cx">     , m_source(other.source())
</span><del>-    , m_client(nullptr)
</del><span class="cx">     , m_id(createCanonicalUUIDString())
</span><span class="cx">     , m_isEnabled(other.enabled())
</span><span class="cx">     , m_isEnded(other.ended())
</span><span class="lines">@@ -61,7 +60,6 @@
</span><span class="cx"> MediaStreamTrackPrivate::MediaStreamTrackPrivate(RefPtr&lt;RealtimeMediaSource&gt;&amp;&amp; source, const String&amp; id)
</span><span class="cx">     : RefCounted()
</span><span class="cx">     , m_source(source)
</span><del>-    , m_client(nullptr)
</del><span class="cx">     , m_id(id)
</span><span class="cx">     , m_isEnabled(true)
</span><span class="cx">     , m_isEnded(false)
</span><span class="lines">@@ -74,6 +72,18 @@
</span><span class="cx">     m_source-&gt;removeObserver(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaStreamTrackPrivate::addObserver(MediaStreamTrackPrivate::Observer&amp; observer)
+{
+    m_observers.append(&amp;observer);
+}
+
+void MediaStreamTrackPrivate::removeObserver(MediaStreamTrackPrivate::Observer&amp; observer)
+{
+    size_t pos = m_observers.find(&amp;observer);
+    if (pos != notFound)
+        m_observers.remove(pos);
+}
+
</ins><span class="cx"> const String&amp; MediaStreamTrackPrivate::label() const
</span><span class="cx"> {
</span><span class="cx">     return m_source-&gt;name();
</span><span class="lines">@@ -102,7 +112,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaStreamTrackPrivate::endTrack()
</span><span class="cx"> {
</span><del>-    if (ended())
</del><ins>+    if (m_isEnded)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_isEnded = true;
</span><span class="lines">@@ -142,21 +152,27 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaStreamTrackPrivate::sourceStopped()
</span><span class="cx"> {
</span><del>-    if (ended())
</del><ins>+    if (m_isEnded)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_isEnded = true;
</span><span class="cx"> 
</span><del>-    if (m_client)
-        m_client-&gt;trackEnded();
</del><ins>+    for (auto&amp; observer : m_observers)
+        observer-&gt;trackEnded(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaStreamTrackPrivate::sourceMutedChanged()
</span><span class="cx"> {
</span><del>-    if (m_client)
-        m_client-&gt;trackMutedChanged();
</del><ins>+    for (auto&amp; observer : m_observers)
+        observer-&gt;trackMutedChanged(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaStreamTrackPrivate::sourceStatesChanged()
+{
+    for (auto&amp; observer : m_observers)
+        observer-&gt;trackStatesChanged(*this);
+}
+
</ins><span class="cx"> bool MediaStreamTrackPrivate::preventSourceFromStopping()
</span><span class="cx"> {
</span><span class="cx">     return !m_isEnded;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamTrackPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -35,19 +35,21 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class AudioSourceProvider;
</ins><span class="cx"> class MediaSourceStates;
</span><span class="cx"> class RealtimeMediaSourceCapabilities;
</span><span class="cx"> 
</span><del>-class MediaStreamTrackPrivateClient {
</del><ins>+class MediaStreamTrackPrivate : public RefCounted&lt;MediaStreamTrackPrivate&gt;, public RealtimeMediaSource::Observer {
</ins><span class="cx"> public:
</span><del>-    virtual ~MediaStreamTrackPrivateClient() { }
</del><ins>+    class Observer {
+    public:
+        virtual ~Observer() { }
</ins><span class="cx"> 
</span><del>-    virtual void trackEnded() = 0;
-    virtual void trackMutedChanged() = 0;
-};
-
-class MediaStreamTrackPrivate : public RefCounted&lt;MediaStreamTrackPrivate&gt;, public RealtimeMediaSource::Observer {
-public:
</del><ins>+        virtual void trackEnded(MediaStreamTrackPrivate&amp;) = 0;
+        virtual void trackMutedChanged(MediaStreamTrackPrivate&amp;) = 0;
+        virtual void trackStatesChanged(MediaStreamTrackPrivate&amp;) = 0;
+    };
+    
</ins><span class="cx">     static RefPtr&lt;MediaStreamTrackPrivate&gt; create(RefPtr&lt;RealtimeMediaSource&gt;&amp;&amp;);
</span><span class="cx">     static RefPtr&lt;MediaStreamTrackPrivate&gt; create(RefPtr&lt;RealtimeMediaSource&gt;&amp;&amp;, const String&amp; id);
</span><span class="cx"> 
</span><span class="lines">@@ -58,7 +60,11 @@
</span><span class="cx"> 
</span><span class="cx">     bool ended() const { return m_isEnded; }
</span><span class="cx"> 
</span><ins>+    void startProducingData() { m_source-&gt;startProducingData(); }
+    void stopProducingData() { m_source-&gt;stopProducingData(); }
+
</ins><span class="cx">     bool muted() const;
</span><ins>+    void setMuted(bool muted) const { m_source-&gt;setMuted(muted); }
</ins><span class="cx"> 
</span><span class="cx">     bool readonly() const;
</span><span class="cx">     bool remote() const;
</span><span class="lines">@@ -73,7 +79,8 @@
</span><span class="cx"> 
</span><span class="cx">     void endTrack();
</span><span class="cx"> 
</span><del>-    void setClient(MediaStreamTrackPrivateClient* client) { m_client = client; }
</del><ins>+    void addObserver(Observer&amp;);
+    void removeObserver(Observer&amp;);
</ins><span class="cx"> 
</span><span class="cx">     const RealtimeMediaSourceStates&amp; states() const;
</span><span class="cx">     RefPtr&lt;RealtimeMediaSourceCapabilities&gt; capabilities() const;
</span><span class="lines">@@ -81,21 +88,18 @@
</span><span class="cx">     RefPtr&lt;MediaConstraints&gt; constraints() const;
</span><span class="cx">     void applyConstraints(const MediaConstraints&amp;);
</span><span class="cx"> 
</span><del>-    void configureTrackRendering();
-
</del><span class="cx"> private:
</span><span class="cx">     explicit MediaStreamTrackPrivate(const MediaStreamTrackPrivate&amp;);
</span><span class="cx">     MediaStreamTrackPrivate(RefPtr&lt;RealtimeMediaSource&gt;&amp;&amp;, const String&amp; id);
</span><span class="cx"> 
</span><del>-    MediaStreamTrackPrivateClient* client() const { return m_client; }
</del><ins>+    // RealtimeMediaSourceObserver
+    void sourceStopped() override final;
+    void sourceMutedChanged() override final;
+    void sourceStatesChanged() override final;
+    bool preventSourceFromStopping() override final;
</ins><span class="cx"> 
</span><del>-    // RealtimeMediaSourceObserver
-    virtual void sourceStopped() override final;
-    virtual void sourceMutedChanged() override final;
-    virtual bool preventSourceFromStopping() override final;
-    
</del><ins>+    Vector&lt;Observer*&gt; m_observers;
</ins><span class="cx">     RefPtr&lt;RealtimeMediaSource&gt; m_source;
</span><del>-    MediaStreamTrackPrivateClient* m_client;
</del><span class="cx">     RefPtr&lt;MediaConstraints&gt; m_constraints;
</span><span class="cx"> 
</span><span class="cx">     String m_id;
</span><span class="lines">@@ -103,6 +107,8 @@
</span><span class="cx">     bool m_isEnded;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+typedef Vector&lt;RefPtr&lt;MediaStreamTrackPrivate&gt;&gt; MediaStreamTrackPrivateVector;
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(MEDIA_STREAM)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamTrackSourcesRequestClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -44,15 +44,14 @@
</span><span class="cx">         return adoptRef(new TrackSourceInfo(id, kind, label));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static Ref&lt;TrackSourceInfo&gt; create(const AtomicString&amp; id, SourceKind kind, const AtomicString&amp; label, const AtomicString&amp; groupId, const AtomicString&amp; deviceId)
</del><ins>+    static Ref&lt;TrackSourceInfo&gt; create(const AtomicString&amp; id, SourceKind kind, const AtomicString&amp; label, const AtomicString&amp; groupId)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new TrackSourceInfo(id, kind, label, groupId, deviceId));
</del><ins>+        return adoptRef(*new TrackSourceInfo(id, kind, label, groupId));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const AtomicString&amp; id() const { return m_id; }
</span><span class="cx">     const AtomicString&amp; label() const { return m_label; }
</span><span class="cx">     const AtomicString&amp; groupId() const { return m_groupId; }
</span><del>-    const AtomicString&amp; deviceId() const { return m_deviceId; }
</del><span class="cx">     SourceKind kind() const { return m_kind; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -63,12 +62,11 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TrackSourceInfo(const AtomicString&amp; id, SourceKind kind, const AtomicString&amp; label, const AtomicString&amp; groupId, const AtomicString&amp; deviceId)
</del><ins>+    TrackSourceInfo(const AtomicString&amp; id, SourceKind kind, const AtomicString&amp; label, const AtomicString&amp; groupId)
</ins><span class="cx">         : m_id(id)
</span><span class="cx">         , m_kind(kind)
</span><span class="cx">         , m_label(label)
</span><span class="cx">         , m_groupId(groupId)
</span><del>-        , m_deviceId(deviceId)
</del><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -76,7 +74,6 @@
</span><span class="cx">     SourceKind m_kind;
</span><span class="cx">     AtomicString m_label;
</span><span class="cx">     AtomicString m_groupId;
</span><del>-    AtomicString m_deviceId;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> typedef Vector&lt;RefPtr&lt;TrackSourceInfo&gt;&gt; TrackSourceInfoVector;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamRealtimeMediaSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -53,12 +53,9 @@
</span><span class="cx"> {
</span><span class="cx">     // FIXME(147205): Need to implement fitness score for constraints
</span><span class="cx"> 
</span><del>-    if (!m_id.isEmpty())
-        return;
-    
-    m_id = createCanonicalUUIDString();
-
-    startProducingData();
</del><ins>+    if (m_id.isEmpty())
+        m_id = createCanonicalUUIDString();
+    m_persistentId = m_id;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RealtimeMediaSource::reset()
</span><span class="lines">@@ -98,6 +95,12 @@
</span><span class="cx">         observer-&gt;sourceMutedChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RealtimeMediaSource::statesDidChanged()
+{
+    for (auto&amp; observer : m_observers)
+        observer-&gt;sourceStatesChanged();
+}
+
</ins><span class="cx"> bool RealtimeMediaSource::readonly() const
</span><span class="cx"> {
</span><span class="cx">     return m_readonly;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamRealtimeMediaSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -44,7 +44,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class AudioBus;
</del><span class="cx"> class MediaConstraints;
</span><span class="cx"> class MediaStreamPrivate;
</span><span class="cx"> class RealtimeMediaSourceStates;
</span><span class="lines">@@ -58,6 +57,7 @@
</span><span class="cx">         // Source state changes.
</span><span class="cx">         virtual void sourceStopped() = 0;
</span><span class="cx">         virtual void sourceMutedChanged() = 0;
</span><ins>+        virtual void sourceStatesChanged() = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Observer state queries.
</span><span class="cx">         virtual bool preventSourceFromStopping() = 0;
</span><span class="lines">@@ -69,6 +69,9 @@
</span><span class="cx"> 
</span><span class="cx">     const String&amp; id() const { return m_id; }
</span><span class="cx"> 
</span><ins>+    const String&amp; persistentId() const { return m_persistentId; }
+    virtual void setPersistentId(const String&amp; persistentId) { m_persistentId = persistentId; }
+
</ins><span class="cx">     enum Type { None, Audio, Video };
</span><span class="cx">     Type type() const { return m_type; }
</span><span class="cx"> 
</span><span class="lines">@@ -80,6 +83,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual RefPtr&lt;RealtimeMediaSourceCapabilities&gt; capabilities() const = 0;
</span><span class="cx">     virtual const RealtimeMediaSourceStates&amp; states() = 0;
</span><ins>+    void statesDidChanged();
</ins><span class="cx">     
</span><span class="cx">     bool stopped() const { return m_stopped; }
</span><span class="cx"> 
</span><span class="lines">@@ -108,6 +112,7 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     String m_id;
</span><ins>+    String m_persistentId;
</ins><span class="cx">     Type m_type;
</span><span class="cx">     String m_name;
</span><span class="cx">     bool m_stopped;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamRealtimeMediaSourceCenterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -53,8 +53,10 @@
</span><span class="cx">     WEBCORE_EXPORT static RealtimeMediaSourceCenter&amp; singleton();
</span><span class="cx">     static void setSharedStreamCenter(RealtimeMediaSourceCenter*);
</span><span class="cx"> 
</span><del>-    virtual void validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) = 0;
</del><ins>+    virtual void validateRequestConstraints(MediaStreamCreationClient*, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints) = 0;
</ins><span class="cx"> 
</span><ins>+    virtual void createMediaStream(MediaStreamCreationClient*, const String&amp; audioDeviceID, const String&amp; videoDeviceID) = 0;
+
</ins><span class="cx">     virtual void createMediaStream(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual bool getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;) = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacAVCaptureDeviceManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -333,9 +333,9 @@
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="cx">         if (!captureDevice.m_videoSourceId.isEmpty())
</span><del>-            sourcesInfo.append(TrackSourceInfo::create(captureDevice.m_videoSourceId, TrackSourceInfo::Video, captureDevice.m_localizedName, captureDevice.m_groupID, captureDevice.m_captureDeviceID));
</del><ins>+            sourcesInfo.append(TrackSourceInfo::create(captureDevice.m_videoSourceId, TrackSourceInfo::Video, captureDevice.m_localizedName, captureDevice.m_groupID));
</ins><span class="cx">         if (!captureDevice.m_audioSourceId.isEmpty())
</span><del>-            sourcesInfo.append(TrackSourceInfo::create(captureDevice.m_audioSourceId, TrackSourceInfo::Audio, captureDevice.m_localizedName, captureDevice.m_groupID, captureDevice.m_captureDeviceID));
</del><ins>+            sourcesInfo.append(TrackSourceInfo::create(captureDevice.m_audioSourceId, TrackSourceInfo::Audio, captureDevice.m_localizedName, captureDevice.m_groupID));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     LOG(Media, &quot;AVCaptureDeviceManager::getSourcesInfo(%p), found %d active devices&quot;, this, sourcesInfo.size());
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -56,10 +56,8 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RealtimeMediaSourceCenterMac::validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt; prpQueryClient, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints)
</del><ins>+void RealtimeMediaSourceCenterMac::validateRequestConstraints(MediaStreamCreationClient* client, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;MediaStreamCreationClient&gt; client = prpQueryClient;
-    
</del><span class="cx">     ASSERT(client);
</span><span class="cx"> 
</span><span class="cx">     if (audioConstraints) {
</span><span class="lines">@@ -126,6 +124,26 @@
</span><span class="cx">     client-&gt;didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RealtimeMediaSourceCenterMac::createMediaStream(MediaStreamCreationClient* client, const String&amp; audioDeviceID, const String&amp; videoDeviceID)
+{
+    ASSERT(client);
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
+
+    if (!audioDeviceID.isEmpty()) {
+        RefPtr&lt;RealtimeMediaSource&gt; audioSource = AVCaptureDeviceManager::singleton().sourceWithUID(audioDeviceID, RealtimeMediaSource::Audio, nullptr);
+        if (audioSource)
+            audioSources.append(audioSource.release());
+    }
+    if (!videoDeviceID.isEmpty()) {
+        RefPtr&lt;RealtimeMediaSource&gt; videoSource = AVCaptureDeviceManager::singleton().sourceWithUID(videoDeviceID, RealtimeMediaSource::Video, nullptr);
+        if (videoSource)
+            videoSources.append(videoSource.release());
+    }
+
+    client-&gt;didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));
+}
+
</ins><span class="cx"> bool RealtimeMediaSourceCenterMac::getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; prpClient)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; requestClient = prpClient;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -45,9 +45,10 @@
</span><span class="cx">     RealtimeMediaSourceCenterMac();
</span><span class="cx">     ~RealtimeMediaSourceCenterMac();
</span><span class="cx"> 
</span><del>-    void validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
</del><ins>+    void validateRequestConstraints(MediaStreamCreationClient*, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints) override;
</ins><span class="cx">     void createMediaStream(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
</span><del>-    virtual bool getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;) override;
</del><ins>+    void createMediaStream(MediaStreamCreationClient*, const String&amp; audioDeviceID, const String&amp; videoDeviceID) override;
+    bool getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;) override;
</ins><span class="cx">     RefPtr&lt;TrackSourceInfo&gt; sourceWithUID(const String&amp;, RealtimeMediaSource::Type, MediaConstraints*) override;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -78,17 +78,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RealtimeMediaSourceCenterOwr::validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt; prpClient, PassRefPtr&lt;MediaConstraints&gt; prpAudioConstraints, PassRefPtr&lt;MediaConstraints&gt; prpVideoConstraints)
</del><ins>+void RealtimeMediaSourceCenterOwr::validateRequestConstraints(MediaStreamCreationClient* client, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints)
</ins><span class="cx"> {
</span><del>-    m_client = prpClient;
-    ASSERT(m_client);
</del><ins>+    m_client = client;
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: Actually do constraints validation. The MediaConstraints
</span><span class="cx">     // need to comply with the available audio/video device(s)
</span><span class="cx">     // capabilities. See bug #123345.
</span><del>-    RefPtr&lt;MediaConstraints&gt; audioConstraints = prpAudioConstraints;
-    RefPtr&lt;MediaConstraints&gt; videoConstraints = prpVideoConstraints;
-
</del><span class="cx">     int types = OWR_MEDIA_TYPE_UNKNOWN;
</span><span class="cx">     if (audioConstraints)
</span><span class="cx">         types |= OWR_MEDIA_TYPE_AUDIO;
</span><span class="lines">@@ -132,6 +128,32 @@
</span><span class="cx">     client-&gt;didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RealtimeMediaSourceCenterOwr::createMediaStream(MediaStreamCreationClient* client, const String&amp; audioDeviceID, const String&amp; videoDeviceID)
+{
+    ASSERT(client);
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
+
+    if (!audioDeviceID.isEmpty()) {
+        RealtimeMediaSourceOwrMap::iterator sourceIterator = m_sourceMap.find(audioDeviceID);
+        if (sourceIterator != m_sourceMap.end()) {
+            RefPtr&lt;RealtimeMediaSource&gt; source = sourceIterator-&gt;value;
+            if (source-&gt;type() == RealtimeMediaSource::Audio)
+                audioSources.append(source.release());
+        }
+    }
+    if (!videoDeviceID.isEmpty()) {
+        RealtimeMediaSourceOwrMap::iterator sourceIterator = m_sourceMap.find(videoDeviceID);
+        if (sourceIterator != m_sourceMap.end()) {
+            RefPtr&lt;RealtimeMediaSource&gt; source = sourceIterator-&gt;value;
+            if (source-&gt;type() == RealtimeMediaSource::Video)
+                audioSources.append(source.release());
+        }
+    }
+
+    client-&gt;didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));
+}
+
</ins><span class="cx"> bool RealtimeMediaSourceCenterOwr::getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;)
</span><span class="cx"> {
</span><span class="cx">     notImplemented();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamopenwebrtcRealtimeMediaSourceCenterOwrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -53,8 +53,11 @@
</span><span class="cx">     RealtimeMediaSourceCenterOwr();
</span><span class="cx">     ~RealtimeMediaSourceCenterOwr();
</span><span class="cx"> 
</span><del>-    void validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
</del><ins>+    void validateRequestConstraints(MediaStreamCreationClient*, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints) override;
+
</ins><span class="cx">     void createMediaStream(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
</span><ins>+    void createMediaStream(MediaStreamCreationClient*, const String&amp; audioDeviceID, const String&amp; videoDeviceID) override;
+
</ins><span class="cx">     bool getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;) override;
</span><span class="cx"> 
</span><span class="cx">     void mediaSourcesAvailable(GList* sources);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -127,12 +127,10 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MockRealtimeMediaSourceCenter::validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt; prpQueryClient, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints)
</del><ins>+void MockRealtimeMediaSourceCenter::validateRequestConstraints(MediaStreamCreationClient* client, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;MediaStreamCreationClient&gt; client = prpQueryClient;
-    
</del><span class="cx">     ASSERT(client);
</span><del>-    
</del><ins>+
</ins><span class="cx">     if (audioConstraints) {
</span><span class="cx">         String invalidQuery = MediaConstraintsMock::verifyConstraints(audioConstraints);
</span><span class="cx">         if (!invalidQuery.isEmpty()) {
</span><span class="lines">@@ -195,6 +193,33 @@
</span><span class="cx">     client-&gt;didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MockRealtimeMediaSourceCenter::createMediaStream(MediaStreamCreationClient* client, const String&amp; audioDeviceID, const String&amp; videoDeviceID)
+{
+    ASSERT(client);
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
+    Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
+    MockSourceMap&amp; map = mockSourceMap();
+
+    if (!audioDeviceID.isEmpty()) {
+        MockSourceMap::iterator it = map.find(mockAudioSourceID());
+        ASSERT(it != map.end());
+
+        RefPtr&lt;RealtimeMediaSource&gt; audioSource = it-&gt;value;
+        audioSource-&gt;reset();
+        audioSources.append(audioSource.release());
+    }
+    if (!videoDeviceID.isEmpty()) {
+        MockSourceMap::iterator it = map.find(mockVideoSourceID());
+        ASSERT(it != map.end());
+
+        RefPtr&lt;RealtimeMediaSource&gt; videoSource = it-&gt;value;
+        videoSource-&gt;reset();
+        videoSources.append(videoSource.release());
+    }
+
+    client-&gt;didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));
+}
+
</ins><span class="cx"> bool MockRealtimeMediaSourceCenter::getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; prpClient)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; requestClient = prpClient;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCenterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h (190071 => 190072)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h        2015-09-21 20:05:51 UTC (rev 190071)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h        2015-09-21 20:09:51 UTC (rev 190072)
</span><span class="lines">@@ -37,12 +37,14 @@
</span><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT static void registerMockRealtimeMediaSourceCenter();
</span><span class="cx"> 
</span><del>-    virtual void validateRequestConstraints(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
-    virtual void createMediaStream(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
-    virtual bool getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;) override;
</del><ins>+private:
+
+    void validateRequestConstraints(MediaStreamCreationClient*, RefPtr&lt;MediaConstraints&gt;&amp; audioConstraints, RefPtr&lt;MediaConstraints&gt;&amp; videoConstraints) override;
+    void createMediaStream(PassRefPtr&lt;MediaStreamCreationClient&gt;, PassRefPtr&lt;MediaConstraints&gt; audioConstraints, PassRefPtr&lt;MediaConstraints&gt; videoConstraints) override;
+    bool getMediaStreamTrackSources(PassRefPtr&lt;MediaStreamTrackSourcesRequestClient&gt;) override;
+    void createMediaStream(MediaStreamCreationClient*, const String&amp; audioDeviceID, const String&amp; videoDeviceID) override;
</ins><span class="cx">     RefPtr&lt;TrackSourceInfo&gt; sourceWithUID(const String&amp;, RealtimeMediaSource::Type, MediaConstraints*) override;
</span><span class="cx"> 
</span><del>-private:
</del><span class="cx">     MockRealtimeMediaSourceCenter() { }
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>