Changeset 237568 in webkit


Ignore:
Timestamp:
Oct 29, 2018 2:31:16 PM (5 years ago)
Author:
youenn@apple.com
Message:

Handle MDNS resolution of candidates through libwebrtc directly
https://bugs.webkit.org/show_bug.cgi?id=190681

Reviewed by Eric Carlson.

Source/ThirdParty/libwebrtc:

  • Configurations/libwebrtc.iOS.exp:
  • Configurations/libwebrtc.iOSsim.exp:
  • Configurations/libwebrtc.mac.exp:

Source/WebCore:

Remove the previous MDNS resolution mechanism.
Instead, add support for the AsyncResolver mechanism added to libwebrtc.
Covered by current mdns webrtc test that is unflaked.

  • Modules/mediastream/PeerConnectionBackend.cpp:

(WebCore::PeerConnectionBackend::addIceCandidate):

  • platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:

(WebCore::LibWebRTCProvider::createPeerConnection):

  • platform/mediastream/libwebrtc/LibWebRTCProvider.h:
  • testing/MockLibWebRTCPeerConnection.cpp:

(WebCore::MockLibWebRTCPeerConnectionFactory::CreatePeerConnection):

  • testing/MockLibWebRTCPeerConnection.h:

Source/WebKit:

Add support for AsyncResolver to resolve MDNS.
This basically reuse the code path used to resolve STUN server addresses.
Removed MDNS specific resolution.
Use existing CFHost resolution mechanism to do the actual resolution.

Make sure that a resolver is kept alive while iterating through its clients when signaling done.
Some of its clients may indeed call Destroy() on the resolver during that iteration.

  • NetworkProcess/webrtc/NetworkMDNSRegister.cpp:

(WebKit::NetworkMDNSRegister::registerMDNSName):

  • NetworkProcess/webrtc/NetworkMDNSRegister.messages.in:
  • WebProcess/Network/webrtc/LibWebRTCProvider.cpp:

(WebKit::LibWebRTCResolver::Destroy):
(WebKit::LibWebRTCResolver::doDestroy):
(WebKit::LibWebRTCResolver::setResolvedAddress):
(WebKit::LibWebRTCResolver::setError):
(WebKit::LibWebRTCProvider::createPeerConnection):

  • WebProcess/Network/webrtc/LibWebRTCProvider.h:
  • WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
  • WebProcess/Network/webrtc/WebMDNSRegister.cpp:
  • WebProcess/Network/webrtc/WebMDNSRegister.h:
  • WebProcess/Network/webrtc/WebMDNSRegister.messages.in:

LayoutTests:

Test should no longer be flaky as we no longer enforce a timer for resolving MDNS candidates.

