Line data Source code
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/. */
6 :
7 : #include "ScriptErrorHelper.h"
8 :
9 : #include "MainThreadUtils.h"
10 : #include "mozilla/SystemGroup.h"
11 : #include "nsCOMPtr.h"
12 : #include "nsContentUtils.h"
13 : #include "nsIConsoleService.h"
14 : #include "nsIScriptError.h"
15 : #include "nsString.h"
16 : #include "nsThreadUtils.h"
17 :
18 : namespace {
19 :
20 : class ScriptErrorRunnable final : public mozilla::Runnable
21 : {
22 : nsString mMessage;
23 : nsCString mMessageName;
24 : nsString mFilename;
25 : uint32_t mLineNumber;
26 : uint32_t mColumnNumber;
27 : uint32_t mSeverityFlag;
28 : uint64_t mInnerWindowID;
29 : bool mIsChrome;
30 :
31 : public:
32 0 : ScriptErrorRunnable(const nsAString& aMessage,
33 : const nsAString& aFilename,
34 : uint32_t aLineNumber,
35 : uint32_t aColumnNumber,
36 : uint32_t aSeverityFlag,
37 : bool aIsChrome,
38 : uint64_t aInnerWindowID)
39 0 : : mozilla::Runnable("ScriptErrorRunnable")
40 : , mMessage(aMessage)
41 : , mFilename(aFilename)
42 : , mLineNumber(aLineNumber)
43 : , mColumnNumber(aColumnNumber)
44 : , mSeverityFlag(aSeverityFlag)
45 : , mInnerWindowID(aInnerWindowID)
46 0 : , mIsChrome(aIsChrome)
47 : {
48 0 : MOZ_ASSERT(!NS_IsMainThread());
49 0 : mMessageName.SetIsVoid(true);
50 0 : }
51 :
52 0 : ScriptErrorRunnable(const nsACString& aMessageName,
53 : const nsAString& aFilename,
54 : uint32_t aLineNumber,
55 : uint32_t aColumnNumber,
56 : uint32_t aSeverityFlag,
57 : bool aIsChrome,
58 : uint64_t aInnerWindowID)
59 0 : : mozilla::Runnable("ScriptErrorRunnable")
60 : , mMessageName(aMessageName)
61 : , mFilename(aFilename)
62 : , mLineNumber(aLineNumber)
63 : , mColumnNumber(aColumnNumber)
64 : , mSeverityFlag(aSeverityFlag)
65 : , mInnerWindowID(aInnerWindowID)
66 0 : , mIsChrome(aIsChrome)
67 : {
68 0 : MOZ_ASSERT(!NS_IsMainThread());
69 0 : mMessage.SetIsVoid(true);
70 0 : }
71 :
72 : static void
73 0 : DumpLocalizedMessage(const nsACString& aMessageName,
74 : const nsAString& aFilename,
75 : uint32_t aLineNumber,
76 : uint32_t aColumnNumber,
77 : uint32_t aSeverityFlag,
78 : bool aIsChrome,
79 : uint64_t aInnerWindowID)
80 : {
81 0 : MOZ_ASSERT(NS_IsMainThread());
82 0 : MOZ_ASSERT(!aMessageName.IsEmpty());
83 :
84 0 : nsXPIDLString localizedMessage;
85 0 : if (NS_WARN_IF(NS_FAILED(
86 : nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
87 : aMessageName.BeginReading(),
88 : localizedMessage)))) {
89 0 : return;
90 : }
91 :
92 0 : Dump(localizedMessage,
93 : aFilename,
94 : aLineNumber,
95 : aColumnNumber,
96 : aSeverityFlag,
97 : aIsChrome,
98 0 : aInnerWindowID);
99 : }
100 :
101 : static void
102 0 : Dump(const nsAString& aMessage,
103 : const nsAString& aFilename,
104 : uint32_t aLineNumber,
105 : uint32_t aColumnNumber,
106 : uint32_t aSeverityFlag,
107 : bool aIsChrome,
108 : uint64_t aInnerWindowID)
109 : {
110 0 : MOZ_ASSERT(NS_IsMainThread());
111 :
112 0 : nsAutoCString category;
113 0 : if (aIsChrome) {
114 0 : category.AssignLiteral("chrome ");
115 : } else {
116 0 : category.AssignLiteral("content ");
117 : }
118 0 : category.AppendLiteral("javascript");
119 :
120 : nsCOMPtr<nsIConsoleService> consoleService =
121 0 : do_GetService(NS_CONSOLESERVICE_CONTRACTID);
122 0 : MOZ_ASSERT(consoleService);
123 :
124 : nsCOMPtr<nsIScriptError> scriptError =
125 0 : do_CreateInstance(NS_SCRIPTERROR_CONTRACTID);
126 0 : MOZ_ASSERT(scriptError);
127 :
128 0 : if (aInnerWindowID) {
129 0 : MOZ_ALWAYS_SUCCEEDS(
130 : scriptError->InitWithWindowID(aMessage,
131 : aFilename,
132 : /* aSourceLine */ EmptyString(),
133 : aLineNumber,
134 : aColumnNumber,
135 : aSeverityFlag,
136 : category,
137 : aInnerWindowID));
138 : } else {
139 0 : MOZ_ALWAYS_SUCCEEDS(
140 : scriptError->Init(aMessage,
141 : aFilename,
142 : /* aSourceLine */ EmptyString(),
143 : aLineNumber,
144 : aColumnNumber,
145 : aSeverityFlag,
146 : category.get()));
147 : }
148 :
149 0 : MOZ_ALWAYS_SUCCEEDS(consoleService->LogMessage(scriptError));
150 0 : }
151 :
152 : NS_IMETHOD
153 0 : Run() override
154 : {
155 0 : MOZ_ASSERT(NS_IsMainThread());
156 0 : MOZ_ASSERT(mMessage.IsVoid() != mMessageName.IsVoid());
157 :
158 0 : if (!mMessage.IsVoid()) {
159 0 : Dump(mMessage,
160 : mFilename,
161 : mLineNumber,
162 : mColumnNumber,
163 : mSeverityFlag,
164 0 : mIsChrome,
165 0 : mInnerWindowID);
166 0 : return NS_OK;
167 : }
168 :
169 0 : DumpLocalizedMessage(mMessageName,
170 : mFilename,
171 : mLineNumber,
172 : mColumnNumber,
173 : mSeverityFlag,
174 0 : mIsChrome,
175 0 : mInnerWindowID);
176 :
177 0 : return NS_OK;
178 : }
179 :
180 : private:
181 0 : virtual ~ScriptErrorRunnable() {}
182 : };
183 :
184 : } // namespace
185 :
186 : namespace mozilla {
187 : namespace dom {
188 : namespace indexedDB {
189 :
190 : /*static*/ void
191 0 : ScriptErrorHelper::Dump(const nsAString& aMessage,
192 : const nsAString& aFilename,
193 : uint32_t aLineNumber,
194 : uint32_t aColumnNumber,
195 : uint32_t aSeverityFlag,
196 : bool aIsChrome,
197 : uint64_t aInnerWindowID)
198 : {
199 0 : if (NS_IsMainThread()) {
200 0 : ScriptErrorRunnable::Dump(aMessage,
201 : aFilename,
202 : aLineNumber,
203 : aColumnNumber,
204 : aSeverityFlag,
205 : aIsChrome,
206 0 : aInnerWindowID);
207 : } else {
208 : RefPtr<ScriptErrorRunnable> runnable =
209 : new ScriptErrorRunnable(aMessage,
210 : aFilename,
211 : aLineNumber,
212 : aColumnNumber,
213 : aSeverityFlag,
214 : aIsChrome,
215 0 : aInnerWindowID);
216 0 : MOZ_ALWAYS_SUCCEEDS(
217 : SystemGroup::Dispatch("indexedDB::ScriptErrorHelper::Dump",
218 : TaskCategory::Other,
219 : runnable.forget()));
220 : }
221 0 : }
222 :
223 : /*static*/ void
224 0 : ScriptErrorHelper::DumpLocalizedMessage(const nsACString& aMessageName,
225 : const nsAString& aFilename,
226 : uint32_t aLineNumber,
227 : uint32_t aColumnNumber,
228 : uint32_t aSeverityFlag,
229 : bool aIsChrome,
230 : uint64_t aInnerWindowID)
231 : {
232 0 : if (NS_IsMainThread()) {
233 0 : ScriptErrorRunnable::DumpLocalizedMessage(aMessageName,
234 : aFilename,
235 : aLineNumber,
236 : aColumnNumber,
237 : aSeverityFlag,
238 : aIsChrome,
239 0 : aInnerWindowID);
240 : } else {
241 : RefPtr<ScriptErrorRunnable> runnable =
242 : new ScriptErrorRunnable(aMessageName,
243 : aFilename,
244 : aLineNumber,
245 : aColumnNumber,
246 : aSeverityFlag,
247 : aIsChrome,
248 0 : aInnerWindowID);
249 0 : MOZ_ALWAYS_SUCCEEDS(
250 : SystemGroup::Dispatch("indexedDB::ScriptErrorHelper::DumpLocalizedMessage",
251 : TaskCategory::Other,
252 : runnable.forget()));
253 : }
254 0 : }
255 :
256 : } // namespace indexedDB
257 : } // namespace dom
258 9 : } // namespace mozilla
|