From c5d637fbb15874caa0d9669ac8cc79912ed4d5d9 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Sat, 9 Apr 2022 19:53:17 -0700 Subject: WIP --- .../jsc/bindings/webcore/ActiveDOMObject.cpp | 196 +++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 src/javascript/jsc/bindings/webcore/ActiveDOMObject.cpp (limited to 'src/javascript/jsc/bindings/webcore/ActiveDOMObject.cpp') diff --git a/src/javascript/jsc/bindings/webcore/ActiveDOMObject.cpp b/src/javascript/jsc/bindings/webcore/ActiveDOMObject.cpp new file mode 100644 index 000000000..059b8039c --- /dev/null +++ b/src/javascript/jsc/bindings/webcore/ActiveDOMObject.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "config.h" +#include "ActiveDOMObject.h" + +// #include "Document.h" +#include "Event.h" +#include "EventTarget.h" +#include "EventLoop.h" +#include "ScriptExecutionContext.h" + +namespace WebCore { + +static inline ScriptExecutionContext* suitableScriptExecutionContext(ScriptExecutionContext* scriptExecutionContext) +{ + // For detached documents, make sure we observe their context document instead. + // return is(scriptExecutionContext) ? &downcast(*scriptExecutionContext).contextDocument() : scriptExecutionContext; + return scriptExecutionContext; +} + +inline ActiveDOMObject::ActiveDOMObject(ScriptExecutionContext* context, CheckedScriptExecutionContextType) + : ContextDestructionObserver(context) +{ + // ASSERT(!is(context) || &downcast(context)->contextDocument() == downcast(context)); + if (!context) + return; + + ASSERT(context->isContextThread()); + context->didCreateActiveDOMObject(*this); +} + +ActiveDOMObject::ActiveDOMObject(ScriptExecutionContext* scriptExecutionContext) + : ActiveDOMObject(suitableScriptExecutionContext(scriptExecutionContext), CheckedScriptExecutionContext) +{ +} + +// ActiveDOMObject::ActiveDOMObject(Document* document) +// : ActiveDOMObject(document ? &document->contextDocument() : nullptr, CheckedScriptExecutionContext) +// { +// } + +// ActiveDOMObject::ActiveDOMObject(Document& document) +// : ActiveDOMObject(&document.contextDocument(), CheckedScriptExecutionContext) +// { +// } + +ActiveDOMObject::~ActiveDOMObject() +{ + ASSERT(canCurrentThreadAccessThreadLocalData(m_creationThread)); + + // ActiveDOMObject may be inherited by a sub-class whose life-cycle + // exceeds that of the associated ScriptExecutionContext. In those cases, + // m_scriptExecutionContext would/should have been nullified by + // ContextDestructionObserver::contextDestroyed() (which we implement / + // inherit). Hence, we should ensure that this is not 0 before use it + // here. + auto* context = scriptExecutionContext(); + if (!context) + return; + + ASSERT(m_suspendIfNeededWasCalled); + ASSERT(context->isContextThread()); + context->willDestroyActiveDOMObject(*this); +} + +void ActiveDOMObject::suspendIfNeeded() +{ +#if ASSERT_ENABLED + ASSERT(!m_suspendIfNeededWasCalled); + m_suspendIfNeededWasCalled = true; +#endif + if (auto* context = scriptExecutionContext()) + context->suspendActiveDOMObjectIfNeeded(*this); +} + +#if ASSERT_ENABLED + +void ActiveDOMObject::assertSuspendIfNeededWasCalled() const +{ + if (!m_suspendIfNeededWasCalled) + WTFLogAlways("Failed to call suspendIfNeeded() for %s", activeDOMObjectName()); + ASSERT(m_suspendIfNeededWasCalled); +} + +#endif // ASSERT_ENABLED + +void ActiveDOMObject::suspend(ReasonForSuspension) +{ +} + +void ActiveDOMObject::resume() +{ +} + +void ActiveDOMObject::stop() +{ +} + +bool ActiveDOMObject::isContextStopped() const +{ + return !scriptExecutionContext() || scriptExecutionContext()->activeDOMObjectsAreStopped(); +} + +bool ActiveDOMObject::isAllowedToRunScript() const +{ + return scriptExecutionContext() && !scriptExecutionContext()->activeDOMObjectsAreStopped() && !scriptExecutionContext()->activeDOMObjectsAreSuspended(); +} + +void ActiveDOMObject::queueTaskInEventLoop(TaskSource source, Function&& function) +{ + auto* context = scriptExecutionContext(); + if (!context) + return; + context->eventLoop().queueTask(source, WTFMove(function)); +} + +class ActiveDOMObjectEventDispatchTask : public EventLoopTask { +public: + ActiveDOMObjectEventDispatchTask(TaskSource source, EventLoopTaskGroup& group, ActiveDOMObject& object, Function&& dispatchEvent) + : EventLoopTask(source, group) + , m_object(object) + , m_dispatchEvent(WTFMove(dispatchEvent)) + { + ++m_object.m_pendingActivityInstanceCount; + } + + ~ActiveDOMObjectEventDispatchTask() + { + ASSERT(m_object.m_pendingActivityInstanceCount); + --m_object.m_pendingActivityInstanceCount; + } + + void execute() final + { + // If this task executes after the script execution context has been stopped, don't + // actually dispatch the event. + if (m_object.isAllowedToRunScript()) + m_dispatchEvent(); + } + +private: + ActiveDOMObject& m_object; + Function m_dispatchEvent; +}; + +void ActiveDOMObject::queueTaskToDispatchEventInternal(EventTarget& target, TaskSource source, Ref&& event) +{ + ASSERT(!event->target() || &target == event->target()); + auto* context = scriptExecutionContext(); + if (!context) + return; + auto& eventLoopTaskGroup = context->eventLoop(); + auto task = makeUnique(source, eventLoopTaskGroup, *this, [target = Ref { target }, event = WTFMove(event)] { + target->dispatchEvent(event); + }); + eventLoopTaskGroup.queueTask(WTFMove(task)); +} + +void ActiveDOMObject::queueCancellableTaskToDispatchEventInternal(EventTarget& target, TaskSource source, TaskCancellationGroup& cancellationGroup, Ref&& event) +{ + ASSERT(!event->target() || &target == event->target()); + auto* context = scriptExecutionContext(); + if (!context) + return; + auto& eventLoopTaskGroup = context->eventLoop(); + auto task = makeUnique(source, eventLoopTaskGroup, *this, CancellableTask(cancellationGroup, [target = Ref { target }, event = WTFMove(event)] { + target->dispatchEvent(event); + })); + eventLoopTaskGroup.queueTask(WTFMove(task)); +} + +} // namespace WebCore -- cgit v1.2.3 rash'>jarred/fix-crash Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2022-06-15wip direct streamsGravatar Jarred Sumner 24-398/+2276
2022-06-12ArrayBufferSink works and it's good.Gravatar Jarred Sumner 26-170/+2054
2022-06-12Fix build issueGravatar Jarred Sumner 2-0/+6
2022-06-12Delete broken submoduleGravatar Jarred Sumner 1-0/+0
2022-06-10Update Dockerfile.baseGravatar Jarred Sumner 1-1/+1
2022-06-10Update WebKitGravatar Jarred Sumner 1-0/+0
2022-06-10Update event_loop.zigGravatar Jarred Sumner 1-0/+1
2022-06-10Missing errno on linuxGravatar Jarred Sumner 1-3/+1
2022-06-10Update js_parser.zigGravatar Jarred Sumner 1-21/+200
2022-06-10Update MakefileGravatar Jarred Sumner 1-4/+4
2022-06-10wip fix linux buildGravatar Jarred Sumner 1-9/+11
2022-06-10Don't show generic crash info when given invalid bunfig.tomlGravatar Jarred Sumner 1-0/+4
2022-06-10Update logger.zigGravatar Jarred Sumner 1-0/+4
2022-06-10Show tracingGravatar Jarred Sumner 1-1/+1
2022-06-10Update bunfig.zigGravatar Jarred Sumner 1-0/+1
2022-06-10Update jest.zigGravatar Jarred Sumner 1-6/+9
2022-06-09Update bun.d.tsGravatar Jarred Sumner 1-2/+5
2022-06-09Add typesGravatar Jarred Sumner 1-2/+32
2022-06-09`new Response(stream).arrayBuffer()` + 3 moreGravatar Jarred Sumner 16-39/+478
2022-06-09fix some memory leaks with stringsGravatar Jarred Sumner 4-28/+45
2022-06-09Support console.log(myBigInt)Gravatar Jarred Sumner 1-1/+6
2022-06-09Fix defaultProps with JSX optimizationGravatar Jarred Sumner 6-34/+73
2022-06-09small perf improvements to encodingGravatar Jarred Sumner 1-43/+37
2022-06-07Update event_loop.zigGravatar Jarred Sumner 1-1/+2