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 "ScriptErrorHelper.h"
9 #include "MainThreadUtils.h"
11 #include "nsComponentManagerUtils.h"
12 #include "nsContentUtils.h"
13 #include "nsIConsoleService.h"
14 #include "nsIScriptError.h"
15 #include "nsServiceManagerUtils.h"
17 #include "nsThreadUtils.h"
19 #include "mozilla/SchedulerGroup.h"
23 class ScriptErrorRunnable final
: public mozilla::Runnable
{
25 nsCString mMessageName
;
28 uint32_t mColumnNumber
;
29 uint32_t mSeverityFlag
;
30 uint64_t mInnerWindowID
;
34 ScriptErrorRunnable(const nsAString
& aMessage
, const nsAString
& aFilename
,
35 uint32_t aLineNumber
, uint32_t aColumnNumber
,
36 uint32_t aSeverityFlag
, bool aIsChrome
,
37 uint64_t aInnerWindowID
)
38 : mozilla::Runnable("ScriptErrorRunnable"),
41 mLineNumber(aLineNumber
),
42 mColumnNumber(aColumnNumber
),
43 mSeverityFlag(aSeverityFlag
),
44 mInnerWindowID(aInnerWindowID
),
45 mIsChrome(aIsChrome
) {
46 MOZ_ASSERT(!NS_IsMainThread());
47 mMessageName
.SetIsVoid(true);
50 ScriptErrorRunnable(const nsACString
& aMessageName
,
51 const nsAString
& aFilename
, uint32_t aLineNumber
,
52 uint32_t aColumnNumber
, uint32_t aSeverityFlag
,
53 bool aIsChrome
, uint64_t aInnerWindowID
)
54 : mozilla::Runnable("ScriptErrorRunnable"),
55 mMessageName(aMessageName
),
57 mLineNumber(aLineNumber
),
58 mColumnNumber(aColumnNumber
),
59 mSeverityFlag(aSeverityFlag
),
60 mInnerWindowID(aInnerWindowID
),
61 mIsChrome(aIsChrome
) {
62 MOZ_ASSERT(!NS_IsMainThread());
63 mMessage
.SetIsVoid(true);
66 static void DumpLocalizedMessage(const nsACString
& aMessageName
,
67 const nsAString
& aFilename
,
68 uint32_t aLineNumber
, uint32_t aColumnNumber
,
69 uint32_t aSeverityFlag
, bool aIsChrome
,
70 uint64_t aInnerWindowID
) {
71 MOZ_ASSERT(NS_IsMainThread());
72 MOZ_ASSERT(!aMessageName
.IsEmpty());
74 nsAutoString localizedMessage
;
75 if (NS_WARN_IF(NS_FAILED(nsContentUtils::GetLocalizedString(
76 nsContentUtils::eDOM_PROPERTIES
, aMessageName
.BeginReading(),
77 localizedMessage
)))) {
81 Dump(localizedMessage
, aFilename
, aLineNumber
, aColumnNumber
, aSeverityFlag
,
82 aIsChrome
, aInnerWindowID
);
85 static void Dump(const nsAString
& aMessage
, const nsAString
& aFilename
,
86 uint32_t aLineNumber
, uint32_t aColumnNumber
,
87 uint32_t aSeverityFlag
, bool aIsChrome
,
88 uint64_t aInnerWindowID
) {
89 MOZ_ASSERT(NS_IsMainThread());
91 nsAutoCString category
;
93 category
.AssignLiteral("chrome ");
95 category
.AssignLiteral("content ");
97 category
.AppendLiteral("javascript");
99 nsCOMPtr
<nsIConsoleService
> consoleService
=
100 do_GetService(NS_CONSOLESERVICE_CONTRACTID
);
102 nsCOMPtr
<nsIScriptError
> scriptError
=
103 do_CreateInstance(NS_SCRIPTERROR_CONTRACTID
);
104 // We may not be able to create the script error object when we're shutting
110 if (aInnerWindowID
) {
111 MOZ_ALWAYS_SUCCEEDS(scriptError
->InitWithWindowID(
113 /* aSourceLine */ u
""_ns
, aLineNumber
, aColumnNumber
, aSeverityFlag
,
114 category
, aInnerWindowID
));
116 MOZ_ALWAYS_SUCCEEDS(scriptError
->Init(
118 /* aSourceLine */ u
""_ns
, aLineNumber
, aColumnNumber
, aSeverityFlag
,
120 /* IDB doesn't run on Private browsing mode */ false,
121 /* from chrome context */ aIsChrome
));
124 // We may not be able to obtain the console service when we're shutting
126 if (consoleService
) {
127 MOZ_ALWAYS_SUCCEEDS(consoleService
->LogMessage(scriptError
));
133 MOZ_ASSERT(NS_IsMainThread());
134 MOZ_ASSERT(mMessage
.IsVoid() != mMessageName
.IsVoid());
136 if (!mMessage
.IsVoid()) {
137 Dump(mMessage
, mFilename
, mLineNumber
, mColumnNumber
, mSeverityFlag
,
138 mIsChrome
, mInnerWindowID
);
142 DumpLocalizedMessage(mMessageName
, mFilename
, mLineNumber
, mColumnNumber
,
143 mSeverityFlag
, mIsChrome
, mInnerWindowID
);
149 virtual ~ScriptErrorRunnable() = default;
154 namespace mozilla::dom::indexedDB
{
157 void ScriptErrorHelper::Dump(const nsAString
& aMessage
,
158 const nsAString
& aFilename
, uint32_t aLineNumber
,
159 uint32_t aColumnNumber
, uint32_t aSeverityFlag
,
160 bool aIsChrome
, uint64_t aInnerWindowID
) {
161 if (NS_IsMainThread()) {
162 ScriptErrorRunnable::Dump(aMessage
, aFilename
, aLineNumber
, aColumnNumber
,
163 aSeverityFlag
, aIsChrome
, aInnerWindowID
);
165 RefPtr
<ScriptErrorRunnable
> runnable
=
166 new ScriptErrorRunnable(aMessage
, aFilename
, aLineNumber
, aColumnNumber
,
167 aSeverityFlag
, aIsChrome
, aInnerWindowID
);
168 MOZ_ALWAYS_SUCCEEDS(SchedulerGroup::Dispatch(runnable
.forget()));
173 void ScriptErrorHelper::DumpLocalizedMessage(
174 const nsACString
& aMessageName
, const nsAString
& aFilename
,
175 uint32_t aLineNumber
, uint32_t aColumnNumber
, uint32_t aSeverityFlag
,
176 bool aIsChrome
, uint64_t aInnerWindowID
) {
177 if (NS_IsMainThread()) {
178 ScriptErrorRunnable::DumpLocalizedMessage(
179 aMessageName
, aFilename
, aLineNumber
, aColumnNumber
, aSeverityFlag
,
180 aIsChrome
, aInnerWindowID
);
182 RefPtr
<ScriptErrorRunnable
> runnable
= new ScriptErrorRunnable(
183 aMessageName
, aFilename
, aLineNumber
, aColumnNumber
, aSeverityFlag
,
184 aIsChrome
, aInnerWindowID
);
185 MOZ_ALWAYS_SUCCEEDS(SchedulerGroup::Dispatch(runnable
.forget()));
189 } // namespace mozilla::dom::indexedDB