<!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>[192174] 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/192174">192174</a></dd>
<dt>Author</dt> <dd>eric.carlson@apple.com</dd>
<dt>Date</dt> <dd>2015-11-09 13:20:08 -0800 (Mon, 09 Nov 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[MediaStream] Add mock audio and video sources
https://bugs.webkit.org/show_bug.cgi?id=150997
&lt;rdar://problem/23453358&gt;

Reviewed by Jer Noble.

Create basic mock audio and video realtime media source classes so we can test MediaStream
API without requiring test machines to have audio/video input hardware. No new tests added
yet, thoe will follow.

No new tests, these changes will allow us to write MediaStream tests.

* CMakeLists.txt: Add MockRealtimeAudioSource.cpp, MockRealtimeMediaSource.cpp, and
  MockRealtimeVideoSource.cpp

* PlatformMac.cmake: Add MockRealtimeVideoSourceMac.mm

* WebCore.xcodeproj/project.pbxproj: Add new files.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::createPreviewLayers): Don't set autoresizingMask,
  it isn't necessary.

* platform/mediastream/mac/AVCaptureDeviceManager.mm:
(WebCore::refreshCaptureDeviceList): AVCaptureDevice -&gt; getAVCaptureDeviceClass()
(WebCore::AVCaptureDeviceManager::bestDeviceForFacingMode): Ditto.
(WebCore::AVCaptureDeviceManager::sourceWithUID): Ditto.

Mac class implements RealtimeVideoSource::platformLayer, returns a CALayer which uses the
GraphicsContext as contents.
* platform/mediastream/mac/MockRealtimeVideoSourceMac.h: Added.
* platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: Added.
(WebCore::MockRealtimeVideoSource::create):
(WebCore::MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac):
(WebCore::MockRealtimeVideoSourceMac::platformLayer):
(WebCore::MockRealtimeVideoSourceMac::updatePlatformLayer):

Mock audio source. Doesn't provide data yet, only provides states and capabilities.
* platform/mock/MockRealtimeAudioSource.cpp: Added.
(WebCore::MockRealtimeAudioSource::create):
(WebCore::MockRealtimeAudioSource::MockRealtimeAudioSource):
(WebCore::MockRealtimeAudioSource::updateStates):
(WebCore::MockRealtimeAudioSource::initializeCapabilities):
* platform/mock/MockRealtimeAudioSource.h: Added.
(WebCore::MockRealtimeAudioSource::~MockRealtimeAudioSource):

Mock source base class, sets persistent ID and updates states and capabilities.
* platform/mock/MockRealtimeMediaSource.cpp: Added.
(WebCore::MockRealtimeMediaSource::mockAudioPersistentID):
(WebCore::MockRealtimeMediaSource::mockVideoPersistentID):
(WebCore::MockRealtimeMediaSource::MockRealtimeMediaSource):
(WebCore::MockRealtimeMediaSource::capabilities):
(WebCore::MockRealtimeMediaSource::states):
* platform/mock/MockRealtimeMediaSource.h: Added.
(WebCore::MockRealtimeMediaSource::mockAudioSourcePersistentID):
(WebCore::MockRealtimeMediaSource::mockAudioSourceName):
(WebCore::MockRealtimeMediaSource::mockVideoSourcePersistentID):
(WebCore::MockRealtimeMediaSource::mockVideoSourceName):
(WebCore::MockRealtimeMediaSource::trackSourceWithUID):
(WebCore::MockRealtimeMediaSource::~MockRealtimeMediaSource):
(WebCore::MockRealtimeMediaSource::currentStates):
(WebCore::MockRealtimeMediaSource::constraints):

