15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#ifndef WorkerGlobalScope_h
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#define WorkerGlobalScope_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/WorkerScriptController.h"
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContext.h"
3206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventListener.h"
3306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventTarget.h"
34a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "core/frame/DOMWindowBase64.h"
3576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/UseCounter.h"
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/csp/ContentSecurityPolicy.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/workers/WorkerEventQueue.h"
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h"
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/network/ContentSecurityPolicyParsers.h"
40591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h"
41591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/OwnPtr.h"
43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h"
44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/RefCounted.h"
45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/RefPtr.h"
46591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/AtomicStringHash.h"
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass Blob;
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ConsoleMessage;
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ConsoleMessageStorage;
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ExceptionState;
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ScheduledAction;
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerClients;
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerConsole;
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerInspectorController;
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerLocation;
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerNavigator;
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerThread;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WorkerGlobalScope : public RefCountedWillBeGarbageCollectedFinalized<WorkerGlobalScope>, public SecurityContext, public ExecutionContext, public WillBeHeapSupplementable<WorkerGlobalScope>, public EventTargetWithInlineData, public DOMWindowBase64 {
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    REFCOUNTED_EVENT_TARGET(WorkerGlobalScope);
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(WorkerGlobalScope);
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccipublic:
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ~WorkerGlobalScope();
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual bool isWorkerGlobalScope() const OVERRIDE FINAL { return true; }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ExecutionContext* executionContext() const OVERRIDE FINAL;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void countFeature(UseCounter::Feature) const;
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void countDeprecation(UseCounter::Feature) const;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const KURL& url() const { return m_url; }
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    KURL completeURL(const String&) const;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual String userAgent(const KURL&) const OVERRIDE FINAL;
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void disableEval(const String& errorMessage) OVERRIDE FINAL;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerScriptController* script() { return m_script.get(); }
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void clearScript() { m_script.clear(); }
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void clearInspector();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void dispose();
87f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerThread* thread() const { return m_thread; }
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void postTask(PassOwnPtr<ExecutionContextTask>) OVERRIDE FINAL; // Executes the task on context's thread asynchronously.
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // WorkerGlobalScope
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerGlobalScope* self() { return this; }
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerConsole* console();
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerLocation* location() const;
967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void close();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // WorkerUtils
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void importScripts(const Vector<String>& urls, ExceptionState&);
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerNavigator* navigator() const;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // ExecutionContextClient
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual WorkerEventQueue* eventQueue() const OVERRIDE FINAL;
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual SecurityContext& securityContext() OVERRIDE FINAL { return *this; }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual bool isContextThread() const OVERRIDE FINAL;
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual bool isJSExecutionForbidden() const OVERRIDE FINAL;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual double timerAlignmentInterval() const OVERRIDE FINAL;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerInspectorController* workerInspectorController() { return m_workerInspectorController.get(); }
1141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool isClosing() { return m_closing; }
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void stopFetch() { }
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool idleNotification();
1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double timeOrigin() const { return m_timeOrigin; }
1227757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerClients* clients() { return m_workerClients.get(); }
124521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    using SecurityContext::securityOrigin;
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    using SecurityContext::contentSecurityPolicy;
1277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void addConsoleMessage(PassRefPtrWillBeRawPtr<ConsoleMessage>) OVERRIDE FINAL;
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ConsoleMessageStorage* messageStorage();
130f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void trace(Visitor*) OVERRIDE;
1329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprotected:
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerGlobalScope(const KURL&, const String& userAgent, WorkerThread*, double timeOrigin, PassOwnPtrWillBeRawPtr<WorkerClients>);
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void applyContentSecurityPolicyFromString(const String& contentSecurityPolicy, ContentSecurityPolicyHeaderType);
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void logExceptionToConsole(const String& errorMessage, int scriptId, const String& sourceURL, int lineNumber, int columnNumber, PassRefPtrWillBeRawPtr<ScriptCallStack>) OVERRIDE;
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void addMessageToWorkerConsole(PassRefPtrWillBeRawPtr<ConsoleMessage>);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprivate:
1415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if !ENABLE(OILPAN)
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void refExecutionContext() OVERRIDE FINAL { ref(); }
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void derefExecutionContext() OVERRIDE FINAL { deref(); }
1445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual const KURL& virtualURL() const OVERRIDE FINAL;
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual KURL virtualCompleteURL(const String&) const OVERRIDE FINAL;
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void reportBlockedScriptExecutionToInspector(const String& directiveText) OVERRIDE FINAL;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual EventTarget* errorEventTarget() OVERRIDE FINAL;
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void didUpdateSecurityOrigin() OVERRIDE FINAL { }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    KURL m_url;
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String m_userAgent;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mutable RefPtrWillBeMember<WorkerConsole> m_console;
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mutable RefPtrWillBeMember<WorkerLocation> m_location;
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mutable RefPtrWillBeMember<WorkerNavigator> m_navigator;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtr<WorkerScriptController> m_script;
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WorkerThread* m_thread;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeMember<WorkerInspectorController> m_workerInspectorController;
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool m_closing;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtrWillBeMember<WorkerEventQueue> m_eventQueue;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtrWillBeMember<WorkerClients> m_workerClients;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double m_timeOrigin;
1727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtrWillBeMember<ConsoleMessageStorage> m_messageStorage;
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci};
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)DEFINE_TYPE_CASTS(WorkerGlobalScope, ExecutionContext, context, context->isWorkerGlobalScope(), context.isWorkerGlobalScope());
177591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#endif // WorkerGlobalScope_h
181