Changeset 223277 in webkit


Ignore:
Timestamp:
Oct 12, 2017 11:44:47 PM (7 years ago)
Author:
beidson@apple.com
Message:

SW "Hello world".
https://bugs.webkit.org/show_bug.cgi?id=178187

Reviewed by Andy Estes.

Source/WebCore:

No new tests (Covered by changes to existing tests).

With this patch, SW scripts are actually compiled and run inside a ServiceWorkerGlobalScope environment
in the SW context process.

  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/WorkerScriptController.cpp:

(WebCore::WorkerScriptController::initScript):

  • dom/EventTargetFactory.in:
  • workers/WorkerGlobalScope.h:

(WebCore::WorkerGlobalScope::isServiceWorkerGlobalScope const):

  • workers/service/ServiceWorkerContextData.cpp: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.cpp.

(WebCore::ServiceWorkerContextData::isolatedCopy const):

  • workers/service/ServiceWorkerContextData.h:

(WebCore::ServiceWorkerContextData::encode const):
(WebCore::ServiceWorkerContextData::decode):

  • workers/service/ServiceWorkerGlobalScope.cpp:

(WebCore::ServiceWorkerGlobalScope::ServiceWorkerGlobalScope):
(WebCore::ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope):
(WebCore::ServiceWorkerGlobalScope::registration):
(WebCore::ServiceWorkerGlobalScope::eventTargetInterface const):

  • workers/service/ServiceWorkerGlobalScope.h:

(WebCore::ServiceWorkerGlobalScope::create):
(WebCore::ServiceWorkerGlobalScope::serverConnectionIdentifier const):

  • workers/service/context/SWContextManager.cpp: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.cpp.

(WebCore::SWContextManager::singleton):
(WebCore::SWContextManager::SWContextManager):
(WebCore::SWContextManager::startServiceWorkerContext):

  • workers/service/context/SWContextManager.h: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.h.
  • workers/service/context/ServiceWorkerThread.cpp: Added.

(WebCore::ServiceWorkerThreadProxy::sharedDummyProxy):
(WebCore::ServiceWorkerThread::ServiceWorkerThread):
(WebCore::m_workerObjectProxy):
(WebCore::ServiceWorkerThread::~ServiceWorkerThread):
(WebCore::ServiceWorkerThread::createWorkerGlobalScope):
(WebCore::ServiceWorkerThread::runEventLoop):

  • workers/service/context/ServiceWorkerThread.h: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.h.

(WebCore::ServiceWorkerThread::create):
(WebCore::ServiceWorkerThread::workerObjectProxy const):

  • workers/service/server/SWServer.cpp:

(WebCore::SWServer::createWorker):

Source/WebKit:

  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::startServiceWorkerContext):

LayoutTests:

  • http/tests/workers/service/basic-register-exceptions-expected.txt:
  • http/tests/workers/service/basic-register-expected.txt:
  • http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt:
