Title: [230970] trunk
Revision
230970
Author
you...@apple.com
Date
2018-04-24 13:22:51 -0700 (Tue, 24 Apr 2018)

Log Message

Throw in case of PeerConnection created for detached documents
https://bugs.webkit.org/show_bug.cgi?id=184921
<rdar://problem/39629216>

Reviewed by Eric Carlson.

Source/WebCore:

Add a check to ensure that page is not null when creating a peer connection backend.
In that case, the peer connection constructor will later on throw.
The same for setConfiguration is done.
Behavior is consistent with Chrome.

Test: webrtc/pc-detached-document.html

* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::createLibWebRTCPeerConnectionBackend):
(WebCore::LibWebRTCPeerConnectionBackend::LibWebRTCPeerConnectionBackend):
(WebCore::LibWebRTCPeerConnectionBackend::setConfiguration):
(WebCore::libWebRTCProvider): Deleted.
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:

LayoutTests:

* webrtc/pc-detached-document-expected.txt: Added.
* webrtc/pc-detached-document.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (230969 => 230970)


--- trunk/LayoutTests/ChangeLog	2018-04-24 20:15:02 UTC (rev 230969)
+++ trunk/LayoutTests/ChangeLog	2018-04-24 20:22:51 UTC (rev 230970)
@@ -1,3 +1,14 @@
+2018-04-24  Youenn Fablet  <you...@apple.com>
+
+        Throw in case of PeerConnection created for detached documents
+        https://bugs.webkit.org/show_bug.cgi?id=184921
+        <rdar://problem/39629216>
+
+        Reviewed by Eric Carlson.
+
+        * webrtc/pc-detached-document-expected.txt: Added.
+        * webrtc/pc-detached-document.html: Added.
+
 2018-04-24  John Wilander  <wilan...@apple.com>
 
         From-Origin: Support for 'same' and 'same-site' response header, nested frame origin check

Added: trunk/LayoutTests/webrtc/pc-detached-document-expected.txt (0 => 230970)


--- trunk/LayoutTests/webrtc/pc-detached-document-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webrtc/pc-detached-document-expected.txt	2018-04-24 20:22:51 UTC (rev 230970)
@@ -0,0 +1,4 @@
+
+PASS Peer Connection objects should not be created in detached documents 
+PASS Peer Connection objects should not be created in detached documents 
+

Added: trunk/LayoutTests/webrtc/pc-detached-document.html (0 => 230970)


--- trunk/LayoutTests/webrtc/pc-detached-document.html	                        (rev 0)
+++ trunk/LayoutTests/webrtc/pc-detached-document.html	2018-04-24 20:22:51 UTC (rev 230970)
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+<body>
+<script src=""
+<script src=""
+<script>
+test(() => {
+    var frame = document.createElement("iframe");
+    frame.setAttribute("src", "/");
+    document.body.appendChild(frame);
+    var constructor = frame.contentWindow.RTCPeerConnection;
+    document.body.removeChild(frame);
+    assert_throws('NotSupportedError', () => { new constructor() });
+}, "Peer Connection objects should not be created in detached documents");
+test(() => {
+    var frame = document.createElement("iframe");
+    frame.setAttribute("src", "/");
+    document.body.appendChild(frame);
+    var pc = new frame.contentWindow.RTCPeerConnection();
+    document.body.removeChild(frame);
+    assert_throws('InvalidStateError', () => { pc.setConfiguration({}) });
+}, "Peer Connection objects should not be created in detached documents");
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (230969 => 230970)


