Move some more assorted classes from ExceptionCode to Exception
[WebKit.git] / Source / WebCore / workers / WorkerGlobalScope.h
index 2cdb3e5..276b13f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #pragma once
 
 #include "Base64Utilities.h"
-#include "EventListener.h"
 #include "EventTarget.h"
 #include "ScriptExecutionContext.h"
 #include "URL.h"
 #include "WorkerEventQueue.h"
 #include "WorkerScriptController.h"
 #include <memory>
-#include <wtf/HashSet.h>
-#include <wtf/RefCounted.h>
-#include <wtf/RefPtr.h>
-#include <wtf/TypeCasts.h>
 
 namespace Inspector {
 class ConsoleMessage;
@@ -60,30 +55,15 @@ class WorkerGlobalScope : public RefCounted<WorkerGlobalScope>, public Supplemen
 public:
     virtual ~WorkerGlobalScope();
 
-    bool isWorkerGlobalScope() const override { return true; }
-
-    ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkerGlobalScope*>(this); }
-
     virtual bool isDedicatedWorkerGlobalScope() const { return false; }
 
     const URL& url() const final { return m_url; }
-    URL completeURL(const String&) const final;
-
-    String userAgent(const URL&) const override;
-
-    void disableEval(const String& errorMessage) override;
 
 #if ENABLE(INDEXED_DATABASE)
     IDBClient::IDBConnectionProxy* idbConnectionProxy() final;
     void stopIndexedDatabase();
 #endif
 
-#if ENABLE(WEB_SOCKETS)
-    SocketProvider* socketProvider() final;
-#endif
-
-    bool shouldBypassMainWorldContentSecurityPolicy() const final { return m_shouldBypassMainWorldContentSecurityPolicy; }
-
     WorkerScriptController* script() { return m_script.get(); }
     void clearScript() { m_script = nullptr; }
 
@@ -93,90 +73,77 @@ public:
 
     void postTask(Task&&) final; // Executes the task on context's thread asynchronously.
 
-    // WorkerGlobalScope
     WorkerGlobalScope& self() { return *this; }
     WorkerLocation& location() const;
     void close();
 
-    // WorkerUtils
-    virtual void importScripts(const Vector<String>& urls, ExceptionCode&);
+    virtual ExceptionOr<void> importScripts(const Vector<String>& urls);
     WorkerNavigator& navigator() const;
 
-    // Timers
     int setTimeout(std::unique_ptr<ScheduledAction>, int timeout);
     void clearTimeout(int timeoutId);
     int setInterval(std::unique_ptr<ScheduledAction>, int timeout);
     void clearInterval(int timeoutId);
 
-    bool isContextThread() const override;
-    bool isJSExecutionForbidden() const override;
+    bool isContextThread() const final;
 
-    // These methods are used for GC marking. See JSWorkerGlobalScope::visitChildrenVirtual(SlotVisitor&) in
-    // JSWorkerGlobalScopeCustom.cpp.
     WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
     WorkerLocation* optionalLocation() const { return m_location.get(); }
 
-    using RefCounted<WorkerGlobalScope>::ref;
-    using RefCounted<WorkerGlobalScope>::deref;
+    using RefCounted::ref;
+    using RefCounted::deref;
 
     bool isClosing() { return m_closing; }
 
-    // An observer interface to be notified when the worker thread is getting stopped.
-    class Observer {
-        WTF_MAKE_NONCOPYABLE(Observer);
-    public:
-        Observer(WorkerGlobalScope*);
-        virtual ~Observer();
-        virtual void notifyStop() = 0;
-        void stopObserving();
-    private:
-        WorkerGlobalScope* m_context;
-    };
-    friend class Observer;
-    void registerObserver(Observer*);
-    void unregisterObserver(Observer*);
-    void notifyObserversOfStop();
-
-    SecurityOrigin* topOrigin() const override { return m_topOrigin.get(); }
-
-    void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>);
-    void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier = 0) override;
-
-#if ENABLE(SUBTLE_CRYPTO)
-    // The following two functions are side effects of providing extra protection to serialized
-    // CryptoKey data that went through the structured clone algorithm to local storage such as
-    // IndexedDB. They don't provide any proctection against communications between mainThread
-    // and workerThreads. In fact, they cause extra expense as workerThreads cannot talk to clients
-    // to unwrap/wrap crypto keys. Hence, workerThreads must always ask mainThread to unwrap/wrap
-    // keys, which results in a second communication and plain keys being transferred between
-    // workerThreads and the mainThread.
-    bool wrapCryptoKey(const Vector<uint8_t>& key, Vector<uint8_t>& wrappedKey) final;
-    bool unwrapCryptoKey(const Vector<uint8_t>& wrappedKey, Vector<uint8_t>& key) final;
-#endif
+    void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&);
 
