Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebCore / worklets / WorkletGlobalScope.h
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  */
26
27 #pragma once
28
29 #if ENABLE(CSS_PAINTING_API)
30
31 #include "EventTarget.h"
32 #include "ExceptionOr.h"
33 #include "ScriptExecutionContext.h"
34 #include "ScriptSourceCode.h"
35 #include "WorkerEventQueue.h"
36
37 #include <JavaScriptCore/ConsoleMessage.h>
38 #include <JavaScriptCore/RuntimeFlags.h>
39 #include <pal/SessionID.h>
40 #include <wtf/URL.h>
41 #include <wtf/ObjectIdentifier.h>
42 #include <wtf/WeakPtr.h>
43
44 namespace WebCore {
45 class WorkletScriptController;
46 class ScriptSourceCode;
47
48 enum WorkletGlobalScopeIdentifierType { };
49 using WorkletGlobalScopeIdentifier = ObjectIdentifier<WorkletGlobalScopeIdentifierType>;
50
51 class WorkletGlobalScope : public RefCounted<WorkletGlobalScope>, public ScriptExecutionContext, public EventTargetWithInlineData {
52 public:
53     virtual ~WorkletGlobalScope();
54
55     using WorkletGlobalScopesSet = HashSet<const WorkletGlobalScope*>;
56     WEBCORE_EXPORT static WorkletGlobalScopesSet& allWorkletGlobalScopesSet();
57
58     virtual bool isPaintWorkletGlobalScope() const { return false; }
59
60     const URL& url() const final { return m_code.url(); }
61     String origin() const final;
62
63     void evaluate();
64
65     using RefCounted::ref;
66     using RefCounted::deref;
67
68     WorkletScriptController* script() { return m_script.get(); }
69
70     void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&) final;
71
72     bool isJSExecutionForbidden() const final;
73     SecurityOrigin& topOrigin() const final { return m_topOrigin.get(); }
74
75     SocketProvider* socketProvider() final { return nullptr; }
76
77     bool isContextThread() const final { return true; }
78     bool isSecureContext() const final { return false; }
79
80     JSC::RuntimeFlags jsRuntimeFlags() const { return m_jsRuntimeFlags; }
81
82     virtual void prepareForDestruction();
83
84 protected:
85     WorkletGlobalScope(Document&, ScriptSourceCode&&);
86     WorkletGlobalScope(const WorkletGlobalScope&) = delete;
87     WorkletGlobalScope(WorkletGlobalScope&&) = delete;
88
89     Document* responsibleDocument() { return m_document.get(); }
90     const Document* responsibleDocument() const { return m_document.get(); }
91
92 private:
93 #if ENABLE(INDEXED_DATABASE)
94     IDBClient::IDBConnectionProxy* idbConnectionProxy() final { ASSERT_NOT_REACHED(); return nullptr; }
95 #endif
96
97     void postTask(Task&&) final { ASSERT_NOT_REACHED(); }
98
99     void refScriptExecutionContext() final { ref(); }
100     void derefScriptExecutionContext() final { deref(); }
101
102     void refEventTarget() final { ref(); }
103     void derefEventTarget() final { deref(); }
104
105     ScriptExecutionContext* scriptExecutionContext() const final { return const_cast<WorkletGlobalScope*>(this); }
106     EventTargetInterface eventTargetInterface() const final { return WorkletGlobalScopeEventTargetInterfaceType; }
107
108     bool isWorkletGlobalScope() const final { return true; }
109
110     void logExceptionToConsole(const String& errorMessage, const String&, int, int, RefPtr<Inspector::ScriptCallStack>&&) final;
111     void addMessage(MessageSource, MessageLevel, const String&, const String&, unsigned, unsigned, RefPtr<Inspector::ScriptCallStack>&&, JSC::ExecState*, unsigned long) final;
112     void addConsoleMessage(MessageSource, MessageLevel, const String&, unsigned long) final;
113
114     EventTarget* errorEventTarget() final { return this; }
115     EventQueue& eventQueue() const final { ASSERT_NOT_REACHED(); return m_eventQueue; }
116
117 #if ENABLE(WEB_CRYPTO)
118     bool wrapCryptoKey(const Vector<uint8_t>&, Vector<uint8_t>&) final { RELEASE_ASSERT_NOT_REACHED(); return false; }
119     bool unwrapCryptoKey(const Vector<uint8_t>&, Vector<uint8_t>&) final { RELEASE_ASSERT_NOT_REACHED(); return false; }
120 #endif
121     URL completeURL(const String&) const final;
122     PAL::SessionID sessionID() const final { return m_sessionID; }
123     String userAgent(const URL&) const final;
124     void disableEval(const String&) final;
125     void disableWebAssembly(const String&) final;
126
127     WeakPtr<Document> m_document;
128
129     PAL::SessionID m_sessionID;
130     std::unique_ptr<WorkletScriptController> m_script;
131
132     Ref<SecurityOrigin> m_topOrigin;
133
134     // FIXME: This is not implemented properly, it just satisfies the compiler.
135     // https://bugs.webkit.org/show_bug.cgi?id=191136
136     mutable WorkerEventQueue m_eventQueue;
137
138     JSC::RuntimeFlags m_jsRuntimeFlags;
139     ScriptSourceCode m_code;
140 };
141
142 } // namespace WebCore
143
144 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::WorkletGlobalScope)
145 static bool isType(const WebCore::ScriptExecutionContext& context) { return context.isWorkletGlobalScope(); }
146 SPECIALIZE_TYPE_TRAITS_END()
147 #endif