Changeset 214413 in webkit


Ignore:
Timestamp:
Mar 27, 2017, 8:43:34 AM (8 years ago)
Author:
achristensen@apple.com
Message:

Make WebSockets work in network process
https://bugs.webkit.org/show_bug.cgi?id=169930

Reviewed by Youenn Fablet.

Source/WebCore:

Covered by 136 existing tests in http/tests/websocket/tests/hybi
This also does fine with the 544 websocket tests in the web-platform-tests which we have not yet imported.
Also added http/tests/websocket/tests/hybi/network-process-crash-error.html
to test a new condition that couldn't happen before this move: the NetworkProcess crashing.

  • Modules/websockets/WebSocketChannel.cpp:

(WebCore::WebSocketChannel::fail):
We were asserting that didCloseSocketStream was called. It is still called,
but not synchronously like it used to. This assertion is now invalid, but tests
that would hit it still pass.

  • platform/network/cf/SocketStreamHandleImplCFNet.cpp:

(WebCore::SocketStreamHandleImpl::platformSendInternal):
CFWriteStreamCanAcceptBytes crashes if you give it a null parameter, and that can happen now.
If we have no write stream, then we cannot write. Tests that hit this pass still.

Source/WebKit2:

This adds WebSocketStream, which is a SocketStreamHandle that sends asynchronous
messages to a NetworkSocketStream in the NetworkProcess. WebKit1 uses a SocketStreamHandleImpl
still, but WebKit2 now has a SocketStreamHandleImpl in the NetworkProcess owned by the
NetworkSocketStream, which is a SocketStreamHandleClient that sends asynchronous messages back
to the WebProcess. WebSocketStream's implementation of SocketStreamHandle::platformSend is special
because it stores the completion handler in a map and asynchronously reports to the caller whether
it succeeded or not. If the network processes crashes before the completion handlers are called,
then they are called indicating failure and an error is reported, but that never happens, right?

  • CMakeLists.txt:
  • DerivedSources.make:
  • NetworkProcess/NetworkConnectionToWebProcess.cpp:

(WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
(WebKit::NetworkConnectionToWebProcess::createSocketStream):
(WebKit::NetworkConnectionToWebProcess::destroySocketStream):

  • NetworkProcess/NetworkConnectionToWebProcess.h:
  • NetworkProcess/NetworkConnectionToWebProcess.messages.in:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::setAllowsAnySSLCertificateForWebSocket):

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • NetworkProcess/NetworkSocketStream.cpp: Added.

(WebKit::NetworkSocketStream::create):
(WebKit::NetworkSocketStream::NetworkSocketStream):
(WebKit::NetworkSocketStream::sendData):
(WebKit::NetworkSocketStream::close):
(WebKit::NetworkSocketStream::didOpenSocketStream):
(WebKit::NetworkSocketStream::didCloseSocketStream):
(WebKit::NetworkSocketStream::didReceiveSocketStreamData):
(WebKit::NetworkSocketStream::didFailToReceiveSocketStreamData):
(WebKit::NetworkSocketStream::didUpdateBufferedAmount):
(WebKit::NetworkSocketStream::didFailSocketStream):
(WebKit::NetworkSocketStream::messageSenderConnection):
(WebKit::NetworkSocketStream::messageSenderDestinationID):

  • NetworkProcess/NetworkSocketStream.h: Added.
  • NetworkProcess/NetworkSocketStream.messages.in: Added.
  • UIProcess/API/C/WKContext.cpp:

(WKContextSetAllowsAnySSLCertificateForWebSocketTesting):
(WKContextTerminateNetworkProcess):

  • UIProcess/API/C/WKContextPrivate.h:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::sendSyncToNetworkingProcess):
(WebKit::WebProcessPool::setAllowsAnySSLCertificateForWebSocket):
(WebKit::WebProcessPool::terminateNetworkProcess):

  • UIProcess/WebProcessPool.h:
  • WebKit2.xcodeproj/project.pbxproj:
  • WebProcess/Network/NetworkProcessConnection.cpp:

(WebKit::NetworkProcessConnection::didReceiveMessage):

  • WebProcess/Network/WebSocketProvider.cpp:

(WebKit::WebSocketProvider::createSocketStreamHandle):

  • WebProcess/Network/WebSocketStream.cpp: Added.

(WebKit::globalWebSocketStreamMap):
(WebKit::WebSocketStream::streamWithIdentifier):
(WebKit::WebSocketStream::networkProcessCrashed):
(WebKit::WebSocketStream::create):
(WebKit::WebSocketStream::WebSocketStream):
(WebKit::WebSocketStream::~WebSocketStream):
(WebKit::WebSocketStream::messageSenderConnection):
(WebKit::WebSocketStream::messageSenderDestinationID):
(WebKit::WebSocketStream::platformSend):
(WebKit::WebSocketStream::didSendData):
(WebKit::WebSocketStream::platformClose):
(WebKit::WebSocketStream::bufferedAmount):
(WebKit::WebSocketStream::didOpenSocketStream):
(WebKit::WebSocketStream::didCloseSocketStream):
(WebKit::WebSocketStream::didReceiveSocketStreamData):
(WebKit::WebSocketStream::didFailToReceiveSocketStreamData):
(WebKit::WebSocketStream::didUpdateBufferedAmount):
(WebKit::WebSocketStream::didFailSocketStream):

  • WebProcess/Network/WebSocketStream.h: Added.
  • WebProcess/Network/WebSocketStream.messages.in: Added.
  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::networkProcessConnectionClosed):

Tools:

  • WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:

Add terminateNetworkProcess for the new test
http/tests/websocket/tests/hybi/network-process-crash-error.html

  • WebKitTestRunner/InjectedBundle/TestRunner.cpp:

(WTR::TestRunner::setAllowsAnySSLCertificate):
(WTR::TestRunner::terminateNetworkProcess):

  • WebKitTestRunner/InjectedBundle/TestRunner.h:
  • WebKitTestRunner/TestController.cpp:

(WTR::TestController::setAllowsAnySSLCertificate):
(WTR::TestController::terminateNetworkProcess):

  • WebKitTestRunner/TestController.h:
  • WebKitTestRunner/TestInvocation.cpp:

(WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):

  • WebKitTestRunner/cocoa/TestControllerCocoa.mm:

(WTR::TestController::platformContext):

  • WebKitTestRunner/gtk/TestControllerGtk.cpp:

(WTR::TestController::platformContext):
(WTR::TestController::platformLibraryPathForTesting):
Add some infrastructure for http/tests/websocket/tests/hybi/simple-wss.html
which calls testRunner.setAllowsAnySSLCertificate. It used to only be effective
for the WebProcess, but SocketStreamHandleImpl::createStreams is now in the NetworkProcess,
and we need its call to Settings::allowsAnySSLCertificate to be loosened for this test,
which tests that wss works, but our test certificate has an invalid certificate chain.
We want production software to not have the ability to have its security weakened, so this
is a test code path that is only implemented in WebKitTestRunner.

LayoutTests:

  • http/tests/websocket/tests/hybi/network-process-crash-error-expected.txt: Added.
  • http/tests/websocket/tests/hybi/network-process-crash-error.html: Added.
  • http/tests/websocket/tests/hybi/slow-reply_wsh.py: Added.

(web_socket_do_extra_handshake):
(web_socket_transfer_data):

  • platform/ios-simulator-wk1/TestExpectations:
  • platform/mac-wk1/TestExpectations:
  • platform/win/TestExpectations:
Location:
trunk
Files:
9 added
33 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r214411 r214413  
     12017-03-27  Alex Christensen  <achristensen@webkit.org>
     2
     3        Make WebSockets work in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=169930
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * http/tests/websocket/tests/hybi/network-process-crash-error-expected.txt: Added.
     9        * http/tests/websocket/tests/hybi/network-process-crash-error.html: Added.
     10        * http/tests/websocket/tests/hybi/slow-reply_wsh.py: Added.
     11        (web_socket_do_extra_handshake):
     12        (web_socket_transfer_data):
     13        * platform/ios-simulator-wk1/TestExpectations:
     14        * platform/mac-wk1/TestExpectations:
     15        * platform/win/TestExpectations:
     16
    1172017-03-27  Antoine Quint  <graouts@apple.com>
    218
  • trunk/LayoutTests/platform/ios-simulator-wk1/TestExpectations

    r213735 r214413  
    18861886fast/css/deferred-parsing/hover-test.html [ Skip ]
    18871887
     1888# There is not NetworkProcess in WK1, so it can't crash.
     1889http/tests/websocket/tests/hybi/network-process-crash-error.html [ Skip ]
  • trunk/LayoutTests/platform/mac-wk1/TestExpectations

    r214128 r214413  
    167167########################################
    168168
    169 # This test is WebKit2-only
     169# These tests are WebKit2-only
    170170http/tests/contentfiltering/load-substitute-data-from-appcache.html
    171171fast/dom/Window/child-window-focus.html
     
    335335webkit.org/b/167752 media/modern-media-controls/icon-button/icon-button-active-state.html [ Pass Timeout ]
    336336webkit.org/b/167477 [ Debug ] media/modern-media-controls/play-pause-button/play-pause-button.html [ Pass Timeout ]
     337
     338# There is not NetworkProcess in WK1, so it can't crash.
     339http/tests/websocket/tests/hybi/network-process-crash-error.html [ Skip ]
  • trunk/LayoutTests/platform/win/TestExpectations

    r213676 r214413  
    38033803# webglcontextchanged event not supported
    38043804fast/canvas/webgl/webglcontextchangedevent.html [ Skip ]
     3805
     3806# There is not NetworkProcess in WK1, so it can't crash.
     3807http/tests/websocket/tests/hybi/network-process-crash-error.html [ Skip ]
  • trunk/Source/WebCore/ChangeLog

    r214411 r214413  
     12017-03-27  Alex Christensen  <achristensen@webkit.org>
     2
     3        Make WebSockets work in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=169930
     5
     6        Reviewed by Youenn Fablet.
     7
     8        Covered by 136 existing tests in http/tests/websocket/tests/hybi
     9        This also does fine with the 544 websocket tests in the web-platform-tests which we have not yet imported.
     10        Also added http/tests/websocket/tests/hybi/network-process-crash-error.html
     11        to test a new condition that couldn't happen before this move: the NetworkProcess crashing.
     12
     13        * Modules/websockets/WebSocketChannel.cpp:
     14        (WebCore::WebSocketChannel::fail):
     15        We were asserting that didCloseSocketStream was called.  It is still called,
     16        but not synchronously like it used to.  This assertion is now invalid, but tests
     17        that would hit it still pass.
     18        * platform/network/cf/SocketStreamHandleImplCFNet.cpp:
     19        (WebCore::SocketStreamHandleImpl::platformSendInternal):
     20        CFWriteStreamCanAcceptBytes crashes if you give it a null parameter, and that can happen now.
     21        If we have no write stream, then we cannot write.  Tests that hit this pass still.
     22
    1232017-03-27  Antoine Quint  <graouts@apple.com>
    224
  • trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp

    r214190 r214413  
    239239
    240240    if (m_handle && !m_closed)
    241         m_handle->disconnect(); // Will call didClose().
    242 
    243     // We should be closed by now, but if we never got a handshake then we never even opened.
    244     ASSERT(m_closed || !m_handshake);
     241        m_handle->disconnect(); // Will call didCloseSocketStream() but maybe not synchronously.
    245242}
    246243
     
    367364    }
    368365    m_shouldDiscardReceivedData = true;
     366    if (m_client)
     367        m_client->didReceiveMessageError();
    369368    handle.disconnect();
    370369}
  • trunk/Source/WebCore/platform/network/cf/SocketStreamHandleImplCFNet.cpp

    r214114 r214413  
    656656std::optional<size_t> SocketStreamHandleImpl::platformSendInternal(const char* data, size_t length)
    657657{
     658    if (!m_writeStream)
     659        return std::nullopt;
     660
    658661    if (!CFWriteStreamCanAcceptBytes(m_writeStream.get()))
    659662        return std::nullopt;
  • trunk/Source/WebKit2/CMakeLists.txt

    r214033 r214413  
    120120    NetworkProcess/NetworkResourceLoader.cpp
    121121    NetworkProcess/NetworkSession.cpp
     122    NetworkProcess/NetworkSocketStream.cpp
    122123
    123124    NetworkProcess/cache/NetworkCache.cpp
     
    514515    WebProcess/Network/WebResourceLoader.cpp
    515516    WebProcess/Network/WebSocketProvider.cpp
     517    WebProcess/Network/WebSocketStream.cpp
    516518
    517519    WebProcess/Notifications/NotificationPermissionRequestManager.cpp
     
    597599    NetworkProcess/NetworkProcess.messages.in
    598600    NetworkProcess/NetworkResourceLoader.messages.in
     601    NetworkProcess/NetworkSocketStream.messages.in
    599602
    600603    NetworkProcess/webrtc/NetworkRTCMonitor.messages.in
     
    664667    WebProcess/Network/NetworkProcessConnection.messages.in
    665668    WebProcess/Network/WebResourceLoader.messages.in
     669    WebProcess/Network/WebSocketStream.messages.in
    666670
    667671    WebProcess/Notifications/WebNotificationManager.messages.in
  • trunk/Source/WebKit2/ChangeLog

    r214412 r214413  
     12017-03-27  Alex Christensen  <achristensen@webkit.org>
     2
     3        Make WebSockets work in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=169930
     5
     6        Reviewed by Youenn Fablet.
     7
     8        This adds WebSocketStream, which is a SocketStreamHandle that sends asynchronous
     9        messages to a NetworkSocketStream in the NetworkProcess.  WebKit1 uses a SocketStreamHandleImpl
     10        still, but WebKit2 now has a SocketStreamHandleImpl in the NetworkProcess owned by the
     11        NetworkSocketStream, which is a SocketStreamHandleClient that sends asynchronous messages back
     12        to the WebProcess.  WebSocketStream's implementation of SocketStreamHandle::platformSend is special
     13        because it stores the completion handler in a map and asynchronously reports to the caller whether
     14        it succeeded or not.  If the network processes crashes before the completion handlers are called,
     15        then they are called indicating failure and an error is reported, but that never happens, right?
     16
     17        * CMakeLists.txt:
     18        * DerivedSources.make:
     19        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     20        (WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
     21        (WebKit::NetworkConnectionToWebProcess::createSocketStream):
     22        (WebKit::NetworkConnectionToWebProcess::destroySocketStream):
     23        * NetworkProcess/NetworkConnectionToWebProcess.h:
     24        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
     25        * NetworkProcess/NetworkProcess.cpp:
     26        (WebKit::NetworkProcess::setAllowsAnySSLCertificateForWebSocket):
     27        * NetworkProcess/NetworkProcess.h:
     28        * NetworkProcess/NetworkProcess.messages.in:
     29        * NetworkProcess/NetworkSocketStream.cpp: Added.
     30        (WebKit::NetworkSocketStream::create):
     31        (WebKit::NetworkSocketStream::NetworkSocketStream):
     32        (WebKit::NetworkSocketStream::sendData):
     33        (WebKit::NetworkSocketStream::close):
     34        (WebKit::NetworkSocketStream::didOpenSocketStream):
     35        (WebKit::NetworkSocketStream::didCloseSocketStream):
     36        (WebKit::NetworkSocketStream::didReceiveSocketStreamData):
     37        (WebKit::NetworkSocketStream::didFailToReceiveSocketStreamData):
     38        (WebKit::NetworkSocketStream::didUpdateBufferedAmount):
     39        (WebKit::NetworkSocketStream::didFailSocketStream):
     40        (WebKit::NetworkSocketStream::messageSenderConnection):
     41        (WebKit::NetworkSocketStream::messageSenderDestinationID):
     42        * NetworkProcess/NetworkSocketStream.h: Added.
     43        * NetworkProcess/NetworkSocketStream.messages.in: Added.
     44        * UIProcess/API/C/WKContext.cpp:
     45        (WKContextSetAllowsAnySSLCertificateForWebSocketTesting):
     46        (WKContextTerminateNetworkProcess):
     47        * UIProcess/API/C/WKContextPrivate.h:
     48        * UIProcess/WebProcessPool.cpp:
     49        (WebKit::WebProcessPool::sendSyncToNetworkingProcess):
     50        (WebKit::WebProcessPool::setAllowsAnySSLCertificateForWebSocket):
     51        (WebKit::WebProcessPool::terminateNetworkProcess):
     52        * UIProcess/WebProcessPool.h:
     53        * WebKit2.xcodeproj/project.pbxproj:
     54        * WebProcess/Network/NetworkProcessConnection.cpp:
     55        (WebKit::NetworkProcessConnection::didReceiveMessage):
     56        * WebProcess/Network/WebSocketProvider.cpp:
     57        (WebKit::WebSocketProvider::createSocketStreamHandle):
     58        * WebProcess/Network/WebSocketStream.cpp: Added.
     59        (WebKit::globalWebSocketStreamMap):
     60        (WebKit::WebSocketStream::streamWithIdentifier):
     61        (WebKit::WebSocketStream::networkProcessCrashed):
     62        (WebKit::WebSocketStream::create):
     63        (WebKit::WebSocketStream::WebSocketStream):
     64        (WebKit::WebSocketStream::~WebSocketStream):
     65        (WebKit::WebSocketStream::messageSenderConnection):
     66        (WebKit::WebSocketStream::messageSenderDestinationID):
     67        (WebKit::WebSocketStream::platformSend):
     68        (WebKit::WebSocketStream::didSendData):
     69        (WebKit::WebSocketStream::platformClose):
     70        (WebKit::WebSocketStream::bufferedAmount):
     71        (WebKit::WebSocketStream::didOpenSocketStream):
     72        (WebKit::WebSocketStream::didCloseSocketStream):
     73        (WebKit::WebSocketStream::didReceiveSocketStreamData):
     74        (WebKit::WebSocketStream::didFailToReceiveSocketStreamData):
     75        (WebKit::WebSocketStream::didUpdateBufferedAmount):
     76        (WebKit::WebSocketStream::didFailSocketStream):
     77        * WebProcess/Network/WebSocketStream.h: Added.
     78        * WebProcess/Network/WebSocketStream.messages.in: Added.
     79        * WebProcess/WebProcess.cpp:
     80        (WebKit::WebProcess::networkProcessConnectionClosed):
     81
    1822017-03-27  Adrian Perez de Castro  <aperez@igalia.com>
    283
  • trunk/Source/WebKit2/DerivedSources.make

    r214027 r214413  
    109109    NetworkRTCSocket \
    110110    NetworkResourceLoader \
     111    NetworkSocketStream \
    111112    PluginControllerProxy \
    112113    PluginProcess \
     
    165166    WebResourceLoader \
    166167    WebResourceLoadStatisticsStore \
     168    WebSocketStream \
    167169    WebUserContentController \
    168170    WebUserContentControllerProxy \
  • trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r213759 r214413  
    4141#include "NetworkResourceLoader.h"
    4242#include "NetworkResourceLoaderMessages.h"
     43#include "NetworkSocketStream.h"
     44#include "NetworkSocketStreamMessages.h"
    4345#include "RemoteNetworkingContext.h"
    4446#include "SessionTracker.h"
     
    99101    }
    100102
     103    if (decoder.messageReceiverName() == Messages::NetworkSocketStream::messageReceiverName()) {
     104        auto socketIterator = m_networkSocketStreams.find(decoder.destinationID());
     105        if (socketIterator != m_networkSocketStreams.end()) {
     106            socketIterator->value->didReceiveMessage(connection, decoder);
     107            if (decoder.messageName() == Messages::NetworkSocketStream::Close::name())
     108                m_networkSocketStreams.remove(socketIterator);
     109        }
     110        return;
     111    }
     112
    101113#if USE(LIBWEBRTC)
    102114    if (decoder.messageReceiverName() == Messages::NetworkRTCSocket::messageReceiverName()) {
     
    159171void NetworkConnectionToWebProcess::didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference, IPC::StringReference)
    160172{
     173}
     174
     175void NetworkConnectionToWebProcess::createSocketStream(URL&& url, SessionID sessionID, String cachePartition, uint64_t identifier)
     176{
     177    ASSERT(!m_networkSocketStreams.contains(identifier));
     178    m_networkSocketStreams.set(identifier, NetworkSocketStream::create(WTFMove(url), sessionID, cachePartition, identifier, m_connection));
     179}
     180
     181void NetworkConnectionToWebProcess::destroySocketStream(uint64_t identifier)
     182{
     183    ASSERT(m_networkSocketStreams.get(identifier));
     184    m_networkSocketStreams.remove(identifier);
    161185}
    162186
  • trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h

    r213759 r214413  
    4444class NetworkConnectionToWebProcess;
    4545class NetworkResourceLoader;
     46class NetworkSocketStream;
    4647class SyncNetworkResourceLoader;
    4748typedef uint64_t ResourceLoadIdentifier;
     
    105106    void storeDerivedDataToCache(const WebKit::NetworkCache::DataKey&, const IPC::DataReference&);
    106107
     108    void createSocketStream(WebCore::URL&&, WebCore::SessionID, String cachePartition, uint64_t);
     109    void destroySocketStream(uint64_t);
     110   
    107111    void ensureLegacyPrivateBrowsingSession();
    108112
     
    113117    Ref<IPC::Connection> m_connection;
    114118
     119    HashMap<uint64_t, RefPtr<NetworkSocketStream>> m_networkSocketStreams;
    115120    HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader>> m_networkResourceLoaders;
    116121    HashMap<String, RefPtr<WebCore::BlobDataFileReference>> m_blobDataFileReferences;
  • trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in

    r213759 r214413  
    5252    StoreDerivedDataToCache(WebKit::NetworkCache::DataKey key, IPC::DataReference data)
    5353
     54    CreateSocketStream(WebCore::URL url, WebCore::SessionID sessionID, String cachePartition, uint64_t identifier)
     55
    5456    EnsureLegacyPrivateBrowsingSession()
    5557}
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp

    r213927 r214413  
    6262#include <WebCore/SecurityOriginHash.h>
    6363#include <WebCore/SessionID.h>
     64#include <WebCore/Settings.h>
    6465#include <WebCore/URLParser.h>
    6566#include <wtf/OptionSet.h>
     
    582583}
    583584
     585void NetworkProcess::setAllowsAnySSLCertificateForWebSocket(bool allows)
     586{
     587    Settings::setAllowsAnySSLCertificate(allows);
     588}
     589
    584590void NetworkProcess::logDiagnosticMessage(uint64_t webPageID, const String& message, const String& description, ShouldSample shouldSample)
    585591{
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h

    r213871 r214413  
    190190    void getNetworkProcessStatistics(uint64_t callbackID);
    191191    void clearCacheForAllOrigins(uint32_t cachesToClear);
     192    void setAllowsAnySSLCertificateForWebSocket(bool);
    192193
    193194    void didGrantSandboxExtensionsToDatabaseProcessForBlobs(uint64_t requestID);
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in

    r213871 r214413  
    6363    SetCookieStoragePartitioningEnabled(bool enabled)
    6464#endif
     65    SetAllowsAnySSLCertificateForWebSocket(bool enabled) -> ()
    6566
    6667    AllowSpecificHTTPSCertificateForHost(WebCore::CertificateInfo certificate, String host)
  • trunk/Source/WebKit2/UIProcess/API/C/WKContext.cpp

    r213690 r214413  
    528528}
    529529
     530void WKContextSetAllowsAnySSLCertificateForWebSocketTesting(WKContextRef context, bool allows)
     531{
     532    toImpl(context)->setAllowsAnySSLCertificateForWebSocket(allows);
     533}
     534
    530535void WKContextClearCachedCredentials(WKContextRef context)
    531536{
     
    574579}
    575580
     581void WKContextTerminateNetworkProcess(WKContextRef context)
     582{
     583    toImpl(context)->terminateNetworkProcess();
     584}
     585
    576586pid_t WKContextGetNetworkProcessIdentifier(WKContextRef contextRef)
    577587{
  • trunk/Source/WebKit2/UIProcess/API/C/WKContextPrivate.h

    r212832 r214413  
    8282WK_EXPORT void WKContextSetUsesNetworkProcess(WKContextRef, bool);
    8383
     84WK_EXPORT void WKContextTerminateNetworkProcess(WKContextRef);
     85
     86WK_EXPORT void WKContextSetAllowsAnySSLCertificateForWebSocketTesting(WKContextRef, bool);
     87   
    8488// Test only. Should be called before any secondary processes are started.
    8589WK_EXPORT void WKContextUseTestingNetworkSession(WKContextRef context);
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp

    r214127 r214413  
    12271227}
    12281228
     1229template<typename T, typename U>
     1230void WebProcessPool::sendSyncToNetworkingProcess(T&& message, U&& reply)
     1231{
     1232    if (m_networkProcess && m_networkProcess->canSendMessage())
     1233        m_networkProcess->sendSync(std::forward<T>(message), std::forward<U>(reply), 0);
     1234}
     1235
     1236void WebProcessPool::setAllowsAnySSLCertificateForWebSocket(bool allows)
     1237{
     1238    sendSyncToNetworkingProcess(Messages::NetworkProcess::SetAllowsAnySSLCertificateForWebSocket(allows), Messages::NetworkProcess::SetAllowsAnySSLCertificateForWebSocket::Reply());
     1239}
     1240
    12291241void WebProcessPool::clearCachedCredentials()
    12301242{
     
    12431255    m_databaseProcess = nullptr;
    12441256#endif
     1257}
     1258
     1259void WebProcessPool::terminateNetworkProcess()
     1260{
     1261    if (!m_networkProcess)
     1262        return;
     1263   
     1264    m_networkProcess->terminate();
     1265    m_networkProcess = nullptr;
    12451266}
    12461267
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.h

    r214127 r214413  
    162162    // Sends the message to WebProcess or NetworkProcess as approporiate for current process model.
    163163    template<typename T> void sendToNetworkingProcess(T&& message);
     164    template<typename T, typename U> void sendSyncToNetworkingProcess(T&& message, U&& reply);
    164165    template<typename T> void sendToNetworkingProcessRelaunchingIfNecessary(T&& message);
    165166
     
    255256    bool isUsingTestingNetworkSession() const { return m_shouldUseTestingNetworkSession; }
    256257
     258    void setAllowsAnySSLCertificateForWebSocket(bool);
     259
    257260    void clearCachedCredentials();
    258261    void terminateDatabaseProcess();
     262    void terminateNetworkProcess();
    259263
    260264    void reportWebContentCPUTime(int64_t cpuTime, uint64_t activityState);
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r214403 r214413  
    11301130                53DEA3661DDE423100E82648 /* json.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 53DEA3651DDE422E00E82648 /* json.hpp */; };
    11311131                5C052F261C6D3BD30076E919 /* AuthenticationManagerCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C052F241C6D3AB60076E919 /* AuthenticationManagerCocoa.mm */; };
     1132                5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B17741E7C879C00E9123C /* NetworkSocketStreamMessageReceiver.cpp */; };
     1133                5C0B17791E7C882100E9123C /* WebSocketStreamMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B17761E7C879C00E9123C /* WebSocketStreamMessageReceiver.cpp */; };
     1134                5C0B177C1E7C885400E9123C /* WebSocketStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B177A1E7C884F00E9123C /* WebSocketStream.cpp */; };
     1135                5C0B17811E7C8C2600E9123C /* NetworkSocketStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B177D1E7C886700E9123C /* NetworkSocketStream.cpp */; };
    11321136                5C1426EC1C23F80900D41183 /* NetworkProcessCreationParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1426E21C23F80500D41183 /* NetworkProcessCreationParameters.cpp */; };
    11331137                5C1426ED1C23F80900D41183 /* NetworkProcessCreationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1426E31C23F80500D41183 /* NetworkProcessCreationParameters.h */; };
     
    33743378                579D18B71CCFE34B00B1974C /* PhotosSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PhotosSPI.h; sourceTree = "<group>"; };
    33753379                5C052F241C6D3AB60076E919 /* AuthenticationManagerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AuthenticationManagerCocoa.mm; path = Authentication/cocoa/AuthenticationManagerCocoa.mm; sourceTree = "<group>"; };
     3380                5C0B17741E7C879C00E9123C /* NetworkSocketStreamMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkSocketStreamMessageReceiver.cpp; sourceTree = "<group>"; };
     3381                5C0B17751E7C879C00E9123C /* NetworkSocketStreamMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkSocketStreamMessages.h; sourceTree = "<group>"; };
     3382                5C0B17761E7C879C00E9123C /* WebSocketStreamMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSocketStreamMessageReceiver.cpp; sourceTree = "<group>"; };
     3383                5C0B17771E7C879C00E9123C /* WebSocketStreamMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSocketStreamMessages.h; sourceTree = "<group>"; };
     3384                5C0B177A1E7C884F00E9123C /* WebSocketStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebSocketStream.cpp; path = Network/WebSocketStream.cpp; sourceTree = "<group>"; };
     3385                5C0B177B1E7C884F00E9123C /* WebSocketStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebSocketStream.h; path = Network/WebSocketStream.h; sourceTree = "<group>"; };
     3386                5C0B177D1E7C886700E9123C /* NetworkSocketStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkSocketStream.cpp; path = NetworkProcess/NetworkSocketStream.cpp; sourceTree = "<group>"; };
     3387                5C0B177E1E7C886700E9123C /* NetworkSocketStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSocketStream.h; path = NetworkProcess/NetworkSocketStream.h; sourceTree = "<group>"; };
     3388                5C0B177F1E7C886700E9123C /* NetworkSocketStream.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NetworkSocketStream.messages.in; path = NetworkProcess/NetworkSocketStream.messages.in; sourceTree = "<group>"; };
     3389                5C0B17801E7C888000E9123C /* WebSocketStream.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebSocketStream.messages.in; path = Network/WebSocketStream.messages.in; sourceTree = "<group>"; };
    33763390                5C1426E21C23F80500D41183 /* NetworkProcessCreationParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkProcessCreationParameters.cpp; path = NetworkProcess/NetworkProcessCreationParameters.cpp; sourceTree = "<group>"; };
    33773391                5C1426E31C23F80500D41183 /* NetworkProcessCreationParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkProcessCreationParameters.h; path = NetworkProcess/NetworkProcessCreationParameters.h; sourceTree = "<group>"; };
     
    58235837                        isa = PBXGroup;
    58245838                        children = (
     5839                                5C0B17801E7C888000E9123C /* WebSocketStream.messages.in */,
     5840                                5C0B177A1E7C884F00E9123C /* WebSocketStream.cpp */,
     5841                                5C0B177B1E7C884F00E9123C /* WebSocketStream.h */,
    58255842                                4130759E1DE85E650039EC69 /* webrtc */,
    58265843                                5105B0D4162F7A7A00E27709 /* NetworkProcessConnection.cpp */,
     
    58415858                        isa = PBXGroup;
    58425859                        children = (
     5860                                5C0B177D1E7C886700E9123C /* NetworkSocketStream.cpp */,
     5861                                5C0B177E1E7C886700E9123C /* NetworkSocketStream.h */,
     5862                                5C0B177F1E7C886700E9123C /* NetworkSocketStream.messages.in */,
    58435863                                E489D2821A0A2BE80078C06A /* cache */,
    58445864                                539BD5B21DADB0BA00F2E4E1 /* capture */,
     
    76527672                        isa = PBXGroup;
    76537673                        children = (
     7674                                5C0B17741E7C879C00E9123C /* NetworkSocketStreamMessageReceiver.cpp */,
     7675                                5C0B17751E7C879C00E9123C /* NetworkSocketStreamMessages.h */,
     7676                                5C0B17761E7C879C00E9123C /* WebSocketStreamMessageReceiver.cpp */,
     7677                                5C0B17771E7C879C00E9123C /* WebSocketStreamMessages.h */,
    76547678                                512F58A012A883AD00629530 /* AuthenticationManagerMessageReceiver.cpp */,
    76557679                                512F58A112A883AD00629530 /* AuthenticationManagerMessages.h */,
     
    1029310317                                8360349F1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp in Sources */,
    1029410318                                1A52C0F71A38CDC70016160A /* WebStorageNamespaceProvider.cpp in Sources */,
     10319                                5C0B177C1E7C885400E9123C /* WebSocketStream.cpp in Sources */,
    1029510320                                BCC5715C115ADAEF001CCAF9 /* WebSystemInterface.mm in Sources */,
    1029610321                                51032F18180F73BB00961BB7 /* WebToDatabaseProcessConnection.cpp in Sources */,
     
    1030710332                                1AAF08B719269E6D00B6390C /* WebUserContentControllerMessageReceiver.cpp in Sources */,
    1030810333                                1AAF08A1192681D100B6390C /* WebUserContentControllerProxy.cpp in Sources */,
     10334                                5C0B17811E7C8C2600E9123C /* NetworkSocketStream.cpp in Sources */,
    1030910335                                7C361D78192803BD0036A59D /* WebUserContentControllerProxyMessageReceiver.cpp in Sources */,
    1031010336                                15739BBE1B42046600D258C1 /* WebUserMediaClient.cpp in Sources */,
     
    1044310469                                374436881820E7240049579F /* WKObject.mm in Sources */,
    1044410470                                1ACC50F11CBC381D003C7D03 /* WKOpenPanelParameters.mm in Sources */,
     10471                                5C0B17791E7C882100E9123C /* WebSocketStreamMessageReceiver.cpp in Sources */,
    1044510472                                BC85806312B8505700EDEB2E /* WKOpenPanelParametersRef.cpp in Sources */,
    1044610473                                BC85806212B8505700EDEB2E /* WKOpenPanelResultListener.cpp in Sources */,
     
    1049910526                                07297FA21C186ADB003F0735 /* WKUserMediaPermissionCheck.cpp in Sources */,
    1050010527                                4A3CC18E19B07B8500D14AEF /* WKUserMediaPermissionRequest.cpp in Sources */,
     10528                                5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */,
    1050110529                                1AAF089A19267EE500B6390C /* WKUserScript.mm in Sources */,
    1050210530                                7C89D2A31A678875003A5FDE /* WKUserScriptRef.cpp in Sources */,
  • trunk/Source/WebKit2/WebProcess/Network/NetworkProcessConnection.cpp

    r211441 r214413  
    3737#include "WebRTCSocketMessages.h"
    3838#include "WebResourceLoaderMessages.h"
     39#include "WebSocketStream.h"
     40#include "WebSocketStreamMessages.h"
    3941#include <WebCore/CachedResource.h>
    4042#include <WebCore/MemoryCache.h>
     
    6163        if (auto* webResourceLoader = WebProcess::singleton().webLoaderStrategy().webResourceLoaderForIdentifier(decoder.destinationID()))
    6264            webResourceLoader->didReceiveWebResourceLoaderMessage(connection, decoder);
     65        return;
     66    }
     67    if (decoder.messageReceiverName() == Messages::WebSocketStream::messageReceiverName()) {
     68        if (auto* stream = WebSocketStream::streamWithIdentifier(decoder.destinationID()))
     69            stream->didReceiveMessage(connection, decoder);
    6370        return;
    6471    }
  • trunk/Source/WebKit2/WebProcess/Network/WebSocketProvider.cpp

    r211751 r214413  
    3434#if ENABLE(WEB_SOCKETS)
    3535
    36 #include <WebCore/SocketStreamHandleImpl.h>
     36#include "WebSocketStream.h"
    3737
    3838using namespace WebCore;
     
    4242Ref<SocketStreamHandle> WebSocketProvider::createSocketStreamHandle(const URL& url, SocketStreamHandleClient& client, SessionID sessionID, const String& credentialPartition)
    4343{
    44     // FIXME: This should return a proxy so we can do the actual network interactions in the NetworkProcess.
    45     return SocketStreamHandleImpl::create(url, client, sessionID, credentialPartition);
     44    return WebSocketStream::create(url, client, sessionID, credentialPartition);
    4645}
    4746
  • trunk/Source/WebKit2/WebProcess/WebProcess.cpp

    r214320 r214413  
    6464#include "WebProcessProxyMessages.h"
    6565#include "WebResourceLoadStatisticsStoreMessages.h"
     66#include "WebSocketStream.h"
    6667#include "WebsiteData.h"
    6768#include "WebsiteDataType.h"
     
    11261127
    11271128    m_webLoaderStrategy.networkProcessCrashed();
     1129    WebSocketStream::networkProcessCrashed();
    11281130}
    11291131
  • trunk/Tools/ChangeLog

    r214399 r214413  
     12017-03-27  Alex Christensen  <achristensen@webkit.org>
     2
     3        Make WebSockets work in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=169930
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
     9        Add terminateNetworkProcess for the new test
     10        http/tests/websocket/tests/hybi/network-process-crash-error.html
     11        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
     12        (WTR::TestRunner::setAllowsAnySSLCertificate):
     13        (WTR::TestRunner::terminateNetworkProcess):
     14        * WebKitTestRunner/InjectedBundle/TestRunner.h:
     15        * WebKitTestRunner/TestController.cpp:
     16        (WTR::TestController::setAllowsAnySSLCertificate):
     17        (WTR::TestController::terminateNetworkProcess):
     18        * WebKitTestRunner/TestController.h:
     19        * WebKitTestRunner/TestInvocation.cpp:
     20        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
     21        (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
     22        * WebKitTestRunner/cocoa/TestControllerCocoa.mm:
     23        (WTR::TestController::platformContext):
     24        * WebKitTestRunner/gtk/TestControllerGtk.cpp:
     25        (WTR::TestController::platformContext):
     26        (WTR::TestController::platformLibraryPathForTesting):
     27        Add some infrastructure for http/tests/websocket/tests/hybi/simple-wss.html
     28        which calls testRunner.setAllowsAnySSLCertificate.  It used to only be effective
     29        for the WebProcess, but SocketStreamHandleImpl::createStreams is now in the NetworkProcess,
     30        and we need its call to Settings::allowsAnySSLCertificate to be loosened for this test,
     31        which tests that wss works, but our test certificate has an invalid certificate chain.
     32        We want production software to not have the ability to have its security weakened, so this
     33        is a test code path that is only implemented in WebKitTestRunner.
     34
    1352017-03-25  Jonathan Bedard  <jbedard@apple.com>
    236
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl

    r214080 r214413  
    271271
    272272    void setWebRTCLegacyAPIEnabled(boolean value);
     273
     274    void terminateNetworkProcess();
    273275};
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp

    r214080 r214413  
    433433void TestRunner::setAllowsAnySSLCertificate(bool enabled)
    434434{
    435     InjectedBundle::singleton().setAllowsAnySSLCertificate(enabled);
     435    auto& injectedBundle = InjectedBundle::singleton();
     436    injectedBundle.setAllowsAnySSLCertificate(enabled);
     437
     438    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("SetAllowsAnySSLCertificate"));
     439    WKRetainPtr<WKBooleanRef> messageBody(AdoptWK, WKBooleanCreate(enabled));
     440    WKBundlePagePostSynchronousMessageForTesting(injectedBundle.page()->page(), messageName.get(), messageBody.get(), nullptr);
    436441}
    437442
     
    11021107}
    11031108
     1109void TestRunner::terminateNetworkProcess()
     1110{
     1111    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("TerminateNetworkProcess"));
     1112    WKBundlePagePostMessage(InjectedBundle::singleton().page()->page(), messageName.get(), nullptr);
     1113}
     1114
    11041115static unsigned nextUIScriptCallbackID()
    11051116{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h

    r214080 r214413  
    372372    void setOpenPanelFiles(JSValueRef);
    373373
     374    void terminateNetworkProcess();
     375
    374376private:
    375377    TestRunner();
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r213764 r214413  
    889889}
    890890
     891void TestController::setAllowsAnySSLCertificate(bool allows)
     892{
     893    WKContextSetAllowsAnySSLCertificateForWebSocketTesting(platformContext(), allows);
     894}
     895
    891896static std::string testPath(WKURLRef url)
    892897{
     
    23032308    WKResourceLoadStatisticsManagerResetToConsistentState();
    23042309}
    2305    
     2310
     2311void TestController::terminateNetworkProcess()
     2312{
     2313    WKContextTerminateNetworkProcess(platformContext());
     2314}
     2315
    23062316#if !PLATFORM(COCOA)
    23072317void TestController::platformWillRunTest(const TestInvocation&)
  • trunk/Tools/WebKitTestRunner/TestController.h

    r213688 r214413  
    134134    void setAuthenticationUsername(String username) { m_authenticationUsername = username; }
    135135    void setAuthenticationPassword(String password) { m_authenticationPassword = password; }
     136    void setAllowsAnySSLCertificate(bool);
    136137
    137138    void setBlockAllPlugins(bool shouldBlock) { m_shouldBlockAllPlugins = shouldBlock; }
     
    168169    void setOpenPanelFileURLs(WKArrayRef fileURLs) { m_openPanelFileURLs = fileURLs; }
    169170
     171    void terminateNetworkProcess();
     172   
    170173private:
    171174    WKRetainPtr<WKPageConfigurationRef> generatePageConfiguration(WKContextConfigurationRef);
     
    193196    void platformRunUntil(bool& done, double timeout);
    194197    void platformDidCommitLoadForFrame(WKPageRef, WKFrameRef);
     198    WKContextRef platformContext();
    195199    WKPreferencesRef platformPreferences();
    196200    void initializeInjectedBundlePath();
  • trunk/Tools/WebKitTestRunner/TestInvocation.cpp

    r213688 r214413  
    720720    }
    721721
     722    if (WKStringIsEqualToUTF8CString(messageName, "TerminateNetworkProcess")) {
     723        ASSERT(!messageBody);
     724        TestController::singleton().terminateNetworkProcess();
     725        return;
     726    }
     727
    722728    if (WKStringIsEqualToUTF8CString(messageName, "RunUIProcessScript")) {
    723729        WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
     
    799805        return nullptr;
    800806    }
    801    
     807
     808    if (WKStringIsEqualToUTF8CString(messageName, "SetAllowsAnySSLCertificate")) {
     809        TestController::singleton().setAllowsAnySSLCertificate(WKBooleanGetValue(static_cast<WKBooleanRef>(messageBody)));
     810        return nullptr;
     811    }
     812
    802813    if (WKStringIsEqualToUTF8CString(messageName, "ImageCountInGeneralPasteboard")) {
    803814        unsigned count = TestController::singleton().imageCountInGeneralPasteboard();
  • trunk/Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm

    r209760 r214413  
    7272#endif
    7373    globalWebViewConfiguration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
     74#endif
     75}
     76
     77WKContextRef TestController::platformContext()
     78{
     79#if WK_API_ENABLED
     80    return (WKContextRef)globalWebViewConfiguration.processPool;
     81#else
     82    return nullptr;
    7483#endif
    7584}
  • trunk/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp

    r203777 r214413  
    134134}
    135135
     136WKContextRef TestController::platformContext()
     137{
     138    return nullptr;
     139}
     140
    136141const char* TestController::platformLibraryPathForTesting()
    137142{
    138     return 0;
     143    return nullptr;
    139144}
    140145
Note: See TracChangeset for help on using the changeset viewer.