Commit 3cdb7d19 authored by Daniel Rubery's avatar Daniel Rubery Committed by Commit Bot

Add CRSBLOG macro to log debug messages on chrome://safe-browsing

Example usage is: CRSBLOG << "debug messages " << this; It should
serialize all objects in the same way as the regular LOG macro.

Bug: 874693
Change-Id: I761184f919129a62dbde741bf97cf4a1d1cdb1ad
Reviewed-on: https://chromium-review.googlesource.com/1181654
Commit-Queue: Daniel Rubery <drubery@chromium.org>
Reviewed-by: default avatarVarun Khaneja <vakh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#584779}
parent 702edef9
......@@ -27,6 +27,7 @@
<tab>Download Protection</tab>
<tab>Password Protection</tab>
<tab>Referrer Chain</tab>
<tab>Log Messages</tab>
</tabs>
<tabpanels>
<tabpanel>
......@@ -89,6 +90,12 @@
<p id="referrer-chain"></p>
</div>
</tabpanel>
<tabpanel>
<h2>Log Messages</h2>
<div class="content">
<p id="log-messages"></p>
</div>
</tabpanel>
</tabpanels>
</tabbox>
<script src="chrome://resources/js/i18n_template.js"></script>
......
......@@ -79,6 +79,14 @@ cr.define('safe_browsing', function() {
addPGResponse(result);
});
cr.sendWithPromise('getLogMessages', [])
.then((logMessages) => { logMessages.forEach(function (message) {
addLogMessage(message);
})});
cr.addWebUIListener('log-messages-update', function(message) {
addLogMessage(message);
});
$('get-referrer-chain-form').addEventListener('submit', addReferrerChain);
}
......@@ -190,6 +198,13 @@ cr.define('safe_browsing', function() {
appendChildWithInnerText(cell, response);
}
function addLogMessage(result) {
var logDiv = $('log-messages');
var eventFormatted = "[" + (new Date(result["time"])).toLocaleString() +
"] " + result['message'];
appendChildWithInnerText(logDiv, eventFormatted);
}
function appendChildWithInnerText(logDiv, text) {
if (!logDiv)
return;
......
......@@ -151,6 +151,21 @@ void WebUIInfoSingleton::ClearPGPings() {
std::map<int, LoginReputationClientResponse>().swap(pg_responses_);
}
void WebUIInfoSingleton::LogMessage(const std::string& message) {
if (webui_instances_.empty())
return;
base::Time timestamp = base::Time::Now();
log_messages_.push_back(std::make_pair(timestamp, message));
for (auto* webui_listener : webui_instances_)
webui_listener->NotifyLogMessageJsListener(timestamp, message);
}
void WebUIInfoSingleton::ClearLogMessages() {
std::vector<std::pair<base::Time, std::string>>().swap(log_messages_);
}
void WebUIInfoSingleton::RegisterWebUIInstance(SafeBrowsingUIHandler* webui) {
webui_instances_.push_back(webui);
}
......@@ -163,6 +178,8 @@ void WebUIInfoSingleton::UnregisterWebUIInstance(SafeBrowsingUIHandler* webui) {
ClearCSBRRsSent();
ClearClientDownloadRequestsSent();
ClearPGEvents();
ClearPGPings();
ClearLogMessages();
}
}
......@@ -853,6 +870,14 @@ std::string SerializePGResponse(const LoginReputationClientResponse& response) {
return response_serialized;
}
base::Value SerializeLogMessage(const base::Time& timestamp,
const std::string& message) {
base::DictionaryValue result;
result.SetDouble("time", timestamp.ToJsTime());
result.SetString("message", message);
return std::move(result);
}
} // namespace
SafeBrowsingUI::SafeBrowsingUI(content::WebUI* web_ui)
......@@ -1098,6 +1123,22 @@ void SafeBrowsingUIHandler::GetReferrerChain(const base::ListValue* args) {
base::Value(referrer_chain_serialized));
}
void SafeBrowsingUIHandler::GetLogMessages(const base::ListValue* args) {
const std::vector<std::pair<base::Time, std::string>>& log_messages =
WebUIInfoSingleton::GetInstance()->log_messages();
base::ListValue messages_received;
for (const auto& message : log_messages) {
messages_received.GetList().push_back(
base::Value(SerializeLogMessage(message.first, message.second)));
}
AllowJavascript();
std::string callback_id;
args->GetString(0, &callback_id);
ResolveJavascriptCallback(base::Value(callback_id), messages_received);
}
void SafeBrowsingUIHandler::NotifyClientDownloadRequestJsListener(
ClientDownloadRequest* client_download_request) {
AllowJavascript();
......@@ -1148,6 +1189,14 @@ void SafeBrowsingUIHandler::NotifyPGResponseJsListener(
FireWebUIListener("pg-responses-update", response_list);
}
void SafeBrowsingUIHandler::NotifyLogMessageJsListener(
const base::Time& timestamp,
const std::string& message) {
AllowJavascript();
FireWebUIListener("log-messages-update",
base::Value(SerializeLogMessage(timestamp, message)));
}
void SafeBrowsingUIHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"getExperiments",
......@@ -1187,10 +1236,20 @@ void SafeBrowsingUIHandler::RegisterMessages() {
"getPGResponses",
base::BindRepeating(&SafeBrowsingUIHandler::GetPGResponses,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"getLogMessages",
base::BindRepeating(&SafeBrowsingUIHandler::GetLogMessages,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"getReferrerChain",
base::BindRepeating(&SafeBrowsingUIHandler::GetReferrerChain,
base::Unretained(this)));
}
CrSBLogMessage::CrSBLogMessage() {}
CrSBLogMessage::~CrSBLogMessage() {
WebUIInfoSingleton::GetInstance()->LogMessage(stream_.str());
}
} // namespace safe_browsing
......@@ -69,6 +69,10 @@ class SafeBrowsingUIHandler : public content::WebUIMessageHandler {
// Get the current referrer chain for a given URL.
void GetReferrerChain(const base::ListValue* args);
// Get the list of log messages that have been received since the oldest
// currently open chrome://safe-browsing tab was opened.
void GetLogMessages(const base::ListValue* args);
// Register callbacks for WebUI messages.
void RegisterMessages() override;
......@@ -104,6 +108,11 @@ class SafeBrowsingUIHandler : public content::WebUIMessageHandler {
int token,
const LoginReputationClientResponse& response);
// Called when any new log messages are received while one or more WebUI tabs
// are open.
void NotifyLogMessageJsListener(const base::Time& timestamp,
const std::string& message);
content::BrowserContext* browser_context_;
// List that keeps all the WebUI listener objects.
......@@ -171,6 +180,12 @@ class WebUIInfoSingleton {
// Clear the list of sent PhishGuard pings and responses.
void ClearPGPings();
// Log an arbitrary message. Frequently used for debugging.
void LogMessage(const std::string& message);
// Clear the log messages.
void ClearLogMessages();
// Register the new WebUI listener object.
void RegisterWebUIInstance(SafeBrowsingUIHandler* webui);
......@@ -230,6 +245,10 @@ class WebUIInfoSingleton {
referrer_chain_provider_ = provider;
}
const std::vector<std::pair<base::Time, std::string>>& log_messages() {
return log_messages_;
}
private:
WebUIInfoSingleton();
~WebUIInfoSingleton();
......@@ -273,12 +292,29 @@ class WebUIInfoSingleton {
// marked const.
std::vector<SafeBrowsingUIHandler*> webui_instances_;
// List of messages logged since the oldest currently open
// chrome://safe-browsing tab was opened.
std::vector<std::pair<base::Time, std::string>> log_messages_;
// The current referrer chain provider, if any. Can be nullptr.
ReferrerChainProvider* referrer_chain_provider_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(WebUIInfoSingleton);
};
class CrSBLogMessage {
public:
CrSBLogMessage();
~CrSBLogMessage();
std::ostream& stream() { return stream_; }
private:
std::ostringstream stream_;
};
#define CRSBLOG CrSBLogMessage().stream()
} // namespace safe_browsing
#endif // COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment