1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "content/browser/log_console_message.h"
6 
7 #include "base/feature_list.h"
8 #include "base/logging.h"
9 #include "build/build_config.h"
10 #include "content/public/common/content_features.h"
11 
12 namespace content {
13 
ConsoleMessageLevelToLogSeverity(blink::mojom::ConsoleMessageLevel level)14 logging::LogSeverity ConsoleMessageLevelToLogSeverity(
15     blink::mojom::ConsoleMessageLevel level) {
16   logging::LogSeverity log_severity = logging::LOG_VERBOSE;
17   switch (level) {
18     case blink::mojom::ConsoleMessageLevel::kVerbose:
19       log_severity = logging::LOG_VERBOSE;
20       break;
21     case blink::mojom::ConsoleMessageLevel::kInfo:
22       log_severity = logging::LOG_INFO;
23       break;
24     case blink::mojom::ConsoleMessageLevel::kWarning:
25       log_severity = logging::LOG_WARNING;
26       break;
27     case blink::mojom::ConsoleMessageLevel::kError:
28       log_severity = logging::LOG_ERROR;
29       break;
30   }
31 
32   return log_severity;
33 }
34 
LogConsoleMessage(blink::mojom::ConsoleMessageLevel log_level,const base::string16 & message,int32_t line_number,bool is_builtin_component,bool is_off_the_record,const base::string16 & source_id)35 void LogConsoleMessage(blink::mojom::ConsoleMessageLevel log_level,
36                        const base::string16& message,
37                        int32_t line_number,
38                        bool is_builtin_component,
39                        bool is_off_the_record,
40                        const base::string16& source_id) {
41   const int32_t resolved_level =
42       is_builtin_component ? ConsoleMessageLevelToLogSeverity(log_level)
43                            : ::logging::LOG_INFO;
44   if (::logging::GetMinLogLevel() > resolved_level)
45     return;
46 
47   // LogMessages can be persisted so this shouldn't be logged in incognito mode.
48   // This rule is not applied to WebUI pages or other builtin components,
49   // because WebUI and builtin components source code is a part of Chrome source
50   // code, and we want to treat messages from WebUI and other builtin components
51   // the same way as we treat log messages from native code.
52   if (is_off_the_record && !is_builtin_component)
53     return;
54 
55   if (!base::FeatureList::IsEnabled(features::kLogJsConsoleMessages))
56     return;
57 
58   logging::LogMessage("CONSOLE", line_number, resolved_level).stream()
59       << "\"" << message << "\", source: " << source_id << " (" << line_number
60       << ")";
61 }
62 
63 }  // namespace content
64