<!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
<rdar://problem/24334526>
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 -> 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 <eric.carlson@apple.com>
+
+ [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+ https://bugs.webkit.org/show_bug.cgi?id=153163
+ <rdar://problem/24334526>
+
+ 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 <pecoraro@apple.com>
</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 ""
</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 ""
</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 ""
</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 ""
</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("Tests MediaDevices.enumerateDevices()");
</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("captureDevice.label");
</span><span class="cx"> shouldBeNonNull("captureDevice.groupId");
</span><ins>+
+ if (deviceIds.length < 2)
+ deviceIds.push(captureDevice.deviceId);
+ else
+ shouldNotBe("deviceIds.indexOf(captureDevice.deviceId)", "-1");
+
</ins><span class="cx"> debug("");
</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, "");
</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, "");
</ins><span class="cx">
</span><del>- debug(`<br>*** Calling mediaDevices.enumerateDevices without persistent access, and without a media stream track<br>`);
</del><ins>+ debug(`<br>*** Calling mediaDevices.enumerateDevices with persistent access, and without a media stream track<br>`);
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+
+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 "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+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>+<!DOCTYPE html>
+<html>
+ <head>
+ <style>
+ iframe { border: 1px solid black; }
+ </style>
+ <script src="../../../../resources/js-test-pre.js"></script>
+ <script>
+ var frameInfos = [];
+ window.jsTestIsAsync = true;
+
+ if (window.testRunner) {
+ testRunner.setUserMediaPermission(true);
+ testRunner.setUserMediaPermissionForOrigin(true, "http://localhost:8000", location.href);
+ }
+
+ function setup()
+ {
+ description("Tests that mediaDevices.enumerateDevices returns a persistent deviceId when appropriate."
+ + "<br>http://localhost:8000 has persistent permission, so IDs must persist across frames.");
+ }
+
+ 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 < frameInfos.length; i++) {
+ var deviceId = frameInfos[i].deviceId;
+ if (frameInfos[i].origin.indexOf("http://localhost:8000") == 0) {
+ if (idCounts[deviceId] < 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("message", handler, false);
+
+ </script>
+ </head>
+ <body onload="setup()">
+ <iframe src="http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html"></iframe>
+ <br>
+ <iframe src="http://127.0.0.1:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html"></iframe>
+ <br>
+ <iframe src="http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html"></iframe>
+ <div id="console"></div>
+ <script src="../../../../resources/js-test-post.js"></script>
+ </body>
+</html>
</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>+<!DOCTYPE html>
+<html>
+ <head>
+ <style>
+ iframe { border: 1px solid black; }
+ </style>
+ <script src="../../../../resources/js-test-pre.js"></script>
+ <script>
+ var frameInfos = [];
+ window.jsTestIsAsync = true;
+
+ if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+
+ function setup()
+ {
+ description("Tests that mediaDevices.enumerateDevices returns a unique ID for deviceId in each domain.");
+ }
+
+ 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 < 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("message", handler, false);
+
+ </script>
+ </head>
+ <body onload="setup()">
+ <iframe src="http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html"></iframe>
+ <br>
+ <iframe src="http://127.0.0.1:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html"></iframe>
+ <br>
+ <iframe src="http://localhost:8000/media/media-stream/resources/enumerate-devices-source-id-frame.html"></iframe>
+ <div id="console"></div>
+ <script src="../../../../resources/js-test-post.js"></script>
+ </body>
+</html>
</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>+<!DOCTYPE html>
+<html>
+ <head>
+ <style>
+ iframe { border: 1px solid black; }
+ </style>
+ <script>
+ function log(msg)
+ {
+ document.getElementById("console").innerHTML += msg + "<br>";
+ }
+
+ function test(event)
+ {
+ navigator.mediaDevices.enumerateDevices()
+ .then(function(devices) {
+ var result = {
+ origin: document.origin,
+ deviceIds: [devices[0].deviceId, devices[1].deviceId]
+ };
+
+ parent.postMessage(result, "*");
+ })
+ .catch(function(err) {
+ log(`enumerateDevices failed: ${err.name} - ${err.message}`);
+ });
+
+ var parentPage = document.referrer.split('/').pop();
+ if (parentPage != "enumerate-devices-source-id.html")
+ 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, "*");
+ }
+
+ addEventListener("message", handler, false);
+
+ </script>
+ </head>
+ <body onload="test()">
+ <pre id="console"></pre>
+ </body>
+</html>
</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 <eric.carlson@apple.com>
+
+ [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+ https://bugs.webkit.org/show_bug.cgi?id=153163
+ <rdar://problem/24334526>
+
+ 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 <cgarcia@igalia.com>
</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 "JSMediaDeviceInfo.h"
</span><span class="cx"> #include "RealtimeMediaSourceCenter.h"
</span><span class="cx"> #include "SecurityOrigin.h"
</span><ins>+#include "UserMediaController.h"
</ins><span class="cx"> #include <wtf/MainThread.h>
</span><ins>+#include <wtf/SHA1.h>
</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<Document>(scriptExecutionContext())) {
- m_canShowLabels = document->hasHadActiveMediaStreamTrack();
- if (m_canShowLabels) {
- getTrackSources();
- return;
- }
- }
-
</del><span class="cx"> m_permissionCheck = UserMediaPermissionCheck::create(*downcast<Document>(scriptExecutionContext()), *this);
</span><span class="cx"> m_permissionCheck->start();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MediaDevicesRequest::didCompleteCheck(bool canAccess)
</del><ins>+void MediaDevicesRequest::didCompletePermissionCheck(const String& salt, bool canAccess)
</ins><span class="cx"> {
</span><span class="cx"> m_permissionCheck->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& capturedDevices)
</del><ins>+static void hashString(SHA1& sha1, const String& string)
</ins><span class="cx"> {
</span><del>- if (!m_scriptExecutionContext) {
</del><ins>+ if (string.isEmpty())
+ return;
+
+ if (string.is8Bit() && string.containsOnlyASCII()) {
+ const uint8_t nullByte = 0;
+ sha1.addBytes(string.characters8(), string.length());
+ sha1.addBytes(&nullByte, 1);
+ return;
+ }
+
+ auto utf8 = string.utf8();
+ sha1.addBytes(reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length() + 1); // Include terminating null byte.
+}
+
+String MediaDevicesRequest::hashID(const String& 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& 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<RefPtr<MediaDeviceInfo>> deviceInfo;
- for (auto device : capturedDevices) {
- TrackSourceInfo* trackInfo = device.get();
- String deviceType = trackInfo->kind() == TrackSourceInfo::SourceKind::Audio ? MediaDeviceInfo::audioInputType() : MediaDeviceInfo::videoInputType();
</del><ins>+ Document& document = downcast<Document>(*scriptExecutionContext());
+ UserMediaController* controller = UserMediaController::from(document.page());
+ if (!controller) {
+ m_protector = nullptr;
+ return;
+ }
</ins><span class="cx">
</span><del>- AtomicString label = m_canShowLabels ? trackInfo->label() : emptyAtom;
- deviceInfo.append(MediaDeviceInfo::create(m_scriptExecutionContext, label, trackInfo->id(), trackInfo->groupId(), deviceType));
</del><ins>+ Vector<RefPtr<MediaDeviceInfo>> devices;
+ for (auto deviceInfo : captureDevices) {
+ String deviceType = deviceInfo->kind() == TrackSourceInfo::SourceKind::Audio ? MediaDeviceInfo::audioInputType() : MediaDeviceInfo::videoInputType();
+ AtomicString label = emptyAtom;
+ if (m_havePersistentPermission || document.hasHadActiveMediaStreamTrack())
+ label = deviceInfo->label();
+
+ String id = hashID(deviceInfo->persistentId());
+ if (id.isEmpty())
+ continue;
+
+ String groupId = hashID(deviceInfo->groupId());
+
+ devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<MediaDevicesRequest> protectedThis(this);
</span><del>- callOnMainThread([protectedThis, deviceInfo] {
- protectedThis->m_promise.resolve(deviceInfo);
</del><ins>+ callOnMainThread([protectedThis, devices] {
+ protectedThis->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&&);
</span><span class="cx">
</span><del>- void getTrackSources();
-
</del><span class="cx"> // MediaStreamTrackSourcesRequestClient
</span><span class="cx"> const String& requestOrigin() const final;
</span><del>- void didCompleteRequest(const TrackSourceInfoVector&) final;
</del><ins>+ void didCompleteTrackSourceInfoRequest(const TrackSourceInfoVector&) 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&, bool) override final;
</ins><span class="cx">
</span><ins>+ String hashID(const String&);
+
</ins><span class="cx"> MediaDevices::EnumerateDevicesPromise m_promise;
</span><span class="cx"> RefPtr<MediaDevicesRequest> m_protector;
</span><span class="cx"> RefPtr<UserMediaPermissionCheck> 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 "ExceptionCode.h"
</span><span class="cx"> #include "Frame.h"
</span><span class="cx"> #include "JSMediaDeviceInfo.h"
</span><ins>+#include "MainFrame.h"
</ins><span class="cx"> #include "RealtimeMediaSourceCenter.h"
</span><span class="cx"> #include "SecurityOrigin.h"
</span><span class="cx"> #include "UserMediaController.h"
</span><del>-#include <wtf/MainThread.h>
</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()->securityOrigin();
</del><ins>+ if (m_scriptExecutionContext)
+ return m_scriptExecutionContext->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<Document>(*scriptExecutionContext()).frame()) {
+ if (frame->isMainFrame())
+ return nullptr;
+ }
+
+ return m_scriptExecutionContext->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->checkUserMediaPermission(*this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void UserMediaPermissionCheck::setHasPersistentPermission(bool mode)
</del><ins>+void UserMediaPermissionCheck::setUserMediaAccessInfo(const String& 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->didCompleteCheck(m_hasPersistentPermission);
</del><ins>+ m_client->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&, bool) = 0;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> class UserMediaPermissionCheck final : public ContextDestructionObserver, public RefCounted<UserMediaPermissionCheck> {
</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&, 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&, UserMediaPermissionCheckClient&);
</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 "JSMediaDeviceInfo.h"
</span><span class="cx"> #include "JSMediaStream.h"
</span><span class="cx"> #include "JSNavigatorUserMediaError.h"
</span><ins>+#include "MainFrame.h"
</ins><span class="cx"> #include "MediaConstraintsImpl.h"
</span><span class="cx"> #include "MediaStream.h"
</span><span class="cx"> #include "MediaStreamPrivate.h"
</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->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<Document>(*scriptExecutionContext()).frame()) {
+ if (frame->isMainFrame())
+ return nullptr;
+ }
+
+ return m_scriptExecutionContext->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& audioDeviceUID, const String& 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<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
</span><span class="cx"> const Vector<String>& 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->mediaDeviceIdentifierStorageDirectory();
- if (storageDirectory.isEmpty())
- return emptyString();
-
- SecurityOrigin* origin = document().securityOrigin();
- if (!origin)
- return emptyString();
-
- return pathByAppendingComponent(storageDirectory, origin->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& requestOrigin() const = 0;
</span><del>- virtual void didCompleteRequest(const TrackSourceInfoVector&) = 0;
</del><ins>+ virtual void didCompleteTrackSourceInfoRequest(const TrackSourceInfoVector&) = 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->requestOrigin());
</span><span class="cx">
</span><span class="cx"> callOnMainThread([this, requestClient, sources] {
</span><del>- requestClient->didCompleteRequest(sources);
</del><ins>+ requestClient->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->didCompleteRequest(sources);
</del><ins>+ requestClient->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 <eric.carlson@apple.com>
+
+ [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+ https://bugs.webkit.org/show_bug.cgi?id=153163
+ <rdar://problem/24334526>
+
+ Reviewed by Tim Horton.
+
+ * WebCoreSupport/WebUserMediaClient.mm:
+ (WebUserMediaClient::requestUserMediaAccess):
+ (WebUserMediaClient::checkUserMediaPermission):
+ (-[WebUserMediaPolicyCheckerListener allow]):
+ (-[WebUserMediaPolicyCheckerListener deny]):
+
</ins><span class="cx"> 2016-02-24 Nikos Andronikos <nikos.andronikos-webkit@cisra.canon.com.au>
</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:&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(&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:&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(&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->setHasPersistentPermission(true);
</del><ins>+ _request->setUserMediaAccessInfo(_request->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->setHasPersistentPermission(true);
</del><ins>+ _request->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 <eric.carlson@apple.com>
+
+ [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+ https://bugs.webkit.org/show_bug.cgi?id=153163
+ <rdar://problem/24334526>
+
+ 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 <cgarcia@igalia.com>
</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&, WebKit::WebFrameProxy&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; }
- virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; }
</del><ins>+ virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; }
+ virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { 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 <WebCore/Settings.h>
</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 "config.h"
+#include "WKFrameHandleRef.h"
+
+#include "APIFrameHandle.h"
+#include "WKAPICast.h"
+
+using namespace WebKit;
+
+WKTypeID WKFrameHandleGetTypeID()
+{
+ return toAPI(API::FrameHandle::APIType);
+}
+
+uint64_t WKFrameHandleGetFrameID(WKFrameHandleRef frameHandleRef)
+{
+ return toImpl(frameHandleRef)->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 <WebKit/WKBase.h>
+
+#ifdef __cplusplus
+extern "C" {
+#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 "config.h"
</span><span class="cx"> #include "WKFrameInfoRef.h"
</span><span class="cx">
</span><ins>+#include "APIFrameHandle.h"
</ins><span class="cx"> #include "APIFrameInfo.h"
</span><span class="cx"> #include "WKAPICast.h"
</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(&toImpl(frameInfoRef)->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& page, WebFrameProxy& frame, API::SecurityOrigin& origin, UserMediaPermissionRequestProxy& permissionRequest) override
</del><ins>+ virtual bool decidePolicyForUserMediaPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& 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(&page), toAPI(&frame), toAPI(&origin), toAPI(&permissionRequest), m_client.base.clientInfo);
</del><ins>+ m_client.decidePolicyForUserMediaPermissionRequest(toAPI(&page), toAPI(&frame), toAPI(&userMediaDocumentOrigin), toAPI(&topLevelDocumentOrigin), toAPI(&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& page, WebFrameProxy& frame, API::SecurityOrigin& origin, UserMediaPermissionCheckProxy& request) override
</del><ins>+ virtual bool checkUserMediaPermissionForOrigin(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionCheckProxy& 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(&page), toAPI(&frame), toAPI(&origin), toAPI(&request), m_client.base.clientInfo);
</del><ins>+ m_client.checkUserMediaPermissionForOrigin(toAPI(&page), toAPI(&frame), toAPI(&userMediaDocumentOrigin), toAPI(&topLevelDocumentOrigin), toAPI(&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)->setHasPersistentPermission(allowed);
</del><ins>+ toImpl(userMediaPermissionRequestRef)->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&, WebFrameProxy&, API::SecurityOrigin& securityOrigin, UserMediaPermissionRequestProxy& permissionRequest) override
</del><ins>+ virtual bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& topLevelDocumentOrigin, UserMediaPermissionRequestProxy& permissionRequest) override
</ins><span class="cx"> {
</span><del>- GRefPtr<WebKitUserMediaPermissionRequest> userMediaPermissionRequest = adoptGRef(webkitUserMediaPermissionRequestCreate(permissionRequest, securityOrigin));
</del><ins>+ GRefPtr<WebKitUserMediaPermissionRequest> 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& request, API::SecurityOrigin& securityOrigin)
</del><ins>+WebKitUserMediaPermissionRequest* webkitUserMediaPermissionRequestCreate(UserMediaPermissionRequestProxy& request, API::SecurityOrigin& userMediaDocumentOrigin, API::SecurityOrigin& 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->priv->request = &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&, API::SecurityOrigin&);
</del><ins>+WebKitUserMediaPermissionRequest* webkitUserMediaPermissionRequestCreate(WebKit::UserMediaPermissionRequestProxy&, API::SecurityOrigin&, API::SecurityOrigin&);
</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& 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->didCompleteUserMediaPermissionCheck(m_userMediaID, allowed);
</del><ins>+ m_manager->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 "APIObject.h"
</span><del>-#include <WebCore/RealtimeMediaSource.h>
</del><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</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&, bool allowed);
</ins><span class="cx"> void invalidate();
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- UserMediaPermissionCheckProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID);
</del><ins>+ UserMediaPermissionCheckProxy(UserMediaPermissionRequestManagerProxy&, 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& 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<UserMediaPermissionCheckProxy> createUserMediaPermissionCheck(uint64_t userMediaID);
</span><del>- void didCompleteUserMediaPermissionCheck(uint64_t, bool allow);
</del><ins>+ void didCompleteUserMediaPermissionCheck(uint64_t, const String&, bool allow);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> HashMap<uint64_t, RefPtr<UserMediaPermissionRequestProxy>> 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<String>& videoDeviceUIDs() const { return m_videoDeviceUIDs; }
</span><span class="cx"> const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
</span><del>-
- const String& firstVideoDeviceUID() const { return !videoDeviceUIDs().isEmpty() ? videoDeviceUIDs().at(0) : emptyString(); }
- const String& firstAudioDeviceUID() const { return !audioDeviceUIDs().isEmpty() ? audioDeviceUIDs().at(0) : emptyString(); }
</del><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, const Vector<String>& videoDeviceUIDs, const Vector<String>& 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->deny();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPageProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs)
</del><ins>+void WebPageProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs)
</ins><span class="cx"> {
</span><ins>+#if ENABLE(MEDIA_STREAM)
</ins><span class="cx"> WebFrameProxy* frame = m_process->webFrame(frameID);
</span><span class="cx"> MESSAGE_CHECK(frame);
</span><span class="cx">
</span><del>- RefPtr<API::SecurityOrigin> origin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
</del><ins>+ RefPtr<API::SecurityOrigin> userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier));
+ RefPtr<API::SecurityOrigin> topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier));
</ins><span class="cx"> RefPtr<UserMediaPermissionRequestProxy> request = m_userMediaPermissionRequestManager.createRequest(userMediaID, audioDeviceUIDs, videoDeviceUIDs);
</span><span class="cx">
</span><del>- if (!m_uiClient->decidePolicyForUserMediaPermissionRequest(*this, *frame, *origin.get(), *request.get()))
</del><ins>+ if (!m_uiClient->decidePolicyForUserMediaPermissionRequest(*this, *frame, *userMediaOrigin.get(), *topLevelOrigin.get(), *request.get()))
</ins><span class="cx"> request->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->webFrame(frameID);
</span><span class="cx"> MESSAGE_CHECK(frame);
</span><span class="cx">
</span><del>- RefPtr<API::SecurityOrigin> origin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
</del><span class="cx"> RefPtr<UserMediaPermissionCheckProxy> request = m_userMediaPermissionRequestManager.createUserMediaPermissionCheck(userMediaID);
</span><del>-
- if (!m_uiClient->checkUserMediaPermissionForOrigin(*this, *frame, *origin.get(), *request.get()))
- request->setHasPersistentPermission(false);
</del><ins>+ RefPtr<API::SecurityOrigin> userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier));
+ RefPtr<API::SecurityOrigin> topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier));
+ if (!m_uiClient->checkUserMediaPermissionForOrigin(*this, *frame, *userMediaOrigin.get(), *topLevelOrigin.get(), *request.get()))
+ request->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& 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& originIdentifier, uint64_t currentQuota, uint64_t totalBytesNeeded, PassRefPtr<Messages::WebPageProxy::ReachedApplicationCacheOriginQuota::DelayedReply>);
</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<String>& audioDeviceUIDs, const Vector<String>& 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<String>& audioDeviceUIDs, const Vector<String>& 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&);
</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<String> audioDeviceUIDs, Vector<String> videoDeviceUIDs)
- CheckUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String originIdentifier)
</del><ins>+ RequestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, Vector<String> audioDeviceUIDs, Vector<String> 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 = "<group>"; };
</span><span class="cx">                 076E884D1A13CADF005E90FC /* APIContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIContextMenuClient.h; sourceTree = "<group>"; };
</span><span class="cx">                 076E884F1A13CBC6005E90FC /* APIInjectedBundlePageContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIInjectedBundlePageContextMenuClient.h; sourceTree = "<group>"; };
</span><ins>+                07A5EBB91C7BA43E00B9CA69 /* WKFrameHandleRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKFrameHandleRef.cpp; sourceTree = "<group>"; };
+                07A5EBBA1C7BA43E00B9CA69 /* WKFrameHandleRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKFrameHandleRef.h; sourceTree = "<group>"; };
</ins><span class="cx">                 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
</span><span class="cx">                 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
</span><span class="cx">                 0F0C365718C051BA00F607D7 /* RemoteLayerTreeHostIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RemoteLayerTreeHostIOS.mm; path = ios/RemoteLayerTreeHostIOS.mm; sourceTree = "<group>"; };
</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->frameID(), origin->databaseIdentifier(), request.audioDeviceUIDs(), request.videoDeviceUIDs()));
</del><ins>+ SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin();
+ String topLevelDocumentOriginString = topLevelDocumentOrigin ? topLevelDocumentOrigin->databaseIdentifier() : emptyString();
+ m_page.send(Messages::WebPageProxy::RequestUserMediaPermissionForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->databaseIdentifier(), topLevelDocumentOriginString, request.audioDeviceUIDs(), request.videoDeviceUIDs()));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void UserMediaPermissionRequestManager::cancelUserMediaRequest(UserMediaRequest& request)
</span><span class="lines">@@ -93,7 +94,7 @@
</span><span class="cx"> Frame* frame = document ? document->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->frameID(), origin->databaseIdentifier()));
</del><ins>+ SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin();
+ String topLevelDocumentOriginString = topLevelDocumentOrigin ? topLevelDocumentOrigin->databaseIdentifier() : emptyString();
+ m_page.send(Messages::WebPageProxy::CheckUserMediaPermissionForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->databaseIdentifier(), topLevelDocumentOriginString));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void UserMediaPermissionRequestManager::cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& 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& mediaDeviceIdentifierHashSalt, bool allowed)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<UserMediaPermissionCheck> 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->setHasPersistentPermission(allowed);
</del><ins>+ request->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&);
</span><span class="cx"> void cancelUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&);
</span><del>- void didCompleteUserMediaPermissionCheck(uint64_t requestID, bool allowed);
</del><ins>+ void didCompleteUserMediaPermissionCheck(uint64_t requestID, const String&, bool allowed);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> WebPage& 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& 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& audioDeviceUID, const String& videoDeviceUID);
</span><del>- void didCompleteUserMediaPermissionCheck(uint64_t userMediaID, bool allowed);
</del><ins>+ void didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String&, 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 <eric.carlson@apple.com>
+
+ [MediaStream] MediaDeviceInfo deviceId and groupId must be unique to the page's origin
+ https://bugs.webkit.org/show_bug.cgi?id=153163
+ <rdar://problem/24334526>
+
+ 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 -> 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 <nikos.andronikos-webkit@cisra.canon.com.au>
</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()->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("SetUserMediaPermissionForOrigin"));
</span><span class="cx"> WKRetainPtr<WKMutableDictionaryRef> messageBody(AdoptWK, WKMutableDictionaryCreate());
</span><span class="lines">@@ -535,9 +535,12 @@
</span><span class="cx"> WKRetainPtr<WKBooleanRef> permissionWK(AdoptWK, WKBooleanCreate(permission));
</span><span class="cx"> WKDictionarySetItem(messageBody.get(), permissionKeyWK.get(), permissionWK.get());
</span><span class="cx">
</span><del>- WKRetainPtr<WKStringRef> urlKeyWK(AdoptWK, WKStringCreateWithUTF8CString("url"));
- WKDictionarySetItem(messageBody.get(), urlKeyWK.get(), url);
</del><ins>+ WKRetainPtr<WKStringRef> originKeyWK(AdoptWK, WKStringCreateWithUTF8CString("origin"));
+ WKDictionarySetItem(messageBody.get(), originKeyWK.get(), origin);
</ins><span class="cx">
</span><ins>+ WKRetainPtr<WKStringRef> parentOriginKeyWK(AdoptWK, WKStringCreateWithUTF8CString("parentOrigin"));
+ WKDictionarySetItem(messageBody.get(), parentOriginKeyWK.get(), parentOrigin);
+
</ins><span class="cx"> WKBundlePagePostMessage(page()->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<WKStringRef> urlWK = toWK(url);
- InjectedBundle::singleton().setUserMediaPermissionForOrigin(permission, urlWK.get());
</del><ins>+ WKRetainPtr<WKStringRef> originWK = toWK(origin);
+ WKRetainPtr<WKStringRef> 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 "PlatformWebView.h"
</span><span class="cx"> #include "StringFunctions.h"
</span><span class="cx"> #include "TestInvocation.h"
</span><ins>+#include <WebCore/UUID.h>
</ins><span class="cx"> #include <WebKit/WKArray.h>
</span><span class="cx"> #include <WebKit/WKAuthenticationChallenge.h>
</span><span class="cx"> #include <WebKit/WKAuthenticationDecisionListener.h>
</span><span class="lines">@@ -38,6 +39,8 @@
</span><span class="cx"> #include <WebKit/WKContextPrivate.h>
</span><span class="cx"> #include <WebKit/WKCookieManager.h>
</span><span class="cx"> #include <WebKit/WKCredential.h>
</span><ins>+#include <WebKit/WKFrameHandleRef.h>
+#include <WebKit/WKFrameInfoRef.h>
</ins><span class="cx"> #include <WebKit/WKIconDatabase.h>
</span><span class="cx"> #include <WebKit/WKNavigationResponseRef.h>
</span><span class="cx"> #include <WebKit/WKNotification.h>
</span><span class="lines">@@ -61,7 +64,10 @@
</span><span class="cx"> #include <stdlib.h>
</span><span class="cx"> #include <string>
</span><span class="cx"> #include <unistd.h>
</span><ins>+#include <wtf/CryptographicallyRandomNumber.h>
+#include <wtf/HexNumber.h>
</ins><span class="cx"> #include <wtf/MainThread.h>
</span><ins>+#include <wtf/RefCounted.h>
</ins><span class="cx"> #include <wtf/RunLoop.h>
</span><span class="cx"> #include <wtf/TemporaryChange.h>
</span><span class="cx"> #include <wtf/text/CString.h>
</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->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("%s://%s:%d", protocol.c_str(), host.c_str(), port);
- else
- userVisibleName = String::format("%s://%s", protocol.c_str(), host.c_str());
</del><ins>+ return String::format("%s://%s:%d", protocol.c_str(), host.c_str(), port);
</ins><span class="cx">
</span><del>- return WKStringCreateWithUTF8CString(userVisibleName.utf8().data());
</del><ins>+ return String::format("%s://%s", 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("%s-%s", 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<OriginSettings> {
+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& salt) { m_persistentSalt = salt; }
+
+ HashMap<uint64_t, String>& ephemeralSalts() { return m_ephemeralSalts; }
+
+private:
+ HashMap<uint64_t, String> 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<WKBooleanRef> allowed = adoptWK(WKBooleanCreate(permission));
- WKRetainPtr<WKSecurityOriginRef> origin = adoptWK(WKSecurityOriginCreateFromString(originString));
- WKDictionarySetItem(m_userMediaOriginPermissions.get(), originUserVisibleName(origin.get()), allowed.get());
</del><ins>+ RefPtr<OriginSettings> settings = m_cahcedUserMediaPermissions.get(originHash);
+ if (!settings) {
+ settings = adoptRef(*new OriginSettings());
+ m_cahcedUserMediaPermissions.add(originHash, settings);
+ }
+
+ auto& ephemeralSalts = settings->ephemeralSalts();
+ auto frameInfo = adoptWK(WKFrameCreateFrameInfo(frame));
+ auto frameHandle = WKFrameInfoGetFrameHandleRef(frameInfo.get());
+ uint64_t frameIdentifier = WKFrameHandleGetFrameID(frameHandle);
+ String frameSalt = ephemeralSalts.get(frameIdentifier);
+
+ if (settings->persistentPermission()) {
+ if (frameSalt.length())
+ return frameSalt;
+
+ if (!settings->persistentSalt().length())
+ settings->setPersistentSalt(WebCore::createCanonicalUUIDString());
+
+ return settings->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& 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<WKStringRef> originString = originUserVisibleName(origin);
- WKBooleanRef value = static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(m_userMediaOriginPermissions.get(), originString.get()));
- if (value && WKGetTypeID(value) == WKBooleanGetTypeID())
- allowed = WKBooleanGetValue(value);
</del><ins>+ auto originHash = userMediaOriginHash(userMediaDocumentOriginString, topLevelDocumentOriginString);
+ RefPtr<OriginSettings> 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->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& 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)->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& pair : m_userMediaPermissionRequests) {
</span><ins>+ auto originHash = pair.first;
</ins><span class="cx"> auto request = pair.second.get();
</span><ins>+
+ bool persistentPermission = false;
+ RefPtr<OriginSettings> settings = m_cahcedUserMediaPermissions.get(originHash);
+ if (settings)
+ persistentPermission = settings->persistentPermission();
+
</ins><span class="cx"> WKRetainPtr<WKArrayRef> audioDeviceUIDs = WKUserMediaPermissionRequestAudioDeviceUIDs(request);
</span><span class="cx"> WKRetainPtr<WKArrayRef> videoDeviceUIDs = WKUserMediaPermissionRequestVideoDeviceUIDs(request);
</span><span class="cx">
</span><del>- if (m_isUserMediaPermissionAllowed && (WKArrayGetSize(videoDeviceUIDs.get()) || WKArrayGetSize(audioDeviceUIDs.get()))) {
</del><ins>+ if ((m_isUserMediaPermissionAllowed || persistentPermission) && (WKArrayGetSize(videoDeviceUIDs.get()) || WKArrayGetSize(audioDeviceUIDs.get()))) {
</ins><span class="cx"> WKRetainPtr<WKStringRef> videoDeviceUID;
</span><span class="cx"> if (WKArrayGetSize(videoDeviceUIDs.get()))
</span><span class="cx"> videoDeviceUID = reinterpret_cast<WKStringRef>(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 <vector>
</span><span class="cx"> #include <wtf/HashMap.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><ins>+#include <wtf/text/StringHash.h>
</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&, WKRetainPtr<WKStringRef>&);
+ 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&);
</del><ins>+ void setUserMediaPermissionForOrigin(bool, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString);
+ void handleUserMediaPermissionRequest(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, WKUserMediaPermissionRequestRef);
+ void handleCheckOfUserMediaPermissionForOrigin(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, const WKUserMediaPermissionCheckRef&);
</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<WKMutableDictionaryRef> m_userMediaOriginPermissions;
</del><ins>+ HashMap<String, RefPtr<OriginSettings>> m_cahcedUserMediaPermissions;
</ins><span class="cx">
</span><del>- typedef Vector<std::pair<WKRetainPtr<WKSecurityOriginRef>, WKRetainPtr<WKUserMediaPermissionRequestRef>>> PermissionRequestList;
</del><ins>+ typedef Vector<std::pair<String, WKRetainPtr<WKUserMediaPermissionRequestRef>>> 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<WKBooleanRef>(WKDictionaryGetItemForKey(messageBodyDictionary, permissionKeyWK.get()));
</span><span class="cx"> bool permission = WKBooleanGetValue(permissionWK);
</span><span class="cx">
</span><del>- WKRetainPtr<WKStringRef> urlKey(AdoptWK, WKStringCreateWithUTF8CString("url"));
- WKStringRef urlWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, urlKey.get()));
</del><ins>+ WKRetainPtr<WKStringRef> originKey(AdoptWK, WKStringCreateWithUTF8CString("origin"));
+ WKStringRef originWK = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, originKey.get()));
</ins><span class="cx">
</span><del>- TestController::singleton().setUserMediaPermissionForOrigin(permission, urlWK);
</del><ins>+ WKRetainPtr<WKStringRef> parentOriginKey(AdoptWK, WKStringCreateWithUTF8CString("parentOrigin"));
+ WKStringRef parentOriginWK = static_cast<WKStringRef>(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>