Location:
trunk
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r237566 r237568  
     12018-10-29  Youenn Fablet  <youenn@apple.com>
     2
     3        Handle MDNS resolution of candidates through libwebrtc directly
     4        https://bugs.webkit.org/show_bug.cgi?id=190681
     5
     6        Reviewed by Eric Carlson.
     7
     8        * TestExpectations:
     9        Test should no longer be flaky as we no longer enforce a timer for resolving MDNS candidates.
     10
    1112018-10-29  Tim Horton  <timothy_horton@apple.com>
    212
  • trunk/LayoutTests/TestExpectations

    r237556 r237568  
    12171217webrtc/simulcast-h264.html [ Slow ]
    12181218webrtc/datachannel/multiple-connections.html [ Slow ]
    1219 webkit.org/b/187180 webrtc/datachannel/mdns-ice-candidates.html [ Pass Failure ]
    12201219webkit.org/b/171094 imported/w3c/web-platform-tests/webrtc/rtcpeerconnection/rtcpeerconnection-idl.html [ Failure ]
    12211220webkit.org/b/172f21 imported/w3c/web-platform-tests/webrtc/getstats.html [ Failure ]
  • trunk/Source/ThirdParty/libwebrtc/ChangeLog

    r237367 r237568  
     12018-10-29  Youenn Fablet  <youenn@apple.com>
     2
     3        Handle MDNS resolution of candidates through libwebrtc directly
     4        https://bugs.webkit.org/show_bug.cgi?id=190681
     5
     6        Reviewed by Eric Carlson.
     7
     8        * Configurations/libwebrtc.iOS.exp:
     9        * Configurations/libwebrtc.iOSsim.exp:
     10        * Configurations/libwebrtc.mac.exp:
     11
    1122018-10-23  Ryan Haddad  <ryanhaddad@apple.com>
    213
  • trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp

    r237367 r237568  
    230230__ZNK3rtc14SSLCertificate8GetStatsEv
    231231__ZN3rtc14RTCCertificate7FromPEMERKNS_17RTCCertificatePEME
     232__ZN6webrtc26PeerConnectionDependenciesC1EPNS_22PeerConnectionObserverE
     233__ZN6webrtc30PeerConnectionFactoryInterface20CreatePeerConnectionERKNS_23PeerConnectionInterface16RTCConfigurationENSt3__110unique_ptrIN7cricket13PortAllocatorENS5_14default_deleteIS8_EEEENS6_IN3rtc32RTCCertificateGeneratorInterfaceENS9_ISD_EEEEPNS_22PeerConnectionObserverE
  • trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp

    r237367 r237568  
    231231__ZNK3rtc14SSLCertificate8GetStatsEv
    232232__ZN3rtc14RTCCertificate7FromPEMERKNS_17RTCCertificatePEME
     233__ZN6webrtc26PeerConnectionDependenciesC1EPNS_22PeerConnectionObserverE
     234__ZN6webrtc30PeerConnectionFactoryInterface20CreatePeerConnectionERKNS_23PeerConnectionInterface16RTCConfigurationENSt3__110unique_ptrIN7cricket13PortAllocatorENS5_14default_deleteIS8_EEEENS6_IN3rtc32RTCCertificateGeneratorInterfaceENS9_ISD_EEEEPNS_22PeerConnectionObserverE
  • trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp

    r237367 r237568  
    231231__ZNK3rtc14SSLCertificate8GetStatsEv
    232232__ZN3rtc14RTCCertificate7FromPEMERKNS_17RTCCertificatePEME
     233__ZN6webrtc26PeerConnectionDependenciesC1EPNS_22PeerConnectionObserverE
     234__ZN6webrtc30PeerConnectionFactoryInterface20CreatePeerConnectionERKNS_23PeerConnectionInterface16RTCConfigurationENSt3__110unique_ptrIN7cricket13PortAllocatorENS5_14default_deleteIS8_EEEENS6_IN3rtc32RTCCertificateGeneratorInterfaceENS9_ISD_EEEEPNS_22PeerConnectionObserverE
  • trunk/Source/WebCore/ChangeLog

    r237567 r237568  
     12018-10-29  Youenn Fablet  <youenn@apple.com>
     2
     3        Handle MDNS resolution of candidates through libwebrtc directly
     4        https://bugs.webkit.org/show_bug.cgi?id=190681
     5
     6        Reviewed by Eric Carlson.
     7
     8        Remove the previous MDNS resolution mechanism.
     9        Instead, add support for the AsyncResolver mechanism added to libwebrtc.
     10        Covered by current mdns webrtc test that is unflaked.
     11
     12        * Modules/mediastream/PeerConnectionBackend.cpp:
     13        (WebCore::PeerConnectionBackend::addIceCandidate):
     14        * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:
     15        (WebCore::LibWebRTCProvider::createPeerConnection):
     16        * platform/mediastream/libwebrtc/LibWebRTCProvider.h:
     17        * testing/MockLibWebRTCPeerConnection.cpp:
     18        (WebCore::MockLibWebRTCPeerConnectionFactory::CreatePeerConnection):
     19        * testing/MockLibWebRTCPeerConnection.h:
     20
    1212018-10-29  Devin Rousso  <drousso@apple.com>
    222
  • trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp

    r237367 r237568  
    275275
    276276    if (!iceCandidate) {
    277         if (m_waitingForMDNSResolution) {
    278             m_finishedReceivingCandidates = true;
    279             m_endOfIceCandidatePromise = WTFMove(promise);
    280             return;
    281         }
    282277        endOfIceCandidates(WTFMove(promise));
    283278        return;
    284     }
    285 
    286     if (RuntimeEnabledFeatures::sharedFeatures().mdnsICECandidatesEnabled()) {
    287         auto name = extractIPAddres(iceCandidate->candidate());
    288         if (name.endsWith(".local")) {
    289             ++m_waitingForMDNSResolution;
    290             auto& document = downcast<Document>(*m_peerConnection.scriptExecutionContext());
    291             auto& provider = document.page()->libWebRTCProvider();
    292             provider.resolveMDNSName(document.sessionID(), name, [peerConnection = makeRef(m_peerConnection), this, name, iceCandidate = makeRef(*iceCandidate), promise = WTFMove(promise)] (LibWebRTCProvider::IPAddressOrError&& result) mutable {
    293                 if (peerConnection->isStopped())
    294                     return;
    295 
    296                 --m_waitingForMDNSResolution;
    297                 if (!result.has_value()) {
    298                     if (result.error() != MDNSRegisterError::Timeout)
    299                         peerConnection->scriptExecutionContext()->addConsoleMessage(MessageSource::JS, MessageLevel::Warning, makeString("MDNS resolution of a host candidate failed with error", (unsigned)result.error()));
    300                     return;
    301                 }
    302 
    303                 auto candidate = iceCandidate->candidate();
    304                 candidate.replace(name, result.value());
    305                 iceCandidate->setCandidate(WTFMove(candidate));
    306                 m_addIceCandidatePromise = WTFMove(promise);
    307                 this->doAddIceCandidate(iceCandidate);
    308             });
    309             return;
    310         }
    311279    }
    312280
  • trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp

    r237367 r237568  
    3434ALLOW_UNUSED_PARAMETERS_BEGIN
    3535
     36#include <webrtc/api/asyncresolverfactory.h>
    3637#include <webrtc/api/audio_codecs/builtin_audio_decoder_factory.h>
    3738#include <webrtc/api/audio_codecs/builtin_audio_encoder_factory.h>
     
    245246    factoryAndThreads.packetSocketFactory->setDisableNonLocalhostConnections(m_disableNonLocalhostConnections);
    246247
    247     return createPeerConnection(observer, *factoryAndThreads.networkManager, *factoryAndThreads.packetSocketFactory, WTFMove(configuration));
    248 }
    249 
    250 rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::NetworkManager& networkManager, rtc::PacketSocketFactory& packetSocketFactory, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
     248    return createPeerConnection(observer, *factoryAndThreads.networkManager, *factoryAndThreads.packetSocketFactory, WTFMove(configuration), nullptr);
     249}
     250
     251rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, rtc::NetworkManager& networkManager, rtc::PacketSocketFactory& packetSocketFactory, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration, std::unique_ptr<webrtc::AsyncResolverFactory>&& asyncResolveFactory)
    251252{
    252253    auto& factoryAndThreads = getStaticFactoryAndThreads(m_useNetworkThreadWithSocketServer);
     
    264265        return nullptr;
    265266
    266     return m_factory->CreatePeerConnection(configuration, WTFMove(portAllocator), nullptr, &observer);
     267    webrtc::PeerConnectionDependencies dependencies { &observer };
     268    dependencies.allocator = WTFMove(portAllocator);
     269    dependencies.async_resolver_factory = WTFMove(asyncResolveFactory);
     270
     271    return m_factory->CreatePeerConnection(configuration, WTFMove(dependencies));
    267272}
    268273
  • trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h

    r237367 r237568  
    5252
    5353namespace webrtc {
     54class AsyncResolverFactory;
    5455class PeerConnectionFactoryInterface;
    5556}
     
    8990    }
    9091
    91     virtual void resolveMDNSName(PAL::SessionID, const String& name, CompletionHandler<void(IPAddressOrError&&)>&& callback)
    92     {
    93         UNUSED_PARAM(name);
    94         callback(makeUnexpected(MDNSRegisterError::NotImplemented));
    95     }
    96 
    9792#if USE(LIBWEBRTC)
    9893    virtual rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, webrtc::PeerConnectionInterface::RTCConfiguration&&);
     
    118113    LibWebRTCProvider() = default;
    119114
    120     rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::NetworkManager&, rtc::PacketSocketFactory&, webrtc::PeerConnectionInterface::RTCConfiguration&&);
     115    rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::NetworkManager&, rtc::PacketSocketFactory&, webrtc::PeerConnectionInterface::RTCConfiguration&&, std::unique_ptr<webrtc::AsyncResolverFactory>&&);
    121116
    122117    rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> createPeerConnectionFactory(rtc::Thread* networkThread, rtc::Thread* signalingThread, LibWebRTCAudioModule*);
  • trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp

    r237367 r237568  
    173173}
    174174
    175 rtc::scoped_refptr<webrtc::PeerConnectionInterface> MockLibWebRTCPeerConnectionFactory::CreatePeerConnection(const webrtc::PeerConnectionInterface::RTCConfiguration&, std::unique_ptr<cricket::PortAllocator>, std::unique_ptr<rtc::RTCCertificateGeneratorInterface>, webrtc::PeerConnectionObserver* observer)
     175rtc::scoped_refptr<webrtc::PeerConnectionInterface> MockLibWebRTCPeerConnectionFactory::CreatePeerConnection(const webrtc::PeerConnectionInterface::RTCConfiguration&, webrtc::PeerConnectionDependencies dependencies)
    176176{
    177177    if (m_testCase == "ICECandidates")
    178         return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionForIceCandidates>(*observer);
     178        return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionForIceCandidates>(*dependencies.observer);
    179179
    180180    if (m_testCase == "ICEConnectionState")
    181         return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionForIceConnectionState>(*observer);
     181        return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionForIceConnectionState>(*dependencies.observer);
    182182
    183183    if (m_testCase == "LibWebRTCReleasingWhileCreatingOffer")
    184         return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionReleasedInNetworkThreadWhileCreatingOffer>(*observer);
     184        return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionReleasedInNetworkThreadWhileCreatingOffer>(*dependencies.observer);
    185185
    186186    if (m_testCase == "LibWebRTCReleasingWhileGettingStats")
    187         return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionReleasedInNetworkThreadWhileGettingStats>(*observer);
     187        return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionReleasedInNetworkThreadWhileGettingStats>(*dependencies.observer);
    188188
    189189    if (m_testCase == "LibWebRTCReleasingWhileSettingDescription")
    190         return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionReleasedInNetworkThreadWhileSettingDescription>(*observer);
    191 
    192     return new rtc::RefCountedObject<MockLibWebRTCPeerConnection>(*observer);
     190        return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionReleasedInNetworkThreadWhileSettingDescription>(*dependencies.observer);
     191
     192    return new rtc::RefCountedObject<MockLibWebRTCPeerConnection>(*dependencies.observer);
    193193}
    194194
  • trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h

    r237367 r237568  
    242242
    243243private:
    244     rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection(const webrtc::PeerConnectionInterface::RTCConfiguration&, std::unique_ptr<cricket::PortAllocator>, std::unique_ptr<rtc::RTCCertificateGeneratorInterface>, webrtc::PeerConnectionObserver*) final;
     244    rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection(const webrtc::PeerConnectionInterface::RTCConfiguration&, webrtc::PeerConnectionDependencies) final;
    245245
    246246    rtc::scoped_refptr<webrtc::MediaStreamInterface> CreateLocalMediaStream(const std::string&) final;
  • trunk/Source/WebKit/ChangeLog

    r237566 r237568  
     12018-10-29  Youenn Fablet  <youenn@apple.com>
     2
     3        Handle MDNS resolution of candidates through libwebrtc directly
     4        https://bugs.webkit.org/show_bug.cgi?id=190681
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add support for AsyncResolver to resolve MDNS.
     9        This basically reuse the code path used to resolve STUN server addresses.
     10        Removed MDNS specific resolution.
     11        Use existing CFHost resolution mechanism to do the actual resolution.
     12
     13        Make sure that a resolver is kept alive while iterating through its clients when signaling done.
     14        Some of its clients may indeed call Destroy() on the resolver during that iteration.
     15
     16        * NetworkProcess/webrtc/NetworkMDNSRegister.cpp:
     17        (WebKit::NetworkMDNSRegister::registerMDNSName):
     18        * NetworkProcess/webrtc/NetworkMDNSRegister.messages.in:
     19        * WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
     20        (WebKit::LibWebRTCResolver::Destroy):
     21        (WebKit::LibWebRTCResolver::doDestroy):
     22        (WebKit::LibWebRTCResolver::setResolvedAddress):
     23        (WebKit::LibWebRTCResolver::setError):
     24        (WebKit::LibWebRTCProvider::createPeerConnection):
     25        * WebProcess/Network/webrtc/LibWebRTCProvider.h:
     26        * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
     27        * WebProcess/Network/webrtc/WebMDNSRegister.cpp:
     28        * WebProcess/Network/webrtc/WebMDNSRegister.h:
     29        * WebProcess/Network/webrtc/WebMDNSRegister.messages.in:
     30
    1312018-10-29  Tim Horton  <timothy_horton@apple.com>
    232
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.cpp

    r237367 r237568  
    157157    pendingRegistrationRequests().add(pendingRegistrationRequestCount++, WTFMove(pendingRequest));
    158158}
    159 
    160 struct PendingResolutionRequest {
    161     PendingResolutionRequest(Ref<IPC::Connection> connection, uint64_t requestIdentifier, PAL::SessionID sessionID)
    162         : connection(WTFMove(connection))
    163         , requestIdentifier(requestIdentifier)
    164         , timeoutTimer(*this, &PendingResolutionRequest::timeout)
    165         , sessionID(sessionID)
    166     {
    167         timeoutTimer.startOneShot(500_ms);
    168     }
    169 
    170     ~PendingResolutionRequest()
    171     {
    172         if (service)
    173             DNSServiceRefDeallocate(service);
    174         if (operationService)
    175             DNSServiceRefDeallocate(operationService);
    176     }
    177 
    178     void timeout()
    179     {
    180         connection->send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { requestIdentifier, makeUnexpected(MDNSRegisterError::Timeout) }, 0);
    181         requestIdentifier = 0;
    182     }
    183 
    184     Ref<IPC::Connection> connection;
    185     uint64_t requestIdentifier { 0 };
    186     DNSServiceRef service { nullptr };
    187     DNSServiceRef operationService { nullptr };
    188     Timer timeoutTimer;
    189     PAL::SessionID sessionID;
    190 };
    191 
    192 static void resolveMDNSNameCallback(DNSServiceRef, DNSServiceFlags, uint32_t, DNSServiceErrorType errorCode, const char *hostname, const struct sockaddr *socketAddress, uint32_t ttl, void *context)
    193 {
    194     std::unique_ptr<PendingResolutionRequest> request { static_cast<PendingResolutionRequest*>(context) };
    195 
    196     if (!request->requestIdentifier)
    197         return;
    198 
    199     if (errorCode) {
    200         RELEASE_LOG_IF_ALLOWED_IN_CALLBACK(request->sessionID, "resolveMDNSNameCallback MDNS error %d", errorCode);
    201         request->connection->send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { request->requestIdentifier, makeUnexpected(MDNSRegisterError::DNSSD) }, 0);
    202         return;
    203     }
    204 
    205     const void* address = socketAddress->sa_family == AF_INET6 ? (const void*) &((const struct sockaddr_in6*)socketAddress)->sin6_addr : (const void*)&((const struct sockaddr_in*)socketAddress)->sin_addr;
    206 
    207     char buffer[INET6_ADDRSTRLEN] = { 0 };
    208     if (!inet_ntop(socketAddress->sa_family, address, buffer, sizeof(buffer))) {
    209         RELEASE_LOG_IF_ALLOWED_IN_CALLBACK(request->sessionID, "resolveMDNSNameCallback inet_ntop error");
    210         request->connection->send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { request->requestIdentifier, makeUnexpected(MDNSRegisterError::DNSSD) }, 0);
    211         return;
    212     }
    213 
    214     request->connection->send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { request->requestIdentifier, String { buffer } }, 0);
    215 }
    216 
    217 void NetworkMDNSRegister::resolveMDNSName(uint64_t requestIdentifier, PAL::SessionID sessionID, const String& name)
    218 {
    219     UNUSED_PARAM(sessionID);
    220     auto pendingRequest = std::make_unique<PendingResolutionRequest>(makeRef(m_connection.connection()), requestIdentifier, sessionID);
    221 
    222     if (auto error = DNSServiceCreateConnection(&pendingRequest->service)) {
    223         RELEASE_LOG_IF_ALLOWED(sessionID, "resolveMDNSName DNSServiceCreateConnection error %d", error);
    224         m_connection.connection().send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { requestIdentifier, makeUnexpected(MDNSRegisterError::DNSSD) }, 0);
    225         return;
    226     }
    227 
    228     DNSServiceRef service;
    229     auto error = DNSServiceGetAddrInfo(&service,
    230         kDNSServiceFlagsUnique,
    231         0,
    232         kDNSServiceProtocol_IPv4,
    233         name.utf8().data(),
    234         resolveMDNSNameCallback,
    235         pendingRequest.get());
    236     pendingRequest->operationService = service;
    237     if (error) {
    238         RELEASE_LOG_IF_ALLOWED(sessionID, "resolveMDNSName DNSServiceGetAddrInfo error %d", error);
    239         m_connection.connection().send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { requestIdentifier, makeUnexpected(MDNSRegisterError::DNSSD) }, 0);
    240         return;
    241     }
    242     pendingRequest.release();
    243 
    244     error = DNSServiceSetDispatchQueue(service, dispatch_get_main_queue());
    245     if (error) {
    246         RELEASE_LOG_IF_ALLOWED(sessionID, "resolveMDNSName DNSServiceSetDispatchQueue error %d", error);
    247         m_connection.connection().send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { requestIdentifier, makeUnexpected(MDNSRegisterError::DNSSD) }, 0);
    248     }
    249 }
    250159#else
    251160void NetworkMDNSRegister::unregisterMDNSNames(WebCore::DocumentIdentifier)
     
    259168}
    260169
    261 void NetworkMDNSRegister::resolveMDNSName(uint64_t requestIdentifier, PAL::SessionID sessionID, const String& name)
    262 {
    263     RELEASE_LOG_IF_ALLOWED(sessionID, "resolveMDNSName not implemented");
    264     m_connection.connection().send(Messages::WebMDNSRegister::FinishedResolvingMDNSName { requestIdentifier, makeUnexpected(MDNSRegisterError::NotImplemented) }, 0);
    265 }
    266 
    267170#endif
    268171
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkMDNSRegister.messages.in

    r237367 r237568  
    2626    UnregisterMDNSNames(WebCore::DocumentIdentifier documentIdentifier)
    2727    RegisterMDNSName(uint64_t requestIdentifier, PAL::SessionID sessionID, WebCore::DocumentIdentifier documentIdentifier, String ipAddress)
    28     ResolveMDNSName(uint64_t requestIdentifier, PAL::SessionID sessionID, String name)
    2928}
    3029
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp

    r237367 r237568  
    3131#include "LibWebRTCNetwork.h"
    3232#include "WebProcess.h"
     33#include <webrtc/api/asyncresolverfactory.h>
    3334#include <webrtc/pc/peerconnectionfactory.h>
    3435
     
    3637using namespace WebCore;
    3738
     39class AsyncResolverFactory : public webrtc::AsyncResolverFactory {
     40private:
     41    rtc::AsyncResolverInterface* Create() final
     42    {
     43        return WebProcess::singleton().libWebRTCNetwork().socketFactory().createAsyncResolver();
     44    }
     45};
     46
    3847rtc::scoped_refptr<webrtc::PeerConnectionInterface> LibWebRTCProvider::createPeerConnection(webrtc::PeerConnectionObserver& observer, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
    3948{
    40     return WebCore::LibWebRTCProvider::createPeerConnection(observer, WebProcess::singleton().libWebRTCNetwork().monitor(), WebProcess::singleton().libWebRTCNetwork().socketFactory(), WTFMove(configuration));
     49    return WebCore::LibWebRTCProvider::createPeerConnection(observer, WebProcess::singleton().libWebRTCNetwork().monitor(), WebProcess::singleton().libWebRTCNetwork().socketFactory(), WTFMove(configuration), std::make_unique<AsyncResolverFactory>());
    4150}
    4251
     
    5665}
    5766
    58 void LibWebRTCProvider::resolveMDNSName(PAL::SessionID sessionID, const String& name, CompletionHandler<void(IPAddressOrError&&)>&& callback)
    59 {
    60     WebProcess::singleton().libWebRTCNetwork().mdnsRegister().resolveMDNSName(sessionID, name, WTFMove(callback));
    61 }
    62 
    6367} // namespace WebKit
    6468
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h

    r237367 r237568  
    5555    void unregisterMDNSNames(uint64_t documentIdentifier) final;
    5656    void registerMDNSName(PAL::SessionID, uint64_t documentIdentifier, const String& ipAddress, CompletionHandler<void(MDNSNameOrError&&)>&&) final;
    57     void resolveMDNSName(PAL::SessionID, const String& name, CompletionHandler<void(IPAddressOrError&&)>&&) final;
    5857    void disableNonLocalhostConnections() final;
    5958};
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCResolver.cpp

    r235205 r237568  
    7878        return;
    7979
     80    if (m_isProvidingResults) {
     81        m_shouldDestroy = true;
     82        return;
     83    }
     84
    8085    auto identifier = m_identifier;
    8186    sendOnMainThread([identifier](IPC::Connection& connection) {
     
    8388    });
    8489
     90    doDestroy();
     91}
     92
     93void LibWebRTCResolver::doDestroy()
     94{
    8595    // Let's take the resolver so that it gets destroyed at the end of this function.
    8696    auto resolver = WebProcess::singleton().libWebRTCNetwork().socketFactory().takeResolver(m_identifier);
     
    91101{
    92102    m_addresses = addresses;
     103    m_isProvidingResults = true;
    93104    SignalDone(this);
     105    m_isProvidingResults = false;
     106    if (m_shouldDestroy)
     107        doDestroy();
    94108}
    95109
     
    97111{
    98112    m_error = error;
     113    m_isProvidingResults = true;
    99114    SignalDone(this);
     115    m_isProvidingResults = false;
     116    if (m_shouldDestroy)
     117        doDestroy();
    100118}
    101119
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCResolver.h

    r235205 r237568  
    5656    void Destroy(bool) final;
    5757
     58    void doDestroy();
    5859    void setError(int);
    5960    void setResolvedAddress(const Vector<rtc::IPAddress>&);
     
    6768    uint16_t m_port { 0 };
    6869    bool m_isResolving { false };
     70    bool m_isProvidingResults { false };
     71    bool m_shouldDestroy { false };
    6972};
    7073
  • trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h

    r237367 r237568  
    5252    void disableNonLocalhostConnections() { m_disableNonLocalhostConnections = true; }
    5353
     54    rtc::AsyncResolverInterface* createAsyncResolver() { return CreateAsyncResolver(); }
     55
    5456private:
    5557    rtc::AsyncPacketSocket* CreateUdpSocket(const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort) final;
  • trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.cpp

    r237367 r237568  
    5353}
    5454
    55 void WebMDNSRegister::finishedResolvingMDNSName(uint64_t identifier, LibWebRTCProvider::IPAddressOrError&& result)
    56 {
    57     auto callback = m_pendingResolutions.take(identifier);
    58     if (callback)
    59         callback(WTFMove(result));
    60 }
    61 
    6255void WebMDNSRegister::unregisterMDNSNames(uint64_t documentIdentifier)
    6356{
     
    9083}
    9184
    92 void WebMDNSRegister::resolveMDNSName(PAL::SessionID sessionID, const String& name, CompletionHandler<void(LibWebRTCProvider::IPAddressOrError&&)>&& callback)
    93 {
    94     m_pendingResolutions.add(++m_pendingRequestsIdentifier, WTFMove(callback));
    95 
    96     auto& connection = WebProcess::singleton().ensureNetworkProcessConnection().connection();
    97     if (!connection.send(Messages::NetworkMDNSRegister::ResolveMDNSName { m_pendingRequestsIdentifier, sessionID, name }, 0))
    98         finishedResolvingMDNSName(m_pendingRequestsIdentifier, makeUnexpected(MDNSRegisterError::Internal));
    99 }
    100 
    10185} // namespace WebKit
    10286
  • trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.h

    r237367 r237568  
    4747    void unregisterMDNSNames(uint64_t documentIdentifier);
    4848    void registerMDNSName(PAL::SessionID, uint64_t documentIdentifier, const String& ipAddress, CompletionHandler<void(WebCore::LibWebRTCProvider::MDNSNameOrError&&)>&&);
    49     void resolveMDNSName(PAL::SessionID, const String& name, CompletionHandler<void(WebCore::LibWebRTCProvider::IPAddressOrError&&)>&&);
    5049
    5150    void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
     
    5352private:
    5453    void finishedRegisteringMDNSName(uint64_t, WebCore::LibWebRTCProvider::MDNSNameOrError&&);
    55     void finishedResolvingMDNSName(uint64_t, WebCore::LibWebRTCProvider::IPAddressOrError&&);
    5654
    5755    struct PendingRegistration {
  • trunk/Source/WebKit/WebProcess/Network/webrtc/WebMDNSRegister.messages.in

    r237367 r237568  
    2525messages -> WebMDNSRegister {
    2626    void FinishedRegisteringMDNSName(uint64_t identifier, WebCore::LibWebRTCProvider::MDNSNameOrError result)
    27     void FinishedResolvingMDNSName(uint64_t identifier, WebCore::LibWebRTCProvider::IPAddressOrError result)
    2827}
    2928
Note: See TracChangeset for help on using the changeset viewer.