no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / dom / indexedDB / ScriptErrorHelper.cpp
blob0bf33336ba329a57ccaebb35c0713c6d4a6d5e92
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"
10 #include "nsCOMPtr.h"
11 #include "nsComponentManagerUtils.h"
12 #include "nsContentUtils.h"
13 #include "nsIConsoleService.h"
14 #include "nsIScriptError.h"
15 #include "nsServiceManagerUtils.h"
16 #include "nsString.h"
17 #include "nsThreadUtils.h"
19 #include "mozilla/SchedulerGroup.h"
21 namespace {
23 class ScriptErrorRunnable final : public mozilla::Runnable {
24 nsString mMessage;
25 nsCString mMessageName;
26 nsString mFilename;
27 uint32_t mLineNumber;
28 uint32_t mColumnNumber;
29 uint32_t mSeverityFlag;
30 uint64_t mInnerWindowID;
31 bool mIsChrome;
33 public:
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"),
39 mMessage(aMessage),
40 mFilename(aFilename),
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),
56 mFilename(aFilename),
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)))) {
78 return;
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;
92 if (aIsChrome) {
93 category.AssignLiteral("chrome ");
94 } else {
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
105 // down.
106 if (!scriptError) {
107 return;
110 if (aInnerWindowID) {
111 MOZ_ALWAYS_SUCCEEDS(scriptError->InitWithWindowID(
112 aMessage, aFilename,
113 /* aSourceLine */ u""_ns, aLineNumber, aColumnNumber, aSeverityFlag,
114 category, aInnerWindowID));
115 } else {
116 MOZ_ALWAYS_SUCCEEDS(scriptError->Init(
117 aMessage, aFilename,
118 /* aSourceLine */ u""_ns, aLineNumber, aColumnNumber, aSeverityFlag,
119 category,
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
125 // down.
126 if (consoleService) {
127 MOZ_ALWAYS_SUCCEEDS(consoleService->LogMessage(scriptError));
131 NS_IMETHOD
132 Run() override {
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);
139 return NS_OK;
142 DumpLocalizedMessage(mMessageName, mFilename, mLineNumber, mColumnNumber,
143 mSeverityFlag, mIsChrome, mInnerWindowID);
145 return NS_OK;
148 private:
149 virtual ~ScriptErrorRunnable() = default;
152 } // namespace
154 namespace mozilla::dom::indexedDB {
156 /*static*/
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);
164 } else {
165 RefPtr<ScriptErrorRunnable> runnable =
166 new ScriptErrorRunnable(aMessage, aFilename, aLineNumber, aColumnNumber,
167 aSeverityFlag, aIsChrome, aInnerWindowID);
168 MOZ_ALWAYS_SUCCEEDS(SchedulerGroup::Dispatch(runnable.forget()));
172 /*static*/
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);
181 } else {
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