Location:
trunk
Files:
2 added
15 edited
4 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r223271 r223277  
     12017-10-12  Brady Eidson  <beidson@apple.com>
     2
     3        SW "Hello world".
     4        https://bugs.webkit.org/show_bug.cgi?id=178187
     5
     6        Reviewed by Andy Estes.
     7
     8        * http/tests/workers/service/basic-register-exceptions-expected.txt:
     9        * http/tests/workers/service/basic-register-expected.txt:
     10        * http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt:
     11
    1122017-10-12  Alex Christensen  <achristensen@webkit.org>
    213
  • trunk/LayoutTests/http/tests/workers/service/basic-register-exceptions-expected.txt

    r223191 r223277  
    55CONSOLE MESSAGE: line 60: Registration failed with error: TypeError: Scope URL provided to serviceWorker.register() must be either HTTP or HTTPS
    66CONSOLE MESSAGE: line 70: Registration failed with error: TypeError: Scope URL provided to serviceWorker.register() cannot have a path that contains '%2f' or '%5c'
    7 CONSOLE MESSAGE: line 10: Registration failed with error: UnknownError: Failed to start service worker script of length 0
     7CONSOLE MESSAGE: line 10: Registration failed with error: UnknownError: Worker script successfully started, but it has no way to communicate yet
    88CONSOLE MESSAGE: line 80: Registration failed with error: SecurityError: Script origin does not match the registering client's origin
    99CONSOLE MESSAGE: line 91: Registration failed with error: SecurityError: Scope origin does not match the registering client's origin
  • trunk/LayoutTests/http/tests/workers/service/basic-register-expected.txt

    r223191 r223277  
    1 CONSOLE MESSAGE: line 10: Registration failed with error: UnknownError: Failed to start service worker script of length 41
    2 CONSOLE MESSAGE: line 21: Registration failed with error: UnknownError: Failed to start service worker script of length 0
     1CONSOLE MESSAGE: line 10: Registration failed with error: UnknownError: Worker script successfully started, but it has no way to communicate yet
     2CONSOLE MESSAGE: line 21: Registration failed with error: UnknownError: Worker script successfully started, but it has no way to communicate yet
    33
  • trunk/LayoutTests/http/tests/workers/service/registration-task-queue-scheduling-1-expected.txt

    r223191 r223277  
    1 ALERT: Unexpected error received from server: UnknownError: Failed to start service worker script of length 41
     1ALERT: Unexpected error received from server: UnknownError: Worker script successfully started, but it has no way to communicate yet
    22
  • trunk/Source/WebCore/ChangeLog

    r223271 r223277  
     12017-10-12  Brady Eidson  <beidson@apple.com>
     2
     3        SW "Hello world".
     4        https://bugs.webkit.org/show_bug.cgi?id=178187
     5
     6        Reviewed by Andy Estes.
     7
     8        No new tests (Covered by changes to existing tests).
     9
     10        With this patch, SW scripts are actually compiled and run inside a ServiceWorkerGlobalScope environment
     11        in the SW context process.
     12
     13        * WebCore.xcodeproj/project.pbxproj:
     14
     15        * bindings/js/WorkerScriptController.cpp:
     16        (WebCore::WorkerScriptController::initScript):
     17
     18        * dom/EventTargetFactory.in:
     19
     20        * workers/WorkerGlobalScope.h:
     21        (WebCore::WorkerGlobalScope::isServiceWorkerGlobalScope const):
     22
     23        * workers/service/ServiceWorkerContextData.cpp: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.cpp.
     24        (WebCore::ServiceWorkerContextData::isolatedCopy const):
     25        * workers/service/ServiceWorkerContextData.h:
     26        (WebCore::ServiceWorkerContextData::encode const):
     27        (WebCore::ServiceWorkerContextData::decode):
     28
     29        * workers/service/ServiceWorkerGlobalScope.cpp:
     30        (WebCore::ServiceWorkerGlobalScope::ServiceWorkerGlobalScope):
     31        (WebCore::ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope):
     32        (WebCore::ServiceWorkerGlobalScope::registration):
     33        (WebCore::ServiceWorkerGlobalScope::eventTargetInterface const):
     34        * workers/service/ServiceWorkerGlobalScope.h:
     35        (WebCore::ServiceWorkerGlobalScope::create):
     36        (WebCore::ServiceWorkerGlobalScope::serverConnectionIdentifier const):
     37
     38        * workers/service/context/SWContextManager.cpp: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.cpp.
     39        (WebCore::SWContextManager::singleton):
     40        (WebCore::SWContextManager::SWContextManager):
     41        (WebCore::SWContextManager::startServiceWorkerContext):
     42        * workers/service/context/SWContextManager.h: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.h.
     43
     44        * workers/service/context/ServiceWorkerThread.cpp: Added.
     45        (WebCore::ServiceWorkerThreadProxy::sharedDummyProxy):
     46        (WebCore::ServiceWorkerThread::ServiceWorkerThread):
     47        (WebCore::m_workerObjectProxy):
     48        (WebCore::ServiceWorkerThread::~ServiceWorkerThread):
     49        (WebCore::ServiceWorkerThread::createWorkerGlobalScope):
     50        (WebCore::ServiceWorkerThread::runEventLoop):
     51        * workers/service/context/ServiceWorkerThread.h: Copied from Source/WebCore/workers/service/ServiceWorkerGlobalScope.h.
     52        (WebCore::ServiceWorkerThread::create):
     53        (WebCore::ServiceWorkerThread::workerObjectProxy const):
     54
     55        * workers/service/server/SWServer.cpp:
     56        (WebCore::SWServer::createWorker):
     57
    1582017-10-12  Alex Christensen  <achristensen@webkit.org>
    259
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r223271 r223277  
    23532353                517B25A91CC82B2A0061C011 /* IDBConnectionProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517B25A71CC820320061C011 /* IDBConnectionProxy.cpp */; };
    23542354                517B25AA1CC82B2A0061C011 /* IDBConnectionProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 517B25A81CC820320061C011 /* IDBConnectionProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2355                517C870A1F8EBB2500EB8076 /* SWContextManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517C87081F8EB9BF00EB8076 /* SWContextManager.cpp */; };
     2356                517C870B1F8EBB2500EB8076 /* SWContextManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 517C87091F8EB9C000EB8076 /* SWContextManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2357                517C87181F8FD4D900EB8076 /* ServiceWorkerContextData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517C87161F8FD4D300EB8076 /* ServiceWorkerContextData.cpp */; };
    23552358                517DEEE51DE94ADC00B91644 /* ScrollingMomentumCalculatorMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 517DEEE31DE94ADC00B91644 /* ScrollingMomentumCalculatorMac.mm */; };
    23562359                517DEEE81DE94B0800B91644 /* ScrollingMomentumCalculatorMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 517DEEE71DE94B0800B91644 /* ScrollingMomentumCalculatorMac.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    24552458                51BA4ACB1BBC5BD900DF3D6D /* MemoryIDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA4AC91BBC5B9E00DF3D6D /* MemoryIDBBackingStore.h */; };
    24562459                51BA4ACC1BBC5BDD00DF3D6D /* IDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA4AC71BBC5AD600DF3D6D /* IDBBackingStore.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2460                51BCCE2F1F8F1795006BA0ED /* ServiceWorkerThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517C87111F8EE72F00EB8076 /* ServiceWorkerThread.cpp */; };
     2461                51BCCE301F8F179E006BA0ED /* ServiceWorkerThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 517C87101F8EE72E00EB8076 /* ServiceWorkerThread.h */; settings = {ATTRIBUTES = (Private, ); }; };
    24572462                51BE37E00DAEE00E001085FC /* StorageArea.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BE37DE0DAEE00E001085FC /* StorageArea.h */; settings = {ATTRIBUTES = (Private, ); }; };
    24582463                51C0AA390F2AA10A001648C2 /* CachedFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 51C0AA380F2AA10A001648C2 /* CachedFrame.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1028810293                517B25A71CC820320061C011 /* IDBConnectionProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBConnectionProxy.cpp; sourceTree = "<group>"; };
    1028910294                517B25A81CC820320061C011 /* IDBConnectionProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBConnectionProxy.h; sourceTree = "<group>"; };
     10295                517C87081F8EB9BF00EB8076 /* SWContextManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SWContextManager.cpp; path = workers/service/context/SWContextManager.cpp; sourceTree = SOURCE_ROOT; };
     10296                517C87091F8EB9C000EB8076 /* SWContextManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SWContextManager.h; path = workers/service/context/SWContextManager.h; sourceTree = SOURCE_ROOT; };
     10297                517C87101F8EE72E00EB8076 /* ServiceWorkerThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ServiceWorkerThread.h; path = workers/service/context/ServiceWorkerThread.h; sourceTree = SOURCE_ROOT; };
     10298                517C87111F8EE72F00EB8076 /* ServiceWorkerThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ServiceWorkerThread.cpp; path = workers/service/context/ServiceWorkerThread.cpp; sourceTree = SOURCE_ROOT; };
     10299                517C87161F8FD4D300EB8076 /* ServiceWorkerContextData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerContextData.cpp; sourceTree = "<group>"; };
    1029010300                517DEEE31DE94ADC00B91644 /* ScrollingMomentumCalculatorMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollingMomentumCalculatorMac.mm; sourceTree = "<group>"; };
    1029110301                517DEEE71DE94B0800B91644 /* ScrollingMomentumCalculatorMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollingMomentumCalculatorMac.h; sourceTree = "<group>"; };
     
    1913319143                        sourceTree = "<group>";
    1913419144                };
     19145                517C87071F8E8FF200EB8076 /* context */ = {
     19146                        isa = PBXGroup;
     19147                        children = (
     19148                                517C87081F8EB9BF00EB8076 /* SWContextManager.cpp */,
     19149                                517C87091F8EB9C000EB8076 /* SWContextManager.h */,
     19150                                517C87111F8EE72F00EB8076 /* ServiceWorkerThread.cpp */,
     19151                                517C87101F8EE72E00EB8076 /* ServiceWorkerThread.h */,
     19152                        );
     19153                        path = context;
     19154                        sourceTree = "<group>";
     19155                };
    1913519156                5182C24C1F3142090059BA7C /* ServiceWorkers */ = {
    1913619157                        isa = PBXGroup;
     
    1921319234                        isa = PBXGroup;
    1921419235                        children = (
     19236                                517C87071F8E8FF200EB8076 /* context */,
    1921519237                                517A52EC1F47532D00DCDC0A /* server */,
    1921619238                                51F1755B1F3EBC0C00C74950 /* ServiceWorker.cpp */,
     
    1922019242                                51F175571F3EBC0C00C74950 /* ServiceWorkerContainer.h */,
    1922119243                                51F175561F3EBC0C00C74950 /* ServiceWorkerContainer.idl */,
     19244                                517C87161F8FD4D300EB8076 /* ServiceWorkerContextData.cpp */,
    1922219245                                51CA7EE71F8832E0003D3131 /* ServiceWorkerContextData.h */,
    1922319246                                517A535C1F5899F200DCDC0A /* ServiceWorkerFetchResult.h */,
     
    2862828651                                413C2C341BC29A8F0075204C /* JSDOMConstructor.h in Headers */,
    2862928652                                930841341CDDB15500B0958C /* JSDOMConvert.h in Headers */,
     28653                                517C870B1F8EBB2500EB8076 /* SWContextManager.h in Headers */,
    2863028654                                7C8E34AD1E4A33AF0054CE23 /* JSDOMConvertAny.h in Headers */,
    2863128655                                7C8E34AE1E4A33AF0054CE23 /* JSDOMConvertBase.h in Headers */,
     
    3041430438                                B22279C80D00BF220071B782 /* SVGFEBlendElement.h in Headers */,
    3041530439                                B22279CB0D00BF220071B782 /* SVGFEColorMatrixElement.h in Headers */,
     30440                                51BCCE301F8F179E006BA0ED /* ServiceWorkerThread.h in Headers */,
    3041630441                                B22279CE0D00BF220071B782 /* SVGFEComponentTransferElement.h in Headers */,
    3041730442                                B22279D10D00BF220071B782 /* SVGFECompositeElement.h in Headers */,
     
    3159031615                                E43AF8E61AC5B7E800CA717E /* CacheValidation.cpp in Sources */,
    3159131616                                49AE2D96134EE5F90072920A /* CalculationValue.cpp in Sources */,
     31617                                517C87181F8FD4D900EB8076 /* ServiceWorkerContextData.cpp in Sources */,
    3159231618                                952076041F2675FE007D2AAB /* CallTracer.cpp in Sources */,
    3159331619                                415CDAF41E6B8F87004F11EE /* CanvasCaptureMediaStreamTrack.cpp in Sources */,
     
    3223232258                                B2ED97710B1F55CE00257D0F /* GraphicsContextCG.cpp in Sources */,
    3223332259                                B277B4040B22F37C0004BEC6 /* GraphicsContextCocoa.mm in Sources */,
     32260                                51BCCE2F1F8F1795006BA0ED /* ServiceWorkerThread.cpp in Sources */,
    3223432261                                0F580B0C0F12A2690051D689 /* GraphicsLayer.cpp in Sources */,
    3223532262                                499B3ED6128CD31400E726C2 /* GraphicsLayerCA.cpp in Sources */,
     
    3354533572                                C90F65551B2253B1002163A1 /* MediaSessionManager.cpp in Sources */,
    3354633573                                CD669D681D23364B004D1866 /* MediaSessionManagerCocoa.cpp in Sources */,
     33574                                517C870A1F8EBB2500EB8076 /* SWContextManager.cpp in Sources */,
    3354733575                                07638A9A1884487200E15A1B /* MediaSessionManagerIOS.mm in Sources */,
    3354833576                                07EDC3EE1AACB75D00983EB5 /* MediaSessionManagerMac.mm in Sources */,
  • trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp

    r218951 r223277  
    3131#include "JSDedicatedWorkerGlobalScope.h"
    3232#include "JSEventTarget.h"
     33#include "JSServiceWorkerGlobalScope.h"
    3334#include "ScriptSourceCode.h"
    3435#include "WebCoreJSClientData.h"
     
    9394        proxy->setTarget(*m_vm, m_workerGlobalScopeWrapper.get());
    9495        proxy->structure()->setGlobalObject(*m_vm, m_workerGlobalScopeWrapper.get());
    95     }
     96#if ENABLE(SERVICE_WORKER)
     97    } else if (m_workerGlobalScope->isServiceWorkerGlobalScope()) {
     98        Structure* contextPrototypeStructure = JSServiceWorkerGlobalScopePrototype::createStructure(*m_vm, nullptr, jsNull());
     99        Strong<JSServiceWorkerGlobalScopePrototype> contextPrototype(*m_vm, JSServiceWorkerGlobalScopePrototype::create(*m_vm, nullptr, contextPrototypeStructure));
     100        Structure* structure = JSServiceWorkerGlobalScope::createStructure(*m_vm, nullptr, contextPrototype.get());
     101        auto* proxyStructure = JSProxy::createStructure(*m_vm, nullptr, jsNull(), PureForwardingProxyType);
     102        auto* proxy = JSProxy::create(*m_vm, proxyStructure);
     103   
     104        m_workerGlobalScopeWrapper.set(*m_vm, JSServiceWorkerGlobalScope::create(*m_vm, structure, static_cast<ServiceWorkerGlobalScope&>(*m_workerGlobalScope), proxy));
     105        contextPrototypeStructure->setGlobalObject(*m_vm, m_workerGlobalScopeWrapper.get());
     106        ASSERT(structure->globalObject() == m_workerGlobalScopeWrapper);
     107        ASSERT(m_workerGlobalScopeWrapper->structure()->globalObject() == m_workerGlobalScopeWrapper);
     108        contextPrototype->structure()->setGlobalObject(*m_vm, m_workerGlobalScopeWrapper.get());
     109        contextPrototype->structure()->setPrototypeWithoutTransition(*m_vm, JSWorkerGlobalScope::prototype(*m_vm, *m_workerGlobalScopeWrapper.get()));
     110
     111        proxy->setTarget(*m_vm, m_workerGlobalScopeWrapper.get());
     112        proxy->structure()->setGlobalObject(*m_vm, m_workerGlobalScopeWrapper.get());
     113#endif
     114    }
     115   
    96116    ASSERT(m_workerGlobalScopeWrapper->globalObject() == m_workerGlobalScopeWrapper);
    97117    ASSERT(asObject(m_workerGlobalScopeWrapper->getPrototypeDirect())->globalObject() == m_workerGlobalScopeWrapper);
  • trunk/Source/WebCore/dom/EventTargetFactory.in

    r222692 r223277  
    3333ServiceWorker conditional=SERVICE_WORKER
    3434ServiceWorkerContainer conditional=SERVICE_WORKER
     35ServiceWorkerGlobalScope conditional=SERVICE_WORKER
    3536ServiceWorkerRegistration conditional=SERVICE_WORKER
    3637SourceBuffer conditional=MEDIA_SOURCE
  • trunk/Source/WebCore/workers/WorkerGlobalScope.h

    r220887 r223277  
    6060
    6161    virtual bool isDedicatedWorkerGlobalScope() const { return false; }
     62    virtual bool isServiceWorkerGlobalScope() const { return false; }
    6263
    6364    const URL& url() const final { return m_url; }
  • trunk/Source/WebCore/workers/service/ServiceWorkerContextData.cpp

    r223274 r223277  
    2525
    2626#include "config.h"
    27 #include "ServiceWorkerGlobalScope.h"
     27#include "ServiceWorkerContextData.h"
    2828
    2929#if ENABLE(SERVICE_WORKER)
     
    3131namespace WebCore {
    3232
    33 ServiceWorkerRegistration& ServiceWorkerGlobalScope::registration()
     33ServiceWorkerContextData ServiceWorkerContextData::isolatedCopy() const
    3434{
    35     return m_registration;
    36 }
    37 
    38 void ServiceWorkerGlobalScope::skipWaiting(Ref<DeferredPromise>&&)
    39 {
     35    return { registrationKey.isolatedCopy(), workerID.isolatedCopy(), script.isolatedCopy(), scriptURL.isolatedCopy() };
    4036}
    4137
  • trunk/Source/WebCore/workers/service/ServiceWorkerContextData.h

    r223191 r223277  
    2727
    2828#include "ServiceWorkerRegistrationKey.h"
     29#include "URL.h"
    2930
    3031#if ENABLE(SERVICE_WORKER)
     
    3637    String workerID;
    3738    String script;
     39    URL scriptURL;
    3840   
    3941    template<class Encoder> void encode(Encoder&) const;
    4042    template<class Decoder> static std::optional<ServiceWorkerContextData> decode(Decoder&);
     43   
     44    ServiceWorkerContextData isolatedCopy() const;
    4145};
    4246
     
    4448void ServiceWorkerContextData::encode(Encoder& encoder) const
    4549{
    46     encoder << registrationKey << workerID << script;
     50    encoder << registrationKey << workerID << script << scriptURL;
    4751}
    4852
     
    6266        return std::nullopt;
    6367   
    64     return {{ WTFMove(*registrationKey), WTFMove(workerID), WTFMove(script) }};
     68    URL scriptURL;
     69    if (!decoder.decode(scriptURL))
     70        return std::nullopt;
     71
     72    return {{ WTFMove(*registrationKey), WTFMove(workerID), WTFMove(script), WTFMove(scriptURL) }};
    6573}
    6674
  • trunk/Source/WebCore/workers/service/ServiceWorkerGlobalScope.cpp

    r220623 r223277  
    2929#if ENABLE(SERVICE_WORKER)
    3030
     31#include "ServiceWorkerThread.h"
     32
    3133namespace WebCore {
     34
     35ServiceWorkerGlobalScope::ServiceWorkerGlobalScope(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData& data, const URL& url, const String& identifier, const String& userAgent, ServiceWorkerThread& thread, bool shouldBypassMainWorldContentSecurityPolicy, Ref<SecurityOrigin>&& topOrigin, MonotonicTime timeOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider, PAL::SessionID sessionID)
     36    : WorkerGlobalScope(url, identifier, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), timeOrigin, connectionProxy, socketProvider, sessionID)
     37    , m_serverConnectionIdentifier(serverConnectionIdentifier)
     38    , m_contextData(crossThreadCopy(data))
     39{
     40}
     41
     42ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope()
     43{
     44}
    3245
    3346ServiceWorkerRegistration& ServiceWorkerGlobalScope::registration()
    3447{
    35     return m_registration;
     48    // FIXME: Is this method still needed?
     49    RELEASE_ASSERT_NOT_REACHED();
    3650}
    3751
     
    4054}
    4155
     56EventTargetInterface ServiceWorkerGlobalScope::eventTargetInterface() const
     57{
     58    return ServiceWorkerGlobalScopeEventTargetInterfaceType;
     59}
     60
    4261} // namespace WebCore
    4362
  • trunk/Source/WebCore/workers/service/ServiceWorkerGlobalScope.h

    r220623 r223277  
    2828#if ENABLE(SERVICE_WORKER)
    2929
     30#include "ServiceWorkerContextData.h"
    3031#include "ServiceWorkerRegistration.h"
    3132#include "WorkerGlobalScope.h"
     
    3435
    3536class DeferredPromise;
    36 class ServiceWorkerRegistration;
     37class ServiceWorkerThread;
    3738
    3839class ServiceWorkerGlobalScope : public WorkerGlobalScope {
    3940public:
     41    template<typename... Args> static Ref<ServiceWorkerGlobalScope> create(Args&&... args)
     42    {
     43        return adoptRef(*new ServiceWorkerGlobalScope(std::forward<Args>(args)...));
     44    }
     45
     46    virtual ~ServiceWorkerGlobalScope();
     47
     48    bool isServiceWorkerGlobalScope() const final { return true; }
     49
    4050    ServiceWorkerRegistration& registration();
     51   
     52    uint64_t serverConnectionIdentifier() const { return m_serverConnectionIdentifier; }
    4153
    4254    void skipWaiting(Ref<DeferredPromise>&&);
    4355
     56    EventTargetInterface eventTargetInterface() const final;
     57
    4458private:
    45     ServiceWorkerRegistration m_registration;
     59    ServiceWorkerGlobalScope(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&, const URL&, const String& identifier, const String& userAgent, ServiceWorkerThread&, bool shouldBypassMainWorldContentSecurityPolicy, Ref<SecurityOrigin>&& topOrigin, MonotonicTime timeOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*, PAL::SessionID);
     60
     61    uint64_t m_serverConnectionIdentifier;
     62    ServiceWorkerContextData m_contextData;
    4663};
    4764
  • trunk/Source/WebCore/workers/service/context/SWContextManager.cpp

    r223274 r223277  
    2525
    2626#include "config.h"
    27 #include "ServiceWorkerGlobalScope.h"
     27#include "SWContextManager.h"
    2828
    2929#if ENABLE(SERVICE_WORKER)
    3030
     31#include "Logging.h"
     32#include <pal/SessionID.h>
     33
     34using namespace PAL;
     35
    3136namespace WebCore {
    3237
    33 ServiceWorkerRegistration& ServiceWorkerGlobalScope::registration()
     38SWContextManager& SWContextManager::singleton()
    3439{
    35     return m_registration;
     40    static SWContextManager* sharedManager = new SWContextManager;
     41    return *sharedManager;
    3642}
    3743
    38 void ServiceWorkerGlobalScope::skipWaiting(Ref<DeferredPromise>&&)
     44SWContextManager::SWContextManager()
    3945{
     46
     47}
     48
     49ExceptionOr<uint64_t> SWContextManager::startServiceWorkerContext(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData& data)
     50{
     51    // FIXME: Provide a sensical session ID
     52
     53    auto thread = ServiceWorkerThread::create(serverConnectionIdentifier, data, SessionID::defaultSessionID());
     54    auto result = m_workerThreadMap.add(thread->identifier(), WTFMove(thread));
     55    ASSERT(result.isNewEntry);
     56
     57    result.iterator->value->start();
     58   
     59    LOG(ServiceWorker, "Context process PID: %i started worker thread %s\n", getpid(), data.workerID.utf8().data());
     60   
     61    // FIXME: For testing purposes we need to signal a failure with an exception payload.
     62    // Later with more APIs and infrastructure filled in, testing will be much easier.
     63   
     64    return Exception { UnknownError, "Worker script successfully started, but it has no way to communicate yet" };
    4065}
    4166
  • trunk/Source/WebCore/workers/service/context/SWContextManager.h

    r223274 r223277  
    2828#if ENABLE(SERVICE_WORKER)
    2929
    30 #include "ServiceWorkerRegistration.h"
    31 #include "WorkerGlobalScope.h"
     30#include "ExceptionOr.h"
     31#include "ServiceWorkerThread.h"
     32#include <wtf/HashMap.h>
    3233
    3334namespace WebCore {
    3435
    35 class DeferredPromise;
    36 class ServiceWorkerRegistration;
     36struct ServiceWorkerContextData;
    3737
    38 class ServiceWorkerGlobalScope : public WorkerGlobalScope {
     38class SWContextManager {
    3939public:
    40     ServiceWorkerRegistration& registration();
     40    WEBCORE_EXPORT static SWContextManager& singleton();
    4141
    42     void skipWaiting(Ref<DeferredPromise>&&);
     42    WEBCORE_EXPORT ExceptionOr<uint64_t> startServiceWorkerContext(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&);
    4343
    4444private:
    45     ServiceWorkerRegistration m_registration;
     45    SWContextManager();
     46   
     47    HashMap<uint64_t, RefPtr<ServiceWorkerThread>> m_workerThreadMap;
    4648};
    4749
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h

    r223274 r223277  
    2828#if ENABLE(SERVICE_WORKER)
    2929
    30 #include "ServiceWorkerRegistration.h"
    31 #include "WorkerGlobalScope.h"
     30#include "ServiceWorkerContextData.h"
     31#include "WorkerThread.h"
     32#include <wtf/Identified.h>
    3233
    3334namespace WebCore {
    3435
    35 class DeferredPromise;
    36 class ServiceWorkerRegistration;
     36class ContentSecurityPolicyResponseHeaders;
     37class WorkerObjectProxy;
     38struct ServiceWorkerContextData;
    3739
    38 class ServiceWorkerGlobalScope : public WorkerGlobalScope {
     40class ServiceWorkerThread : public WorkerThread, public ThreadSafeIdentified<ServiceWorkerThread> {
    3941public:
    40     ServiceWorkerRegistration& registration();
     42    template<typename... Args> static Ref<ServiceWorkerThread> create(Args&&... args)
     43    {
     44        return adoptRef(*new ServiceWorkerThread(std::forward<Args>(args)...));
     45    }
     46    virtual ~ServiceWorkerThread();
    4147
    42     void skipWaiting(Ref<DeferredPromise>&&);
     48    WorkerObjectProxy& workerObjectProxy() const { return m_workerObjectProxy; }
     49
     50protected:
     51    Ref<WorkerGlobalScope> createWorkerGlobalScope(const URL&, const String& identifier, const String& userAgent, const ContentSecurityPolicyResponseHeaders&, bool shouldBypassMainWorldContentSecurityPolicy, Ref<SecurityOrigin>&& topOrigin, MonotonicTime timeOrigin, PAL::SessionID) final;
     52    void runEventLoop() override;
    4353
    4454private:
    45     ServiceWorkerRegistration m_registration;
     55    ServiceWorkerThread(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData&, PAL::SessionID);
     56
     57    uint64_t m_serverConnectionIdentifier;
     58    ServiceWorkerContextData m_data;
     59    WorkerObjectProxy& m_workerObjectProxy;
    4660};
    4761
  • trunk/Source/WebCore/workers/service/server/SWServer.cpp

    r223191 r223277  
    165165    ASSERT(result.isNewEntry);
    166166   
    167     connection.startServiceWorkerContext({ registrationKey, workerID, script });
     167    connection.startServiceWorkerContext({ registrationKey, workerID, script, url });
    168168   
    169169    return result.iterator->value.get();
  • trunk/Source/WebKit/ChangeLog

    r223270 r223277  
     12017-10-12  Brady Eidson  <beidson@apple.com>
     2
     3        SW "Hello world".
     4        https://bugs.webkit.org/show_bug.cgi?id=178187
     5
     6        Reviewed by Andy Estes.
     7
     8        * WebProcess/WebProcess.cpp:
     9        (WebKit::WebProcess::startServiceWorkerContext):
     10
    1112017-10-12  Alex Christensen  <achristensen@webkit.org>
    212
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r223270 r223277  
    106106#include <WebCore/ResourceLoadStatistics.h>
    107107#include <WebCore/RuntimeApplicationChecks.h>
     108#include <WebCore/SWContextManager.h>
    108109#include <WebCore/SchemeRegistry.h>
    109110#include <WebCore/SecurityOrigin.h>
     
    16501651void WebProcess::startServiceWorkerContext(uint64_t serverConnectionIdentifier, const ServiceWorkerContextData& data)
    16511652{
    1652     // FIXME: Here is where we will actually start the script.
    1653     // For now we bounce back a failure message to the requesting process for test coverage.
    1654 
    1655     auto message = makeString("Failed to start service worker script of length ", String::number(data.script.length()));
    1656     m_workerContextConnection->send(Messages::StorageProcess::ServiceWorkerContextFailedToStart(serverConnectionIdentifier, data.registrationKey, data.workerID, message), 0);
     1653    auto contextResult = SWContextManager::singleton().startServiceWorkerContext(serverConnectionIdentifier, data);
     1654   
     1655    if (contextResult.hasException())
     1656        m_workerContextConnection->send(Messages::StorageProcess::ServiceWorkerContextFailedToStart(serverConnectionIdentifier, data.registrationKey, data.workerID, contextResult.exception().message()), 0);
    16571657}
    16581658
Note: See TracChangeset for help on using the changeset viewer.