--- trunk/Source/WebCore/ChangeLog	2018-04-24 20:15:02 UTC (rev 230969)
+++ trunk/Source/WebCore/ChangeLog	2018-04-24 20:22:51 UTC (rev 230970)
@@ -1,3 +1,25 @@
+2018-04-24  Youenn Fablet  <you...@apple.com>
+
+        Throw in case of PeerConnection created for detached documents
+        https://bugs.webkit.org/show_bug.cgi?id=184921
+        <rdar://problem/39629216>
+
+        Reviewed by Eric Carlson.
+
+        Add a check to ensure that page is not null when creating a peer connection backend.
+        In that case, the peer connection constructor will later on throw.
+        The same for setConfiguration is done.
+        Behavior is consistent with Chrome.
+
+        Test: webrtc/pc-detached-document.html
+
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::createLibWebRTCPeerConnectionBackend):
+        (WebCore::LibWebRTCPeerConnectionBackend::LibWebRTCPeerConnectionBackend):
+        (WebCore::LibWebRTCPeerConnectionBackend::setConfiguration):
+        (WebCore::libWebRTCProvider): Deleted.
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+
 2018-04-24  John Wilander  <wilan...@apple.com>
 
         From-Origin: Support for 'same' and 'same-site' response header, nested frame origin check

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (230969 => 230970)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2018-04-24 20:15:02 UTC (rev 230969)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2018-04-24 20:22:51 UTC (rev 230970)
@@ -49,19 +49,18 @@
 {
     if (!LibWebRTCProvider::webRTCAvailable())
         return nullptr;
-    return std::make_unique<LibWebRTCPeerConnectionBackend>(peerConnection);
+
+    auto* page = downcast<Document>(*peerConnection.scriptExecutionContext()).page();
+    if (!page)
+        return nullptr;
+    return std::make_unique<LibWebRTCPeerConnectionBackend>(peerConnection, page->libWebRTCProvider());
 }
 
 CreatePeerConnectionBackend PeerConnectionBackend::create = createLibWebRTCPeerConnectionBackend;
 
-static inline LibWebRTCProvider& libWebRTCProvider(RTCPeerConnection& peerConnection)
-{
-    return downcast<Document>(*peerConnection.scriptExecutionContext()).page()->libWebRTCProvider();
-}
-
-LibWebRTCPeerConnectionBackend::LibWebRTCPeerConnectionBackend(RTCPeerConnection& peerConnection)
+LibWebRTCPeerConnectionBackend::LibWebRTCPeerConnectionBackend(RTCPeerConnection& peerConnection, LibWebRTCProvider& provider)
     : PeerConnectionBackend(peerConnection)
-    , m_endpoint(LibWebRTCMediaEndpoint::create(*this, libWebRTCProvider(peerConnection)))
+    , m_endpoint(LibWebRTCMediaEndpoint::create(*this, provider))
 {
 }
 
@@ -120,7 +119,11 @@
 
 bool LibWebRTCPeerConnectionBackend::setConfiguration(MediaEndpointConfiguration&& configuration)
 {
-    return m_endpoint->setConfiguration(libWebRTCProvider(m_peerConnection), configurationFromMediaEndpointConfiguration(WTFMove(configuration)));
+    auto* page = downcast<Document>(*m_peerConnection.scriptExecutionContext()).page();
+    if (!page)
+        return false;
+
+    return m_endpoint->setConfiguration(page->libWebRTCProvider(), configurationFromMediaEndpointConfiguration(WTFMove(configuration)));
 }
 
 void LibWebRTCPeerConnectionBackend::getStats(MediaStreamTrack* track, Ref<DeferredPromise>&& promise)

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (230969 => 230970)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2018-04-24 20:15:02 UTC (rev 230969)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2018-04-24 20:22:51 UTC (rev 230970)
@@ -36,6 +36,7 @@
 namespace WebCore {
 
 class LibWebRTCMediaEndpoint;
+class LibWebRTCProvider;
 class RTCRtpReceiver;
 class RTCSessionDescription;
 class RTCStatsReport;
@@ -46,7 +47,7 @@
 
 class LibWebRTCPeerConnectionBackend final : public PeerConnectionBackend {
 public:
-    explicit LibWebRTCPeerConnectionBackend(RTCPeerConnection&);
+    LibWebRTCPeerConnectionBackend(RTCPeerConnection&, LibWebRTCProvider&);
     ~LibWebRTCPeerConnectionBackend();
 
     bool hasAudioSources() const { return m_audioSources.size(); }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to