Document no longer needs to store a SessionID
[WebKit-https.git] / Source / WebCore / worklets / WorkletGlobalScope.cpp
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 #include "config.h"
28 #include "WorkletGlobalScope.h"
29
30 #if ENABLE(CSS_PAINTING_API)
31
32 #include "Frame.h"
33 #include "InspectorInstrumentation.h"
34 #include "JSWorkletGlobalScope.h"
35 #include "PageConsoleClient.h"
36 #include "SecurityOriginPolicy.h"
37 #include "Settings.h"
38 #include "WorkletScriptController.h"
39 #include <JavaScriptCore/Exception.h>
40 #include <JavaScriptCore/JSLock.h>
41 #include <JavaScriptCore/ScriptCallStack.h>
42 #include <wtf/IsoMallocInlines.h>
43
44 namespace WebCore {
45 using namespace Inspector;
46
47 WTF_MAKE_ISO_ALLOCATED_IMPL(WorkletGlobalScope);
48
49 WorkletGlobalScope::WorkletGlobalScope(Document& document, ScriptSourceCode&& code)
50     : m_document(makeWeakPtr(document))
51     , m_script(makeUnique<WorkletScriptController>(this))
52     , m_topOrigin(SecurityOrigin::createUnique())
53     , m_eventQueue(*this)
54     , m_code(WTFMove(code))
55 {
56     auto addResult = allWorkletGlobalScopesSet().add(this);
57     ASSERT_UNUSED(addResult, addResult);
58
59     auto* frame = document.frame();
60     m_jsRuntimeFlags = frame ? frame->settings().javaScriptRuntimeFlags() : JSC::RuntimeFlags();
61     ASSERT(document.page());
62
63     setSecurityOriginPolicy(SecurityOriginPolicy::create(m_topOrigin.copyRef()));
64     setContentSecurityPolicy(makeUnique<ContentSecurityPolicy>(URL { m_code.url() }, *this));
65 }
66
67 WorkletGlobalScope::~WorkletGlobalScope()
68 {
69     ASSERT(!m_script);
70     removeFromContextsMap();
71     auto removeResult = allWorkletGlobalScopesSet().remove(this);
72     ASSERT_UNUSED(removeResult, removeResult);
73 }
74
75 void WorkletGlobalScope::prepareForDestruction()
76 {
77     if (!m_script)
78         return;
79     stopActiveDOMObjects();
80     removeRejectedPromiseTracker();
81     removeAllEventListeners();
82     m_script->vm().notifyNeedTermination();
83     m_script = nullptr;
84 }
85
86 auto WorkletGlobalScope::allWorkletGlobalScopesSet() -> WorkletGlobalScopesSet&
87 {
88     static NeverDestroyed<WorkletGlobalScopesSet> scopes;
89     return scopes;
90 }
91
92 String WorkletGlobalScope::origin() const
93 {
94     return m_topOrigin->toString();
95 }
96
97 String WorkletGlobalScope::userAgent(const URL& url) const
98 {
99     if (!m_document)
100         return "";
101     return m_document->userAgent(url);
102 }
103
104 void WorkletGlobalScope::evaluate()
105 {
106     m_script->evaluate(m_code);
107 }
108
109 bool WorkletGlobalScope::isJSExecutionForbidden() const
110 {
111     return !m_script || m_script->isExecutionForbidden();
112 }
113
114 void WorkletGlobalScope::disableEval(const String& errorMessage)
115 {
116     m_script->disableEval(errorMessage);
117 }
118
119 void WorkletGlobalScope::disableWebAssembly(const String& errorMessage)
120 {
121     m_script->disableWebAssembly(errorMessage);
122 }
123
124 URL WorkletGlobalScope::completeURL(const String& url) const
125 {
126     if (url.isNull())
127         return URL();
128     return URL(m_code.url(), url);
129 }
130
131 void WorkletGlobalScope::logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, RefPtr<ScriptCallStack>&& stack)
132 {
133     if (!m_document || isJSExecutionForbidden())
134         return;
135     m_document->logExceptionToConsole(errorMessage, sourceURL, lineNumber, columnNumber, WTFMove(stack));
136 }
137
138 void WorkletGlobalScope::addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&& message)
139 {
140     if (!m_document || isJSExecutionForbidden() || !message)
141         return;
142     m_document->addConsoleMessage(makeUnique<Inspector::ConsoleMessage>(message->source(), message->type(), message->level(), message->message(), 0));
143 }
144
145 void WorkletGlobalScope::addConsoleMessage(MessageSource source, MessageLevel level, const String& message, unsigned long requestIdentifier)
146 {
147     if (!m_document || isJSExecutionForbidden())
148         return;
149     m_document->addConsoleMessage(source, level, message, requestIdentifier);
150 }
151
152 void WorkletGlobalScope::addMessage(MessageSource source, MessageLevel level, const String& messageText, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr<ScriptCallStack>&& callStack, JSC::ExecState*, unsigned long requestIdentifier)
153 {
154     if (!m_document || isJSExecutionForbidden())
155         return;
156     m_document->addMessage(source, level, messageText, sourceURL, lineNumber, columnNumber, WTFMove(callStack), nullptr, requestIdentifier);
157 }
158
159 } // namespace WebCore
160 #endif