Use new mock source classes. Create a new source instance for each request instead of reusing the
same sources each time.
* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::mockSourceMap):
(WebCore::MockRealtimeMediaSourceCenter::registerMockRealtimeMediaSourceCenter):
(WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints):
(WebCore::MockRealtimeMediaSourceCenter::createMediaStream):
(WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
(WebCore::MockSource::MockSource): Deleted.
(WebCore::MockSource::~MockSource): Deleted.
(WebCore::MockSource::capabilities): Deleted.
(WebCore::MockSource::states): Deleted.
(WebCore::mockAudioSourceID): Deleted.
(WebCore::mockVideoSourceID): Deleted.
(WebCore::initializeMockSources): Deleted.

Mock video source. Generate bip-bop inspired frames with burned in state information.
* platform/mock/MockRealtimeVideoSource.cpp: Added.
(WebCore::MockRealtimeVideoSource::create):
(WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource):
(WebCore::MockRealtimeVideoSource::startProducingData):
(WebCore::MockRealtimeVideoSource::stopProducingData):
(WebCore::MockRealtimeVideoSource::elapsedTime):
(WebCore::MockRealtimeVideoSource::updateStates):
(WebCore::MockRealtimeVideoSource::initializeCapabilities):
(WebCore::MockRealtimeVideoSource::setFacingMode):
(WebCore::MockRealtimeVideoSource::setFrameRate):
(WebCore::MockRealtimeVideoSource::setSize):
(WebCore::MockRealtimeVideoSource::drawAnimation):
(WebCore::MockRealtimeVideoSource::drawBoxes):
(WebCore::MockRealtimeVideoSource::drawText):
(WebCore::MockRealtimeVideoSource::generateFrame):
(WebCore::MockRealtimeVideoSource::imageBuffer):
(WebCore::MockRealtimeVideoSource::paintCurrentFrameInContext):
(WebCore::MockRealtimeVideoSource::currentFrameImage):
* platform/mock/MockRealtimeVideoSource.h: Added.
(WebCore::MockRealtimeVideoSource::~MockRealtimeVideoSource):
(WebCore::MockRealtimeVideoSource::size):
(WebCore::MockRealtimeVideoSource::updatePlatformLayer):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorePlatformMaccmake">trunk/Source/WebCore/PlatformMac.cmake</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacAVCaptureDeviceManagermm">trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformmediastreammacMockRealtimeVideoSourceMach">trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacMockRealtimeVideoSourceMacmm">trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeAudioSourcecpp">trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeAudioSourceh">trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourcecpp">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceh">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeVideoSourcecpp">trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeVideoSourceh">trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/CMakeLists.txt        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -2302,7 +2302,10 @@
</span><span class="cx">     platform/mock/DeviceOrientationClientMock.cpp
</span><span class="cx">     platform/mock/GeolocationClientMock.cpp
</span><span class="cx">     platform/mock/MediaConstraintsMock.cpp
</span><ins>+    platform/mock/MockRealtimeAudioSource.cpp
+    platform/mock/MockRealtimeMediaSource.cpp
</ins><span class="cx">     platform/mock/MockRealtimeMediaSourceCenter.cpp
</span><ins>+    platform/mock/MockRealtimeVideoSource.cpp
</ins><span class="cx">     platform/mock/RTCDTMFSenderHandlerMock.cpp
</span><span class="cx">     platform/mock/RTCDataChannelHandlerMock.cpp
</span><span class="cx">     platform/mock/RTCNotifiersMock.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/ChangeLog        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -1,3 +1,108 @@
</span><ins>+2015-11-09  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] Add mock audio and video sources
+        https://bugs.webkit.org/show_bug.cgi?id=150997
+        &lt;rdar://problem/23453358&gt;
+
+        Reviewed by Jer Noble.
+
+        Create basic mock audio and video realtime media source classes so we can test MediaStream
+        API without requiring test machines to have audio/video input hardware. No new tests added
+        yet, thoe will follow.
+
+        No new tests, these changes will allow us to write MediaStream tests.
+
+        * CMakeLists.txt: Add MockRealtimeAudioSource.cpp, MockRealtimeMediaSource.cpp, and 
+          MockRealtimeVideoSource.cpp
+
+        * PlatformMac.cmake: Add MockRealtimeVideoSourceMac.mm
+
+        * WebCore.xcodeproj/project.pbxproj: Add new files.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::createPreviewLayers): Don't set autoresizingMask,
+          it isn't necessary.
+
+        * platform/mediastream/mac/AVCaptureDeviceManager.mm:
+        (WebCore::refreshCaptureDeviceList): AVCaptureDevice -&gt; getAVCaptureDeviceClass()
+        (WebCore::AVCaptureDeviceManager::bestDeviceForFacingMode): Ditto.
+        (WebCore::AVCaptureDeviceManager::sourceWithUID): Ditto.
+
+        Mac class implements RealtimeVideoSource::platformLayer, returns a CALayer which uses the
+        GraphicsContext as contents.
+        * platform/mediastream/mac/MockRealtimeVideoSourceMac.h: Added.
+        * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: Added.
+        (WebCore::MockRealtimeVideoSource::create):
+        (WebCore::MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac):
+        (WebCore::MockRealtimeVideoSourceMac::platformLayer):
+        (WebCore::MockRealtimeVideoSourceMac::updatePlatformLayer):
+
+        Mock audio source. Doesn't provide data yet, only provides states and capabilities.
+        * platform/mock/MockRealtimeAudioSource.cpp: Added.
+        (WebCore::MockRealtimeAudioSource::create):
+        (WebCore::MockRealtimeAudioSource::MockRealtimeAudioSource):
+        (WebCore::MockRealtimeAudioSource::updateStates):
+        (WebCore::MockRealtimeAudioSource::initializeCapabilities):
+        * platform/mock/MockRealtimeAudioSource.h: Added.
+        (WebCore::MockRealtimeAudioSource::~MockRealtimeAudioSource):
+
+        Mock source base class, sets persistent ID and updates states and capabilities.
+        * platform/mock/MockRealtimeMediaSource.cpp: Added.
+        (WebCore::MockRealtimeMediaSource::mockAudioPersistentID):
+        (WebCore::MockRealtimeMediaSource::mockVideoPersistentID):
+        (WebCore::MockRealtimeMediaSource::MockRealtimeMediaSource):
+        (WebCore::MockRealtimeMediaSource::capabilities):
+        (WebCore::MockRealtimeMediaSource::states):
+        * platform/mock/MockRealtimeMediaSource.h: Added.
+        (WebCore::MockRealtimeMediaSource::mockAudioSourcePersistentID):
+        (WebCore::MockRealtimeMediaSource::mockAudioSourceName):
+        (WebCore::MockRealtimeMediaSource::mockVideoSourcePersistentID):
+        (WebCore::MockRealtimeMediaSource::mockVideoSourceName):
+        (WebCore::MockRealtimeMediaSource::trackSourceWithUID):
+        (WebCore::MockRealtimeMediaSource::~MockRealtimeMediaSource):
+        (WebCore::MockRealtimeMediaSource::currentStates):
+        (WebCore::MockRealtimeMediaSource::constraints):
+
+        Use new mock source classes. Create a new source instance for each request instead of reusing the
+        same sources each time.
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::mockSourceMap):
+        (WebCore::MockRealtimeMediaSourceCenter::registerMockRealtimeMediaSourceCenter):
+        (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints):
+        (WebCore::MockRealtimeMediaSourceCenter::createMediaStream):
+        (WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
+        (WebCore::MockSource::MockSource): Deleted.
+        (WebCore::MockSource::~MockSource): Deleted.
+        (WebCore::MockSource::capabilities): Deleted.
+        (WebCore::MockSource::states): Deleted.
+        (WebCore::mockAudioSourceID): Deleted.
+        (WebCore::mockVideoSourceID): Deleted.
+        (WebCore::initializeMockSources): Deleted.
+
+        Mock video source. Generate bip-bop inspired frames with burned in state information.
+        * platform/mock/MockRealtimeVideoSource.cpp: Added.
+        (WebCore::MockRealtimeVideoSource::create):
+        (WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource):
+        (WebCore::MockRealtimeVideoSource::startProducingData):
+        (WebCore::MockRealtimeVideoSource::stopProducingData):
+        (WebCore::MockRealtimeVideoSource::elapsedTime):
+        (WebCore::MockRealtimeVideoSource::updateStates):
+        (WebCore::MockRealtimeVideoSource::initializeCapabilities):
+        (WebCore::MockRealtimeVideoSource::setFacingMode):
+        (WebCore::MockRealtimeVideoSource::setFrameRate):
+        (WebCore::MockRealtimeVideoSource::setSize):
+        (WebCore::MockRealtimeVideoSource::drawAnimation):
+        (WebCore::MockRealtimeVideoSource::drawBoxes):
+        (WebCore::MockRealtimeVideoSource::drawText):
+        (WebCore::MockRealtimeVideoSource::generateFrame):
+        (WebCore::MockRealtimeVideoSource::imageBuffer):
+        (WebCore::MockRealtimeVideoSource::paintCurrentFrameInContext):
+        (WebCore::MockRealtimeVideoSource::currentFrameImage):
+        * platform/mock/MockRealtimeVideoSource.h: Added.
+        (WebCore::MockRealtimeVideoSource::~MockRealtimeVideoSource):
+        (WebCore::MockRealtimeVideoSource::size):
+        (WebCore::MockRealtimeVideoSource::updatePlatformLayer):
+
</ins><span class="cx"> 2015-11-09  Nan Wang  &lt;n_wang@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: Input type: time is not accessible on iOS
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformMaccmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformMac.cmake (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformMac.cmake        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/PlatformMac.cmake        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -107,6 +107,7 @@
</span><span class="cx">     &quot;${WEBCORE_DIR}/platform/graphics/opengl&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/platform/graphics/mac&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/platform/mac&quot;
</span><ins>+    &quot;${WEBCORE_DIR}/platform/mediastream/mac&quot;
</ins><span class="cx">     &quot;${WEBCORE_DIR}/platform/network/cocoa&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/platform/network/cf&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/platform/network/mac&quot;
</span><span class="lines">@@ -497,6 +498,8 @@
</span><span class="cx">     platform/mac/WebWindowAnimation.mm
</span><span class="cx">     platform/mac/WidgetMac.mm
</span><span class="cx"> 
</span><ins>+    platform/mediastream/mac/MockRealtimeVideoSourceMac.mm
+
</ins><span class="cx">     platform/network/cf/AuthenticationCF.cpp
</span><span class="cx">     platform/network/cf/CookieJarCFNet.cpp
</span><span class="cx">     platform/network/cf/CookieStorageCFNet.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -335,6 +335,10 @@
</span><span class="cx">                 07D07B141834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07D07B131834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp */; };
</span><span class="cx">                 07D637401BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */; };
</span><span class="cx">                 07D637411BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07D6373F1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm */; };
</span><ins>+                07D6A4EF1BECF2D200174146 /* MockRealtimeMediaSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07D6A4ED1BECF2D200174146 /* MockRealtimeMediaSource.cpp */; settings = {ASSET_TAGS = (); }; };
+                07D6A4F01BECF2D200174146 /* MockRealtimeMediaSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6A4EE1BECF2D200174146 /* MockRealtimeMediaSource.h */; settings = {ASSET_TAGS = (); }; };
+                07D6A4F31BED5F8800174146 /* MockRealtimeAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07D6A4F11BED5F8800174146 /* MockRealtimeAudioSource.cpp */; settings = {ASSET_TAGS = (); }; };
+                07D6A4F41BED5F8800174146 /* MockRealtimeAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6A4F21BED5F8800174146 /* MockRealtimeAudioSource.h */; settings = {ASSET_TAGS = (); }; };
</ins><span class="cx">                 07DC5FD417D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07DC5FD317D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp */; };
</span><span class="cx">                 07E116B11489C9A100EC5ACE /* JSTextTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */; };
</span><span class="cx">                 07E117071489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */; };
</span><span class="lines">@@ -342,6 +346,10 @@
</span><span class="cx">                 07E9E12E18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E9E12D18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h */; };
</span><span class="cx">                 07E9E13018F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E9E12F18F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp */; };
</span><span class="cx">                 07EDC3EE1AACB75D00983EB5 /* MediaSessionManagerMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07EDC3ED1AACB75D00983EB5 /* MediaSessionManagerMac.cpp */; };
</span><ins>+                07EE76EB1BE96DB000F89133 /* MockRealtimeVideoSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07EE76E91BE96DB000F89133 /* MockRealtimeVideoSource.cpp */; settings = {ASSET_TAGS = (); }; };
+                07EE76EC1BE96DB000F89133 /* MockRealtimeVideoSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 07EE76EA1BE96DB000F89133 /* MockRealtimeVideoSource.h */; settings = {ASSET_TAGS = (); }; };
+                07EE76EF1BEA619800F89133 /* MockRealtimeVideoSourceMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 07EE76ED1BEA619800F89133 /* MockRealtimeVideoSourceMac.h */; settings = {ASSET_TAGS = (); }; };
+                07EE76F01BEA619800F89133 /* MockRealtimeVideoSourceMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07EE76EE1BEA619800F89133 /* MockRealtimeVideoSourceMac.mm */; settings = {ASSET_TAGS = (); }; };
</ins><span class="cx">                 07F0B97A1AC5DB3300E535D9 /* AVKitSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 07F0B9791AC5DB3300E535D9 /* AVKitSPI.h */; };
</span><span class="cx">                 07F0B97C1AC5DB4600E535D9 /* AVFoundationSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 07F0B97B1AC5DB4600E535D9 /* AVFoundationSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 07F876841AD580F900905849 /* MediaPlaybackTargetContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 07F876831AD4A94500905849 /* MediaPlaybackTargetContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -7586,6 +7594,10 @@
</span><span class="cx">                 07D07B131834158800ABDD3C /* JSRTCSessionDescriptionCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCSessionDescriptionCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAudioSourceProviderAVFObjC.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07D6373F1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebAudioSourceProviderAVFObjC.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                07D6A4ED1BECF2D200174146 /* MockRealtimeMediaSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockRealtimeMediaSource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07D6A4EE1BECF2D200174146 /* MockRealtimeMediaSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockRealtimeMediaSource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07D6A4F11BED5F8800174146 /* MockRealtimeAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockRealtimeAudioSource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07D6A4F21BED5F8800174146 /* MockRealtimeAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockRealtimeAudioSource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 07DC5FD317D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCStatsResponseCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCueCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -7593,6 +7605,10 @@
</span><span class="cx">                 07E9E12D18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandMetadataTextTrackPrivateAVF.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07E9E12F18F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandMetadataTextTrackPrivateAVF.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07EDC3ED1AACB75D00983EB5 /* MediaSessionManagerMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaSessionManagerMac.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                07EE76E91BE96DB000F89133 /* MockRealtimeVideoSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockRealtimeVideoSource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07EE76EA1BE96DB000F89133 /* MockRealtimeVideoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockRealtimeVideoSource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07EE76ED1BEA619800F89133 /* MockRealtimeVideoSourceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockRealtimeVideoSourceMac.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07EE76EE1BEA619800F89133 /* MockRealtimeVideoSourceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MockRealtimeVideoSourceMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 07F0B9791AC5DB3300E535D9 /* AVKitSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVKitSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07F0B97B1AC5DB4600E535D9 /* AVFoundationSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVFoundationSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07F876831AD4A94500905849 /* MediaPlaybackTargetContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlaybackTargetContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -15217,6 +15233,8 @@
</span><span class="cx">                                 070363DD181A1CDC00C074A5 /* AVMediaCaptureSource.mm */,
</span><span class="cx">                                 070363DE181A1CDC00C074A5 /* AVVideoCaptureSource.h */,
</span><span class="cx">                                 070363DF181A1CDC00C074A5 /* AVVideoCaptureSource.mm */,
</span><ins>+                                07EE76ED1BEA619800F89133 /* MockRealtimeVideoSourceMac.h */,
+                                07EE76EE1BEA619800F89133 /* MockRealtimeVideoSourceMac.mm */,
</ins><span class="cx">                                 4A0FFAA31AAF5EF60062803B /* RealtimeMediaSourceCenterMac.cpp */,
</span><span class="cx">                                 4A0FFAA41AAF5EF60062803B /* RealtimeMediaSourceCenterMac.h */,
</span><span class="cx">                                 07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */,
</span><span class="lines">@@ -17077,6 +17095,12 @@
</span><span class="cx">                                 59309A1211F4AE6A00250603 /* DeviceOrientationClientMock.h */,
</span><span class="cx">                                 073794DF19EE2D1B00E5A045 /* MediaConstraintsMock.cpp */,
</span><span class="cx">                                 073794E019EE2D1B00E5A045 /* MediaConstraintsMock.h */,
</span><ins>+                                07D6A4F11BED5F8800174146 /* MockRealtimeAudioSource.cpp */,
+                                07D6A4F21BED5F8800174146 /* MockRealtimeAudioSource.h */,
+                                07D6A4ED1BECF2D200174146 /* MockRealtimeMediaSource.cpp */,
+                                07D6A4EE1BECF2D200174146 /* MockRealtimeMediaSource.h */,
+                                07EE76E91BE96DB000F89133 /* MockRealtimeVideoSource.cpp */,
+                                07EE76EA1BE96DB000F89133 /* MockRealtimeVideoSource.h */,
</ins><span class="cx">                                 4A0FFA9B1AAF5E6C0062803B /* MockRealtimeMediaSourceCenter.cpp */,
</span><span class="cx">                                 4A0FFA9C1AAF5E6C0062803B /* MockRealtimeMediaSourceCenter.h */,
</span><span class="cx">                                 AAE27B7416CBFC0D00623043 /* PlatformSpeechSynthesizerMock.cpp */,
</span><span class="lines">@@ -25555,7 +25579,9 @@
</span><span class="cx">                                 A80D67080E9E9DEB00E420F0 /* GraphicsContextPlatformPrivateCG.h in Headers */,
</span><span class="cx">                                 0F580B0D0F12A2690051D689 /* GraphicsLayer.h in Headers */,
</span><span class="cx">                                 499B3ED7128CD31400E726C2 /* GraphicsLayerCA.h in Headers */,
</span><ins>+                                07D6A4F01BECF2D200174146 /* MockRealtimeMediaSource.h in Headers */,
</ins><span class="cx">                                 0F580B0E0F12A2690051D689 /* GraphicsLayerClient.h in Headers */,
</span><ins>+                                07D6A4F41BED5F8800174146 /* MockRealtimeAudioSource.h in Headers */,
</ins><span class="cx">                                 1AC69593161A1E53003732CB /* GraphicsLayerFactory.h in Headers */,
</span><span class="cx">                                 0FA24D7A162DF91900A3F4C0 /* GraphicsLayerUpdater.h in Headers */,
</span><span class="cx">                                 CEC337AF1A46086D009B8523 /* GraphicsServicesSPI.h in Headers */,
</span><span class="lines">@@ -26559,6 +26585,7 @@
</span><span class="cx">                                 49D5DC2C0F423A73008F20FD /* Matrix3DTransformOperation.h in Headers */,
</span><span class="cx">                                 49E911C70EF86D47009D0CAF /* MatrixTransformOperation.h in Headers */,
</span><span class="cx">                                 5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */,
</span><ins>+                                07EE76EF1BEA619800F89133 /* MockRealtimeVideoSourceMac.h in Headers */,
</ins><span class="cx">                                 931BCC611124DFCB00BE70DD /* MediaCanStartListener.h in Headers */,
</span><span class="cx">                                 078E093A17D16E1C00420AA1 /* MediaConstraints.h in Headers */,
</span><span class="cx">                                 078E091417D14D1C00420AA1 /* MediaConstraintsImpl.h in Headers */,
</span><span class="lines">@@ -27715,6 +27742,7 @@
</span><span class="cx">                                 1C18DA59181AF6A500C4EF22 /* TextPainter.h in Headers */,
</span><span class="cx">                                 E4C91A0E1802343100A17F6D /* TextPaintStyle.h in Headers */,
</span><span class="cx">                                 93F198F608245E59001E9ABC /* TextResourceDecoder.h in Headers */,
</span><ins>+                                07EE76EC1BE96DB000F89133 /* MockRealtimeVideoSource.h in Headers */,
</ins><span class="cx">                                 A824B4650E2EF2EA0081A7B7 /* TextRun.h in Headers */,
</span><span class="cx">                                 448B1B7A0F3A2F9B0047A9E2 /* TextSizeAdjustment.h in Headers */,
</span><span class="cx">                                 B2C3DA4B0D006C1D00EF6F26 /* TextStream.h in Headers */,
</span><span class="lines">@@ -28967,6 +28995,7 @@
</span><span class="cx">                                 85ACA99D0A9B575900671E90 /* DOMText.mm in Sources */,
</span><span class="cx">                                 933A14AA0B7D1D0900A53FFD /* DOMTextEvent.mm in Sources */,
</span><span class="cx">                                 188604B30F2E654A000B6443 /* DOMTimer.cpp in Sources */,
</span><ins>+                                07EE76F01BEA619800F89133 /* MockRealtimeVideoSourceMac.mm in Sources */,
</ins><span class="cx">                                 76FC2B0B12370DA0006A991A /* DOMTokenList.cpp in Sources */,
</span><span class="cx">                                 0F54DCD61880F867003EEDBB /* DOMTouch.mm in Sources */,
</span><span class="cx">                                 0F54DCD81880F867003EEDBB /* DOMTouchEvent.mm in Sources */,
</span><span class="lines">@@ -29822,6 +29851,7 @@
</span><span class="cx">                                 073BE34017D17E01002BD431 /* JSNavigatorUserMedia.cpp in Sources */,
</span><span class="cx">                                 073BE34817D17E7A002BD431 /* JSNavigatorUserMediaError.cpp in Sources */,
</span><span class="cx">                                 14DC0D3709FED073007B0235 /* JSNode.cpp in Sources */,
</span><ins>+                                07D6A4EF1BECF2D200174146 /* MockRealtimeMediaSource.cpp in Sources */,
</ins><span class="cx">                                 BCD9C2640C17AA67005C90A2 /* JSNodeCustom.cpp in Sources */,
</span><span class="cx">                                 14115B7209F84CD600CA4FC1 /* JSNodeFilter.cpp in Sources */,
</span><span class="cx">                                 83F1206B1B8C104700D75F63 /* JSNodeFilterCustom.cpp in Sources */,
</span><span class="lines">@@ -30037,6 +30067,7 @@
</span><span class="cx">                                 B2FA3DDE0AB75A6F000E5AC4 /* JSSVGPathSegMovetoRel.cpp in Sources */,
</span><span class="cx">                                 B2FA3DE00AB75A6F000E5AC4 /* JSSVGPatternElement.cpp in Sources */,
</span><span class="cx">                                 8542A7960AE5C94200DF58DF /* JSSVGPoint.cpp in Sources */,
</span><ins>+                                07D6A4F31BED5F8800174146 /* MockRealtimeAudioSource.cpp in Sources */,
</ins><span class="cx">                                 B2FA3DE20AB75A6F000E5AC4 /* JSSVGPointList.cpp in Sources */,
</span><span class="cx">                                 B2FA3DE50AB75A6F000E5AC4 /* JSSVGPolygonElement.cpp in Sources */,
</span><span class="cx">                                 B2FA3DE70AB75A6F000E5AC4 /* JSSVGPolylineElement.cpp in Sources */,
</span><span class="lines">@@ -30066,6 +30097,7 @@
</span><span class="cx">                                 B2FA3E140AB75A6F000E5AC4 /* JSSVGUseElement.cpp in Sources */,
</span><span class="cx">                                 B2FA3E160AB75A6F000E5AC4 /* JSSVGViewElement.cpp in Sources */,
</span><span class="cx">                                 7118FED415685CC60030B79A /* JSSVGViewSpec.cpp in Sources */,
</span><ins>+                                07EE76EB1BE96DB000F89133 /* MockRealtimeVideoSource.cpp in Sources */,
</ins><span class="cx">                                 8485227D1190162C006EDC7F /* JSSVGVKernElement.cpp in Sources */,
</span><span class="cx">                                 71DCB7011568197600862271 /* JSSVGZoomAndPan.cpp in Sources */,
</span><span class="cx">                                 B2FA3E180AB75A6F000E5AC4 /* JSSVGZoomEvent.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -120,10 +120,11 @@
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateMediaStreamAVFObjC::load(%p)&quot;, this);
</span><span class="cx"> 
</span><ins>+    m_previewLayer = nullptr;
+    m_intrinsicSize = FloatSize();
+
</ins><span class="cx">     m_mediaStreamPrivate = &amp;stream;
</span><span class="cx">     m_mediaStreamPrivate-&gt;addObserver(*this);
</span><del>-
-    m_previewLayer = nullptr;
</del><span class="cx">     m_ended = !m_mediaStreamPrivate-&gt;active();
</span><span class="cx"> 
</span><span class="cx">     scheduleDeferredTask([this] {
</span><span class="lines">@@ -358,16 +359,11 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_videoBackgroundLayer = adoptNS([[CALayer alloc] init]);
</span><del>-#ifndef NDEBUG
</del><span class="cx">     m_videoBackgroundLayer.get().name = @&quot;MediaPlayerPrivateMediaStreamAVFObjC preview background layer&quot;;
</span><del>-#endif
</del><span class="cx"> 
</span><span class="cx">     m_previewLayer = m_mediaStreamPrivate-&gt;platformLayer();
</span><span class="cx">     m_previewLayer.get().contentsGravity = kCAGravityResize;
</span><span class="cx">     m_previewLayer.get().anchorPoint = CGPointZero;
</span><del>-#if !PLATFORM(IOS)
-    m_previewLayer.get().autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
-#endif
</del><span class="cx">     if (!m_playing)
</span><span class="cx">         m_previewLayer.get().hidden = true;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacAVCaptureDeviceManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;CaptureDevice&gt;&amp; devices = captureDeviceList();
</span><span class="cx">     
</span><del>-    for (AVCaptureDeviceType *device in [AVCaptureDevice devices]) {
</del><ins>+    for (AVCaptureDeviceType *device in [getAVCaptureDeviceClass() devices]) {
</ins><span class="cx">         CaptureDevice source;
</span><span class="cx"> 
</span><span class="cx">         if (![device isConnected])
</span><span class="lines">@@ -254,7 +254,7 @@
</span><span class="cx">     
</span><span class="cx">     size_t count = devices.size();
</span><span class="cx">     for (size_t i = 0; i &lt; count; ++i) {
</span><del>-        AVCaptureDeviceType *device = [AVCaptureDevice deviceWithUniqueID:devices[i].m_captureDeviceID];
</del><ins>+        AVCaptureDeviceType *device = [getAVCaptureDeviceClass() deviceWithUniqueID:devices[i].m_captureDeviceID];
</ins><span class="cx">         ASSERT(device);
</span><span class="cx">         
</span><span class="cx">         if (device &amp;&amp; deviceSupportsFacingMode(device, facingMode))
</span><span class="lines">@@ -428,7 +428,7 @@
</span><span class="cx">         if (type == RealtimeMediaSource::Video &amp;&amp; captureDevice.m_videoSourceId.isEmpty())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        AVCaptureDeviceType *device = [AVCaptureDevice deviceWithUniqueID:captureDevice.m_captureDeviceID];
</del><ins>+        AVCaptureDeviceType *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.m_captureDeviceID];
</ins><span class="cx">         ASSERT(device);
</span><span class="cx"> 
</span><span class="cx">         RefPtr&lt;AVMediaCaptureSource&gt; captureSource;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacMockRealtimeVideoSourceMach"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h                                (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Ericsson nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MockRealtimeVideoSourceMac_h
+#define MockRealtimeVideoSourceMac_h
+
+#if ENABLE(MEDIA_STREAM)
+
+#include &quot;FontCascade.h&quot;
+#include &quot;MockRealtimeVideoSource.h&quot;
+#include &lt;wtf/RunLoop.h&gt;
+
+namespace WebCore {
+
+class MockRealtimeVideoSourceMac final : public MockRealtimeVideoSource {
+public:
+
+    virtual ~MockRealtimeVideoSourceMac() { }
+
+private:
+    friend class MockRealtimeVideoSource;
+    MockRealtimeVideoSourceMac();
+
+    PlatformLayer* platformLayer() const override;
+    void updatePlatformLayer() const override;
+
+    mutable RetainPtr&lt;CGImageRef&gt; m_previewImage;
+    mutable RetainPtr&lt;PlatformLayer&gt; m_previewLayer;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
+
+#endif // MockRealtimeVideoSourceMac_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacMockRealtimeVideoSourceMacmm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm                                (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,102 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import &quot;config.h&quot;
+#import &quot;MockRealtimeVideoSourceMac.h&quot;
+
+#if ENABLE(MEDIA_STREAM)
+#import &quot;GraphicsContextCG.h&quot;
+#import &quot;ImageBuffer.h&quot;
+#import &quot;MediaConstraints.h&quot;
+#import &quot;NotImplemented.h&quot;
+#import &quot;PlatformLayer.h&quot;
+#import &quot;RealtimeMediaSourceStates.h&quot;
+#import &lt;QuartzCore/CALayer.h&gt;
+#import &lt;QuartzCore/CATransaction.h&gt;
+#import &lt;objc/runtime.h&gt;
+
+namespace WebCore {
+
+RefPtr&lt;MockRealtimeVideoSource&gt; MockRealtimeVideoSource::create()
+{
+    return adoptRef(new MockRealtimeVideoSourceMac());
+}
+
+MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac()
+    : MockRealtimeVideoSource()
+{
+}
+
+PlatformLayer* MockRealtimeVideoSourceMac::platformLayer() const
+{
+    if (m_previewLayer)
+        return m_previewLayer.get();
+
+    m_previewLayer = adoptNS([[CALayer alloc] init]);
+    m_previewLayer.get().name = @&quot;MockRealtimeVideoSourceMac preview layer&quot;;
+    m_previewLayer.get().contentsGravity = kCAGravityResizeAspect;
+    m_previewLayer.get().anchorPoint = CGPointZero;
+    m_previewLayer.get().needsDisplayOnBoundsChange = YES;
+#if !PLATFORM(IOS)
+    m_previewLayer.get().autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
+#endif
+
+    updatePlatformLayer();
+
+    return m_previewLayer.get();
+}
+
+void MockRealtimeVideoSourceMac::updatePlatformLayer() const
+{
+    if (!m_previewLayer)
+        return;
+
+    [CATransaction begin];
+    [CATransaction setAnimationDuration:0];
+    [CATransaction setDisableActions:YES];
+
+    do {
+        RefPtr&lt;Image&gt; image = imageBuffer()-&gt;copyImage();
+        if (!image)
+            break;
+
+        m_previewImage = image-&gt;getCGImageRef();
+        if (!m_previewImage)
+            break;
+
+        m_previewLayer.get().contents = (NSObject*)(m_previewImage.get());
+    } while (0);
+
+    [CATransaction commit];
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeAudioSourcecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;MockRealtimeAudioSource.h&quot;
+
+#if ENABLE(MEDIA_STREAM)
+#include &quot;Logging.h&quot;
+#include &quot;MediaConstraints.h&quot;
+#include &quot;NotImplemented.h&quot;
+#include &quot;RealtimeMediaSourceStates.h&quot;
+#include &quot;UUID.h&quot;
+
+namespace WebCore {
+
+RefPtr&lt;MockRealtimeAudioSource&gt; MockRealtimeAudioSource::create()
+{
+    return adoptRef(new MockRealtimeAudioSource());
+}
+
+MockRealtimeAudioSource::MockRealtimeAudioSource()
+    : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Audio, mockAudioSourceName())
+{
+}
+
+void MockRealtimeAudioSource::updateStates()
+{
+    RealtimeMediaSourceStates* states = currentStates();
+    states-&gt;setSourceType(RealtimeMediaSourceStates::Microphone);
+    states-&gt;setVolume(50);
+}
+
+void MockRealtimeAudioSource::initializeCapabilities(RealtimeMediaSourceCapabilities&amp; capabilities)
+{
+    capabilities.setVolumeRange(RealtimeMediaSourceCapabilityRange(0UL, 100UL, true));
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeAudioSourceh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h                                (rev 0)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Ericsson nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MockRealtimeAudioSource_h
+#define MockRealtimeAudioSource_h
+
+#if ENABLE(MEDIA_STREAM)
+
+#include &quot;FontCascade.h&quot;
+#include &quot;ImageBuffer.h&quot;
+#include &quot;MockRealtimeMediaSource.h&quot;
+#include &lt;wtf/RunLoop.h&gt;
+
+namespace WebCore {
+
+class MockRealtimeAudioSource : public MockRealtimeMediaSource {
+public:
+
+    static RefPtr&lt;MockRealtimeAudioSource&gt; create();
+
+    virtual ~MockRealtimeAudioSource() { }
+
+protected:
+    MockRealtimeAudioSource();
+
+private:
+    void updateStates() override;
+    void initializeCapabilities(RealtimeMediaSourceCapabilities&amp;) override;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
+
+#endif // MockRealtimeAudioSource_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourcecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,117 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;MockRealtimeMediaSource.h&quot;
+
+#if ENABLE(MEDIA_STREAM)
+#include &quot;Logging.h&quot;
+#include &quot;MediaConstraints.h&quot;
+#include &quot;MediaStreamTrackSourcesRequestClient.h&quot;
+#include &quot;NotImplemented.h&quot;
+#include &quot;RealtimeMediaSourceStates.h&quot;
+#include &lt;math.h&gt;
+#include &lt;wtf/CurrentTime.h&gt;
+#include &lt;wtf/NeverDestroyed.h&gt;
+#include &lt;wtf/text/StringView.h&gt;
+
+namespace WebCore {
+
+const AtomicString&amp; MockRealtimeMediaSource::mockAudioSourcePersistentID()
+{
+    static NeverDestroyed&lt;AtomicString&gt; id(&quot;239c24b1-2b15-11e3-8224-0800200c9a66&quot;, AtomicString::ConstructFromLiteral);
+    return id;
+}
+
+const AtomicString&amp; MockRealtimeMediaSource::mockVideoSourcePersistentID()
+{
+    static NeverDestroyed&lt;AtomicString&gt; id(&quot;239c24b0-2b15-11e3-8224-0800200c9a66&quot;, AtomicString::ConstructFromLiteral);
+    return id;
+}
+
+const AtomicString&amp; MockRealtimeMediaSource::mockAudioSourceName()
+{
+    static NeverDestroyed&lt;AtomicString&gt; name(&quot;Mock audio device&quot;, AtomicString::ConstructFromLiteral);
+    return name;
+}
+
+const AtomicString&amp; MockRealtimeMediaSource::mockVideoSourceName()
+{
+    static NeverDestroyed&lt;AtomicString&gt; name(&quot;Mock video device&quot;, AtomicString::ConstructFromLiteral);
+    return name;
+}
+
+RefPtr&lt;TrackSourceInfo&gt; MockRealtimeMediaSource::trackSourceWithUID(const String&amp; id, MediaConstraints*)
+{
+    // FIXME: validate constraints.
+
+    if (mockAudioSourcePersistentID() == id)
+        return TrackSourceInfo::create(mockAudioSourcePersistentID(), TrackSourceInfo::Audio, &quot;Mock audio device&quot;);
+
+    if (mockVideoSourcePersistentID() == id)
+        return TrackSourceInfo::create(mockVideoSourcePersistentID(), TrackSourceInfo::Video, &quot;Mock video device&quot;);
+    
+    return nullptr;
+}
+
+#if 0
+
+#endif
+
+MockRealtimeMediaSource::MockRealtimeMediaSource(const String&amp; id, RealtimeMediaSource::Type type, const String&amp; name)
+    : RealtimeMediaSource(id, type, name)
+{
+    if (type == RealtimeMediaSource::Audio)
+        setPersistentID(mockAudioSourcePersistentID());
+    else
+        setPersistentID(mockVideoSourcePersistentID());
+}
+
+RefPtr&lt;RealtimeMediaSourceCapabilities&gt; MockRealtimeMediaSource::capabilities()
+{
+    if (!m_capabilities) {
+        m_capabilities = RealtimeMediaSourceCapabilities::create();
+        m_capabilities-&gt;setSourceId(m_currentStates.sourceId());
+        initializeCapabilities(*m_capabilities.get());
+    }
+    return m_capabilities;
+}
+
+const RealtimeMediaSourceStates&amp; MockRealtimeMediaSource::states()
+{
+    m_currentStates.setSourceId(id());
+    updateStates();
+
+    return m_currentStates;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h                                (rev 0)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,86 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Ericsson nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MockRealtimeMediaSource_h
+#define MockRealtimeMediaSource_h
+
+#if ENABLE(MEDIA_STREAM)
+
+#include &quot;RealtimeMediaSource.h&quot;
+#include &lt;wtf/RunLoop.h&gt;
+
+namespace WebCore {
+
+class FloatRect;
+class GraphicsContext;
+class TrackSourceInfo;
+
+class MockRealtimeMediaSource : public RealtimeMediaSource {
+public:
+    virtual ~MockRealtimeMediaSource() { }
+
+    static const AtomicString&amp; mockAudioSourcePersistentID();
+    static const AtomicString&amp; mockAudioSourceName();
+
+    static const AtomicString&amp; mockVideoSourcePersistentID();
+    static const AtomicString&amp; mockVideoSourceName();
+
+    static RefPtr&lt;TrackSourceInfo&gt; trackSourceWithUID(const String&amp;, MediaConstraints*);
+
+protected:
+    MockRealtimeMediaSource(const String&amp; id, Type, const String&amp; name);
+
+    virtual void updateStates() = 0;
+    virtual void initializeCapabilities(RealtimeMediaSourceCapabilities&amp;) = 0;
+
+    void startProducingData() override { m_isProducingData = true; }
+    void stopProducingData() override { m_isProducingData = false; }
+
+    RefPtr&lt;RealtimeMediaSourceCapabilities&gt; capabilities() override;
+    const RealtimeMediaSourceStates&amp; states() override;
+
+    RealtimeMediaSourceStates* currentStates() { return &amp;m_currentStates; }
+    MediaConstraints* constraints() { return m_constraints.get(); }
+
+private:
+
+    bool isProducingData() const override { return m_isProducingData; }
+
+    RealtimeMediaSourceStates m_currentStates;
+    RefPtr&lt;RealtimeMediaSourceCapabilities&gt; m_capabilities;
+    RefPtr&lt;MediaConstraints&gt; m_constraints;
+    bool m_isProducingData { false };
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
+
+#endif // MockRealtimeMediaSource_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (192173 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2015-11-09 21:16:14 UTC (rev 192173)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -26,9 +26,9 @@
</span><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><ins>+#include &quot;MockRealtimeMediaSourceCenter.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><del>-#include &quot;MockRealtimeMediaSourceCenter.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;MediaConstraintsMock.h&quot;
</span><span class="cx"> #include &quot;MediaStream.h&quot;
</span><span class="lines">@@ -36,86 +36,16 @@
</span><span class="cx"> #include &quot;MediaStreamPrivate.h&quot;
</span><span class="cx"> #include &quot;MediaStreamTrack.h&quot;
</span><span class="cx"> #include &quot;MediaStreamTrackSourcesRequestClient.h&quot;
</span><ins>+#include &quot;MockRealtimeAudioSource.h&quot;
+#include &quot;MockRealtimeMediaSource.h&quot;
+#include &quot;MockRealtimeVideoSource.h&quot;
</ins><span class="cx"> #include &quot;RealtimeMediaSource.h&quot;
</span><span class="cx"> #include &quot;RealtimeMediaSourceCapabilities.h&quot;
</span><ins>+#include &quot;UUID.h&quot;
</ins><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class MockSource : public RealtimeMediaSource {
-public:
-    MockSource(const AtomicString&amp; id, const AtomicString&amp; name, RealtimeMediaSource::Type type)
-        : RealtimeMediaSource(id, type, name)
-    {
-    }
-
-    virtual ~MockSource() { }
-
-    virtual RefPtr&lt;RealtimeMediaSourceCapabilities&gt; capabilities() { return m_capabilities; }
-    virtual const RealtimeMediaSourceStates&amp; states() { return m_currentStates; }
-
-    RefPtr&lt;RealtimeMediaSourceCapabilities&gt; m_capabilities;
-    RealtimeMediaSourceStates m_currentStates;
-};
-    
-typedef HashMap&lt;String, RefPtr&lt;MockSource&gt;&gt; MockSourceMap;
-
-static MockSourceMap&amp; mockSourceMap()
-{
-    DEPRECATED_DEFINE_STATIC_LOCAL(MockSourceMap, mockSourceMap, ());
-    return mockSourceMap;
-}
-
-static const AtomicString&amp; mockAudioSourceID()
-{
-    static NeverDestroyed&lt;AtomicString&gt; id(&quot;239c24b1-2b15-11e3-8224-0800200c9a66&quot;, AtomicString::ConstructFromLiteral);
-    return id;
-}
-
-static const AtomicString&amp; mockVideoSourceID()
-{
-    static NeverDestroyed&lt;AtomicString&gt; id(&quot;239c24b0-2b15-11e3-8224-0800200c9a66&quot;, AtomicString::ConstructFromLiteral);
-    return id;
-}
-
-static void initializeMockSources()
-{
-    RefPtr&lt;MockSource&gt; mockSource1 = adoptRef(new MockSource(mockVideoSourceID(), &quot;Mock video device&quot;, RealtimeMediaSource::Video));
-    mockSource1-&gt;m_capabilities = RealtimeMediaSourceCapabilities::create();
-    mockSource1-&gt;m_capabilities-&gt;setSourceId(mockSource1-&gt;id());
-    mockSource1-&gt;m_capabilities-&gt;addSourceType(RealtimeMediaSourceStates::Camera);
-    mockSource1-&gt;m_capabilities-&gt;addSourceType(RealtimeMediaSourceStates::Microphone);
-    mockSource1-&gt;m_capabilities-&gt;addFacingMode(RealtimeMediaSourceStates::User);
-    mockSource1-&gt;m_capabilities-&gt;addFacingMode(RealtimeMediaSourceStates::Environment);
-    mockSource1-&gt;m_capabilities-&gt;setWidthRange(RealtimeMediaSourceCapabilityRange(320UL, 1920UL, true));
-    mockSource1-&gt;m_capabilities-&gt;setHeightRange(RealtimeMediaSourceCapabilityRange(240UL, 1080UL, true));
-    mockSource1-&gt;m_capabilities-&gt;setFrameRateRange(RealtimeMediaSourceCapabilityRange(15.0f, 60.0f, true));
-    mockSource1-&gt;m_capabilities-&gt;setAspectRatioRange(RealtimeMediaSourceCapabilityRange(4 / 3.0f, 16 / 9.0f, true));
-    mockSource1-&gt;m_capabilities-&gt;setVolumeRange(RealtimeMediaSourceCapabilityRange(10UL, 90UL, true));
-
-    mockSource1-&gt;m_currentStates.setSourceType(RealtimeMediaSourceStates::Camera);
-    mockSource1-&gt;m_currentStates.setSourceId(mockSource1-&gt;id());
-    mockSource1-&gt;m_currentStates.setFacingMode(RealtimeMediaSourceStates::User);
-    mockSource1-&gt;m_currentStates.setWidth(1920);
-    mockSource1-&gt;m_currentStates.setHeight(1080);
-    mockSource1-&gt;m_currentStates.setFrameRate(30);
-    mockSource1-&gt;m_currentStates.setAspectRatio(16 / 9.0f);
-    mockSource1-&gt;m_currentStates.setVolume(70);
-    String mockSource1id = mockSource1-&gt;id();
-    mockSourceMap().add(mockSource1id, mockSource1.release());
-
-    RefPtr&lt;MockSource&gt; mockSource2 = adoptRef(new MockSource(mockAudioSourceID(), &quot;Mock audio device&quot;, RealtimeMediaSource::Audio));
-    mockSource2-&gt;m_capabilities = RealtimeMediaSourceCapabilities::create();
-    mockSource2-&gt;m_capabilities-&gt;setSourceId(mockSource2-&gt;id());
-    mockSource2-&gt;m_capabilities-&gt;setVolumeRange(RealtimeMediaSourceCapabilityRange(0UL, 100UL, true));
-
-    mockSource2-&gt;m_currentStates.setSourceType(RealtimeMediaSourceStates::Microphone);
-    mockSource2-&gt;m_currentStates.setSourceId(mockSource2-&gt;id());
-    mockSource2-&gt;m_currentStates.setVolume(50);
-    String mockSource2id = mockSource2-&gt;id();
-    mockSourceMap().add(mockSource2id, mockSource2.release());
-}
-
</del><span class="cx"> void MockRealtimeMediaSourceCenter::registerMockRealtimeMediaSourceCenter()
</span><span class="cx"> {
</span><span class="cx">     DEPRECATED_DEFINE_STATIC_LOCAL(MockRealtimeMediaSourceCenter, center, ());
</span><span class="lines">@@ -123,7 +53,6 @@
</span><span class="cx">     if (!registered) {
</span><span class="cx">         registered = true;
</span><span class="cx">         RealtimeMediaSourceCenter::setSharedStreamCenter(&amp;center);
</span><del>-        initializeMockSources();
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -133,7 +62,6 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
</span><span class="cx">     Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
</span><del>-    MockSourceMap&amp; map = mockSourceMap();
</del><span class="cx"> 
</span><span class="cx">     if (audioConstraints) {
</span><span class="cx">         String invalidQuery = MediaConstraintsMock::verifyConstraints(audioConstraints);
</span><span class="lines">@@ -142,11 +70,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        MockSourceMap::iterator it = map.find(mockAudioSourceID());
-        ASSERT(it != map.end());
-
-        RefPtr&lt;RealtimeMediaSource&gt; audioSource = it-&gt;value;
-        audioSource-&gt;reset();
</del><ins>+        RefPtr&lt;RealtimeMediaSource&gt; audioSource = MockRealtimeAudioSource::create();
</ins><span class="cx">         audioSources.append(audioSource.release());
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -157,11 +81,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        MockSourceMap::iterator it = map.find(mockVideoSourceID());
-        ASSERT(it != map.end());
-
-        RefPtr&lt;RealtimeMediaSource&gt; videoSource = it-&gt;value;
-        videoSource-&gt;reset();
</del><ins>+        RefPtr&lt;RealtimeMediaSource&gt; videoSource = MockRealtimeVideoSource::create();
</ins><span class="cx">         videoSources.append(videoSource.release());
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -176,7 +96,6 @@
</span><span class="cx">     
</span><span class="cx">     Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
</span><span class="cx">     Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
</span><del>-    MockSourceMap&amp; map = mockSourceMap();
</del><span class="cx"> 
</span><span class="cx">     if (audioConstraints) {
</span><span class="cx">         String invalidQuery = MediaConstraintsMock::verifyConstraints(audioConstraints);
</span><span class="lines">@@ -185,11 +104,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        MockSourceMap::iterator it = map.find(mockAudioSourceID());
-        ASSERT(it != map.end());
-
-        RefPtr&lt;RealtimeMediaSource&gt; audioSource = it-&gt;value;
-        audioSource-&gt;reset();
</del><ins>+        RefPtr&lt;RealtimeMediaSource&gt; audioSource = MockRealtimeAudioSource::create();
</ins><span class="cx">         audioSources.append(audioSource.release());
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -200,11 +115,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        MockSourceMap::iterator it = map.find(mockVideoSourceID());
-        ASSERT(it != map.end());
-
-        RefPtr&lt;RealtimeMediaSource&gt; videoSource = it-&gt;value;
-        videoSource-&gt;reset();
</del><ins>+        RefPtr&lt;RealtimeMediaSource&gt; videoSource = MockRealtimeVideoSource::create();
</ins><span class="cx">         videoSources.append(videoSource.release());
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -216,22 +127,13 @@
</span><span class="cx">     ASSERT(client);
</span><span class="cx">     Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; audioSources;
</span><span class="cx">     Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt; videoSources;
</span><del>-    MockSourceMap&amp; map = mockSourceMap();
</del><span class="cx"> 
</span><del>-    if (!audioDeviceID.isEmpty()) {
-        MockSourceMap::iterator it = map.find(mockAudioSourceID());
-        ASSERT(it != map.end());
-
-        RefPtr&lt;RealtimeMediaSource&gt; audioSource = it-&gt;value;
-        audioSource-&gt;reset();
</del><ins>+    if (!audioDeviceID.isEmpty() &amp;&amp; audioDeviceID == MockRealtimeMediaSource::mockAudioSourcePersistentID()) {
+        RefPtr&lt;RealtimeMediaSource&gt; audioSource = MockRealtimeAudioSource::create();
</ins><span class="cx">         audioSources.append(audioSource.release());
</span><span class="cx">     }
</span><del>-    if (!videoDeviceID.isEmpty()) {
-        MockSourceMap::iterator it = map.find(mockVideoSourceID());
-        ASSERT(it != map.end());
-
-        RefPtr&lt;RealtimeMediaSource&gt; videoSource = it-&gt;value;
-        videoSource-&gt;reset();
</del><ins>+    if (!videoDeviceID.isEmpty() &amp;&amp; videoDeviceID == MockRealtimeMediaSource::mockVideoSourcePersistentID()) {
+        RefPtr&lt;RealtimeMediaSource&gt; videoSource = MockRealtimeVideoSource::create();
</ins><span class="cx">         videoSources.append(videoSource.release());
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -243,25 +145,19 @@
</span><span class="cx">     RefPtr&lt;MediaStreamTrackSourcesRequestClient&gt; requestClient = prpClient;
</span><span class="cx">     TrackSourceInfoVector sources;
</span><span class="cx"> 
</span><del>-    MockSourceMap&amp; map = mockSourceMap();
-    MockSourceMap::iterator end = map.end();
-    for (MockSourceMap::iterator it = map.begin(); it != end; ++it) {
-        MockSource* source = it-&gt;value.get();
</del><ins>+    sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockAudioSourcePersistentID(), nullptr));
+    sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockVideoSourcePersistentID(), nullptr));
</ins><span class="cx"> 
</span><del>-        sources.append(TrackSourceInfo::create(source-&gt;id(), source-&gt;type() == RealtimeMediaSource::Video ? TrackSourceInfo::Video : TrackSourceInfo::Audio, source-&gt;name()));
-    }
</del><ins>+    callOnMainThread([this, requestClient, sources] {
+        requestClient-&gt;didCompleteRequest(sources);
+    });
</ins><span class="cx"> 
</span><del>-    requestClient-&gt;didCompleteRequest(sources);
</del><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;TrackSourceInfo&gt; MockRealtimeMediaSourceCenter::sourceWithUID(const String&amp; UID, RealtimeMediaSource::Type, MediaConstraints*)
</del><ins>+RefPtr&lt;TrackSourceInfo&gt; MockRealtimeMediaSourceCenter::sourceWithUID(const String&amp; UID, RealtimeMediaSource::Type, MediaConstraints* constraints)
</ins><span class="cx"> {
</span><del>-    for (auto&amp; source : mockSourceMap()) {
-        if (source.value-&gt;id() == UID)
-            return TrackSourceInfo::create(source.value-&gt;id(), source.value-&gt;type() == RealtimeMediaSource::Video ? TrackSourceInfo::Video : TrackSourceInfo::Audio, source.value-&gt;name());
-    }
-    return nullptr;
</del><ins>+    return MockRealtimeMediaSource::trackSourceWithUID(UID, constraints);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeVideoSourcecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,373 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;MockRealtimeVideoSource.h&quot;
+
+#if ENABLE(MEDIA_STREAM)
+#include &quot;GraphicsContext.h&quot;
+#include &quot;ImageBuffer.h&quot;
+#include &quot;IntRect.h&quot;
+#include &quot;Logging.h&quot;
+#include &quot;MediaConstraints.h&quot;
+#include &quot;NotImplemented.h&quot;
+#include &quot;PlatformLayer.h&quot;
+#include &quot;RealtimeMediaSourceStates.h&quot;
+#include &quot;UUID.h&quot;
+#include &lt;math.h&gt;
+#include &lt;wtf/CurrentTime.h&gt;
+#include &lt;wtf/text/StringView.h&gt;
+
+namespace WebCore {
+
+#if !PLATFORM(MAC) &amp;&amp; !PLATFORM(IOS)
+RefPtr&lt;MockRealtimeVideoSource&gt; MockRealtimeVideoSource::create()
+{
+    return adoptRef(new MockRealtimeVideoSource());
+}
+#endif
+
+MockRealtimeVideoSource::MockRealtimeVideoSource()
+    : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Video, mockVideoSourceName())
+    , m_timer(RunLoop::main(), this, &amp;MockRealtimeVideoSource::generateFrame)
+{
+    m_dashWidths.reserveInitialCapacity(2);
+    m_dashWidths.uncheckedAppend(6);
+    m_dashWidths.uncheckedAppend(6);
+}
+
+void MockRealtimeVideoSource::startProducingData()
+{
+    MockRealtimeMediaSource::startProducingData();
+    if (m_size.isEmpty())
+        setSize(IntSize(640, 480));
+
+    m_startTime = monotonicallyIncreasingTime();
+    m_timer.startRepeating(std::chrono::milliseconds(lround(1000 / m_frameRate)));
+}
+
+void MockRealtimeVideoSource::stopProducingData()
+{
+    MockRealtimeMediaSource::startProducingData();
+    m_timer.stop();
+    m_elapsedTime += monotonicallyIncreasingTime() - m_startTime;
+    m_startTime = NAN;
+}
+
+double MockRealtimeVideoSource::elapsedTime()
+{
+    if (std::isnan(m_startTime))
+        return m_elapsedTime;
+
+    return m_elapsedTime + (monotonicallyIncreasingTime() - m_startTime);
+}
+
+void MockRealtimeVideoSource::updateStates()
+{
+    RealtimeMediaSourceStates* states = currentStates();
+
+    states-&gt;setFacingMode(RealtimeMediaSourceStates::User);
+    states-&gt;setFrameRate(m_frameRate);
+    states-&gt;setWidth(m_size.width());
+    states-&gt;setHeight(m_size.height());
+    states-&gt;setAspectRatio(static_cast&lt;float&gt;(m_size.width()) / m_size.height());
+}
+
+void MockRealtimeVideoSource::initializeCapabilities(RealtimeMediaSourceCapabilities&amp; capabilities)
+{
+    capabilities.addSourceType(RealtimeMediaSourceStates::Camera);
+    capabilities.addFacingMode(RealtimeMediaSourceStates::User);
+    capabilities.addFacingMode(RealtimeMediaSourceStates::Environment);
+    capabilities.setWidthRange(RealtimeMediaSourceCapabilityRange(320UL, 1920UL, true));
+    capabilities.setHeightRange(RealtimeMediaSourceCapabilityRange(240UL, 1080UL, true));
+    capabilities.setFrameRateRange(RealtimeMediaSourceCapabilityRange(15.0f, 60.0f, true));
+    capabilities.setAspectRatioRange(RealtimeMediaSourceCapabilityRange(4 / 3.0f, 16 / 9.0f, true));
+}
+
+void MockRealtimeVideoSource::setFacingMode(RealtimeMediaSourceStates::VideoFacingMode mode)
+{
+    RealtimeMediaSourceStates* states = currentStates();
+
+    if (states-&gt;facingMode() == mode)
+        return;
+
+    states-&gt;setFacingMode(mode);
+
+    statesDidChanged();
+}
+
+void MockRealtimeVideoSource::setFrameRate(float rate)
+{
+    if (m_frameRate == rate)
+        return;
+
+    m_frameRate = rate;
+    if (m_timer.isActive())
+        m_timer.startRepeating(std::chrono::milliseconds(lround(1000 / m_frameRate)));
+
+    statesDidChanged();
+}
+
+void MockRealtimeVideoSource::setSize(const IntSize&amp; size)
+{
+    if (size == m_size)
+        return;
+
+    m_size = size;
+
+    m_baseFontSize = m_size.height() * .08;
+    FontCascadeDescription fontDescription;
+    fontDescription.setOneFamily(&quot;Courier&quot;);
+    fontDescription.setSpecifiedSize(m_baseFontSize);
+    fontDescription.setComputedSize(m_baseFontSize);
+    fontDescription.setWeight(FontWeight500);
+
+    m_timeFont = FontCascade(fontDescription, 0, 0);
+    m_timeFont.update(nullptr);
+
+    m_bipBopFontSize = m_baseFontSize * 2.5;
+    fontDescription.setSpecifiedSize(m_bipBopFontSize);
+    fontDescription.setComputedSize(m_bipBopFontSize);
+    m_bipBopFont = FontCascade(fontDescription, 0, 0);
+    m_bipBopFont.update(nullptr);
+
+    m_statsFontSize = m_baseFontSize * .5;
+    fontDescription.setSpecifiedSize(m_statsFontSize);
+    fontDescription.setComputedSize(m_statsFontSize);
+    m_statsFont = FontCascade(fontDescription, 0, 0);
+    m_statsFont.update(nullptr);
+
+    m_imageBuffer = nullptr;
+    updatePlatformLayer();
+
+    statesDidChanged();
+}
+
+void MockRealtimeVideoSource::drawAnimation(GraphicsContext&amp; context)
+{
+    float radius = m_size.width() * .09;
+    FloatPoint location(m_size.width() * .8, m_size.height() * .3);
+
+    m_path.clear();
+    m_path.moveTo(location);
+    m_path.addArc(location, radius, 0, 2 * piFloat, false);
+    m_path.closeSubpath();
+    context.setFillColor(Color::white);
+    context.setFillRule(RULE_NONZERO);
+    context.fillPath(m_path);
+
+    float endAngle = piFloat * (((fmod(m_frameNumber, m_frameRate) + 0.5) * (2.0 / m_frameRate)) + 1);
+    m_path.clear();
+    m_path.moveTo(location);
+    m_path.addArc(location, radius, 1.5 * piFloat, endAngle, false);
+    m_path.closeSubpath();
+    context.setFillColor(Color::gray);
+    context.setFillRule(RULE_NONZERO);
+    context.fillPath(m_path);
+}
+
+void MockRealtimeVideoSource::drawBoxes(GraphicsContext&amp; context)
+{
+    static const RGBA32 magenta = 0xffff00ff;
+    static const RGBA32 yellow = 0xffffff00;
+    static const RGBA32 blue = 0xff0000ff;
+    static const RGBA32 red = 0xffff0000;
+    static const RGBA32 green = 0xff008000;
+
+    float boxSize = m_size.width() * .035;
+    float boxTop = m_size.height() * .6;
+
+    m_path.clear();
+    FloatRect frameRect(2, 2, m_size.width() - 3, m_size.height() - 3);
+    context.setStrokeColor(Color::white);
+    context.setStrokeThickness(3);
+    context.setLineDash(m_dashWidths, 0);
+    m_path.addRect(frameRect);
+    m_path.closeSubpath();
+    context.strokePath(m_path);
+
+    context.setLineDash(DashArray(), 0);
+    m_path.clear();
+    m_path.moveTo(FloatPoint(0, boxTop + boxSize));
+    m_path.addLineTo(FloatPoint(m_size.width(), boxTop + boxSize));
+    m_path.closeSubpath();
+    context.setStrokeColor(Color::white);
+    context.setStrokeThickness(2);
+    context.strokePath(m_path);
+
+    context.setStrokeThickness(1);
+    float boxLeft = boxSize;
+    m_path.clear();
+    for (unsigned i = 0; i &lt; boxSize / 4; i++) {
+        m_path.moveTo(FloatPoint(boxLeft + 4 * i, boxTop));
+        m_path.addLineTo(FloatPoint(boxLeft + 4 * i, boxTop + boxSize));
+    }
+    boxLeft += boxSize + 2;
+    for (unsigned i = 0; i &lt; boxSize / 4; i++) {
+        m_path.moveTo(FloatPoint(boxLeft, boxTop + 4 * i));
+        m_path.addLineTo(FloatPoint(boxLeft + boxSize - 1, boxTop + 4 * i));
+    }
+    context.setStrokeThickness(3);
+    boxLeft += boxSize + 2;
+    for (unsigned i = 0; i &lt; boxSize / 8; i++) {
+        m_path.moveTo(FloatPoint(boxLeft + 8 * i, boxTop));
+        m_path.addLineTo(FloatPoint(boxLeft + 8 * i, boxTop + boxSize - 1));
+    }
+    boxLeft += boxSize + 2;
+    for (unsigned i = 0; i &lt; boxSize / 8; i++) {
+        m_path.moveTo(FloatPoint(boxLeft, boxTop + 8 * i));
+        m_path.addLineTo(FloatPoint(boxLeft + boxSize - 1, boxTop + 8 * i));
+    }
+
+    boxTop += boxSize + 2;
+    boxLeft = boxSize;
+    Color boxColors[] = { Color::white, yellow, Color::cyan, green, magenta, red, blue };
+    for (unsigned i = 0; i &lt; sizeof(boxColors) / sizeof(boxColors[0]); i++) {
+        context.fillRect(FloatRect(boxLeft, boxTop, boxSize + 1, boxSize + 1), boxColors[i]);
+        boxLeft += boxSize + 1;
+    }
+    context.strokePath(m_path);
+}
+
+void MockRealtimeVideoSource::drawText(GraphicsContext&amp; context)
+{
+    unsigned milliseconds = lround(elapsedTime() * 1000);
+    unsigned seconds = milliseconds / 1000 % 60;
+    unsigned minutes = seconds / 60 % 60;
+    unsigned hours = minutes / 60 % 60;
+
+    FloatPoint timeLocation(m_size.width() * .05, m_size.height() * .15);
+    context.setFillColor(Color::white);
+    context.setTextDrawingMode(TextModeFill);
+    String string = String::format(&quot;%02u:%02u:%02u.%03u&quot;, hours, minutes, seconds, milliseconds % 1000);
+    context.drawText(m_timeFont, TextRun((StringView(string))), timeLocation, 0, -1);
+
+    string = String::format(&quot;%06u&quot;, m_frameNumber++);
+    timeLocation.move(0, m_baseFontSize);
+    context.drawText(m_timeFont, TextRun((StringView(string))), timeLocation, 0, -1);
+
+    FloatPoint statsLocation(m_size.width() * .65, m_size.height() * .75);
+    string = String::format(&quot;Frame rate: %ufps&quot;, m_frameRate);
+    context.drawText(m_statsFont, TextRun((StringView(string))), statsLocation, 0, -1);
+
+    string = String::format(&quot;Size: %u x %u&quot;, m_size.width(), m_size.height());
+    statsLocation.move(0, m_statsFontSize);
+    context.drawText(m_statsFont, TextRun((StringView(string))), statsLocation, 0, -1);
+
+    const char* camera;
+    switch (states().facingMode()) {
+    case RealtimeMediaSourceStates::User:
+        camera = &quot;User facing&quot;;
+        break;
+    case RealtimeMediaSourceStates::Environment:
+        camera = &quot;Environment facing&quot;;
+        break;
+    case RealtimeMediaSourceStates::Left:
+        camera = &quot;Left facing&quot;;
+        break;
+    case RealtimeMediaSourceStates::Right:
+        camera = &quot;Right facing&quot;;
+        break;
+    case RealtimeMediaSourceStates::Unknown:
+        camera = &quot;Unknown&quot;;
+        break;
+    }
+    string = String::format(&quot;Camera: %s&quot;, camera);
+    statsLocation.move(0, m_statsFontSize);
+    context.drawText(m_statsFont, TextRun((StringView(string))), statsLocation, 0, -1);
+
+    FloatPoint bipBopLocation(m_size.width() * .6, m_size.height() * .6);
+    unsigned frameMod = m_frameNumber % 60;
+    if (frameMod &lt;= 15) {
+        context.setFillColor(Color::gray);
+        TextRun run(StringView(&quot;Bip&quot;));
+        context.drawText(m_bipBopFont, run, bipBopLocation, 0, -1);
+    } else if (frameMod &gt; 30 &amp;&amp; frameMod &lt;= 45) {
+        context.setFillColor(Color::white);
+        TextRun run(StringView(&quot;Bop&quot;));
+        context.drawText(m_bipBopFont, run, bipBopLocation, 0, -1);
+    }
+}
+
+void MockRealtimeVideoSource::generateFrame()
+{
+    GraphicsContext&amp; context = imageBuffer()-&gt;context();
+    GraphicsContextStateSaver stateSaver(context);
+
+    FloatRect frameRect(FloatPoint(), m_size);
+    context.fillRect(FloatRect(FloatPoint(), m_size), Color::black);
+
+    drawText(context);
+    drawAnimation(context);
+    drawBoxes(context);
+
+    updatePlatformLayer();
+}
+
+ImageBuffer* MockRealtimeVideoSource::imageBuffer() const
+{
+    if (m_imageBuffer)
+        return m_imageBuffer.get();
+
+    m_imageBuffer = ImageBuffer::create(m_size, Unaccelerated);
+    if (!m_imageBuffer)
+        return nullptr;
+
+    m_imageBuffer-&gt;context().setImageInterpolationQuality(InterpolationDefault);
+    m_imageBuffer-&gt;context().setStrokeThickness(1);
+
+    return m_imageBuffer.get();
+}
+
+void MockRealtimeVideoSource::paintCurrentFrameInContext(GraphicsContext&amp; context, const FloatRect&amp; rect)
+{
+    if (context.paintingDisabled() || !imageBuffer())
+        return;
+
+    GraphicsContextStateSaver stateSaver(context);
+//    context.translate(rect.x(), rect.y() + rect.height());
+    context.setImageInterpolationQuality(InterpolationLow);
+    IntRect paintRect(IntPoint(0, 0), IntSize(rect.width(), rect.height()));
+
+    context.drawImage(*m_imageBuffer-&gt;copyImage(DontCopyBackingStore), rect);
+}
+
+RefPtr&lt;Image&gt; MockRealtimeVideoSource::currentFrameImage()
+{
+    if (!imageBuffer())
+        return nullptr;
+
+    return m_imageBuffer-&gt;copyImage(DontCopyBackingStore);
+}
+
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeVideoSourceh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h (0 => 192174)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h                                (rev 0)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h        2015-11-09 21:20:08 UTC (rev 192174)
</span><span class="lines">@@ -0,0 +1,112 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Ericsson nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MockRealtimeVideoSource_h
+#define MockRealtimeVideoSource_h
+
+#if ENABLE(MEDIA_STREAM)
+
+#include &quot;FontCascade.h&quot;
+#include &quot;ImageBuffer.h&quot;
+#include &quot;MockRealtimeMediaSource.h&quot;
+#include &lt;wtf/RunLoop.h&gt;
+
+namespace WebCore {
+
+class FloatRect;
+class GraphicsContext;
+
+class MockRealtimeVideoSource : public MockRealtimeMediaSource {
+public:
+
+    static RefPtr&lt;MockRealtimeVideoSource&gt; create();
+
+    virtual ~MockRealtimeVideoSource() { }
+
+    void setSize(const IntSize&amp;);
+    const IntSize&amp; size() const { return m_size; }
+
+    void setFacingMode(RealtimeMediaSourceStates::VideoFacingMode);
+    void setFrameRate(float);
+
+protected:
+    MockRealtimeVideoSource();
+    virtual void updatePlatformLayer() const { }
+
+    ImageBuffer* imageBuffer() const;
+
+private:
+    void updateStates() override;
+    void initializeCapabilities(RealtimeMediaSourceCapabilities&amp;) override;
+
+    void startProducingData() override;
+    void stopProducingData() override;
+
+    void drawAnimation(GraphicsContext&amp;);
+    void drawText(GraphicsContext&amp;);
+    void drawBoxes(GraphicsContext&amp;);
+
+    PlatformLayer* platformLayer() const override { return nullptr; }
+    RefPtr&lt;Image&gt; currentFrameImage() override;
+    void paintCurrentFrameInContext(GraphicsContext&amp;, const FloatRect&amp;) override;
+
+    void generateFrame();
+
+    double elapsedTime();
+
+    float m_baseFontSize { 0 };
+    FontCascade m_timeFont;
+
+    float m_bipBopFontSize { 0 };
+    FontCascade m_bipBopFont;
+
+    float m_statsFontSize { 0 };
+    FontCascade m_statsFont;
+
+    mutable std::unique_ptr&lt;ImageBuffer&gt; m_imageBuffer;
+
+    IntSize m_size;
+    Path m_path;
+    DashArray m_dashWidths;
+
+    double m_startTime { NAN };
+    double m_elapsedTime { 0 };
+
+    unsigned m_frameRate { 30 };
+    unsigned m_frameNumber { 0 };
+
+    RunLoop::Timer&lt;MockRealtimeVideoSource&gt; m_timer;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM)
+
+#endif // MockRealtimeVideoSource_h
</ins></span></pre>
</div>
</div>

</body>
</html>