Bug 1850713: remove duplicated setting of early hint preloader id in `ScriptLoader...
[gecko.git] / dom / base / TimeoutHandler.cpp
blobddf2b6abd7a106e79f9f6607ce47d1e6a2d5c2f9
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "TimeoutHandler.h"
9 #include "mozilla/Assertions.h"
10 #include "mozilla/HoldDropJSObjects.h"
11 #include "nsJSUtils.h"
13 namespace mozilla::dom {
15 //-----------------------------------------------------------------------------
16 // TimeoutHandler
17 //-----------------------------------------------------------------------------
19 TimeoutHandler::TimeoutHandler(JSContext* aCx) : TimeoutHandler() {
20 nsJSUtils::GetCallingLocation(aCx, mFileName, &mLineNo, &mColumn);
23 bool TimeoutHandler::Call(const char* /* unused */) { return false; }
25 void TimeoutHandler::GetLocation(const char** aFileName, uint32_t* aLineNo,
26 uint32_t* aColumn) {
27 *aFileName = mFileName.get();
28 *aLineNo = mLineNo;
29 *aColumn = mColumn;
32 void TimeoutHandler::GetDescription(nsACString& aOutString) {
33 aOutString.AppendPrintf("<generic handler> (%s:%d:%d)", mFileName.get(),
34 mLineNo, mColumn);
37 //-----------------------------------------------------------------------------
38 // ScriptTimeoutHandler
39 //-----------------------------------------------------------------------------
41 ScriptTimeoutHandler::ScriptTimeoutHandler(JSContext* aCx,
42 nsIGlobalObject* aGlobal,
43 const nsAString& aExpression)
44 : TimeoutHandler(aCx), mGlobal(aGlobal), mExpr(aExpression) {}
46 NS_IMPL_CYCLE_COLLECTION_CLASS(ScriptTimeoutHandler)
48 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ScriptTimeoutHandler)
49 NS_IMPL_CYCLE_COLLECTION_UNLINK(mGlobal)
50 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
52 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(ScriptTimeoutHandler)
53 if (MOZ_UNLIKELY(cb.WantDebugInfo())) {
54 nsAutoCString name("ScriptTimeoutHandler");
55 name.AppendLiteral(" [");
56 name.Append(tmp->mFileName);
57 name.Append(':');
58 name.AppendInt(tmp->mLineNo);
59 name.Append(':');
60 name.AppendInt(tmp->mColumn);
61 name.Append(']');
62 cb.DescribeRefCountedNode(tmp->mRefCnt.get(), name.get());
63 } else {
64 NS_IMPL_CYCLE_COLLECTION_DESCRIBE(ScriptTimeoutHandler, tmp->mRefCnt.get())
67 // If we need to make TimeoutHandler CCed, don't call its Traverse method
68 // here, otherwise we ends up report same object twice if logging is on. See
69 // https://bugzilla.mozilla.org/show_bug.cgi?id=1588208.
71 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
72 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
74 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ScriptTimeoutHandler)
75 NS_INTERFACE_MAP_ENTRY(nsISupports)
76 NS_INTERFACE_MAP_END
78 NS_IMPL_CYCLE_COLLECTING_ADDREF(ScriptTimeoutHandler)
79 NS_IMPL_CYCLE_COLLECTING_RELEASE(ScriptTimeoutHandler)
81 void ScriptTimeoutHandler::GetDescription(nsACString& aOutString) {
82 if (mExpr.Length() > 15) {
83 aOutString.AppendPrintf(
84 "<string handler (truncated): \"%s...\"> (%s:%d:%d)",
85 NS_ConvertUTF16toUTF8(Substring(mExpr, 0, 13)).get(), mFileName.get(),
86 mLineNo, mColumn);
87 } else {
88 aOutString.AppendPrintf("<string handler: \"%s\"> (%s:%d:%d)",
89 NS_ConvertUTF16toUTF8(mExpr).get(), mFileName.get(),
90 mLineNo, mColumn);
94 //-----------------------------------------------------------------------------
95 // CallbackTimeoutHandler
96 //-----------------------------------------------------------------------------
98 CallbackTimeoutHandler::CallbackTimeoutHandler(
99 JSContext* aCx, nsIGlobalObject* aGlobal, Function* aFunction,
100 nsTArray<JS::Heap<JS::Value>>&& aArguments)
101 : TimeoutHandler(aCx), mGlobal(aGlobal), mFunction(aFunction) {
102 mozilla::HoldJSObjects(this);
103 mArgs = std::move(aArguments);
106 NS_IMPL_CYCLE_COLLECTION_CLASS(CallbackTimeoutHandler)
108 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CallbackTimeoutHandler)
109 NS_IMPL_CYCLE_COLLECTION_UNLINK(mGlobal)
110 NS_IMPL_CYCLE_COLLECTION_UNLINK(mFunction)
111 tmp->ReleaseJSObjects();
112 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
114 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(CallbackTimeoutHandler)
115 if (MOZ_UNLIKELY(cb.WantDebugInfo())) {
116 nsAutoCString name("CallbackTimeoutHandler");
117 JSObject* obj = tmp->mFunction->CallablePreserveColor();
118 JSFunction* fun =
119 JS_GetObjectFunction(js::UncheckedUnwrapWithoutExpose(obj));
120 if (fun && JS_GetFunctionId(fun)) {
121 JSLinearString* funId = JS_ASSERT_STRING_IS_LINEAR(JS_GetFunctionId(fun));
122 size_t size = 1 + JS_PutEscapedLinearString(nullptr, 0, funId, 0);
123 char* funIdName = new char[size];
124 if (funIdName) {
125 JS_PutEscapedLinearString(funIdName, size, funId, 0);
126 name.AppendLiteral(" [");
127 name.Append(funIdName);
128 delete[] funIdName;
129 name.Append(']');
132 cb.DescribeRefCountedNode(tmp->mRefCnt.get(), name.get());
133 } else {
134 NS_IMPL_CYCLE_COLLECTION_DESCRIBE(CallbackTimeoutHandler,
135 tmp->mRefCnt.get())
138 // If we need to make TimeoutHandler CCed, don't call its Traverse method
139 // here, otherwise we ends up report same object twice if logging is on. See
140 // https://bugzilla.mozilla.org/show_bug.cgi?id=1588208.
142 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
143 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFunction)
144 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
146 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(CallbackTimeoutHandler)
147 for (size_t i = 0; i < tmp->mArgs.Length(); ++i) {
148 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mArgs[i])
150 NS_IMPL_CYCLE_COLLECTION_TRACE_END
152 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CallbackTimeoutHandler)
153 NS_INTERFACE_MAP_ENTRY(nsISupports)
154 NS_INTERFACE_MAP_END
156 NS_IMPL_CYCLE_COLLECTING_ADDREF(CallbackTimeoutHandler)
157 NS_IMPL_CYCLE_COLLECTING_RELEASE(CallbackTimeoutHandler)
159 void CallbackTimeoutHandler::ReleaseJSObjects() {
160 mArgs.Clear();
161 mozilla::DropJSObjects(this);
164 bool CallbackTimeoutHandler::Call(const char* aExecutionReason) {
165 IgnoredErrorResult rv;
166 JS::Rooted<JS::Value> ignoredVal(RootingCx());
167 MOZ_KnownLive(mFunction)->Call(MOZ_KnownLive(mGlobal), mArgs, &ignoredVal, rv,
168 aExecutionReason);
169 return !rv.IsUncatchableException();
172 void CallbackTimeoutHandler::MarkForCC() { mFunction->MarkForCC(); }
174 void CallbackTimeoutHandler::GetDescription(nsACString& aOutString) {
175 mFunction->GetDescription(aOutString);
178 } // namespace mozilla::dom