<!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>[197114] trunk</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/197114">197114</a></dd>
<dt>Author</dt> <dd>eric.carlson@apple.com</dd>
<dt>Date</dt> <dd>2016-02-25 07:18:21 -0800 (Thu, 25 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
https://bugs.webkit.org/show_bug.cgi?id=153163
&lt;rdar://problem/24334526&gt;

Reviewed by Tim Horton.

Source/WebCore:

Tests: http/tests/media/media-stream/enumerate-devices-source-id-persistent.html
       http/tests/media/media-stream/enumerate-devices-source-id.html

* Modules/mediastream/MediaDevicesRequest.cpp:
(WebCore::MediaDevicesRequest::start): Don't check document.hasHadActiveMediaStreamTrack, do it
  in didCompleteTrackSourceInfoRequest where we need the information.
(WebCore::MediaDevicesRequest::didCompletePermissionCheck): Renamed from didCompleteCheck, save
  device ID hash string.
(WebCore::hashString): Hash a string with SHA1.
(WebCore::MediaDevicesRequest::hashID): Hash and ID.
(WebCore::MediaDevicesRequest::didCompleteTrackSourceInfoRequest): Hash deviceId and groupId.
(WebCore::MediaDevicesRequest::didCompleteCheck): Deleted.
(WebCore::MediaDevicesRequest::getTrackSources): Deleted.
(WebCore::MediaDevicesRequest::didCompleteRequest): Deleted.
* Modules/mediastream/MediaDevicesRequest.h:

* Modules/mediastream/UserMediaPermissionCheck.cpp:
(WebCore::UserMediaPermissionCheck::userMediaDocumentOrigin): Renamed from securityOrigin.
(WebCore::UserMediaPermissionCheck::topLevelDocumentOrigin): New, return the top level document origin.
(WebCore::UserMediaPermissionCheck::setUserMediaAccessInfo): Renamed from setHasPersistentPermission.
(WebCore::UserMediaPermissionCheck::securityOrigin): Deleted.
(WebCore::UserMediaPermissionCheck::setHasPersistentPermission): Deleted.
* Modules/mediastream/UserMediaPermissionCheck.h:

* Modules/mediastream/UserMediaRequest.cpp:
(WebCore::UserMediaRequest::userMediaDocumentOrigin): Renamed from securityOrigin.
(WebCore::UserMediaRequest::topLevelDocumentOrigin): New, return the top level document origin.
(WebCore::UserMediaRequest::securityOrigin): Deleted.
* Modules/mediastream/UserMediaRequest.h:
(WebCore::UserMediaRequest::requiresAudio): Deleted, unused.
(WebCore::UserMediaRequest::requiresVideo): Ditto.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::mediaPlayerMediaDeviceIdentifierStorageDirectory): Deleted, unused.
* html/HTMLMediaElement.h:

* platform/graphics/MediaPlayer.h:
(WebCore::MediaPlayerClient::mediaPlayerMediaDeviceIdentifierStorageDirectory): Deleted.

* platform/mediastream/MediaStreamTrackSourcesRequestClient.h:
(WebCore::MediaStreamTrackSourcesRequestClient::didCompleteTrackSourceInfoRequest): Renamed from didCompleteRequest.

* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
(WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources): Ditto.

* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources): Ditto.

Source/WebKit/mac:

* WebCoreSupport/WebUserMediaClient.mm:
(WebUserMediaClient::requestUserMediaAccess):
(WebUserMediaClient::checkUserMediaPermission):
(-[WebUserMediaPolicyCheckerListener allow]):
(-[WebUserMediaPolicyCheckerListener deny]):

Source/WebKit2:

* CMakeLists.txt: Add WKFrameHandleRef.cpp.

* Shared/API/c/WKBase.h: Add WKFrameHandleRef.
* UIProcess/API/APIUIClient.h:
(API::UIClient::decidePolicyForUserMediaPermissionRequest): Add parameter top level document
  security context.
(API::UIClient::checkUserMediaPermissionForOrigin): Ditto.

* UIProcess/API/C/WKAPICast.h: Add FrameHandle.

* UIProcess/API/C/WKFrameHandleRef.cpp: Added.
* UIProcess/API/C/WKFrameHandleRef.h: Added.

* UIProcess/API/C/WKFrameInfoRef.cpp:
(WKFrameInfoGetFrameHandleRef): Added.
* UIProcess/API/C/WKFrameInfoRef.h:

* UIProcess/API/C/WKPage.cpp:
(WKPageSetPageUIClient): Add parameters to decidePolicyForUserMediaPermissionRequest and
  checkUserMediaPermissionForOrigin for top level document security context.

* UIProcess/API/C/WKPageUIClient.h: Ditto.

* UIProcess/API/C/WKUserMediaPermissionCheck.cpp:
(WKUserMediaPermissionCheckSetUserMediaAccessInfo): Renamed from WKUserMediaPermissionCheckSetHasPersistentPermission,
  add parameter for top level document security context.
(WKUserMediaPermissionCheckSetHasPersistentPermission): Deleted.
* UIProcess/API/C/WKUserMediaPermissionCheck.h:

* UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp:
(webkitUserMediaPermissionRequestCreate): Add top level document origin.

* UIProcess/UserMediaPermissionCheckProxy.cpp:
(WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Renamed from setHasPersistentPermission.
(WebKit::UserMediaPermissionCheckProxy::setHasPersistentPermission): Deleted.
* UIProcess/UserMediaPermissionCheckProxy.h:

* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Add parameter
 for device id hash salt.
* UIProcess/UserMediaPermissionRequestManagerProxy.h:

* UIProcess/UserMediaPermissionRequestProxy.h:
(WebKit::UserMediaPermissionRequestProxy::requiresAudio): Deleted, unused.
(WebKit::UserMediaPermissionRequestProxy::requiresVideo): Ditto.
(WebKit::UserMediaPermissionRequestProxy::firstVideoDeviceUID): Ditto.
(WebKit::UserMediaPermissionRequestProxy::firstAudioDeviceUID): Ditto.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::requestUserMediaPermissionForFrame): Pass through parameter for top
  level document security context.
(WebKit::WebPageProxy::checkUserMediaPermissionForFrame): Ditto.
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:

* WebKit2.xcodeproj/project.pbxproj: Add WKFrameHandleRef.cpp|.h.

* WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
(WebKit::UserMediaPermissionRequestManager::startUserMediaRequest): Pass through parameter for top
  level document security context.
(WebKit::UserMediaPermissionRequestManager::startUserMediaPermissionCheck): Ditto.
(WebKit::UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck): Pass through
  device id hash salt.
* WebProcess/MediaStream/UserMediaPermissionRequestManager.h:

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didCompleteUserMediaPermissionCheck): Ditto.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:

Tools:

* WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
(WTR::InjectedBundle::setUserMediaPermissionForOrigin): Take top level document origin.
* WebKitTestRunner/InjectedBundle/InjectedBundle.h:

* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::setUserMediaPermissionForOrigin): Ditto.
* WebKitTestRunner/InjectedBundle/TestRunner.h:

* WebKitTestRunner/TestController.cpp:
(WTR::decidePolicyForUserMediaPermissionRequest): Pass through top level document origin.
(WTR::checkUserMediaPermissionForOrigin): Ditto.
(WTR::TestController::resetStateToConsistentValues): m_userMediaOriginPermissions -&gt; m_cahcedUserMediaPermissions.
(WTR::originUserVisibleName): Return a String.
(WTR::userMediaOriginHash): Create a hash of the origin plus top level document origin.
(WTR::TestController::saltForOrigin): Return salt for an origin.
(WTR::TestController::setUserMediaPermissionForOrigin): Return permission for an origin.
(WTR::TestController::handleCheckOfUserMediaPermissionForOrigin):
(WTR::TestController::handleUserMediaPermissionRequest):
(WTR::TestController::decidePolicyForUserMediaPermissionRequestIfPossible):
(WTR::OriginSettings::OriginSettings): New, class to cache settings for an origin.
(WTR::OriginSettings::persistentPermission): Persistent permissions for origin.
(WTR::OriginSettings::setPersistentPermission): Set permissions for origin.
(WTR::OriginSettings::persistentSalt): Return the persistent salt for the origin, if any.
(WTR::OriginSettings::setPersistentSalt): Set the persistent salt for the origin
(WTR::OriginSettings::ephemeralSalts): Return hashmap used to store per-frame salts.
* WebKitTestRunner/TestController.h:

* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveMessageFromInjectedBundle):

LayoutTests:

