Diff
Modified: trunk/Source/WebKit/ChangeLog (223989 => 223990)
--- trunk/Source/WebKit/ChangeLog 2017-10-25 22:15:39 UTC (rev 223989)
+++ trunk/Source/WebKit/ChangeLog 2017-10-25 22:27:06 UTC (rev 223990)
@@ -1,3 +1,29 @@
+2017-10-25 Youenn Fablet <[email protected]>
+
+ Move DNS resolution outside of NetworkRTCProvider
+ https://bugs.webkit.org/show_bug.cgi?id=178796
+
+ Reviewed by Geoffrey Garen.
+
+ Tested through manual testing on external STUN servers.
+ Moving NetworkRTCProvider::Resolver into NetworkRTCResolver.
+ Updating the implementation to use a completion handler.
+
+ * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
+ (WebKit::NetworkRTCProvider::createResolver):
+ * NetworkProcess/webrtc/NetworkRTCProvider.h:
+ * NetworkProcess/webrtc/NetworkRTCResolver.cpp:
+ (WebKit::NetworkRTCResolver::NetworkRTCResolver):
+ (WebKit::NetworkRTCResolver::~NetworkRTCResolver):
+ (WebKit::NetworkRTCResolver::start):
+ (WebKit::NetworkRTCResolver::stop):
+ (WebKit::NetworkRTCResolver::completed):
+ (WebKit::NetworkRTCProvider::Resolver::~Resolver): Deleted.
+ (WebKit::NetworkRTCProvider::stop): Deleted.
+ (WebKit::NetworkRTCProvider::resolutionCompleted): Deleted.
+ * NetworkProcess/webrtc/NetworkRTCResolver.h:
+ * WebKit.xcodeproj/project.pbxproj:
+
2017-10-25 Eric Carlson <[email protected]>
[MediaStream] Clear cached gUM prompt state
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp (223989 => 223990)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2017-10-25 22:15:39 UTC (rev 223989)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2017-10-25 22:27:06 UTC (rev 223990)
@@ -31,6 +31,7 @@
#include "Logging.h"
#include "NetworkConnectionToWebProcess.h"
#include "NetworkProcess.h"
+#include "NetworkRTCResolver.h"
#include "NetworkRTCSocket.h"
#include "WebRTCResolverMessages.h"
#include "WebRTCSocketMessages.h"
@@ -163,62 +164,24 @@
void NetworkRTCProvider::createResolver(uint64_t identifier, const String& address)
{
- auto resolver = std::make_unique<Resolver>(identifier, *this, adoptCF(CFHostCreateWithName(kCFAllocatorDefault, address.createCFString().get())));
-
- CFHostClientContext context = { 0, resolver.get(), nullptr, nullptr, nullptr };
- CFHostSetClient(resolver->host.get(), NetworkRTCProvider::resolvedName, &context);
- CFHostScheduleWithRunLoop(resolver->host.get(), CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
- Boolean result = CFHostStartInfoResolution(resolver->host.get(), kCFHostAddresses, nullptr);
- ASSERT_UNUSED(result, result);
-
+ auto resolver = std::make_unique<NetworkRTCResolver>([this, identifier](NetworkRTCResolver::AddressesOrError&& result) mutable {
+ if (!result.hasValue()) {
+ if (result.error() != NetworkRTCResolver::Error::Cancelled)
+ m_connection->connection().send(Messages::WebRTCResolver::ResolvedAddressError(1), identifier);
+ return;
+ }
+ m_connection->connection().send(Messages::WebRTCResolver::SetResolvedAddress(result.value()), identifier);
+ });
+ resolver->start(address);
m_resolvers.add(identifier, WTFMove(resolver));
}
-NetworkRTCProvider::Resolver::~Resolver()
-{
- CFHostUnscheduleFromRunLoop(host.get(), CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
- CFHostSetClient(host.get(), nullptr, nullptr);
-}
-
void NetworkRTCProvider::stopResolver(uint64_t identifier)
{
- ASSERT(identifier);
if (auto resolver = m_resolvers.take(identifier))
- CFHostCancelInfoResolution(resolver->host.get(), CFHostInfoType::kCFHostAddresses);
+ resolver->stop();
}
-void NetworkRTCProvider::resolvedName(CFHostRef hostRef, CFHostInfoType typeInfo, const CFStreamError *error, void *info)
-{
- ASSERT_UNUSED(typeInfo, !typeInfo);
-
- if (error->domain) {
- // FIXME: Need to handle failure, but info is not provided in the callback.
- return;
- }
-
- ASSERT(info);
- auto* resolverInfo = static_cast<Resolver*>(info);
- auto resolver = resolverInfo->rtcProvider.m_resolvers.take(resolverInfo->identifier);
- if (!resolver)
- return;
-
- Boolean result;
- CFArrayRef resolvedAddresses = (CFArrayRef)CFHostGetAddressing(hostRef, &result);
- ASSERT_UNUSED(result, result);
-
- size_t count = CFArrayGetCount(resolvedAddresses);
- Vector<RTCNetwork::IPAddress> addresses;
- addresses.reserveInitialCapacity(count);
-
- for (size_t index = 0; index < count; ++index) {
- CFDataRef data = "" index);
- auto* address = reinterpret_cast<const struct sockaddr_in*>(CFDataGetBytePtr(data));
- addresses.uncheckedAppend(RTCNetwork::IPAddress(rtc::IPAddress(address->sin_addr)));
- }
- ASSERT(resolver->rtcProvider.m_connection);
- resolver->rtcProvider.m_connection->connection().send(Messages::WebRTCResolver::SetResolvedAddress(addresses), resolver->identifier);
-}
-
void NetworkRTCProvider::closeListeningSockets(Function<void()>&& completionHandler)
{
if (!m_isListeningSocketAuthorized) {
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h (223989 => 223990)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2017-10-25 22:15:39 UTC (rev 223989)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2017-10-25 22:27:06 UTC (rev 223990)
@@ -30,7 +30,6 @@
#include "LibWebRTCSocketClient.h"
#include "NetworkRTCMonitor.h"
#include "RTCNetwork.h"
-#include <CFNetwork/CFHost.h>
#include <WebCore/LibWebRTCMacros.h>
#include <webrtc/base/sigslot.h>
#include <webrtc/p2p/base/basicpacketsocketfactory.h>
@@ -45,8 +44,8 @@
}
namespace WebKit {
-
class NetworkConnectionToWebProcess;
+class NetworkRTCResolver;
class NetworkRTCSocket;
class NetworkRTCProvider : public ThreadSafeRefCounted<NetworkRTCProvider>, public rtc::MessageHandler {
@@ -89,21 +88,7 @@
void OnMessage(rtc::Message*);
- static void resolvedName(CFHostRef, CFHostInfoType, const CFStreamError*, void*);
-
- struct Resolver {
- Resolver(uint64_t identifier, NetworkRTCProvider& rtcProvider, RetainPtr<CFHostRef>&& host)
- : identifier(identifier)
- , rtcProvider(rtcProvider)
- , host(WTFMove(host)) { }
- ~Resolver();
-
- uint64_t identifier;
- NetworkRTCProvider& rtcProvider;
- RetainPtr<CFHostRef> host;
- };
-
- HashMap<uint64_t, std::unique_ptr<Resolver>> m_resolvers;
+ HashMap<uint64_t, std::unique_ptr<NetworkRTCResolver>> m_resolvers;
HashMap<uint64_t, std::unique_ptr<LibWebRTCSocketClient>> m_sockets;
NetworkConnectionToWebProcess* m_connection;
bool m_isStarted { true };
Added: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolver.cpp (0 => 223990)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolver.cpp (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolver.cpp 2017-10-25 22:27:06 UTC (rev 223990)
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2017 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 "NetworkRTCResolver.h"
+
+#if USE(LIBWEBRTC)
+
+#include <wtf/Expected.h>
+
+namespace WebKit {
+
+static void resolvedName(CFHostRef hostRef, CFHostInfoType typeInfo, const CFStreamError *error, void *info)
+{
+ ASSERT_UNUSED(typeInfo, !typeInfo);
+
+ if (error->domain) {
+ // FIXME: Need to handle failure, but info is not provided in the callback.
+ return;
+ }
+
+ ASSERT(info);
+ auto* resolver = static_cast<NetworkRTCResolver*>(info);
+
+ Boolean result;
+ CFArrayRef resolvedAddresses = (CFArrayRef)CFHostGetAddressing(hostRef, &result);
+ ASSERT_UNUSED(result, result);
+
+ size_t count = CFArrayGetCount(resolvedAddresses);
+ Vector<RTCNetwork::IPAddress> addresses;
+ addresses.reserveInitialCapacity(count);
+
+ for (size_t index = 0; index < count; ++index) {
+ CFDataRef data = "" index);
+ auto* address = reinterpret_cast<const struct sockaddr_in*>(CFDataGetBytePtr(data));
+ addresses.uncheckedAppend(RTCNetwork::IPAddress(rtc::IPAddress(address->sin_addr)));
+ }
+ resolver->completed(addresses);
+}
+
+NetworkRTCResolver::NetworkRTCResolver(CompletionHandler&& completionHandler)
+ : m_completionHandler(WTFMove(completionHandler))
+{
+}
+
+NetworkRTCResolver::~NetworkRTCResolver()
+{
+ CFHostUnscheduleFromRunLoop(m_host.get(), CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ CFHostSetClient(m_host.get(), nullptr, nullptr);
+ if (auto completionHandler = WTFMove(m_completionHandler))
+ completionHandler(makeUnexpected(Error::Unknown));
+}
+
+void NetworkRTCResolver::start(const String& address)
+{
+ m_host = adoptCF(CFHostCreateWithName(kCFAllocatorDefault, address.createCFString().get()));
+ CFHostClientContext context = { 0, this, nullptr, nullptr, nullptr };
+ CFHostSetClient(m_host.get(), resolvedName, &context);
+ CFHostScheduleWithRunLoop(m_host.get(), CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+ Boolean result = CFHostStartInfoResolution(m_host.get(), kCFHostAddresses, nullptr);
+ ASSERT_UNUSED(result, result);
+}
+
+void NetworkRTCResolver::stop()
+{
+ CFHostCancelInfoResolution(m_host.get(), CFHostInfoType::kCFHostAddresses);
+ if (auto completionHandler = WTFMove(m_completionHandler))
+ completionHandler(makeUnexpected(Error::Cancelled));
+}
+
+void NetworkRTCResolver::completed(const Vector<RTCNetwork::IPAddress>& addresses)
+{
+ if (auto completionHandler = WTFMove(m_completionHandler))
+ completionHandler({ addresses });
+}
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
Added: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolver.h (0 => 223990)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolver.h (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolver.h 2017-10-25 22:27:06 UTC (rev 223990)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#if USE(LIBWEBRTC)
+
+#include "RTCNetwork.h"
+#include <CFNetwork/CFHost.h>
+#include <wtf/CompletionHandler.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+class NetworkRTCResolver {
+public:
+ enum class Error { Unknown, Cancelled };
+
+ using AddressesOrError = Expected<std::reference_wrapper<const Vector<RTCNetwork::IPAddress>>, Error>;
+ using CompletionHandler = WTF::CompletionHandler<void(AddressesOrError&&)>;
+
+ explicit NetworkRTCResolver(CompletionHandler&&);
+ ~NetworkRTCResolver();
+
+ void start(const String& address);
+ void stop();
+
+ void completed(const Vector<RTCNetwork::IPAddress>&);
+
+private:
+ CompletionHandler m_completionHandler;
+ RetainPtr<CFHostRef> m_host;
+};
+
+} // namespace WebKit
+
+#endif // USE(LIBWEBRTC)
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (223989 => 223990)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2017-10-25 22:15:39 UTC (rev 223989)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2017-10-25 22:27:06 UTC (rev 223990)
@@ -877,6 +877,7 @@
3F87B9C0158940D80090FF62 /* WebColorPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F87B9BF158940D80090FF62 /* WebColorPicker.h */; };
410482CD1DDD324C00F006D0 /* RTCNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */; };
410482CE1DDD324F00F006D0 /* RTCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 410482CC1DDD2FB500F006D0 /* RTCNetwork.h */; };
+ 4112B5551FA0EA7A00E67875 /* NetworkRTCResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4112B5471F9FD3AB00E67875 /* NetworkRTCResolver.cpp */; };
411B22641E371BA6004F7363 /* LibWebRTCNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 411B22621E371244004F7363 /* LibWebRTCNetwork.h */; };
413075A91DE85F2C0039EC69 /* NetworkRTCSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413075981DE84FB00039EC69 /* NetworkRTCSocket.cpp */; };
413075AA1DE85F300039EC69 /* NetworkRTCMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4130759A1DE84FB00039EC69 /* NetworkRTCMonitor.cpp */; };
@@ -3173,6 +3174,8 @@
3F87B9BF158940D80090FF62 /* WebColorPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebColorPicker.h; sourceTree = "<group>"; };
410482CB1DDD2FB500F006D0 /* RTCNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCNetwork.cpp; sourceTree = "<group>"; };
410482CC1DDD2FB500F006D0 /* RTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNetwork.h; sourceTree = "<group>"; };
+ 4112B5471F9FD3AB00E67875 /* NetworkRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkRTCResolver.cpp; path = NetworkProcess/webrtc/NetworkRTCResolver.cpp; sourceTree = "<group>"; };
+ 4112B5481F9FD3AC00E67875 /* NetworkRTCResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkRTCResolver.h; path = NetworkProcess/webrtc/NetworkRTCResolver.h; sourceTree = "<group>"; };
411B22621E371244004F7363 /* LibWebRTCNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCNetwork.h; path = Network/webrtc/LibWebRTCNetwork.h; sourceTree = "<group>"; };
413075981DE84FB00039EC69 /* NetworkRTCSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkRTCSocket.cpp; path = NetworkProcess/webrtc/NetworkRTCSocket.cpp; sourceTree = "<group>"; };
413075991DE84FB00039EC69 /* NetworkRTCSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkRTCSocket.h; path = NetworkProcess/webrtc/NetworkRTCSocket.h; sourceTree = "<group>"; };
@@ -6040,6 +6043,8 @@
41DC45951E3D6E1E00B11F51 /* NetworkRTCProvider.cpp */,
41DC45941E3D6E1E00B11F51 /* NetworkRTCProvider.h */,
41DC45981E3D6ED600B11F51 /* NetworkRTCProvider.messages.in */,
+ 4112B5471F9FD3AB00E67875 /* NetworkRTCResolver.cpp */,
+ 4112B5481F9FD3AC00E67875 /* NetworkRTCResolver.h */,
413075981DE84FB00039EC69 /* NetworkRTCSocket.cpp */,
413075991DE84FB00039EC69 /* NetworkRTCSocket.h */,
4130759D1DE84FB00039EC69 /* NetworkRTCSocket.messages.in */,
@@ -10305,6 +10310,7 @@
51F060E11654318500F3281E /* NetworkRTCMonitorMessageReceiver.cpp in Sources */,
41DC45971E3D6E2200B11F51 /* NetworkRTCProvider.cpp in Sources */,
51F060E11654318500F3282E /* NetworkRTCProviderMessageReceiver.cpp in Sources */,
+ 4112B5551FA0EA7A00E67875 /* NetworkRTCResolver.cpp in Sources */,
413075A91DE85F2C0039EC69 /* NetworkRTCSocket.cpp in Sources */,
51F060E11654318500F3281D /* NetworkRTCSocketMessageReceiver.cpp in Sources */,
BC8283AC16B4BF3F00A278FE /* NetworkServiceEntryPoint.mm in Sources */,