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 @@ ...@@ -27,6 +27,7 @@
<tab>Download Protection</tab> <tab>Download Protection</tab>
<tab>Password Protection</tab> <tab>Password Protection</tab>
<tab>Referrer Chain</tab> <tab>Referrer Chain</tab>
<tab>Log Messages</tab>
</tabs> </tabs>
<tabpanels> <tabpanels>
<tabpanel> <tabpanel>
...@@ -89,6 +90,12 @@ ...@@ -89,6 +90,12 @@
<p id="referrer-chain"></p> <p id="referrer-chain"></p>
</div> </div>
</tabpanel> </tabpanel>
<tabpanel>
<h2>Log Messages</h2>
<div class="content">
<p id="log-messages"></p>
</div>
</tabpanel>
</tabpanels> </tabpanels>
</tabbox> </tabbox>
<script src="chrome://resources/js/i18n_template.js"></script> <script src="chrome://resources/js/i18n_template.js"></script>
......
...@@ -79,6 +79,14 @@ cr.define('safe_browsing', function() { ...@@ -79,6 +79,14 @@ cr.define('safe_browsing', function() {
addPGResponse(result); 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); $('get-referrer-chain-form').addEventListener('submit', addReferrerChain);
} }
...@@ -190,6 +198,13 @@ cr.define('safe_browsing', function() { ...@@ -190,6 +198,13 @@ cr.define('safe_browsing', function() {
appendChildWithInnerText(cell, response); 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) { function appendChildWithInnerText(logDiv, text) {
if (!logDiv) if (!logDiv)
return; return;
......
...@@ -151,6 +151,21 @@ void WebUIInfoSingleton::ClearPGPings() { ...@@ -151,6 +151,21 @@ void WebUIInfoSingleton::ClearPGPings() {
std::map<int, LoginReputationClientResponse>().swap(pg_responses_); 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) { void WebUIInfoSingleton::RegisterWebUIInstance(SafeBrowsingUIHandler* webui) {
webui_instances_.push_back(webui); webui_instances_.push_back(webui);
} }
...@@ -163,6 +178,8 @@ void WebUIInfoSingleton::UnregisterWebUIInstance(SafeBrowsingUIHandler* webui) { ...@@ -163,6 +178,8 @@ void WebUIInfoSingleton::UnregisterWebUIInstance(SafeBrowsingUIHandler* webui) {
ClearCSBRRsSent(); ClearCSBRRsSent();
ClearClientDownloadRequestsSent(); ClearClientDownloadRequestsSent();
ClearPGEvents(); ClearPGEvents();
ClearPGPings();
ClearLogMessages();
} }
} }
...@@ -853,6 +870,14 @@ std::string SerializePGResponse(const LoginReputationClientResponse& response) { ...@@ -853,6 +870,14 @@ std::string SerializePGResponse(const LoginReputationClientResponse& response) {
return response_serialized; 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 } // namespace
SafeBrowsingUI::SafeBrowsingUI(content::WebUI* web_ui) SafeBrowsingUI::SafeBrowsingUI(content::WebUI* web_ui)
...@@ -1098,6 +1123,22 @@ void SafeBrowsingUIHandler::GetReferrerChain(const base::ListValue* args) { ...@@ -1098,6 +1123,22 @@ void SafeBrowsingUIHandler::GetReferrerChain(const base::ListValue* args) {
base::Value(referrer_chain_serialized)); 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( void SafeBrowsingUIHandler::NotifyClientDownloadRequestJsListener(
ClientDownloadRequest* client_download_request) { ClientDownloadRequest* client_download_request) {
AllowJavascript(); AllowJavascript();
...@@ -1148,6 +1189,14 @@ void SafeBrowsingUIHandler::NotifyPGResponseJsListener( ...@@ -1148,6 +1189,14 @@ void SafeBrowsingUIHandler::NotifyPGResponseJsListener(
FireWebUIListener("pg-responses-update", response_list); 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() { void SafeBrowsingUIHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback( web_ui()->RegisterMessageCallback(
"getExperiments", "getExperiments",
...@@ -1187,10 +1236,20 @@ void SafeBrowsingUIHandler::RegisterMessages() { ...@@ -1187,10 +1236,20 @@ void SafeBrowsingUIHandler::RegisterMessages() {
"getPGResponses", "getPGResponses",
base::BindRepeating(&SafeBrowsingUIHandler::GetPGResponses, base::BindRepeating(&SafeBrowsingUIHandler::GetPGResponses,
base::Unretained(this))); base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"getLogMessages",
base::BindRepeating(&SafeBrowsingUIHandler::GetLogMessages,
base::Unretained(this)));
web_ui()->RegisterMessageCallback( web_ui()->RegisterMessageCallback(
"getReferrerChain", "getReferrerChain",
base::BindRepeating(&SafeBrowsingUIHandler::GetReferrerChain, base::BindRepeating(&SafeBrowsingUIHandler::GetReferrerChain,
base::Unretained(this))); base::Unretained(this)));
} }
CrSBLogMessage::CrSBLogMessage() {}
CrSBLogMessage::~CrSBLogMessage() {
WebUIInfoSingleton::GetInstance()->LogMessage(stream_.str());
}
} // namespace safe_browsing } // namespace safe_browsing
...@@ -69,6 +69,10 @@ class SafeBrowsingUIHandler : public content::WebUIMessageHandler { ...@@ -69,6 +69,10 @@ class SafeBrowsingUIHandler : public content::WebUIMessageHandler {
// Get the current referrer chain for a given URL. // Get the current referrer chain for a given URL.
void GetReferrerChain(const base::ListValue* args); 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. // Register callbacks for WebUI messages.
void RegisterMessages() override; void RegisterMessages() override;
...@@ -104,6 +108,11 @@ class SafeBrowsingUIHandler : public content::WebUIMessageHandler { ...@@ -104,6 +108,11 @@ class SafeBrowsingUIHandler : public content::WebUIMessageHandler {
int token, int token,
const LoginReputationClientResponse& response); 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_; content::BrowserContext* browser_context_;
// List that keeps all the WebUI listener objects. // List that keeps all the WebUI listener objects.
...@@ -171,6 +180,12 @@ class WebUIInfoSingleton { ...@@ -171,6 +180,12 @@ class WebUIInfoSingleton {
// Clear the list of sent PhishGuard pings and responses. // Clear the list of sent PhishGuard pings and responses.
void ClearPGPings(); 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. // Register the new WebUI listener object.
void RegisterWebUIInstance(SafeBrowsingUIHandler* webui); void RegisterWebUIInstance(SafeBrowsingUIHandler* webui);
...@@ -230,6 +245,10 @@ class WebUIInfoSingleton { ...@@ -230,6 +245,10 @@ class WebUIInfoSingleton {
referrer_chain_provider_ = provider; referrer_chain_provider_ = provider;
} }
const std::vector<std::pair<base::Time, std::string>>& log_messages() {
return log_messages_;
}
private: private:
WebUIInfoSingleton(); WebUIInfoSingleton();
~WebUIInfoSingleton(); ~WebUIInfoSingleton();
...@@ -273,12 +292,29 @@ class WebUIInfoSingleton { ...@@ -273,12 +292,29 @@ class WebUIInfoSingleton {
// marked const. // marked const.
std::vector<SafeBrowsingUIHandler*> webui_instances_; 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. // The current referrer chain provider, if any. Can be nullptr.
ReferrerChainProvider* referrer_chain_provider_ = nullptr; ReferrerChainProvider* referrer_chain_provider_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(WebUIInfoSingleton); 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 } // namespace safe_browsing
#endif // COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_ #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