* fast/mediastream/MediaDevices-enumerateDevices-expected.txt:
* fast/mediastream/MediaDevices-enumerateDevices.html:
* http/tests/media/media-stream/enumerate-devices-source-id-expected.txt: Added.
* http/tests/media/media-stream/enumerate-devices-source-id-persistent-expected.txt: Added.
* http/tests/media/media-stream/enumerate-devices-source-id-persistent.html: Added.
* http/tests/media/media-stream/enumerate-devices-source-id.html: Added.
* http/tests/media/media-stream/resources/enumerate-devices-source-id-frame.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastmediastreamMediaDevicesenumerateDevicesexpectedtxt">trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastmediastreamMediaDevicesenumerateDeviceshtml">trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaDevicesRequestcpp">trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaDevicesRequesth">trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaPermissionCheckcpp">trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaPermissionCheckh">trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp">trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaRequesth">trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlayerh">trunk/Source/WebCore/platform/graphics/MediaPlayer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamTrackSourcesRequestClienth">trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp">trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebUserMediaClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.mm</a></li>
<li><a href="#trunkSourceWebKit2CMakeListstxt">trunk/Source/WebKit2/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedAPIcWKBaseh">trunk/Source/WebKit2/Shared/API/c/WKBase.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIUIClienth">trunk/Source/WebKit2/UIProcess/API/APIUIClient.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKAPICasth">trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKFrameInfoRefcpp">trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKFrameInfoRefh">trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPagecpp">trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPageUIClienth">trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKUserMediaPermissionCheckcpp">trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKUserMediaPermissionCheckh">trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitUIClientcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitUserMediaPermissionRequestcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitUserMediaPermissionRequestPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequestPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserMediaPermissionCheckProxycpp">trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserMediaPermissionCheckProxyh">trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserMediaPermissionRequestManagerProxycpp">trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserMediaPermissionRequestManagerProxyh">trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessUserMediaPermissionRequestProxyh">trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxymessagesin">trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebKit2WebProcessMediaStreamUserMediaPermissionRequestManagercpp">trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessMediaStreamUserMediaPermissionRequestManagerh">trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleBindingsTestRunneridl">trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleInjectedBundlecpp">trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleInjectedBundleh">trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleTestRunnercpp">trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleTestRunnerh">trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllercpp">trunk/Tools/WebKitTestRunner/TestController.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllerh">trunk/Tools/WebKitTestRunner/TestController.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestInvocationcpp">trunk/Tools/WebKitTestRunner/TestInvocation.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidexpectedtxt">trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidpersistentexpectedtxt">trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidpersistenthtml">trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent.html</a></li>
<li><a href="#trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidhtml">trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id.html</a></li>
<li><a href="#trunkLayoutTestshttptestsmediamediastreamresourcesenumeratedevicessourceidframehtml">trunk/LayoutTests/http/tests/media/media-stream/resources/enumerate-devices-source-id-frame.html</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKFrameHandleRefcpp">trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKFrameHandleRefh">trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/LayoutTests/ChangeLog        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2016-02-25  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+        https://bugs.webkit.org/show_bug.cgi?id=153163
+        &lt;rdar://problem/24334526&gt;
+
+        Reviewed by Tim Horton.
+
+        * fast/mediastream/MediaDevices-enumerateDevices-expected.txt:
+        * fast/mediastream/MediaDevices-enumerateDevices.html:
+        * http/tests/media/media-stream/enumerate-devices-source-id-expected.txt: Added.
+        * http/tests/media/media-stream/enumerate-devices-source-id-persistent-expected.txt: Added.
+        * http/tests/media/media-stream/enumerate-devices-source-id-persistent.html: Added.
+        * http/tests/media/media-stream/enumerate-devices-source-id.html: Added.
+        * http/tests/media/media-stream/resources/enumerate-devices-source-id-frame.html: Added.
+
</ins><span class="cx"> 2016-02-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Expose Proxy target and handler internal properties to Inspector
</span></span></pre></div>
<a id="trunkLayoutTestsfastmediastreamMediaDevicesenumerateDevicesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices-expected.txt (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices-expected.txt        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices-expected.txt        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> PASS captureDevice.groupId is non-null.
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-*** Calling mediaDevices.enumerateDevices without persistent access, and without a media stream track
</del><ins>+*** Calling mediaDevices.enumerateDevices with persistent access, and without a media stream track
</ins><span class="cx"> 
</span><span class="cx"> PASS captureDevices.length is non-zero.
</span><span class="cx"> 
</span><span class="lines">@@ -33,12 +33,14 @@
</span><span class="cx"> PASS captureDevice.label is non-null.
</span><span class="cx"> PASS captureDevice.label is not &quot;&quot;
</span><span class="cx"> PASS captureDevice.groupId is non-null.
</span><ins>+PASS deviceIds.indexOf(captureDevice.deviceId) is not -1
</ins><span class="cx"> 
</span><span class="cx"> PASS captureDevice.kind is non-null.
</span><span class="cx"> PASS captureDevice.deviceId is non-null.
</span><span class="cx"> PASS captureDevice.label is non-null.
</span><span class="cx"> PASS captureDevice.label is not &quot;&quot;
</span><span class="cx"> PASS captureDevice.groupId is non-null.
</span><ins>+PASS deviceIds.indexOf(captureDevice.deviceId) is not -1
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> *** Calling mediaDevices.enumerateDevices without persistent access, with a media stream track
</span><span class="lines">@@ -50,12 +52,14 @@
</span><span class="cx"> PASS captureDevice.label is non-null.
</span><span class="cx"> PASS captureDevice.label is not &quot;&quot;
</span><span class="cx"> PASS captureDevice.groupId is non-null.
</span><ins>+PASS deviceIds.indexOf(captureDevice.deviceId) is not -1
</ins><span class="cx"> 
</span><span class="cx"> PASS captureDevice.kind is non-null.
</span><span class="cx"> PASS captureDevice.deviceId is non-null.
</span><span class="cx"> PASS captureDevice.label is non-null.
</span><span class="cx"> PASS captureDevice.label is not &quot;&quot;
</span><span class="cx"> PASS captureDevice.groupId is non-null.
</span><ins>+PASS deviceIds.indexOf(captureDevice.deviceId) is not -1
</ins><span class="cx"> 
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastmediastreamMediaDevicesenumerateDeviceshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices.html (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices.html        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/LayoutTests/fast/mediastream/MediaDevices-enumerateDevices.html        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -10,6 +10,7 @@
</span><span class="cx">             var captureDevices;
</span><span class="cx">             var captureDevice;
</span><span class="cx">             var havePermission;
</span><ins>+            var deviceIds = [];
</ins><span class="cx"> 
</span><span class="cx">             description(&quot;Tests MediaDevices.enumerateDevices()&quot;);
</span><span class="cx">             window.jsTestIsAsync = true;
</span><span class="lines">@@ -35,6 +36,12 @@
</span><span class="cx">                             else
</span><span class="cx">                                 shouldBeEmptyString(&quot;captureDevice.label&quot;);
</span><span class="cx">                             shouldBeNonNull(&quot;captureDevice.groupId&quot;);
</span><ins>+                            
+                            if (deviceIds.length &lt; 2)
+                                deviceIds.push(captureDevice.deviceId);
+                            else
+                                shouldNotBe(&quot;deviceIds.indexOf(captureDevice.deviceId)&quot;, &quot;-1&quot;);
+
</ins><span class="cx">                             debug(&quot;&quot;);
</span><span class="cx">                         });
</span><span class="cx">                         if (next)
</span><span class="lines">@@ -51,7 +58,7 @@
</span><span class="cx">             {
</span><span class="cx">                 if (window.testRunner) {
</span><span class="cx">                     testRunner.setUserMediaPermission(true);
</span><del>-                    testRunner.setUserMediaPermissionForOrigin(false, document.location.href);
</del><ins>+                    testRunner.setUserMediaPermissionForOrigin(false, document.location.href, &quot;&quot;);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 navigator.mediaDevices
</span><span class="lines">@@ -63,15 +70,16 @@
</span><span class="cx">                     })
</span><span class="cx">                     .catch(function(err) {
</span><span class="cx">                         testFailed(`mediaDevices.getUserMedia() failed with ${err.name}: ${err.message}`);
</span><ins>+                        finishJSTest();
</ins><span class="cx">                     });
</span><span class="cx">             }
</span><span class="cx">             
</span><span class="cx">             function grantPermission()
</span><span class="cx">             {
</span><span class="cx">                 if (window.testRunner)
</span><del>-                    testRunner.setUserMediaPermissionForOrigin(true, document.location.href);
</del><ins>+                    testRunner.setUserMediaPermissionForOrigin(true, document.location.href, &quot;&quot;);
</ins><span class="cx"> 
</span><del>-                debug(`&lt;br&gt;*** Calling mediaDevices.enumerateDevices without persistent access, and without a media stream track&lt;br&gt;`);
</del><ins>+                debug(`&lt;br&gt;*** Calling mediaDevices.enumerateDevices with persistent access, and without a media stream track&lt;br&gt;`);
</ins><span class="cx">                 havePermission = true;
</span><span class="cx">                 enumerate(createStream);
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-expected.txt (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-expected.txt                                (rev 0)
+++ trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-expected.txt        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+ 

+
+Tests that mediaDevices.enumerateDevices returns a unique ID for deviceId in each domain.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS : device id 1 is unique
+PASS : device id 2 is unique
+PASS : device id 3 is unique
+PASS : device id 4 is unique
+PASS : device id 5 is unique
+PASS : device id 6 is unique
+PASS : device id 7 is unique
+PASS : device id 8 is unique
+PASS : device id 9 is unique
+PASS : device id 10 is unique
+PASS : device id 11 is unique
+PASS : device id 12 is unique
+
+PASS : all device IDs are unique
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidpersistentexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent-expected.txt (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent-expected.txt                                (rev 0)
+++ trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent-expected.txt        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+ 

+
+Tests that mediaDevices.enumerateDevices returns a persistent deviceId when appropriate.
+http://localhost:8000 has persistent permission, so IDs must persist across frames.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+
+PASS : device IDs in http://localhost:8000 persist, all others are unique
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidpersistenthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent.html (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent.html                                (rev 0)
+++ trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id-persistent.html        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+    &lt;head&gt;
+        &lt;style&gt;
+            iframe { border: 1px solid black; }
+        &lt;/style&gt;
+        &lt;script src=&quot;../../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+        &lt;script&gt;
+            var frameInfos = [];
+            window.jsTestIsAsync = true;
+
+            if (window.testRunner) {
+                testRunner.setUserMediaPermission(true);
+                testRunner.setUserMediaPermissionForOrigin(true, &quot;http://localhost:8000&quot;, location.href);
+            }
+
+            function setup()
+            {
+                description(&quot;Tests that mediaDevices.enumerateDevices returns a persistent deviceId when appropriate.&quot; 
+                + &quot;&lt;br&gt;http://localhost:8000 has persistent permission, so IDs must persist across frames.&quot;);
+            }
+
+            function handler(event) 
+            {
+                var idCounts = [];
+
+                event.data.deviceIds.forEach(function(id) {
+                    frameInfos.push({origin : event.data.origin, deviceId : id});
+                    idCounts[id] = idCounts[id] === undefined ? 0 : ++idCounts[id];
+                });
+
+                if (frameInfos.length != 6)
+                    return;
+
+                var success = true;
+                for (var i = 0; i &lt; frameInfos.length; i++) {
+                    var deviceId = frameInfos[i].deviceId;
+                    if (frameInfos[i].origin.indexOf(&quot;http://localhost:8000&quot;) == 0) {
+                        if (idCounts[deviceId] &lt; 2) {
+                            testFailed(`: device ID in ${frameInfos[i].origin} is unique`);
+                            success = false;
+                        }
+                    } else {
+                        if (idCounts[deviceId] == 1) {
+                            testFailed(`: device ID in ${frameInfos[i].origin} is not unique`);
+                            success = false;
+                        }
+                    }
+                }
+
+                debug('');
+                if (success)
+                    testPassed(`: device IDs in http://localhost:8000 persist, all others are unique`);
+
+                debug('');
+                finishJSTest();
+            }
+
+            addEventListener(&quot;message&quot;, handler, false);
+
+        &lt;/script&gt; 
+    &lt;/head&gt;
+    &lt;body onload=&quot;setup()&quot;&gt;
+        &lt;iframe src=&quot;http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html&quot;&gt;&lt;/iframe&gt;
+        &lt;br&gt;
+        &lt;iframe src=&quot;http://127.0.0.1:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html&quot;&gt;&lt;/iframe&gt;
+        &lt;br&gt;
+        &lt;iframe src=&quot;http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html&quot;&gt;&lt;/iframe&gt;
+        &lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+        &lt;script src=&quot;../../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+    &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestsmediamediastreamenumeratedevicessourceidhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id.html (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id.html                                (rev 0)
+++ trunk/LayoutTests/http/tests/media/media-stream/enumerate-devices-source-id.html        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+    &lt;head&gt;
+        &lt;style&gt;
+            iframe { border: 1px solid black; }
+        &lt;/style&gt;
+        &lt;script src=&quot;../../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+        &lt;script&gt;
+            var frameInfos = [];
+            window.jsTestIsAsync = true;
+
+            if (window.testRunner)
+                testRunner.setUserMediaPermission(true);
+
+            function setup()
+            {
+                description(&quot;Tests that mediaDevices.enumerateDevices returns a unique ID for deviceId in each domain.&quot;);
+            }
+
+            function handler(event) 
+            {
+                event.data.deviceIds.forEach(function(id) {
+                    frameInfos.push({origin : event.data.origin, deviceId : id});
+                });
+
+                if (frameInfos.length != 12)
+                    return;
+
+                var success = true;
+                var idOrigins = [];
+                for (var i = 0; i &lt; frameInfos.length; i++) {
+                    var deviceId = frameInfos[i].deviceId;
+                    if (idOrigins[deviceId] === undefined) {
+                        idOrigins[deviceId] = frameInfos[i].origin;
+                        testPassed(`: device id ${i + 1} is unique`);
+                    } else {
+                        testFailed(`Duplicate device IDs in ${frameInfos[i].origin} and ${idOrigins[deviceId]}`);
+                        success = false;
+                    }
+                }
+
+                debug('');
+                if (success)
+                    testPassed(`: all device IDs are unique`);
+
+                debug('');
+                finishJSTest();
+            }
+
+            addEventListener(&quot;message&quot;, handler, false);
+
+        &lt;/script&gt; 
+    &lt;/head&gt;
+    &lt;body onload=&quot;setup()&quot;&gt;
+        &lt;iframe src=&quot;http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html&quot;&gt;&lt;/iframe&gt;
+        &lt;br&gt;
+        &lt;iframe src=&quot;http://127.0.0.1:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html&quot;&gt;&lt;/iframe&gt;
+        &lt;br&gt;
+        &lt;iframe src=&quot;http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html&quot;&gt;&lt;/iframe&gt;
+        &lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+        &lt;script src=&quot;../../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+    &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestsmediamediastreamresourcesenumeratedevicessourceidframehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/media/media-stream/resources/enumerate-devices-source-id-frame.html (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/media/media-stream/resources/enumerate-devices-source-id-frame.html                                (rev 0)
+++ trunk/LayoutTests/http/tests/media/media-stream/resources/enumerate-devices-source-id-frame.html        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,54 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+    &lt;head&gt;
+        &lt;style&gt;
+            iframe { border: 1px solid black; }
+        &lt;/style&gt;
+        &lt;script&gt;
+            function log(msg)
+            {
+                document.getElementById(&quot;console&quot;).innerHTML += msg + &quot;&lt;br&gt;&quot;;
+            }
+
+            function test(event)
+            {
+                navigator.mediaDevices.enumerateDevices()
+                    .then(function(devices) {
+                        var result = {
+                            origin: document.origin, 
+                            deviceIds: [devices[0].deviceId, devices[1].deviceId]
+                        };
+
+                        parent.postMessage(result, &quot;*&quot;);
+                    })
+                    .catch(function(err) {
+                        log(`enumerateDevices failed: ${err.name} - ${err.message}`);
+                    });
+                
+                var parentPage = document.referrer.split('/').pop();
+                if (parentPage != &quot;enumerate-devices-source-id.html&quot;)
+                    return;
+
+                var iframe = document.createElement('iframe');
+                iframe.src = location.href;
+                document.body.appendChild(iframe);
+            }
+
+            function handler(event) 
+            {
+                var result = {
+                    origin: `${event.data.origin} in ${document.origin}`, 
+                    deviceIds: event.data.deviceIds
+                };
+
+                parent.postMessage(result, &quot;*&quot;);
+            }
+
+            addEventListener(&quot;message&quot;, handler, false);
+
+        &lt;/script&gt; 
+    &lt;/head&gt;
+    &lt;body onload=&quot;test()&quot;&gt;
+        &lt;pre id=&quot;console&quot;&gt;&lt;/pre&gt;
+    &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/ChangeLog        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,3 +1,59 @@
</span><ins>+2016-02-25  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+        https://bugs.webkit.org/show_bug.cgi?id=153163
+        &lt;rdar://problem/24334526&gt;
+
+        Reviewed by Tim Horton.
+
+        Tests: http/tests/media/media-stream/enumerate-devices-source-id-persistent.html
+               http/tests/media/media-stream/enumerate-devices-source-id.html
+
+        * Modules/mediastream/MediaDevicesRequest.cpp:
+        (WebCore::MediaDevicesRequest::start): Don't check document.hasHadActiveMediaStreamTrack, do it
+          in didCompleteTrackSourceInfoRequest where we need the information.
+        (WebCore::MediaDevicesRequest::didCompletePermissionCheck): Renamed from didCompleteCheck, save
+          device ID hash string.
+        (WebCore::hashString): Hash a string with SHA1.
+        (WebCore::MediaDevicesRequest::hashID): Hash and ID.
+        (WebCore::MediaDevicesRequest::didCompleteTrackSourceInfoRequest): Hash deviceId and groupId.
+        (WebCore::MediaDevicesRequest::didCompleteCheck): Deleted.
+        (WebCore::MediaDevicesRequest::getTrackSources): Deleted.
+        (WebCore::MediaDevicesRequest::didCompleteRequest): Deleted.
+        * Modules/mediastream/MediaDevicesRequest.h:
+
+        * Modules/mediastream/UserMediaPermissionCheck.cpp:
+        (WebCore::UserMediaPermissionCheck::userMediaDocumentOrigin): Renamed from securityOrigin.
+        (WebCore::UserMediaPermissionCheck::topLevelDocumentOrigin): New, return the top level document origin.
+        (WebCore::UserMediaPermissionCheck::setUserMediaAccessInfo): Renamed from setHasPersistentPermission.
+        (WebCore::UserMediaPermissionCheck::securityOrigin): Deleted.
+        (WebCore::UserMediaPermissionCheck::setHasPersistentPermission): Deleted.
+        * Modules/mediastream/UserMediaPermissionCheck.h:
+
+        * Modules/mediastream/UserMediaRequest.cpp:
+        (WebCore::UserMediaRequest::userMediaDocumentOrigin): Renamed from securityOrigin.
+        (WebCore::UserMediaRequest::topLevelDocumentOrigin): New, return the top level document origin.
+        (WebCore::UserMediaRequest::securityOrigin): Deleted.
+        * Modules/mediastream/UserMediaRequest.h:
+        (WebCore::UserMediaRequest::requiresAudio): Deleted, unused.
+        (WebCore::UserMediaRequest::requiresVideo): Ditto.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::mediaPlayerMediaDeviceIdentifierStorageDirectory): Deleted, unused.
+        * html/HTMLMediaElement.h:
+
+        * platform/graphics/MediaPlayer.h:
+        (WebCore::MediaPlayerClient::mediaPlayerMediaDeviceIdentifierStorageDirectory): Deleted.
+
+        * platform/mediastream/MediaStreamTrackSourcesRequestClient.h:
+        (WebCore::MediaStreamTrackSourcesRequestClient::didCompleteTrackSourceInfoRequest): Renamed from didCompleteRequest.
+
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+        (WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources): Ditto.
+
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources): Ditto.
+
</ins><span class="cx"> 2016-02-24  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Tearing when entering AC mode
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -35,7 +35,9 @@
</span><span class="cx"> #include &quot;JSMediaDeviceInfo.h&quot;
</span><span class="cx"> #include &quot;RealtimeMediaSourceCenter.h&quot;
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><ins>+#include &quot;UserMediaController.h&quot;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><ins>+#include &lt;wtf/SHA1.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -77,54 +79,88 @@
</span><span class="cx"> void MediaDevicesRequest::start()
</span><span class="cx"> {
</span><span class="cx">     m_protector = this;
</span><del>-
-    if (Document* document = downcast&lt;Document&gt;(scriptExecutionContext())) {
-        m_canShowLabels = document-&gt;hasHadActiveMediaStreamTrack();
-        if (m_canShowLabels) {
-            getTrackSources();
-            return;
-        }
-    }
-
</del><span class="cx">     m_permissionCheck = UserMediaPermissionCheck::create(*downcast&lt;Document&gt;(scriptExecutionContext()), *this);
</span><span class="cx">     m_permissionCheck-&gt;start();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaDevicesRequest::didCompleteCheck(bool canAccess)
</del><ins>+void MediaDevicesRequest::didCompletePermissionCheck(const String&amp; salt, bool canAccess)
</ins><span class="cx"> {
</span><span class="cx">     m_permissionCheck-&gt;setClient(nullptr);
</span><span class="cx">     m_permissionCheck = nullptr;
</span><span class="cx"> 
</span><del>-    m_canShowLabels = canAccess;
-    getTrackSources();
-}
</del><ins>+    m_idHashSalt = salt;
+    m_havePersistentPermission = canAccess;
</ins><span class="cx"> 
</span><del>-void MediaDevicesRequest::getTrackSources()
-{
</del><span class="cx">     callOnMainThread([this] {
</span><span class="cx">         RealtimeMediaSourceCenter::singleton().getMediaStreamTrackSources(this);
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaDevicesRequest::didCompleteRequest(const TrackSourceInfoVector&amp; capturedDevices)
</del><ins>+static void hashString(SHA1&amp; sha1, const String&amp; string)
</ins><span class="cx"> {
</span><del>-    if (!m_scriptExecutionContext) {
</del><ins>+    if (string.isEmpty())
+        return;
+
+    if (string.is8Bit() &amp;&amp; string.containsOnlyASCII()) {
+        const uint8_t nullByte = 0;
+        sha1.addBytes(string.characters8(), string.length());
+        sha1.addBytes(&amp;nullByte, 1);
+        return;
+    }
+
+    auto utf8 = string.utf8();
+    sha1.addBytes(reinterpret_cast&lt;const uint8_t*&gt;(utf8.data()), utf8.length() + 1); // Include terminating null byte.
+}
+
+String MediaDevicesRequest::hashID(const String&amp; id)
+{
+    if (id.isEmpty() || m_idHashSalt.isEmpty())
+        return emptyString();
+
+    SHA1 sha1;
+
+    hashString(sha1, id);
+    hashString(sha1, m_idHashSalt);
+
+    SHA1::Digest digest;
+    sha1.computeHash(digest);
+
+    return SHA1::hexDigest(digest).data();
+}
+
+void MediaDevicesRequest::didCompleteTrackSourceInfoRequest(const TrackSourceInfoVector&amp; captureDevices)
+{
+    if (!scriptExecutionContext()) {
</ins><span class="cx">         m_protector = nullptr;
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;MediaDeviceInfo&gt;&gt; deviceInfo;
-    for (auto device : capturedDevices) {
-        TrackSourceInfo* trackInfo = device.get();
-        String deviceType = trackInfo-&gt;kind() == TrackSourceInfo::SourceKind::Audio ? MediaDeviceInfo::audioInputType() : MediaDeviceInfo::videoInputType();
</del><ins>+    Document&amp; document = downcast&lt;Document&gt;(*scriptExecutionContext());
+    UserMediaController* controller = UserMediaController::from(document.page());
+    if (!controller) {
+        m_protector = nullptr;
+        return;
+    }
</ins><span class="cx"> 
</span><del>-        AtomicString label = m_canShowLabels ? trackInfo-&gt;label() : emptyAtom;
-        deviceInfo.append(MediaDeviceInfo::create(m_scriptExecutionContext, label, trackInfo-&gt;id(), trackInfo-&gt;groupId(), deviceType));
</del><ins>+    Vector&lt;RefPtr&lt;MediaDeviceInfo&gt;&gt; devices;
+    for (auto deviceInfo : captureDevices) {
+        String deviceType = deviceInfo-&gt;kind() == TrackSourceInfo::SourceKind::Audio ? MediaDeviceInfo::audioInputType() : MediaDeviceInfo::videoInputType();
+        AtomicString label = emptyAtom;
+        if (m_havePersistentPermission || document.hasHadActiveMediaStreamTrack())
+            label = deviceInfo-&gt;label();
+
+        String id = hashID(deviceInfo-&gt;persistentId());
+        if (id.isEmpty())
+            continue;
+
+        String groupId = hashID(deviceInfo-&gt;groupId());
+
+        devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;MediaDevicesRequest&gt; protectedThis(this);
</span><del>-    callOnMainThread([protectedThis, deviceInfo] {
-        protectedThis-&gt;m_promise.resolve(deviceInfo);
</del><ins>+    callOnMainThread([protectedThis, devices] {
+        protectedThis-&gt;m_promise.resolve(devices);
</ins><span class="cx">     });
</span><span class="cx">     m_protector = nullptr;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesRequesth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -59,23 +59,24 @@
</span><span class="cx"> private:
</span><span class="cx">     MediaDevicesRequest(ScriptExecutionContext*, MediaDevices::EnumerateDevicesPromise&amp;&amp;);
</span><span class="cx"> 
</span><del>-    void getTrackSources();
-
</del><span class="cx">     // MediaStreamTrackSourcesRequestClient
</span><span class="cx">     const String&amp; requestOrigin() const final;
</span><del>-    void didCompleteRequest(const TrackSourceInfoVector&amp;) final;
</del><ins>+    void didCompleteTrackSourceInfoRequest(const TrackSourceInfoVector&amp;) final;
</ins><span class="cx"> 
</span><span class="cx">     // ContextDestructionObserver
</span><span class="cx">     void contextDestroyed() override final;
</span><span class="cx"> 
</span><span class="cx">     // UserMediaPermissionCheckClient
</span><del>-    void didCompleteCheck(bool) override final;
</del><ins>+    void didCompletePermissionCheck(const String&amp;, bool) override final;
</ins><span class="cx"> 
</span><ins>+    String hashID(const String&amp;);
+
</ins><span class="cx">     MediaDevices::EnumerateDevicesPromise m_promise;
</span><span class="cx">     RefPtr&lt;MediaDevicesRequest&gt; m_protector;
</span><span class="cx">     RefPtr&lt;UserMediaPermissionCheck&gt; m_permissionCheck;
</span><span class="cx"> 
</span><del>-    bool m_canShowLabels { false };
</del><ins>+    String m_idHashSalt;
+    bool m_havePersistentPermission { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaPermissionCheckcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -33,10 +33,10 @@
</span><span class="cx"> #include &quot;ExceptionCode.h&quot;
</span><span class="cx"> #include &quot;Frame.h&quot;
</span><span class="cx"> #include &quot;JSMediaDeviceInfo.h&quot;
</span><ins>+#include &quot;MainFrame.h&quot;
</ins><span class="cx"> #include &quot;RealtimeMediaSourceCenter.h&quot;
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> #include &quot;UserMediaController.h&quot;
</span><del>-#include &lt;wtf/MainThread.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -55,14 +55,27 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SecurityOrigin* UserMediaPermissionCheck::securityOrigin() const
</del><ins>+SecurityOrigin* UserMediaPermissionCheck::userMediaDocumentOrigin() const
</ins><span class="cx"> {
</span><del>-    if (scriptExecutionContext())
-        return scriptExecutionContext()-&gt;securityOrigin();
</del><ins>+    if (m_scriptExecutionContext)
+        return m_scriptExecutionContext-&gt;securityOrigin();
</ins><span class="cx"> 
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SecurityOrigin* UserMediaPermissionCheck::topLevelDocumentOrigin() const
+{
+    if (!m_scriptExecutionContext)
+        return nullptr;
+
+    if (Frame* frame = downcast&lt;Document&gt;(*scriptExecutionContext()).frame()) {
+        if (frame-&gt;isMainFrame())
+            return nullptr;
+    }
+
+    return m_scriptExecutionContext-&gt;topOrigin();
+}
+
</ins><span class="cx"> void UserMediaPermissionCheck::contextDestroyed()
</span><span class="cx"> {
</span><span class="cx">     ContextDestructionObserver::contextDestroyed();
</span><span class="lines">@@ -80,12 +93,13 @@
</span><span class="cx">     controller-&gt;checkUserMediaPermission(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserMediaPermissionCheck::setHasPersistentPermission(bool mode)
</del><ins>+void UserMediaPermissionCheck::setUserMediaAccessInfo(const String&amp; mediaDeviceIdentifierHashSalt, bool hasPersistentPermission)
</ins><span class="cx"> {
</span><del>-    m_hasPersistentPermission = mode;
</del><ins>+    m_hasPersistentPermission = hasPersistentPermission;
+    m_mediaDeviceIdentifierHashSalt = mediaDeviceIdentifierHashSalt;
</ins><span class="cx"> 
</span><span class="cx">     if (m_client)
</span><del>-        m_client-&gt;didCompleteCheck(m_hasPersistentPermission);
</del><ins>+        m_client-&gt;didCompletePermissionCheck(m_mediaDeviceIdentifierHashSalt, m_hasPersistentPermission);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaPermissionCheckh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~UserMediaPermissionCheckClient() { }
</span><span class="cx"> 
</span><del>-    virtual void didCompleteCheck(bool) = 0;
</del><ins>+    virtual void didCompletePermissionCheck(const String&amp;, bool) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class UserMediaPermissionCheck final : public ContextDestructionObserver, public RefCounted&lt;UserMediaPermissionCheck&gt; {
</span><span class="lines">@@ -55,10 +55,13 @@
</span><span class="cx">     void start();
</span><span class="cx">     void setClient(UserMediaPermissionCheckClient* client) { m_client = client; }
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void setHasPersistentPermission(bool);
</del><ins>+    WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin() const;
+    WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin() const;
</ins><span class="cx"> 
</span><del>-    WEBCORE_EXPORT SecurityOrigin* securityOrigin() const;
</del><ins>+    WEBCORE_EXPORT void setUserMediaAccessInfo(const String&amp;, bool);
</ins><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT String mediaDeviceIdentifierHashSalt() const { return m_mediaDeviceIdentifierHashSalt; }
+
</ins><span class="cx"> private:
</span><span class="cx">     UserMediaPermissionCheck(ScriptExecutionContext&amp;, UserMediaPermissionCheckClient&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -66,6 +69,7 @@
</span><span class="cx">     virtual void contextDestroyed() override final;
</span><span class="cx"> 
</span><span class="cx">     UserMediaPermissionCheckClient* m_client;
</span><ins>+    String m_mediaDeviceIdentifierHashSalt;
</ins><span class="cx">     bool m_hasPersistentPermission { false };
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2011 Ericsson AB. All rights reserved.
</span><span class="cx">  * Copyright (C) 2012 Google Inc. All rights reserved.
</span><del>- * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
</span><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> #include &quot;JSMediaDeviceInfo.h&quot;
</span><span class="cx"> #include &quot;JSMediaStream.h&quot;
</span><span class="cx"> #include &quot;JSNavigatorUserMediaError.h&quot;
</span><ins>+#include &quot;MainFrame.h&quot;
</ins><span class="cx"> #include &quot;MediaConstraintsImpl.h&quot;
</span><span class="cx"> #include &quot;MediaStream.h&quot;
</span><span class="cx"> #include &quot;MediaStreamPrivate.h&quot;
</span><span class="lines">@@ -105,14 +106,27 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SecurityOrigin* UserMediaRequest::securityOrigin() const
</del><ins>+SecurityOrigin* UserMediaRequest::userMediaDocumentOrigin() const
</ins><span class="cx"> {
</span><span class="cx">     if (m_scriptExecutionContext)
</span><span class="cx">         return m_scriptExecutionContext-&gt;securityOrigin();
</span><span class="cx"> 
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><del>-    
</del><ins>+
+SecurityOrigin* UserMediaRequest::topLevelDocumentOrigin() const
+{
+    if (!m_scriptExecutionContext)
+        return nullptr;
+
+    if (Frame* frame = downcast&lt;Document&gt;(*scriptExecutionContext()).frame()) {
+        if (frame-&gt;isMainFrame())
+            return nullptr;
+    }
+
+    return m_scriptExecutionContext-&gt;topOrigin();
+}
+
</ins><span class="cx"> void UserMediaRequest::start()
</span><span class="cx"> {
</span><span class="cx">     // 1 - make sure the system is capable of supporting the audio and video constraints. We don't want to ask for
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaRequesth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2011 Ericsson AB. All rights reserved.
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
</span><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -60,15 +60,13 @@
</span><span class="cx"> 
</span><span class="cx">     ~UserMediaRequest();
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT SecurityOrigin* securityOrigin() const;
</del><ins>+    WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin() const;
+    WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin() const;
</ins><span class="cx"> 
</span><span class="cx">     void start();
</span><span class="cx">     WEBCORE_EXPORT void userMediaAccessGranted(const String&amp; audioDeviceUID, const String&amp; videoDeviceUID);
</span><span class="cx">     WEBCORE_EXPORT void userMediaAccessDenied();
</span><span class="cx"> 
</span><del>-    bool requiresAudio() const { return m_audioDeviceUIDs.size(); }
-    bool requiresVideo() const { return m_videoDeviceUIDs.size(); }
-
</del><span class="cx">     const Vector&lt;String&gt;&amp; audioDeviceUIDs() const { return m_audioDeviceUIDs; }
</span><span class="cx">     const Vector&lt;String&gt;&amp; videoDeviceUIDs() const { return m_videoDeviceUIDs; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -2344,25 +2344,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if ENABLE(MEDIA_STREAM)
-String HTMLMediaElement::mediaPlayerMediaDeviceIdentifierStorageDirectory() const
-{
-    Settings* settings = document().settings();
-    if (!settings)
-        return emptyString();
-
-    String storageDirectory = settings-&gt;mediaDeviceIdentifierStorageDirectory();
-    if (storageDirectory.isEmpty())
-        return emptyString();
-
-    SecurityOrigin* origin = document().securityOrigin();
-    if (!origin)
-        return emptyString();
-
-    return pathByAppendingComponent(storageDirectory, origin-&gt;databaseIdentifier());
-}
-#endif
-
</del><span class="cx"> void HTMLMediaElement::progressEventTimerFired()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_player);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -559,10 +559,6 @@
</span><span class="cx">     virtual String mediaPlayerMediaKeysStorageDirectory() const override;
</span><span class="cx"> #endif
</span><span class="cx">     
</span><del>-#if ENABLE(MEDIA_STREAM)
-    virtual String mediaPlayerMediaDeviceIdentifierStorageDirectory() const override;
-#endif
-
</del><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     virtual void mediaPlayerCurrentPlaybackTargetIsWirelessChanged(MediaPlayer*) override;
</span><span class="cx">     void enqueuePlaybackTargetAvailabilityChangedEvent();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -213,11 +213,6 @@
</span><span class="cx">     virtual String mediaPlayerMediaKeysStorageDirectory() const { return emptyString(); }
</span><span class="cx"> #endif
</span><span class="cx">     
</span><del>-#if ENABLE(MEDIA_STREAM)
-    virtual String mediaPlayerMediaDeviceIdentifierStorageDirectory() const { return emptyString(); }
-#endif
-
-    
</del><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     virtual void mediaPlayerCurrentPlaybackTargetIsWirelessChanged(MediaPlayer*) { };
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamTrackSourcesRequestClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackSourcesRequestClient.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx">     virtual ~MediaStreamTrackSourcesRequestClient() { }
</span><span class="cx"> 
</span><span class="cx">     virtual const String&amp; requestOrigin() const = 0;
</span><del>-    virtual void didCompleteRequest(const TrackSourceInfoVector&amp;) = 0;
</del><ins>+    virtual void didCompleteTrackSourceInfoRequest(const TrackSourceInfoVector&amp;) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx">     TrackSourceInfoVector sources = AVCaptureDeviceManager::singleton().getSourcesInfo(requestClient-&gt;requestOrigin());
</span><span class="cx"> 
</span><span class="cx">     callOnMainThread([this, requestClient, sources] {
</span><del>-        requestClient-&gt;didCompleteRequest(sources);
</del><ins>+        requestClient-&gt;didCompleteTrackSourceInfoRequest(sources);
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -160,7 +160,7 @@
</span><span class="cx">     sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockVideoSourcePersistentID(), nullptr));
</span><span class="cx"> 
</span><span class="cx">     callOnMainThread([this, requestClient, sources] {
</span><del>-        requestClient-&gt;didCompleteRequest(sources);
</del><ins>+        requestClient-&gt;didCompleteTrackSourceInfoRequest(sources);
</ins><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-02-25  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+        https://bugs.webkit.org/show_bug.cgi?id=153163
+        &lt;rdar://problem/24334526&gt;
+
+        Reviewed by Tim Horton.
+
+        * WebCoreSupport/WebUserMediaClient.mm:
+        (WebUserMediaClient::requestUserMediaAccess):
+        (WebUserMediaClient::checkUserMediaPermission):
+        (-[WebUserMediaPolicyCheckerListener allow]):
+        (-[WebUserMediaPolicyCheckerListener deny]):
+
</ins><span class="cx"> 2016-02-24  Nikos Andronikos  &lt;nikos.andronikos-webkit@cisra.canon.com.au&gt;
</span><span class="cx"> 
</span><span class="cx">         [web-animations] Add AnimationTimeline, DocumentTimeline and add extensions to Document interface
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebUserMediaClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.mm (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.mm        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.mm        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     WebUserMediaPolicyListener *listener = [[WebUserMediaPolicyListener alloc] initWithUserMediaRequest:&amp;request];
</span><del>-    WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.securityOrigin()];
</del><ins>+    WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.userMediaDocumentOrigin()];
</ins><span class="cx"> 
</span><span class="cx">     AddRequestToRequestMap(&amp;request, listener);
</span><span class="cx">     CallUIDelegate(m_webView, selector, webOrigin, listener);
</span><span class="lines">@@ -169,12 +169,12 @@
</span><span class="cx"> 
</span><span class="cx">     SEL selector = @selector(webView:checkPolicyForUserMediaRequestFromOrigin:listener:);
</span><span class="cx">     if (![[m_webView UIDelegate] respondsToSelector:selector]) {
</span><del>-        request.setHasPersistentPermission(false);
</del><ins>+        request.setUserMediaAccessInfo(emptyString(), false);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     WebUserMediaPolicyCheckerListener *listener = [[WebUserMediaPolicyCheckerListener alloc] initWithUserMediaPermissionCheck:&amp;request];
</span><del>-    WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.securityOrigin()];
</del><ins>+    WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.userMediaDocumentOrigin()];
</ins><span class="cx"> 
</span><span class="cx">     AddPermissionCheckToMap(&amp;request, listener);
</span><span class="cx">     CallUIDelegate(m_webView, selector, webOrigin, listener);
</span><span class="lines">@@ -288,7 +288,7 @@
</span><span class="cx">     if (!_request)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    _request-&gt;setHasPersistentPermission(true);
</del><ins>+    _request-&gt;setUserMediaAccessInfo(_request-&gt;mediaDeviceIdentifierHashSalt(), true);
</ins><span class="cx">     RemovePermissionCheckFromMap(_request.get());
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="lines">@@ -299,7 +299,7 @@
</span><span class="cx">     if (!_request)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    _request-&gt;setHasPersistentPermission(true);
</del><ins>+    _request-&gt;setUserMediaAccessInfo(emptyString(), true);
</ins><span class="cx">     RemovePermissionCheckFromMap(_request.get());
</span><span class="cx"> #endif
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2CMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/CMakeLists.txt (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/CMakeLists.txt        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/CMakeLists.txt        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -430,6 +430,7 @@
</span><span class="cx">     UIProcess/API/C/WKDownload.cpp
</span><span class="cx">     UIProcess/API/C/WKFormSubmissionListener.cpp
</span><span class="cx">     UIProcess/API/C/WKFrame.cpp
</span><ins>+    UIProcess/API/C/WKFrameHandleRef.cpp
</ins><span class="cx">     UIProcess/API/C/WKFrameInfoRef.cpp
</span><span class="cx">     UIProcess/API/C/WKFramePolicyListener.cpp
</span><span class="cx">     UIProcess/API/C/WKGeolocationManager.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/ChangeLog        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,3 +1,81 @@
</span><ins>+2016-02-25  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+        https://bugs.webkit.org/show_bug.cgi?id=153163
+        &lt;rdar://problem/24334526&gt;
+
+        Reviewed by Tim Horton.
+
+        * CMakeLists.txt: Add WKFrameHandleRef.cpp.
+
+        * Shared/API/c/WKBase.h: Add WKFrameHandleRef.
+        * UIProcess/API/APIUIClient.h:
+        (API::UIClient::decidePolicyForUserMediaPermissionRequest): Add parameter top level document
+          security context.
+        (API::UIClient::checkUserMediaPermissionForOrigin): Ditto.
+
+        * UIProcess/API/C/WKAPICast.h: Add FrameHandle.
+
+        * UIProcess/API/C/WKFrameHandleRef.cpp: Added.
+        * UIProcess/API/C/WKFrameHandleRef.h: Added.
+
+        * UIProcess/API/C/WKFrameInfoRef.cpp:
+        (WKFrameInfoGetFrameHandleRef): Added.
+        * UIProcess/API/C/WKFrameInfoRef.h:
+
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageSetPageUIClient): Add parameters to decidePolicyForUserMediaPermissionRequest and
+          checkUserMediaPermissionForOrigin for top level document security context.
+
+        * UIProcess/API/C/WKPageUIClient.h: Ditto.
+
+        * UIProcess/API/C/WKUserMediaPermissionCheck.cpp:
+        (WKUserMediaPermissionCheckSetUserMediaAccessInfo): Renamed from WKUserMediaPermissionCheckSetHasPersistentPermission,
+          add parameter for top level document security context.
+        (WKUserMediaPermissionCheckSetHasPersistentPermission): Deleted.
+        * UIProcess/API/C/WKUserMediaPermissionCheck.h:
+
+        * UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp:
+        (webkitUserMediaPermissionRequestCreate): Add top level document origin.
+
+        * UIProcess/UserMediaPermissionCheckProxy.cpp:
+        (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Renamed from setHasPersistentPermission.
+        (WebKit::UserMediaPermissionCheckProxy::setHasPersistentPermission): Deleted.
+        * UIProcess/UserMediaPermissionCheckProxy.h:
+
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Add parameter
+         for device id hash salt.
+        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+
+        * UIProcess/UserMediaPermissionRequestProxy.h:
+        (WebKit::UserMediaPermissionRequestProxy::requiresAudio): Deleted, unused.
+        (WebKit::UserMediaPermissionRequestProxy::requiresVideo): Ditto.
+        (WebKit::UserMediaPermissionRequestProxy::firstVideoDeviceUID): Ditto.
+        (WebKit::UserMediaPermissionRequestProxy::firstAudioDeviceUID): Ditto.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::requestUserMediaPermissionForFrame): Pass through parameter for top
+          level document security context.
+        (WebKit::WebPageProxy::checkUserMediaPermissionForFrame): Ditto.
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+
+        * WebKit2.xcodeproj/project.pbxproj: Add WKFrameHandleRef.cpp|.h.
+
+        * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
+        (WebKit::UserMediaPermissionRequestManager::startUserMediaRequest): Pass through parameter for top
+          level document security context.
+        (WebKit::UserMediaPermissionRequestManager::startUserMediaPermissionCheck): Ditto.
+        (WebKit::UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck): Pass through
+          device id hash salt.
+        * WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::didCompleteUserMediaPermissionCheck): Ditto.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
</ins><span class="cx"> 2016-02-24  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Tearing when entering AC mode
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedAPIcWKBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/API/c/WKBase.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/API/c/WKBase.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/Shared/API/c/WKBase.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -99,6 +99,7 @@
</span><span class="cx"> typedef const struct OpaqueWKCredential* WKCredentialRef;
</span><span class="cx"> typedef const struct OpaqueWKDownload* WKDownloadRef;
</span><span class="cx"> typedef const struct OpaqueWKFormSubmissionListener* WKFormSubmissionListenerRef;
</span><ins>+typedef const struct OpaqueWKFrameHandle* WKFrameHandleRef;
</ins><span class="cx"> typedef const struct OpaqueWKFrameInfo* WKFrameInfoRef;
</span><span class="cx"> typedef const struct OpaqueWKFrame* WKFrameRef;
</span><span class="cx"> typedef const struct OpaqueWKFramePolicyListener* WKFramePolicyListenerRef;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIUIClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/APIUIClient.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIUIClient.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/APIUIClient.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -132,8 +132,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool runOpenPanel(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebKit::WebOpenPanelParameters*, WebKit::WebOpenPanelResultListenerProxy*) { return false; }
</span><span class="cx">     virtual bool decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, SecurityOrigin*, WebKit::GeolocationPermissionRequestProxy*) { return false; }
</span><del>-    virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&amp;, WebKit::WebFrameProxy&amp;, SecurityOrigin&amp;, WebKit::UserMediaPermissionRequestProxy&amp;) { return false; }
-    virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&amp;, WebKit::WebFrameProxy&amp;, SecurityOrigin&amp;, WebKit::UserMediaPermissionCheckProxy&amp;) { return false; }
</del><ins>+    virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&amp;, WebKit::WebFrameProxy&amp;, SecurityOrigin&amp;, SecurityOrigin&amp;, WebKit::UserMediaPermissionRequestProxy&amp;) { return false; }
+    virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&amp;, WebKit::WebFrameProxy&amp;, SecurityOrigin&amp;, SecurityOrigin&amp;, WebKit::UserMediaPermissionCheckProxy&amp;) { return false; }
</ins><span class="cx">     virtual bool decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy*, SecurityOrigin*, WebKit::NotificationPermissionRequest*) { return false; }
</span><span class="cx"> 
</span><span class="cx">     // Printing.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKAPICasth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> #include &lt;WebCore/Settings.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace API {
</span><ins>+class FrameHandle;
</ins><span class="cx"> class FrameInfo;
</span><span class="cx"> class HitTestResult;
</span><span class="cx"> class Navigation;
</span><span class="lines">@@ -125,6 +126,7 @@
</span><span class="cx"> WK_ADD_API_MAPPING(WKDownloadRef, DownloadProxy)
</span><span class="cx"> WK_ADD_API_MAPPING(WKFormSubmissionListenerRef, WebFormSubmissionListenerProxy)
</span><span class="cx"> WK_ADD_API_MAPPING(WKFramePolicyListenerRef, WebFramePolicyListenerProxy)
</span><ins>+WK_ADD_API_MAPPING(WKFrameHandleRef, API::FrameHandle)
</ins><span class="cx"> WK_ADD_API_MAPPING(WKFrameInfoRef, API::FrameInfo)
</span><span class="cx"> WK_ADD_API_MAPPING(WKFrameRef, WebFrameProxy)
</span><span class="cx"> WK_ADD_API_MAPPING(WKGeolocationManagerRef, WebGeolocationManagerProxy)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKFrameHandleRefcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.cpp (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.cpp                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * 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 APPLE INC. OR ITS 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;WKFrameHandleRef.h&quot;
+
+#include &quot;APIFrameHandle.h&quot;
+#include &quot;WKAPICast.h&quot;
+
+using namespace WebKit;
+
+WKTypeID WKFrameHandleGetTypeID()
+{
+    return toAPI(API::FrameHandle::APIType);
+}
+
+uint64_t WKFrameHandleGetFrameID(WKFrameHandleRef frameHandleRef)
+{
+    return toImpl(frameHandleRef)-&gt;frameID();
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKFrameHandleRefh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.h (0 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKFrameHandleRef.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * 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 APPLE INC. OR ITS 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 WKFrameHandleRef_h
+#define WKFrameHandleRef_h
+
+#include &lt;WebKit/WKBase.h&gt;
+
+#ifdef __cplusplus
+extern &quot;C&quot; {
+#endif
+
+WK_EXPORT WKTypeID WKFrameHandleGetTypeID();
+
+WK_EXPORT uint64_t WKFrameHandleGetFrameID(WKFrameHandleRef);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // WKFrameHandleRef_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKFrameInfoRefcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;WKFrameInfoRef.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;APIFrameHandle.h&quot;
</ins><span class="cx"> #include &quot;APIFrameInfo.h&quot;
</span><span class="cx"> #include &quot;WKAPICast.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -35,3 +36,8 @@
</span><span class="cx"> {
</span><span class="cx">     return toAPI(API::FrameInfo::APIType);
</span><span class="cx"> }
</span><ins>+
+WKFrameHandleRef WKFrameInfoGetFrameHandleRef(WKFrameInfoRef frameInfoRef)
+{
+    return toAPI(&amp;toImpl(frameInfoRef)-&gt;handle());
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKFrameInfoRefh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKFrameInfoRef.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -34,6 +34,8 @@
</span><span class="cx"> 
</span><span class="cx"> WK_EXPORT WKTypeID WKFrameInfoGetTypeID();
</span><span class="cx"> 
</span><ins>+WK_EXPORT WKFrameHandleRef WKFrameInfoGetFrameHandleRef(WKFrameInfoRef);
+
</ins><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -2063,21 +2063,21 @@
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        virtual bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&amp; page, WebFrameProxy&amp; frame, API::SecurityOrigin&amp; origin, UserMediaPermissionRequestProxy&amp; permissionRequest) override
</del><ins>+        virtual bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&amp; page, WebFrameProxy&amp; frame, API::SecurityOrigin&amp; userMediaDocumentOrigin, API::SecurityOrigin&amp; topLevelDocumentOrigin, UserMediaPermissionRequestProxy&amp; permissionRequest) override
</ins><span class="cx">         {
</span><span class="cx">             if (!m_client.decidePolicyForUserMediaPermissionRequest)
</span><span class="cx">                 return false;
</span><span class="cx"> 
</span><del>-            m_client.decidePolicyForUserMediaPermissionRequest(toAPI(&amp;page), toAPI(&amp;frame), toAPI(&amp;origin), toAPI(&amp;permissionRequest), m_client.base.clientInfo);
</del><ins>+            m_client.decidePolicyForUserMediaPermissionRequest(toAPI(&amp;page), toAPI(&amp;frame), toAPI(&amp;userMediaDocumentOrigin), toAPI(&amp;topLevelDocumentOrigin), toAPI(&amp;permissionRequest), m_client.base.clientInfo);
</ins><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        virtual bool checkUserMediaPermissionForOrigin(WebPageProxy&amp; page, WebFrameProxy&amp; frame, API::SecurityOrigin&amp; origin, UserMediaPermissionCheckProxy&amp; request) override
</del><ins>+        virtual bool checkUserMediaPermissionForOrigin(WebPageProxy&amp; page, WebFrameProxy&amp; frame, API::SecurityOrigin&amp; userMediaDocumentOrigin, API::SecurityOrigin&amp; topLevelDocumentOrigin, UserMediaPermissionCheckProxy&amp; request) override
</ins><span class="cx">         {
</span><span class="cx">             if (!m_client.checkUserMediaPermissionForOrigin)
</span><span class="cx">                 return false;
</span><span class="cx"> 
</span><del>-            m_client.checkUserMediaPermissionForOrigin(toAPI(&amp;page), toAPI(&amp;frame), toAPI(&amp;origin), toAPI(&amp;request), m_client.base.clientInfo);
</del><ins>+            m_client.checkUserMediaPermissionForOrigin(toAPI(&amp;page), toAPI(&amp;frame), toAPI(&amp;userMediaDocumentOrigin), toAPI(&amp;topLevelDocumentOrigin), toAPI(&amp;request), m_client.base.clientInfo);
</ins><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPageUIClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -98,8 +98,8 @@
</span><span class="cx"> typedef void (*WKPageUnavailablePluginButtonClickedCallback)(WKPageRef page, WKPluginUnavailabilityReason pluginUnavailabilityReason, WKDictionaryRef pluginInfoDictionary, const void* clientInfo);
</span><span class="cx"> typedef void (*WKPagePinnedStateDidChangeCallback)(WKPageRef page, const void* clientInfo);
</span><span class="cx"> typedef void (*WKPageIsPlayingAudioDidChangeCallback)(WKPageRef page, const void* clientInfo);
</span><del>-typedef void (*WKPageDecidePolicyForUserMediaPermissionRequestCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef origin, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo);
-typedef void (*WKCheckUserMediaPermissionCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef origin, WKUserMediaPermissionCheckRef devicesRequest, const void *clientInfo);
</del><ins>+typedef void (*WKPageDecidePolicyForUserMediaPermissionRequestCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo);
+typedef void (*WKCheckUserMediaPermissionCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin, WKUserMediaPermissionCheckRef devicesRequest, const void *clientInfo);
</ins><span class="cx"> typedef void (*WKPageDidClickAutoFillButtonCallback)(WKPageRef page, WKTypeRef userData, const void *clientInfo);
</span><span class="cx"> typedef void (*WKPageMediaSessionMetadataDidChangeCallback)(WKPageRef page, WKMediaSessionMetadataRef metadata, const void* clientInfo);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKUserMediaPermissionCheckcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -40,8 +40,8 @@
</span><span class="cx">     return toAPI(UserMediaPermissionCheckProxy::APIType);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WKUserMediaPermissionCheckSetHasPersistentPermission(WKUserMediaPermissionCheckRef userMediaPermissionRequestRef, bool allowed)
</del><ins>+void WKUserMediaPermissionCheckSetUserMediaAccessInfo(WKUserMediaPermissionCheckRef userMediaPermissionRequestRef, WKStringRef mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> {
</span><del>-    toImpl(userMediaPermissionRequestRef)-&gt;setHasPersistentPermission(allowed);
</del><ins>+    toImpl(userMediaPermissionRequestRef)-&gt;setUserMediaAccessInfo(toWTFString(mediaDeviceIdentifierHashSalt), allowed);
</ins><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKUserMediaPermissionCheckh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> WK_EXPORT WKTypeID WKUserMediaPermissionCheckGetTypeID();
</span><span class="cx"> 
</span><del>-WK_EXPORT void WKUserMediaPermissionCheckSetHasPersistentPermission(WKUserMediaPermissionCheckRef, bool);
</del><ins>+WK_EXPORT void WKUserMediaPermissionCheckSetUserMediaAccessInfo(WKUserMediaPermissionCheckRef, WKStringRef, bool);
</ins><span class="cx"> 
</span><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitUIClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -174,9 +174,9 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&amp;, WebFrameProxy&amp;, API::SecurityOrigin&amp; securityOrigin, UserMediaPermissionRequestProxy&amp; permissionRequest) override
</del><ins>+    virtual bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&amp;, WebFrameProxy&amp;, API::SecurityOrigin&amp; userMediaDocumentOrigin, API::SecurityOrigin&amp; topLevelDocumentOrigin, UserMediaPermissionRequestProxy&amp; permissionRequest) override
</ins><span class="cx">     {
</span><del>-        GRefPtr&lt;WebKitUserMediaPermissionRequest&gt; userMediaPermissionRequest = adoptGRef(webkitUserMediaPermissionRequestCreate(permissionRequest, securityOrigin));
</del><ins>+        GRefPtr&lt;WebKitUserMediaPermissionRequest&gt; userMediaPermissionRequest = adoptGRef(webkitUserMediaPermissionRequestCreate(permissionRequest, userMediaDocumentOrigin, topLevelDocumentOrigin));
</ins><span class="cx">         webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(userMediaPermissionRequest.get()));
</span><span class="cx">         return true;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitUserMediaPermissionRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -184,12 +184,13 @@
</span><span class="cx">             WEBKIT_PARAM_READABLE));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebKitUserMediaPermissionRequest* webkitUserMediaPermissionRequestCreate(UserMediaPermissionRequestProxy&amp; request, API::SecurityOrigin&amp; securityOrigin)
</del><ins>+WebKitUserMediaPermissionRequest* webkitUserMediaPermissionRequestCreate(UserMediaPermissionRequestProxy&amp; request, API::SecurityOrigin&amp; userMediaDocumentOrigin, API::SecurityOrigin&amp; topLevelDocumentOrigin)
</ins><span class="cx"> {
</span><span class="cx">     WebKitUserMediaPermissionRequest* usermediaPermissionRequest = WEBKIT_USER_MEDIA_PERMISSION_REQUEST(g_object_new(WEBKIT_TYPE_USER_MEDIA_PERMISSION_REQUEST, nullptr));
</span><span class="cx"> 
</span><del>-    // FIXME: store SecurityOrigin
-    UNUSED_PARAM(securityOrigin);
</del><ins>+    // FIXME: store SecurityOrigins
+    UNUSED_PARAM(userMediaDocumentOrigin);
+    UNUSED_PARAM(topLevelDocumentOrigin);
</ins><span class="cx"> 
</span><span class="cx">     usermediaPermissionRequest-&gt;priv-&gt;request = &amp;request;
</span><span class="cx">     return usermediaPermissionRequest;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitUserMediaPermissionRequestPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequestPrivate.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequestPrivate.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequestPrivate.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -24,6 +24,6 @@
</span><span class="cx"> 
</span><span class="cx"> class SecurityOrigin;
</span><span class="cx"> 
</span><del>-WebKitUserMediaPermissionRequest* webkitUserMediaPermissionRequestCreate(WebKit::UserMediaPermissionRequestProxy&amp;, API::SecurityOrigin&amp;);
</del><ins>+WebKitUserMediaPermissionRequest* webkitUserMediaPermissionRequestCreate(WebKit::UserMediaPermissionRequestProxy&amp;, API::SecurityOrigin&amp;, API::SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #endif // WebKitUserMediaPermissionRequestPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserMediaPermissionCheckProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -36,13 +36,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserMediaPermissionCheckProxy::setHasPersistentPermission(bool allowed)
</del><ins>+void UserMediaPermissionCheckProxy::setUserMediaAccessInfo(const String&amp; mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_manager);
</span><span class="cx">     if (!m_manager)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_manager-&gt;didCompleteUserMediaPermissionCheck(m_userMediaID, allowed);
</del><ins>+    m_manager-&gt;didCompleteUserMediaPermissionCheck(m_userMediaID, mediaDeviceIdentifierHashSalt, allowed);
</ins><span class="cx">     m_manager = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserMediaPermissionCheckProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionCheckProxy.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> #define UserMediaPermissionCheckProxy_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;APIObject.h&quot;
</span><del>-#include &lt;WebCore/RealtimeMediaSource.h&gt;
</del><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -42,11 +41,11 @@
</span><span class="cx">         return adoptRef(*new UserMediaPermissionCheckProxy(manager, userMediaID));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void setHasPersistentPermission(bool allowed);
</del><ins>+    void setUserMediaAccessInfo(const String&amp;, bool allowed);
</ins><span class="cx">     void invalidate();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    UserMediaPermissionCheckProxy(UserMediaPermissionRequestManagerProxy&amp;, uint64_t userMediaID);
</del><ins>+    UserMediaPermissionCheckProxy(UserMediaPermissionRequestManagerProxy&amp;, uint64_t);
</ins><span class="cx"> 
</span><span class="cx">     UserMediaPermissionRequestManagerProxy* m_manager;
</span><span class="cx">     uint64_t m_userMediaID;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserMediaPermissionRequestManagerProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">     return request;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed)
</del><ins>+void UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String&amp; mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_page.isValid())
</span><span class="cx">         return;
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><del>-    m_page.process().send(Messages::WebPage::DidCompleteUserMediaPermissionCheck(userMediaID, allowed), m_page.pageID());
</del><ins>+    m_page.process().send(Messages::WebPage::DidCompleteUserMediaPermissionCheck(userMediaID, mediaDeviceIdentifierHashSalt, allowed), m_page.pageID());
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(allowed);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserMediaPermissionRequestManagerProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;UserMediaPermissionCheckProxy&gt; createUserMediaPermissionCheck(uint64_t userMediaID);
</span><del>-    void didCompleteUserMediaPermissionCheck(uint64_t, bool allow);
</del><ins>+    void didCompleteUserMediaPermissionCheck(uint64_t, const String&amp;, bool allow);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     HashMap&lt;uint64_t, RefPtr&lt;UserMediaPermissionRequestProxy&gt;&gt; m_pendingUserMediaRequests;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessUserMediaPermissionRequestProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -45,9 +45,6 @@
</span><span class="cx"> 
</span><span class="cx">     const Vector&lt;String&gt;&amp; videoDeviceUIDs() const { return m_videoDeviceUIDs; }
</span><span class="cx">     const Vector&lt;String&gt;&amp; audioDeviceUIDs() const { return m_audioDeviceUIDs; }
</span><del>-    
-    const String&amp; firstVideoDeviceUID() const { return !videoDeviceUIDs().isEmpty() ? videoDeviceUIDs().at(0) : emptyString(); }
-    const String&amp; firstAudioDeviceUID() const { return !audioDeviceUIDs().isEmpty() ? audioDeviceUIDs().at(0) : emptyString(); }
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&amp;, uint64_t userMediaID, const Vector&lt;String&gt;&amp; videoDeviceUIDs, const Vector&lt;String&gt;&amp; audioDeviceUIDs);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -5313,28 +5313,45 @@
</span><span class="cx">     request-&gt;deny();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier, const Vector&lt;String&gt;&amp; audioDeviceUIDs, const Vector&lt;String&gt;&amp; videoDeviceUIDs)
</del><ins>+void WebPageProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const Vector&lt;String&gt;&amp; audioDeviceUIDs, const Vector&lt;String&gt;&amp; videoDeviceUIDs)
</ins><span class="cx"> {
</span><ins>+#if ENABLE(MEDIA_STREAM)
</ins><span class="cx">     WebFrameProxy* frame = m_process-&gt;webFrame(frameID);
</span><span class="cx">     MESSAGE_CHECK(frame);
</span><span class="cx"> 
</span><del>-    RefPtr&lt;API::SecurityOrigin&gt; origin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
</del><ins>+    RefPtr&lt;API::SecurityOrigin&gt; userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier));
+    RefPtr&lt;API::SecurityOrigin&gt; topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier));
</ins><span class="cx">     RefPtr&lt;UserMediaPermissionRequestProxy&gt; request = m_userMediaPermissionRequestManager.createRequest(userMediaID, audioDeviceUIDs, videoDeviceUIDs);
</span><span class="cx"> 
</span><del>-    if (!m_uiClient-&gt;decidePolicyForUserMediaPermissionRequest(*this, *frame, *origin.get(), *request.get()))
</del><ins>+    if (!m_uiClient-&gt;decidePolicyForUserMediaPermissionRequest(*this, *frame, *userMediaOrigin.get(), *topLevelOrigin.get(), *request.get()))
</ins><span class="cx">         request-&gt;deny();
</span><ins>+#else
+    UNUSED_PARAM(userMediaID);
+    UNUSED_PARAM(frameID);
+    UNUSED_PARAM(userMediaDocumentOriginIdentifier);
+    UNUSED_PARAM(topLevelDocumentOriginIdentifier);
+    UNUSED_PARAM(audioDeviceUIDs);
+    UNUSED_PARAM(videoDeviceUIDs);
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier)
</del><ins>+void WebPageProxy::checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier)
</ins><span class="cx"> {
</span><ins>+#if ENABLE(MEDIA_STREAM)
</ins><span class="cx">     WebFrameProxy* frame = m_process-&gt;webFrame(frameID);
</span><span class="cx">     MESSAGE_CHECK(frame);
</span><span class="cx"> 
</span><del>-    RefPtr&lt;API::SecurityOrigin&gt; origin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
</del><span class="cx">     RefPtr&lt;UserMediaPermissionCheckProxy&gt; request = m_userMediaPermissionRequestManager.createUserMediaPermissionCheck(userMediaID);
</span><del>-
-    if (!m_uiClient-&gt;checkUserMediaPermissionForOrigin(*this, *frame, *origin.get(), *request.get()))
-        request-&gt;setHasPersistentPermission(false);
</del><ins>+    RefPtr&lt;API::SecurityOrigin&gt; userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier));
+    RefPtr&lt;API::SecurityOrigin&gt; topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier));
+    if (!m_uiClient-&gt;checkUserMediaPermissionForOrigin(*this, *frame, *userMediaOrigin.get(), *topLevelOrigin.get(), *request.get()))
+        request-&gt;setUserMediaAccessInfo(emptyString(), false);
+#else
+    UNUSED_PARAM(userMediaID);
+    UNUSED_PARAM(frameID);
+    UNUSED_PARAM(userMediaDocumentOriginIdentifier);
+    UNUSED_PARAM(topLevelDocumentOriginIdentifier);
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::requestNotificationPermission(uint64_t requestID, const String&amp; originString)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -157,7 +157,6 @@
</span><span class="cx"> class FloatRect;
</span><span class="cx"> class GraphicsLayer;
</span><span class="cx"> class IntSize;
</span><del>-class MediaConstraintsImpl;
</del><span class="cx"> class ProtectionSpace;
</span><span class="cx"> class RunLoopObserver;
</span><span class="cx"> class SharedBuffer;
</span><span class="lines">@@ -1207,8 +1206,8 @@
</span><span class="cx">     void reachedApplicationCacheOriginQuota(const String&amp; originIdentifier, uint64_t currentQuota, uint64_t totalBytesNeeded, PassRefPtr&lt;Messages::WebPageProxy::ReachedApplicationCacheOriginQuota::DelayedReply&gt;);
</span><span class="cx">     void requestGeolocationPermissionForFrame(uint64_t geolocationID, uint64_t frameID, String originIdentifier);
</span><span class="cx"> 
</span><del>-    void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier, const Vector&lt;String&gt;&amp; audioDeviceUIDs, const Vector&lt;String&gt;&amp; videoDeviceUIDs);
-    void checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier);
</del><ins>+    void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const Vector&lt;String&gt;&amp; audioDeviceUIDs, const Vector&lt;String&gt;&amp; videoDeviceUIDs);
+    void checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier);
</ins><span class="cx"> 
</span><span class="cx">     void runModal();
</span><span class="cx">     void notifyScrollerThumbIsVisibleInRect(const WebCore::IntRect&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -264,8 +264,8 @@
</span><span class="cx">     
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><span class="cx">     # MediaSteam messages
</span><del>-    RequestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier, Vector&lt;String&gt; audioDeviceUIDs, Vector&lt;String&gt; videoDeviceUIDs)
-    CheckUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier)
</del><ins>+    RequestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, Vector&lt;String&gt; audioDeviceUIDs, Vector&lt;String&gt; videoDeviceUIDs)
+    CheckUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier)
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     # Notification messages
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -59,6 +59,8 @@
</span><span class="cx">                 07297FA21C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297FA01C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp */; };
</span><span class="cx">                 07297FA31C186ADB003F0735 /* WKUserMediaPermissionCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 076E884E1A13CADF005E90FC /* APIContextMenuClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 076E884D1A13CADF005E90FC /* APIContextMenuClient.h */; };
</span><ins>+                07A5EBBB1C7BA43E00B9CA69 /* WKFrameHandleRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A5EBB91C7BA43E00B9CA69 /* WKFrameHandleRef.cpp */; };
+                07A5EBBC1C7BA43E00B9CA69 /* WKFrameHandleRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A5EBBA1C7BA43E00B9CA69 /* WKFrameHandleRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 0F0C365818C051BA00F607D7 /* RemoteLayerTreeHostIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F0C365718C051BA00F607D7 /* RemoteLayerTreeHostIOS.mm */; };
</span><span class="cx">                 0F0C365A18C0555800F607D7 /* LayerRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F0C365918C0555800F607D7 /* LayerRepresentation.h */; };
</span><span class="cx">                 0F0C365C18C05CA100F607D7 /* RemoteScrollingCoordinatorProxyIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F0C365B18C05CA100F607D7 /* RemoteScrollingCoordinatorProxyIOS.mm */; };
</span><span class="lines">@@ -1977,6 +1979,8 @@
</span><span class="cx">                 07297FA11C186ADB003F0735 /* WKUserMediaPermissionCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserMediaPermissionCheck.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 076E884D1A13CADF005E90FC /* APIContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIContextMenuClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 076E884F1A13CBC6005E90FC /* APIInjectedBundlePageContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIInjectedBundlePageContextMenuClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                07A5EBB91C7BA43E00B9CA69 /* WKFrameHandleRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKFrameHandleRef.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07A5EBBA1C7BA43E00B9CA69 /* WKFrameHandleRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKFrameHandleRef.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = &quot;&lt;absolute&gt;&quot;; };
</span><span class="cx">                 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F0C365718C051BA00F607D7 /* RemoteLayerTreeHostIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RemoteLayerTreeHostIOS.mm; path = ios/RemoteLayerTreeHostIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -6054,6 +6058,8 @@
</span><span class="cx">                                 BCE469581214EDF4000B98EB /* WKFormSubmissionListener.h */,
</span><span class="cx">                                 BCD01398110FA420003B8A67 /* WKFrame.cpp */,
</span><span class="cx">                                 BCD01397110FA420003B8A67 /* WKFrame.h */,
</span><ins>+                                07A5EBB91C7BA43E00B9CA69 /* WKFrameHandleRef.cpp */,
+                                07A5EBBA1C7BA43E00B9CA69 /* WKFrameHandleRef.h */,
</ins><span class="cx">                                 2D3A65E41A7C3AA700CAC637 /* WKFrameInfoRef.cpp */,
</span><span class="cx">                                 2D3A65E51A7C3AA700CAC637 /* WKFrameInfoRef.h */,
</span><span class="cx">                                 BCB9F6A41123DD0D00A137E0 /* WKFramePolicyListener.cpp */,
</span><span class="lines">@@ -7179,6 +7185,7 @@
</span><span class="cx">                                 1A5704F21BE0174000874AF1 /* _WKElementInfo.h in Headers */,
</span><span class="cx">                                 1AD01BC91905D37E00C9C45F /* _WKErrorRecoveryAttempting.h in Headers */,
</span><span class="cx">                                 005D158F18E4C4EB00734619 /* _WKFindDelegate.h in Headers */,
</span><ins>+                                07A5EBBC1C7BA43E00B9CA69 /* WKFrameHandleRef.h in Headers */,
</ins><span class="cx">                                 510523741C73D38B007993CB /* WebIDBConnectionToServerMessages.h in Headers */,
</span><span class="cx">                                 2DEAC5CF1AC368BB00A195D8 /* _WKFindOptions.h in Headers */,
</span><span class="cx">                                 2E7A944A1BBD97C300945547 /* _WKFocusedElementInfo.h in Headers */,
</span><span class="lines">@@ -9440,6 +9447,7 @@
</span><span class="cx">                                 1AAF089A19267EE500B6390C /* WKUserScript.mm in Sources */,
</span><span class="cx">                                 7C89D2A31A678875003A5FDE /* WKUserScriptRef.cpp in Sources */,
</span><span class="cx">                                 BC8699B6116AADAA002A925B /* WKView.mm in Sources */,
</span><ins>+                                07A5EBBB1C7BA43E00B9CA69 /* WKFrameHandleRef.cpp in Sources */,
</ins><span class="cx">                                 2D28A4981AF965A200F190C9 /* WKViewLayoutStrategy.mm in Sources */,
</span><span class="cx">                                 C5E1AFE816B20B67006CC1F2 /* WKWebArchive.cpp in Sources */,
</span><span class="cx">                                 C5E1AFEA16B20B7B006CC1F2 /* WKWebArchiveResource.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessMediaStreamUserMediaPermissionRequestManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -62,8 +62,9 @@
</span><span class="cx">     WebFrame* webFrame = WebFrame::fromCoreFrame(*frame);
</span><span class="cx">     ASSERT(webFrame);
</span><span class="cx"> 
</span><del>-    SecurityOrigin* origin = request.securityOrigin();
-    m_page.send(Messages::WebPageProxy::RequestUserMediaPermissionForFrame(requestID, webFrame-&gt;frameID(), origin-&gt;databaseIdentifier(), request.audioDeviceUIDs(), request.videoDeviceUIDs()));
</del><ins>+    SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin();
+    String topLevelDocumentOriginString = topLevelDocumentOrigin ? topLevelDocumentOrigin-&gt;databaseIdentifier() : emptyString();
+    m_page.send(Messages::WebPageProxy::RequestUserMediaPermissionForFrame(requestID, webFrame-&gt;frameID(), request.userMediaDocumentOrigin()-&gt;databaseIdentifier(), topLevelDocumentOriginString, request.audioDeviceUIDs(), request.videoDeviceUIDs()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserMediaPermissionRequestManager::cancelUserMediaRequest(UserMediaRequest&amp; request)
</span><span class="lines">@@ -93,7 +94,7 @@
</span><span class="cx">     Frame* frame = document ? document-&gt;frame() : nullptr;
</span><span class="cx"> 
</span><span class="cx">     if (!frame) {
</span><del>-        request.setHasPersistentPermission(false);
</del><ins>+        request.setUserMediaAccessInfo(emptyString(), false);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -104,8 +105,9 @@
</span><span class="cx">     WebFrame* webFrame = WebFrame::fromCoreFrame(*frame);
</span><span class="cx">     ASSERT(webFrame);
</span><span class="cx"> 
</span><del>-    SecurityOrigin* origin = request.securityOrigin();
-    m_page.send(Messages::WebPageProxy::CheckUserMediaPermissionForFrame(requestID, webFrame-&gt;frameID(), origin-&gt;databaseIdentifier()));
</del><ins>+    SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin();
+    String topLevelDocumentOriginString = topLevelDocumentOrigin ? topLevelDocumentOrigin-&gt;databaseIdentifier() : emptyString();
+    m_page.send(Messages::WebPageProxy::CheckUserMediaPermissionForFrame(requestID, webFrame-&gt;frameID(), request.userMediaDocumentOrigin()-&gt;databaseIdentifier(), topLevelDocumentOriginString));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UserMediaPermissionRequestManager::cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&amp; request)
</span><span class="lines">@@ -116,14 +118,14 @@
</span><span class="cx">     m_idToUserMediaPermissionCheckMap.remove(requestID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck(uint64_t requestID, bool allowed)
</del><ins>+void UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck(uint64_t requestID, const String&amp; mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;UserMediaPermissionCheck&gt; request = m_idToUserMediaPermissionCheckMap.take(requestID);
</span><span class="cx">     if (!request)
</span><span class="cx">         return;
</span><span class="cx">     m_userMediaPermissionCheckToIDMap.remove(request);
</span><span class="cx">     
</span><del>-    request-&gt;setHasPersistentPermission(allowed);
</del><ins>+    request-&gt;setUserMediaAccessInfo(mediaDeviceIdentifierHashSalt, allowed);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessMediaStreamUserMediaPermissionRequestManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx">     void startUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&amp;);
</span><span class="cx">     void cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&amp;);
</span><del>-    void didCompleteUserMediaPermissionCheck(uint64_t requestID, bool allowed);
</del><ins>+    void didCompleteUserMediaPermissionCheck(uint64_t requestID, const String&amp;, bool allowed);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WebPage&amp; m_page;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -3476,9 +3476,9 @@
</span><span class="cx">     m_userMediaPermissionRequestManager.didReceiveUserMediaPermissionDecision(userMediaID, allowed, audioDeviceUID, videoDeviceUID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed)
</del><ins>+void WebPage::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String&amp; mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> {
</span><del>-    m_userMediaPermissionRequestManager.didCompleteUserMediaPermissionCheck(userMediaID, allowed);
</del><ins>+    m_userMediaPermissionRequestManager.didCompleteUserMediaPermissionCheck(userMediaID, mediaDeviceIdentifierHashSalt, allowed);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1111,7 +1111,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><span class="cx">     void didReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, const String&amp; audioDeviceUID, const String&amp; videoDeviceUID);
</span><del>-    void didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed);
</del><ins>+    void didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String&amp;, bool allowed);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void advanceToNextMisspelling(bool startBeforeSelection);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -283,7 +283,7 @@
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><span class="cx">     # MediaSteam
</span><span class="cx">     DidReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, String audioDeviceUID, String videoDeviceUID)
</span><del>-    DidCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed)
</del><ins>+    DidCompleteUserMediaPermissionCheck(uint64_t userMediaID, String mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     # Notification
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/ChangeLog        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2016-02-25  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+        https://bugs.webkit.org/show_bug.cgi?id=153163
+        &lt;rdar://problem/24334526&gt;
+
+        Reviewed by Tim Horton.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::setUserMediaPermissionForOrigin): Take top level document origin.
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.h:
+
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setUserMediaPermissionForOrigin): Ditto.
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::decidePolicyForUserMediaPermissionRequest): Pass through top level document origin.
+        (WTR::checkUserMediaPermissionForOrigin): Ditto.
+        (WTR::TestController::resetStateToConsistentValues): m_userMediaOriginPermissions -&gt; m_cahcedUserMediaPermissions.
+        (WTR::originUserVisibleName): Return a String.
+        (WTR::userMediaOriginHash): Create a hash of the origin plus top level document origin.
+        (WTR::TestController::saltForOrigin): Return salt for an origin.
+        (WTR::TestController::setUserMediaPermissionForOrigin): Return permission for an origin.
+        (WTR::TestController::handleCheckOfUserMediaPermissionForOrigin):
+        (WTR::TestController::handleUserMediaPermissionRequest):
+        (WTR::TestController::decidePolicyForUserMediaPermissionRequestIfPossible):
+        (WTR::OriginSettings::OriginSettings): New, class to cache settings for an origin.
+        (WTR::OriginSettings::persistentPermission): Persistent permissions for origin.
+        (WTR::OriginSettings::setPersistentPermission): Set permissions for origin.
+        (WTR::OriginSettings::persistentSalt): Return the persistent salt for the origin, if any.
+        (WTR::OriginSettings::setPersistentSalt): Set the persistent salt for the origin
+        (WTR::OriginSettings::ephemeralSalts): Return hashmap used to store per-frame salts.
+        * WebKitTestRunner/TestController.h:
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
+
</ins><span class="cx"> 2016-02-24  Nikos Andronikos  &lt;nikos.andronikos-webkit@cisra.canon.com.au&gt;
</span><span class="cx"> 
</span><span class="cx">         [web-animations] Add AnimationTimeline, DocumentTimeline and add extensions to Document interface
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleBindingsTestRunneridl"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -179,7 +179,7 @@
</span><span class="cx"> 
</span><span class="cx">     // MediaStream
</span><span class="cx">     void setUserMediaPermission(boolean value);
</span><del>-    void setUserMediaPermissionForOrigin(boolean permission, DOMString url);
</del><ins>+    void setUserMediaPermissionForOrigin(boolean permission, DOMString origin, DOMString parentOrigin);
</ins><span class="cx"> 
</span><span class="cx">     // Audio testing.
</span><span class="cx">     [PassContext] void setAudioResult(object data);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleInjectedBundlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -526,7 +526,7 @@
</span><span class="cx">     WKBundlePagePostMessage(page()-&gt;page(), messageName.get(), messageBody.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InjectedBundle::setUserMediaPermissionForOrigin(bool permission, WKStringRef url)
</del><ins>+void InjectedBundle::setUserMediaPermissionForOrigin(bool permission, WKStringRef origin, WKStringRef parentOrigin)
</ins><span class="cx"> {
</span><span class="cx">     auto messageName = adoptWK(WKStringCreateWithUTF8CString(&quot;SetUserMediaPermissionForOrigin&quot;));
</span><span class="cx">     WKRetainPtr&lt;WKMutableDictionaryRef&gt; messageBody(AdoptWK, WKMutableDictionaryCreate());
</span><span class="lines">@@ -535,9 +535,12 @@
</span><span class="cx">     WKRetainPtr&lt;WKBooleanRef&gt; permissionWK(AdoptWK, WKBooleanCreate(permission));
</span><span class="cx">     WKDictionarySetItem(messageBody.get(), permissionKeyWK.get(), permissionWK.get());
</span><span class="cx"> 
</span><del>-    WKRetainPtr&lt;WKStringRef&gt; urlKeyWK(AdoptWK, WKStringCreateWithUTF8CString(&quot;url&quot;));
-    WKDictionarySetItem(messageBody.get(), urlKeyWK.get(), url);
</del><ins>+    WKRetainPtr&lt;WKStringRef&gt; originKeyWK(AdoptWK, WKStringCreateWithUTF8CString(&quot;origin&quot;));
+    WKDictionarySetItem(messageBody.get(), originKeyWK.get(), origin);
</ins><span class="cx"> 
</span><ins>+    WKRetainPtr&lt;WKStringRef&gt; parentOriginKeyWK(AdoptWK, WKStringCreateWithUTF8CString(&quot;parentOrigin&quot;));
+    WKDictionarySetItem(messageBody.get(), parentOriginKeyWK.get(), parentOrigin);
+
</ins><span class="cx">     WKBundlePagePostMessage(page()-&gt;page(), messageName.get(), messageBody.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleInjectedBundleh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -96,7 +96,7 @@
</span><span class="cx"> 
</span><span class="cx">     // MediaStream.
</span><span class="cx">     void setUserMediaPermission(bool);
</span><del>-    void setUserMediaPermissionForOrigin(bool permission, WKStringRef url);
</del><ins>+    void setUserMediaPermissionForOrigin(bool permission, WKStringRef origin, WKStringRef parentOrigin);
</ins><span class="cx"> 
</span><span class="cx">     // Policy delegate.
</span><span class="cx">     void setCustomPolicyDelegate(bool enabled, bool permissive);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleTestRunnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -775,10 +775,11 @@
</span><span class="cx">     InjectedBundle::singleton().setUserMediaPermission(enabled);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TestRunner::setUserMediaPermissionForOrigin(bool permission, JSStringRef url)
</del><ins>+void TestRunner::setUserMediaPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin)
</ins><span class="cx"> {
</span><del>-    WKRetainPtr&lt;WKStringRef&gt; urlWK = toWK(url);
-    InjectedBundle::singleton().setUserMediaPermissionForOrigin(permission, urlWK.get());
</del><ins>+    WKRetainPtr&lt;WKStringRef&gt; originWK = toWK(origin);
+    WKRetainPtr&lt;WKStringRef&gt; parentOriginWK = toWK(parentOrigin);
+    InjectedBundle::singleton().setUserMediaPermissionForOrigin(permission, originWK.get(), parentOriginWK.get());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TestRunner::callShouldCloseOnWebView()
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleTestRunnerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -268,7 +268,7 @@
</span><span class="cx"> 
</span><span class="cx">     // MediaStream
</span><span class="cx">     void setUserMediaPermission(bool);
</span><del>-    void setUserMediaPermissionForOrigin(bool permission, JSStringRef url);
</del><ins>+    void setUserMediaPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin);
</ins><span class="cx"> 
</span><span class="cx">     void setPageVisibility(JSStringRef state);
</span><span class="cx">     void resetPageVisibility();
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;PlatformWebView.h&quot;
</span><span class="cx"> #include &quot;StringFunctions.h&quot;
</span><span class="cx"> #include &quot;TestInvocation.h&quot;
</span><ins>+#include &lt;WebCore/UUID.h&gt;
</ins><span class="cx"> #include &lt;WebKit/WKArray.h&gt;
</span><span class="cx"> #include &lt;WebKit/WKAuthenticationChallenge.h&gt;
</span><span class="cx"> #include &lt;WebKit/WKAuthenticationDecisionListener.h&gt;
</span><span class="lines">@@ -38,6 +39,8 @@
</span><span class="cx"> #include &lt;WebKit/WKContextPrivate.h&gt;
</span><span class="cx"> #include &lt;WebKit/WKCookieManager.h&gt;
</span><span class="cx"> #include &lt;WebKit/WKCredential.h&gt;
</span><ins>+#include &lt;WebKit/WKFrameHandleRef.h&gt;
+#include &lt;WebKit/WKFrameInfoRef.h&gt;
</ins><span class="cx"> #include &lt;WebKit/WKIconDatabase.h&gt;
</span><span class="cx"> #include &lt;WebKit/WKNavigationResponseRef.h&gt;
</span><span class="cx"> #include &lt;WebKit/WKNotification.h&gt;
</span><span class="lines">@@ -61,7 +64,10 @@
</span><span class="cx"> #include &lt;stdlib.h&gt;
</span><span class="cx"> #include &lt;string&gt;
</span><span class="cx"> #include &lt;unistd.h&gt;
</span><ins>+#include &lt;wtf/CryptographicallyRandomNumber.h&gt;
+#include &lt;wtf/HexNumber.h&gt;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><ins>+#include &lt;wtf/RefCounted.h&gt;
</ins><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> #include &lt;wtf/TemporaryChange.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="lines">@@ -203,14 +209,14 @@
</span><span class="cx">     TestController::singleton().handleGeolocationPermissionRequest(permissionRequest);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void decidePolicyForUserMediaPermissionRequest(WKPageRef, WKFrameRef, WKSecurityOriginRef origin, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo)
</del><ins>+static void decidePolicyForUserMediaPermissionRequest(WKPageRef, WKFrameRef frame, WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin, WKUserMediaPermissionRequestRef permissionRequest, const void* clientInfo)
</ins><span class="cx"> {
</span><del>-    TestController::singleton().handleUserMediaPermissionRequest(origin, permissionRequest);
</del><ins>+    TestController::singleton().handleUserMediaPermissionRequest(frame, userMediaDocumentOrigin, topLevelDocumentOrigin, permissionRequest);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void checkUserMediaPermissionForOrigin(WKPageRef, WKFrameRef, WKSecurityOriginRef origin, WKUserMediaPermissionCheckRef checkRequest, const void*)
</del><ins>+static void checkUserMediaPermissionForOrigin(WKPageRef, WKFrameRef frame, WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin, WKUserMediaPermissionCheckRef checkRequest, const void*)
</ins><span class="cx"> {
</span><del>-    TestController::singleton().handleCheckOfUserMediaPermissionForOrigin(origin, checkRequest);
</del><ins>+    TestController::singleton().handleCheckOfUserMediaPermissionForOrigin(frame, userMediaDocumentOrigin, topLevelDocumentOrigin, checkRequest);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WKPageRef TestController::createOtherPage(WKPageRef oldPage, WKPageConfigurationRef configuration, WKNavigationActionRef navigationAction, WKWindowFeaturesRef windowFeatures, const void *clientInfo)
</span><span class="lines">@@ -756,7 +762,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Reset UserMedia permissions.
</span><span class="cx">     m_userMediaPermissionRequests.clear();
</span><del>-    m_userMediaOriginPermissions = nullptr;
</del><ins>+    m_cahcedUserMediaPermissions.clear();
</ins><span class="cx">     m_isUserMediaPermissionSet = false;
</span><span class="cx">     m_isUserMediaPermissionAllowed = false;
</span><span class="cx"> 
</span><span class="lines">@@ -1676,21 +1682,45 @@
</span><span class="cx">     return m_geolocationProvider-&gt;isActive();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static WKStringRef originUserVisibleName(WKSecurityOriginRef origin)
</del><ins>+static String originUserVisibleName(WKSecurityOriginRef origin)
</ins><span class="cx"> {
</span><ins>+    if (!origin)
+        return emptyString();
+
</ins><span class="cx">     std::string host = toSTD(adoptWK(WKSecurityOriginCopyHost(origin))).c_str();
</span><span class="cx">     std::string protocol = toSTD(adoptWK(WKSecurityOriginCopyProtocol(origin))).c_str();
</span><ins>+
+    if (!host.length() || !protocol.length())
+        return emptyString();
+
</ins><span class="cx">     unsigned short port = WKSecurityOriginGetPort(origin);
</span><del>-
-    String userVisibleName;
</del><span class="cx">     if (port)
</span><del>-        userVisibleName = String::format(&quot;%s://%s:%d&quot;, protocol.c_str(), host.c_str(), port);
-    else
-        userVisibleName = String::format(&quot;%s://%s&quot;, protocol.c_str(), host.c_str());
</del><ins>+        return String::format(&quot;%s://%s:%d&quot;, protocol.c_str(), host.c_str(), port);
</ins><span class="cx"> 
</span><del>-    return WKStringCreateWithUTF8CString(userVisibleName.utf8().data());
</del><ins>+    return String::format(&quot;%s://%s&quot;, protocol.c_str(), host.c_str());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static String userMediaOriginHash(WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin)
+{
+    String userMediaDocumentOriginString = originUserVisibleName(userMediaDocumentOrigin);
+    String topLevelDocumentOriginString = originUserVisibleName(topLevelDocumentOrigin);
+
+    if (topLevelDocumentOriginString.isEmpty())
+        return userMediaDocumentOriginString;
+
+    return String::format(&quot;%s-%s&quot;, userMediaDocumentOriginString.utf8().data(), topLevelDocumentOriginString.utf8().data());
+}
+
+static String userMediaOriginHash(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString)
+{
+    auto userMediaDocumentOrigin = adoptWK(WKSecurityOriginCreateFromString(userMediaDocumentOriginString));
+    if (!WKStringGetLength(topLevelDocumentOriginString))
+        return userMediaOriginHash(userMediaDocumentOrigin.get(), nullptr);
+
+    auto topLevelDocumentOrigin = adoptWK(WKSecurityOriginCreateFromString(topLevelDocumentOriginString));
+    return userMediaOriginHash(userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get());
+}
+
</ins><span class="cx"> void TestController::setUserMediaPermission(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     m_isUserMediaPermissionSet = true;
</span><span class="lines">@@ -1698,32 +1728,82 @@
</span><span class="cx">     decidePolicyForUserMediaPermissionRequestIfPossible();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TestController::setUserMediaPermissionForOrigin(bool permission, WKStringRef originString)
</del><ins>+class OriginSettings : public RefCounted&lt;OriginSettings&gt; {
+public:
+    explicit OriginSettings()
+    {
+    }
+
+    bool persistentPermission() const { return m_persistentPermission; }
+    void setPersistentPermission(bool permission) { m_persistentPermission = permission; }
+
+    String persistentSalt() const { return m_persistentSalt; }
+    void setPersistentSalt(const String&amp; salt) { m_persistentSalt = salt; }
+
+    HashMap&lt;uint64_t, String&gt;&amp; ephemeralSalts() { return m_ephemeralSalts; }
+
+private:
+    HashMap&lt;uint64_t, String&gt; m_ephemeralSalts;
+    String m_persistentSalt;
+    bool m_persistentPermission { false };
+};
+
+String TestController::saltForOrigin(WKFrameRef frame, String originHash)
</ins><span class="cx"> {
</span><del>-    if (!m_userMediaOriginPermissions)
-        m_userMediaOriginPermissions = adoptWK(WKMutableDictionaryCreate());
-    WKRetainPtr&lt;WKBooleanRef&gt; allowed = adoptWK(WKBooleanCreate(permission));
-    WKRetainPtr&lt;WKSecurityOriginRef&gt; origin = adoptWK(WKSecurityOriginCreateFromString(originString));
-    WKDictionarySetItem(m_userMediaOriginPermissions.get(), originUserVisibleName(origin.get()), allowed.get());
</del><ins>+    RefPtr&lt;OriginSettings&gt; settings = m_cahcedUserMediaPermissions.get(originHash);
+    if (!settings) {
+        settings = adoptRef(*new OriginSettings());
+        m_cahcedUserMediaPermissions.add(originHash, settings);
+    }
+
+    auto&amp; ephemeralSalts = settings-&gt;ephemeralSalts();
+    auto frameInfo = adoptWK(WKFrameCreateFrameInfo(frame));
+    auto frameHandle = WKFrameInfoGetFrameHandleRef(frameInfo.get());
+    uint64_t frameIdentifier = WKFrameHandleGetFrameID(frameHandle);
+    String frameSalt = ephemeralSalts.get(frameIdentifier);
+
+    if (settings-&gt;persistentPermission()) {
+        if (frameSalt.length())
+            return frameSalt;
+
+        if (!settings-&gt;persistentSalt().length())
+            settings-&gt;setPersistentSalt(WebCore::createCanonicalUUIDString());
+
+        return settings-&gt;persistentSalt();
+    }
+
+    if (!frameSalt.length()) {
+        frameSalt = WebCore::createCanonicalUUIDString();
+        ephemeralSalts.add(frameIdentifier, frameSalt);
+    }
+
+    return frameSalt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TestController::handleCheckOfUserMediaPermissionForOrigin(WKSecurityOriginRef origin, const WKUserMediaPermissionCheckRef&amp; checkRequest)
</del><ins>+void TestController::setUserMediaPermissionForOrigin(bool permission, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString)
</ins><span class="cx"> {
</span><del>-    bool allowed = false;
-
-    if (m_userMediaOriginPermissions) {
-        WKRetainPtr&lt;WKStringRef&gt; originString = originUserVisibleName(origin);
-        WKBooleanRef value = static_cast&lt;WKBooleanRef&gt;(WKDictionaryGetItemForKey(m_userMediaOriginPermissions.get(), originString.get()));
-        if (value &amp;&amp; WKGetTypeID(value) == WKBooleanGetTypeID())
-            allowed = WKBooleanGetValue(value);
</del><ins>+    auto originHash = userMediaOriginHash(userMediaDocumentOriginString, topLevelDocumentOriginString);
+    RefPtr&lt;OriginSettings&gt; settings = m_cahcedUserMediaPermissions.get(originHash);
+    if (!settings) {
+        settings = adoptRef(*new OriginSettings());
+        m_cahcedUserMediaPermissions.add(originHash, settings);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    WKUserMediaPermissionCheckSetHasPersistentPermission(checkRequest, allowed);
</del><ins>+    settings-&gt;setPersistentPermission(permission);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TestController::handleUserMediaPermissionRequest(WKSecurityOriginRef origin, WKUserMediaPermissionRequestRef request)
</del><ins>+void TestController::handleCheckOfUserMediaPermissionForOrigin(WKFrameRef frame, WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin, const WKUserMediaPermissionCheckRef&amp; checkRequest)
</ins><span class="cx"> {
</span><del>-    m_userMediaPermissionRequests.append(std::make_pair(origin, request));
</del><ins>+    auto originHash = userMediaOriginHash(userMediaDocumentOrigin, topLevelDocumentOrigin);
+    auto salt = saltForOrigin(frame, originHash);
+
+    WKUserMediaPermissionCheckSetUserMediaAccessInfo(checkRequest, WKStringCreateWithUTF8CString(salt.utf8().data()), m_cahcedUserMediaPermissions.get(originHash)-&gt;persistentPermission());
+}
+
+void TestController::handleUserMediaPermissionRequest(WKFrameRef frame, WKSecurityOriginRef userMediaDocumentOrigin, WKSecurityOriginRef topLevelDocumentOrigin, WKUserMediaPermissionRequestRef request)
+{
+    auto originHash = userMediaOriginHash(userMediaDocumentOrigin, topLevelDocumentOrigin);
+    m_userMediaPermissionRequests.append(std::make_pair(originHash, request));
</ins><span class="cx">     decidePolicyForUserMediaPermissionRequestIfPossible();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1733,11 +1813,18 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; pair : m_userMediaPermissionRequests) {
</span><ins>+        auto originHash = pair.first;
</ins><span class="cx">         auto request = pair.second.get();
</span><ins>+
+        bool persistentPermission = false;
+        RefPtr&lt;OriginSettings&gt; settings = m_cahcedUserMediaPermissions.get(originHash);
+        if (settings)
+            persistentPermission = settings-&gt;persistentPermission();
+
</ins><span class="cx">         WKRetainPtr&lt;WKArrayRef&gt; audioDeviceUIDs = WKUserMediaPermissionRequestAudioDeviceUIDs(request);
</span><span class="cx">         WKRetainPtr&lt;WKArrayRef&gt; videoDeviceUIDs = WKUserMediaPermissionRequestVideoDeviceUIDs(request);
</span><span class="cx"> 
</span><del>-        if (m_isUserMediaPermissionAllowed &amp;&amp; (WKArrayGetSize(videoDeviceUIDs.get()) || WKArrayGetSize(audioDeviceUIDs.get()))) {
</del><ins>+        if ((m_isUserMediaPermissionAllowed || persistentPermission) &amp;&amp; (WKArrayGetSize(videoDeviceUIDs.get()) || WKArrayGetSize(audioDeviceUIDs.get()))) {
</ins><span class="cx">             WKRetainPtr&lt;WKStringRef&gt; videoDeviceUID;
</span><span class="cx">             if (WKArrayGetSize(videoDeviceUIDs.get()))
</span><span class="cx">                 videoDeviceUID = reinterpret_cast&lt;WKStringRef&gt;(WKArrayGetItemAtIndex(videoDeviceUIDs.get(), 0));
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.h (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.h        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/TestController.h        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -34,12 +34,14 @@
</span><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><ins>+#include &lt;wtf/text/StringHash.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> OBJC_CLASS WKWebViewConfiguration;
</span><span class="cx"> 
</span><span class="cx"> namespace WTR {
</span><span class="cx"> 
</span><span class="cx"> class TestInvocation;
</span><ins>+class OriginSettings;
</ins><span class="cx"> class PlatformWebView;
</span><span class="cx"> class EventSenderProxy;
</span><span class="cx"> struct TestOptions;
</span><span class="lines">@@ -95,10 +97,13 @@
</span><span class="cx">     bool isGeolocationProviderActive() const;
</span><span class="cx"> 
</span><span class="cx">     // MediaStream.
</span><ins>+    String saltForOrigin(WKFrameRef, String);
+    void getUserMediaInfoForOrigin(WKFrameRef, WKStringRef originKey, bool&amp;, WKRetainPtr&lt;WKStringRef&gt;&amp;);
+    WKStringRef getUserMediaSaltForOrigin(WKFrameRef, WKStringRef originKey);
</ins><span class="cx">     void setUserMediaPermission(bool);
</span><del>-    void setUserMediaPermissionForOrigin(bool permission, WKStringRef url);
-    void handleUserMediaPermissionRequest(WKSecurityOriginRef, WKUserMediaPermissionRequestRef);
-    void handleCheckOfUserMediaPermissionForOrigin(WKSecurityOriginRef, const WKUserMediaPermissionCheckRef&amp;);
</del><ins>+    void setUserMediaPermissionForOrigin(bool, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString);
+    void handleUserMediaPermissionRequest(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, WKUserMediaPermissionRequestRef);
+    void handleCheckOfUserMediaPermissionForOrigin(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, const WKUserMediaPermissionCheckRef&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // Policy delegate.
</span><span class="cx">     void setCustomPolicyDelegate(bool enabled, bool permissive);
</span><span class="lines">@@ -288,9 +293,9 @@
</span><span class="cx">     bool m_isGeolocationPermissionSet;
</span><span class="cx">     bool m_isGeolocationPermissionAllowed;
</span><span class="cx"> 
</span><del>-    WKRetainPtr&lt;WKMutableDictionaryRef&gt; m_userMediaOriginPermissions;
</del><ins>+    HashMap&lt;String, RefPtr&lt;OriginSettings&gt;&gt; m_cahcedUserMediaPermissions;
</ins><span class="cx"> 
</span><del>-    typedef Vector&lt;std::pair&lt;WKRetainPtr&lt;WKSecurityOriginRef&gt;, WKRetainPtr&lt;WKUserMediaPermissionRequestRef&gt;&gt;&gt; PermissionRequestList;
</del><ins>+    typedef Vector&lt;std::pair&lt;String, WKRetainPtr&lt;WKUserMediaPermissionRequestRef&gt;&gt;&gt; PermissionRequestList;
</ins><span class="cx">     PermissionRequestList m_userMediaPermissionRequests;
</span><span class="cx"> 
</span><span class="cx">     bool m_isUserMediaPermissionSet;
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestInvocationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestInvocation.cpp (197113 => 197114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestInvocation.cpp        2016-02-25 15:05:22 UTC (rev 197113)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.cpp        2016-02-25 15:18:21 UTC (rev 197114)
</span><span class="lines">@@ -477,10 +477,13 @@
</span><span class="cx">         WKBooleanRef permissionWK = static_cast&lt;WKBooleanRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, permissionKeyWK.get()));
</span><span class="cx">         bool permission = WKBooleanGetValue(permissionWK);
</span><span class="cx"> 
</span><del>-        WKRetainPtr&lt;WKStringRef&gt; urlKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;url&quot;));
-        WKStringRef urlWK = static_cast&lt;WKStringRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, urlKey.get()));
</del><ins>+        WKRetainPtr&lt;WKStringRef&gt; originKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;origin&quot;));
+        WKStringRef originWK = static_cast&lt;WKStringRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, originKey.get()));
</ins><span class="cx"> 
</span><del>-        TestController::singleton().setUserMediaPermissionForOrigin(permission, urlWK);
</del><ins>+        WKRetainPtr&lt;WKStringRef&gt; parentOriginKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;parentOrigin&quot;));
+        WKStringRef parentOriginWK = static_cast&lt;WKStringRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, parentOriginKey.get()));
+
+        TestController::singleton().setUserMediaPermissionForOrigin(permission, originWK, parentOriginWK);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>