Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/console/ConsoleReportCollector.cpp
Line
Count
Source (jump to first uncovered line)
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 "mozilla/ConsoleReportCollector.h"
8
9
#include "ConsoleUtils.h"
10
#include "nsIConsoleService.h"
11
#include "nsIScriptError.h"
12
#include "nsNetUtil.h"
13
14
namespace mozilla {
15
16
using mozilla::dom::ConsoleUtils;
17
18
NS_IMPL_ISUPPORTS(ConsoleReportCollector, nsIConsoleReportCollector)
19
20
ConsoleReportCollector::ConsoleReportCollector()
21
  : mMutex("mozilla::ConsoleReportCollector")
22
0
{
23
0
}
24
25
void
26
ConsoleReportCollector::AddConsoleReport(uint32_t aErrorFlags,
27
                                         const nsACString& aCategory,
28
                                         nsContentUtils::PropertiesFile aPropertiesFile,
29
                                         const nsACString& aSourceFileURI,
30
                                         uint32_t aLineNumber,
31
                                         uint32_t aColumnNumber,
32
                                         const nsACString& aMessageName,
33
                                         const nsTArray<nsString>& aStringParams)
34
0
{
35
0
  // any thread
36
0
  MutexAutoLock lock(mMutex);
37
0
38
0
  mPendingReports.AppendElement(PendingReport(aErrorFlags, aCategory,
39
0
                                              aPropertiesFile, aSourceFileURI,
40
0
                                              aLineNumber, aColumnNumber,
41
0
                                              aMessageName, aStringParams));
42
0
}
43
44
void
45
ConsoleReportCollector::FlushReportsToConsole(uint64_t aInnerWindowID,
46
                                              ReportAction aAction)
47
0
{
48
0
  nsTArray<PendingReport> reports;
49
0
50
0
  {
51
0
    MutexAutoLock lock(mMutex);
52
0
    if (aAction == ReportAction::Forget) {
53
0
      mPendingReports.SwapElements(reports);
54
0
    } else {
55
0
      reports = mPendingReports;
56
0
    }
57
0
  }
58
0
59
0
  for (uint32_t i = 0; i < reports.Length(); ++i) {
60
0
    PendingReport& report = reports[i];
61
0
62
0
    nsAutoString errorText;
63
0
    nsresult rv;
64
0
    if (!report.mStringParams.IsEmpty()) {
65
0
      rv = nsContentUtils::FormatLocalizedString(report.mPropertiesFile,
66
0
                                                 report.mMessageName.get(),
67
0
                                                 report.mStringParams,
68
0
                                                 errorText);
69
0
    } else {
70
0
      rv = nsContentUtils::GetLocalizedString(report.mPropertiesFile,
71
0
                                              report.mMessageName.get(),
72
0
                                              errorText);
73
0
    }
74
0
    if (NS_WARN_IF(NS_FAILED(rv))) {
75
0
      continue;
76
0
    }
77
0
78
0
    // It would be nice if we did not have to do this since ReportToConsole()
79
0
    // just turns around and converts it back to a spec.
80
0
    nsCOMPtr<nsIURI> uri;
81
0
    if (!report.mSourceFileURI.IsEmpty()) {
82
0
      nsresult rv = NS_NewURI(getter_AddRefs(uri), report.mSourceFileURI);
83
0
      MOZ_ALWAYS_SUCCEEDS(rv);
84
0
      if (NS_FAILED(rv)) {
85
0
        continue;
86
0
      }
87
0
    }
88
0
89
0
    nsContentUtils::ReportToConsoleByWindowID(errorText,
90
0
                                              report.mErrorFlags,
91
0
                                              report.mCategory,
92
0
                                              aInnerWindowID,
93
0
                                              uri,
94
0
                                              EmptyString(),
95
0
                                              report.mLineNumber,
96
0
                                              report.mColumnNumber);
97
0
  }
98
0
}
99
100
void
101
ConsoleReportCollector::FlushReportsToConsoleForServiceWorkerScope(const nsACString& aScope,
102
                                                                   ReportAction aAction)
103
0
{
104
0
  nsTArray<PendingReport> reports;
105
0
106
0
  {
107
0
    MutexAutoLock lock(mMutex);
108
0
    if (aAction == ReportAction::Forget) {
109
0
      mPendingReports.SwapElements(reports);
110
0
    } else {
111
0
      reports = mPendingReports;
112
0
    }
113
0
  }
114
0
115
0
  for (uint32_t i = 0; i < reports.Length(); ++i) {
116
0
    PendingReport& report = reports[i];
117
0
118
0
    nsAutoString errorText;
119
0
    nsresult rv;
120
0
    if (!report.mStringParams.IsEmpty()) {
121
0
      rv = nsContentUtils::FormatLocalizedString(report.mPropertiesFile,
122
0
                                                 report.mMessageName.get(),
123
0
                                                 report.mStringParams,
124
0
                                                 errorText);
125
0
    } else {
126
0
      rv = nsContentUtils::GetLocalizedString(report.mPropertiesFile,
127
0
                                              report.mMessageName.get(),
128
0
                                              errorText);
129
0
    }
130
0
    if (NS_WARN_IF(NS_FAILED(rv))) {
131
0
      continue;
132
0
    }
133
0
134
0
    ConsoleUtils::Level level = ConsoleUtils::eLog;
135
0
    switch (report.mErrorFlags) {
136
0
      case nsIScriptError::errorFlag:
137
0
      case nsIScriptError::exceptionFlag:
138
0
        level = ConsoleUtils::eError;
139
0
        break;
140
0
      case nsIScriptError::warningFlag:
141
0
        level = ConsoleUtils::eWarning;
142
0
        break;
143
0
      default:
144
0
        // default to log otherwise
145
0
        break;
146
0
    }
147
0
148
0
    ConsoleUtils::ReportForServiceWorkerScope(NS_ConvertUTF8toUTF16(aScope),
149
0
                                              errorText,
150
0
                                              NS_ConvertUTF8toUTF16(report.mSourceFileURI),
151
0
                                              report.mLineNumber,
152
0
                                              report.mColumnNumber,
153
0
                                              level);
154
0
  }
155
0
}
156
157
void
158
ConsoleReportCollector::FlushConsoleReports(nsIDocument* aDocument,
159
                                            ReportAction aAction)
160
0
{
161
0
  MOZ_ASSERT(NS_IsMainThread());
162
0
163
0
  FlushReportsToConsole(aDocument ? aDocument->InnerWindowID() : 0, aAction);
164
0
}
165
166
void
167
ConsoleReportCollector::FlushConsoleReports(nsILoadGroup* aLoadGroup,
168
                                            ReportAction aAction)
169
0
{
170
0
  FlushReportsToConsole(nsContentUtils::GetInnerWindowID(aLoadGroup), aAction);
171
0
}
172
173
void
174
ConsoleReportCollector::FlushConsoleReports(nsIConsoleReportCollector* aCollector)
175
0
{
176
0
  MOZ_ASSERT(aCollector);
177
0
178
0
  nsTArray<PendingReport> reports;
179
0
180
0
  {
181
0
    MutexAutoLock lock(mMutex);
182
0
    mPendingReports.SwapElements(reports);
183
0
  }
184
0
185
0
  for (uint32_t i = 0; i < reports.Length(); ++i) {
186
0
    PendingReport& report = reports[i];
187
0
    aCollector->AddConsoleReport(report.mErrorFlags, report.mCategory,
188
0
                                 report.mPropertiesFile, report.mSourceFileURI,
189
0
                                 report.mLineNumber, report.mColumnNumber,
190
0
                                 report.mMessageName, report.mStringParams);
191
0
  }
192
0
}
193
194
void
195
ConsoleReportCollector::ClearConsoleReports()
196
0
{
197
0
  MutexAutoLock lock(mMutex);
198
0
199
0
  mPendingReports.Clear();
200
0
}
201
202
ConsoleReportCollector::~ConsoleReportCollector()
203
0
{
204
0
}
205
206
} // namespace mozilla