-    Crypto& crypto() const;
+    Crypto& crypto();
 
 protected:
     WorkerGlobalScope(const URL&, const String& userAgent, WorkerThread&, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr<SecurityOrigin>&& topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
-    void applyContentSecurityPolicyResponseHeaders(const ContentSecurityPolicyResponseHeaders&);
 
-    void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, RefPtr<Inspector::ScriptCallStack>&&) override;
-    void addMessageToWorkerConsole(std::unique_ptr<Inspector::ConsoleMessage>);
-    void addMessageToWorkerConsole(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr<Inspector::ScriptCallStack>&&, JSC::ExecState* = nullptr, unsigned long requestIdentifier = 0);
+    void applyContentSecurityPolicyResponseHeaders(const ContentSecurityPolicyResponseHeaders&);
 
 private:
-    void refScriptExecutionContext() override { ref(); }
-    void derefScriptExecutionContext() override { deref(); }
+    void refScriptExecutionContext() final { ref(); }
+    void derefScriptExecutionContext() final { deref(); }
 
     void refEventTarget() final { ref(); }
     void derefEventTarget() final { deref(); }
 
-    void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr<Inspector::ScriptCallStack>&&, JSC::ExecState* = nullptr, unsigned long requestIdentifier = 0) override;
+    void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, RefPtr<Inspector::ScriptCallStack>&&) final;
+    void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr<Inspector::ScriptCallStack>&&, JSC::ExecState*, unsigned long requestIdentifier) final;
+    void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier) final;
 
-    EventTarget* errorEventTarget() override;
+    bool isWorkerGlobalScope() const final { return true; }
 
+    ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkerGlobalScope*>(this); }
+    URL completeURL(const String&) const final;
+    String userAgent(const URL&) const final;
+    void disableEval(const String& errorMessage) final;
+    EventTarget* errorEventTarget() final;
     WorkerEventQueue& eventQueue() const final;
 
+#if ENABLE(WEB_SOCKETS)
+    SocketProvider* socketProvider() final;
+#endif
+
+    bool shouldBypassMainWorldContentSecurityPolicy() const final { return m_shouldBypassMainWorldContentSecurityPolicy; }
+    bool isJSExecutionForbidden() const final;
+    SecurityOrigin* topOrigin() const final { return m_topOrigin.get(); }
+
+#if ENABLE(SUBTLE_CRYPTO)
+    // The following two functions are side effects of providing extra protection to serialized
+    // CryptoKey data that went through the structured clone algorithm to local storage such as
+    // IndexedDB. They don't provide any proctection against communications between mainThread
+    // and workerThreads. In fact, they cause extra expense as workerThreads cannot talk to clients
+    // to unwrap/wrap crypto keys. Hence, workerThreads must always ask mainThread to unwrap/wrap
+    // keys, which results in a second communication and plain keys being transferred between
+    // workerThreads and the mainThread.
+    bool wrapCryptoKey(const Vector<uint8_t>& key, Vector<uint8_t>& wrappedKey) final;
+    bool unwrapCryptoKey(const Vector<uint8_t>& wrappedKey, Vector<uint8_t>& key) final;
+#endif
+
     URL m_url;
     String m_userAgent;
 
@@ -186,11 +153,9 @@ private:
     std::unique_ptr<WorkerScriptController> m_script;
     WorkerThread& m_thread;
 
-    bool m_closing;
+    bool m_closing { false };
     bool m_shouldBypassMainWorldContentSecurityPolicy;
 
-    HashSet<Observer*> m_workerObservers;
-
     mutable WorkerEventQueue m_eventQueue;
 
     RefPtr<SecurityOrigin> m_topOrigin;
@@ -198,6 +163,7 @@ private:
 #if ENABLE(INDEXED_DATABASE)
     RefPtr<IDBClient::IDBConnectionProxy> m_connectionProxy;
 #endif
+
 #if ENABLE(WEB_SOCKETS)
     RefPtr<SocketProvider> m_socketProvider;
 #endif