0

[CodeHealth] Introduce new WebUI::MessageCallback

WebUI::DeprecatedMessageCallback2 is taking base::Value::ConstListView,
with changed plans around base::Value refactoring it should be
const base::Value::List& instead.

This CL adds new MessageCallback and corresponding
RegisterMessageCallback() unblocking actual refactoring of callers.

This CL also includes an examples of how the refactoring will look like.

Bug: 1300095
Change-Id: Ibaf0b075b4fd60f99f393535cebce154965f4bce
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3483819
Reviewed-by: Alex Moshchuk <alexmos@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Mohamad Ahmadi <mahmadi@chromium.org>
Commit-Queue: Mohamad Ahmadi <mahmadi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#975287}
This commit is contained in:
Moe Ahmadi
2022-02-25 21:56:23 +00:00
committed by Chromium LUCI CQ
parent c93969e60c
commit de59018693
8 changed files with 66 additions and 22 deletions

@ -37,12 +37,12 @@ CryptohomeWebUIHandler::CryptohomeWebUIHandler() {}
CryptohomeWebUIHandler::~CryptohomeWebUIHandler() {} CryptohomeWebUIHandler::~CryptohomeWebUIHandler() {}
void CryptohomeWebUIHandler::RegisterMessages() { void CryptohomeWebUIHandler::RegisterMessages() {
web_ui()->RegisterDeprecatedMessageCallback2( web_ui()->RegisterMessageCallback(
"pageLoaded", base::BindRepeating(&CryptohomeWebUIHandler::OnPageLoaded, "pageLoaded", base::BindRepeating(&CryptohomeWebUIHandler::OnPageLoaded,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
void CryptohomeWebUIHandler::OnPageLoaded(base::Value::ConstListView args) { void CryptohomeWebUIHandler::OnPageLoaded(const base::Value::List& args) {
UserDataAuthClient* userdataauth_client = UserDataAuthClient::Get(); UserDataAuthClient* userdataauth_client = UserDataAuthClient::Get();
CryptohomePkcs11Client* cryptohome_pkcs11_client = CryptohomePkcs11Client* cryptohome_pkcs11_client =
CryptohomePkcs11Client::Get(); CryptohomePkcs11Client::Get();

@ -37,7 +37,7 @@ class CryptohomeWebUIHandler : public content::WebUIMessageHandler {
private: private:
// This method is called from JavaScript. // This method is called from JavaScript.
void OnPageLoaded(base::Value::ConstListView args); void OnPageLoaded(const base::Value::List& args);
void GotIsTPMTokenEnabledOnUIThread(bool is_tpm_token_enabled); void GotIsTPMTokenEnabledOnUIThread(bool is_tpm_token_enabled);

@ -258,6 +258,11 @@ void WebUIImpl::CallJavascriptFunctionUnsafe(
ExecuteJavascript(GetJavascriptCall(function_name, args)); ExecuteJavascript(GetJavascriptCall(function_name, args));
} }
void WebUIImpl::RegisterMessageCallback(base::StringPiece message,
MessageCallback callback) {
message_callbacks_.emplace(message, std::move(callback));
}
void WebUIImpl::RegisterDeprecatedMessageCallback2( void WebUIImpl::RegisterDeprecatedMessageCallback2(
base::StringPiece message, base::StringPiece message,
DeprecatedMessageCallback2 callback) { DeprecatedMessageCallback2 callback) {
@ -276,11 +281,19 @@ void WebUIImpl::ProcessWebUIMessage(const GURL& source_url,
if (controller_->OverrideHandleWebUIMessage(source_url, message, args)) if (controller_->OverrideHandleWebUIMessage(source_url, message, args))
return; return;
// Look up the callback for this message. auto callback_pair = message_callbacks_.find(message);
auto callback_pair = deprecated_message_callbacks_2_.find(message); if (callback_pair != message_callbacks_.end()) {
if (callback_pair != deprecated_message_callbacks_2_.end()) {
// Forward this message and content on. // Forward this message and content on.
callback_pair->second.Run(args.GetListDeprecated()); callback_pair->second.Run(args.GetList());
return;
}
// Look up the deprecated callback for this message.
auto deprecated_callback_2_pair =
deprecated_message_callbacks_2_.find(message);
if (deprecated_callback_2_pair != deprecated_message_callbacks_2_.end()) {
// Forward this message and content on.
deprecated_callback_2_pair->second.Run(args.GetListDeprecated());
return; return;
} }

@ -73,6 +73,8 @@ class CONTENT_EXPORT WebUIImpl : public WebUI,
const std::vector<std::string>& GetRequestableSchemes() override; const std::vector<std::string>& GetRequestableSchemes() override;
void AddRequestableScheme(const char* scheme) override; void AddRequestableScheme(const char* scheme) override;
void AddMessageHandler(std::unique_ptr<WebUIMessageHandler> handler) override; void AddMessageHandler(std::unique_ptr<WebUIMessageHandler> handler) override;
void RegisterMessageCallback(base::StringPiece message,
MessageCallback callback) override;
void RegisterDeprecatedMessageCallback2( void RegisterDeprecatedMessageCallback2(
base::StringPiece message, base::StringPiece message,
DeprecatedMessageCallback2 callback) override; DeprecatedMessageCallback2 callback) override;
@ -126,10 +128,17 @@ class CONTENT_EXPORT WebUIImpl : public WebUI,
void DisallowJavascriptOnAllHandlers(); void DisallowJavascriptOnAllHandlers();
// A map of message name -> message handling callback. // A map of message name -> message handling callback.
std::map<std::string, MessageCallback> message_callbacks_;
// A map of message name -> message handling callback.
// TODO(crbug.com/1300095): Remove once RegisterDeprecatedMessageCallback2()
// instances are migrated to RegisterMessageCallback().
std::map<std::string, DeprecatedMessageCallback2> std::map<std::string, DeprecatedMessageCallback2>
deprecated_message_callbacks_2_; deprecated_message_callbacks_2_;
// A map of message name -> message handling callback. // A map of message name -> message handling callback.
// TODO(crbug.com/1300095): Remove once RegisterDeprecatedMessageCallback()
// instances are migrated to RegisterMessageCallback().
std::map<std::string, DeprecatedMessageCallback> std::map<std::string, DeprecatedMessageCallback>
deprecated_message_callbacks_; deprecated_message_callbacks_;

@ -73,27 +73,29 @@ class CONTENT_EXPORT WebUI {
virtual void AddMessageHandler( virtual void AddMessageHandler(
std::unique_ptr<WebUIMessageHandler> handler) = 0; std::unique_ptr<WebUIMessageHandler> handler) = 0;
// TODO(crbug.com/1300095): new version of DeprecatedMessageCallback2 that
// takes base::Value::List as a parameter needs to be introduced. Afterwards
// existing callers of RegisterDeprecatedMessageCallback2() should be migrated
// to the new RegisterMessageCallback() (not yet introduced) version.
//
// Used by WebUIMessageHandlers. If the given message is already registered, // Used by WebUIMessageHandlers. If the given message is already registered,
// the call has no effect. // the call has no effect.
using MessageCallback =
base::RepeatingCallback<void(const base::Value::List&)>;
virtual void RegisterMessageCallback(base::StringPiece message,
MessageCallback callback) = 0;
// TODO(crbug.com/1300095): Instances of RegisterDeprecatedMessageCallback2()
// should be migrated to RegisterMessageCallback() above if possible.
//
// Used by WebUIMessageHandlers. If the given message is already registered,
// the call has no effect. Use RegisterMessageCallback() above in new code.
using DeprecatedMessageCallback2 = using DeprecatedMessageCallback2 =
base::RepeatingCallback<void(base::Value::ConstListView)>; base::RepeatingCallback<void(base::Value::ConstListView)>;
virtual void RegisterDeprecatedMessageCallback2( virtual void RegisterDeprecatedMessageCallback2(
base::StringPiece message, base::StringPiece message,
DeprecatedMessageCallback2 callback) = 0; DeprecatedMessageCallback2 callback) = 0;
// TODO(crbug.com/1300095): new version of DeprecatedMessageCallback that // TODO(crbug.com/1300095): Instances of RegisterDeprecatedMessageCallback()
// takes base::Value::List as a parameter needs to be introduced. Afterwards // should be migrated to RegisterMessageCallback() above if possible.
// existing callers of RegisterDeprecatedMessageCallback() should be migrated
// to the new RegisterMessageCallback() (not yet introduced) version if
// possible.
// //
// Used by WebUIMessageHandlers. If the given message is already registered, // Used by WebUIMessageHandlers. If the given message is already registered,
// the call has no effect. // the call has no effect. Use RegisterMessageCallback() above in new code.
using DeprecatedMessageCallback = using DeprecatedMessageCallback =
base::RepeatingCallback<void(const base::ListValue*)>; base::RepeatingCallback<void(const base::ListValue*)>;
virtual void RegisterDeprecatedMessageCallback( virtual void RegisterDeprecatedMessageCallback(

@ -27,14 +27,25 @@ void TestWebUI::ClearTrackedCalls() {
void TestWebUI::HandleReceivedMessage(const std::string& handler_name, void TestWebUI::HandleReceivedMessage(const std::string& handler_name,
const base::ListValue* args) { const base::ListValue* args) {
const auto callbacks_map_it = const auto callbacks_map_it = message_callbacks_.find(handler_name);
if (callbacks_map_it != message_callbacks_.end()) {
// Create a copy of the callbacks before running them. Without this, it
// could be possible for the callback's handler to register a new message
// handler during iteration of the vector, resulting in undefined behavior.
std::vector<MessageCallback> callbacks_to_run = callbacks_map_it->second;
for (auto& callback : callbacks_to_run)
callback.Run(args->GetList());
return;
}
const auto deprecated_callbacks_2_map_it =
deprecated_message_callbacks_2_.find(handler_name); deprecated_message_callbacks_2_.find(handler_name);
if (callbacks_map_it != deprecated_message_callbacks_2_.end()) { if (deprecated_callbacks_2_map_it != deprecated_message_callbacks_2_.end()) {
// Create a copy of the callbacks before running them. Without this, it // Create a copy of the callbacks before running them. Without this, it
// could be possible for the callback's handler to register a new message // could be possible for the callback's handler to register a new message
// handler during iteration of the vector, resulting in undefined behavior. // handler during iteration of the vector, resulting in undefined behavior.
std::vector<DeprecatedMessageCallback2> callbacks_to_run = std::vector<DeprecatedMessageCallback2> callbacks_to_run =
callbacks_map_it->second; deprecated_callbacks_2_map_it->second;
for (auto& callback : callbacks_to_run) for (auto& callback : callbacks_to_run)
callback.Run(args->GetListDeprecated()); callback.Run(args->GetListDeprecated());
return; return;
@ -98,6 +109,12 @@ void TestWebUI::AddMessageHandler(
handlers_.push_back(std::move(handler)); handlers_.push_back(std::move(handler));
} }
void TestWebUI::RegisterMessageCallback(base::StringPiece message,
MessageCallback callback) {
message_callbacks_[static_cast<std::string>(message)].push_back(
std::move(callback));
}
void TestWebUI::RegisterDeprecatedMessageCallback2( void TestWebUI::RegisterDeprecatedMessageCallback2(
base::StringPiece message, base::StringPiece message,
DeprecatedMessageCallback2 callback) { DeprecatedMessageCallback2 callback) {

@ -47,6 +47,8 @@ class TestWebUI : public WebUI {
const std::vector<std::string>& GetRequestableSchemes() override; const std::vector<std::string>& GetRequestableSchemes() override;
void AddRequestableScheme(const char* scheme) override; void AddRequestableScheme(const char* scheme) override;
void AddMessageHandler(std::unique_ptr<WebUIMessageHandler> handler) override; void AddMessageHandler(std::unique_ptr<WebUIMessageHandler> handler) override;
void RegisterMessageCallback(base::StringPiece message,
MessageCallback callback) override;
void RegisterDeprecatedMessageCallback2( void RegisterDeprecatedMessageCallback2(
base::StringPiece message, base::StringPiece message,
DeprecatedMessageCallback2 callback) override; DeprecatedMessageCallback2 callback) override;
@ -123,6 +125,7 @@ class TestWebUI : public WebUI {
private: private:
void OnJavascriptCall(const CallData& call_data); void OnJavascriptCall(const CallData& call_data);
base::flat_map<std::string, std::vector<MessageCallback>> message_callbacks_;
base::flat_map<std::string, std::vector<DeprecatedMessageCallback2>> base::flat_map<std::string, std::vector<DeprecatedMessageCallback2>>
deprecated_message_callbacks_2_; deprecated_message_callbacks_2_;
base::flat_map<std::string, std::vector<DeprecatedMessageCallback>> base::flat_map<std::string, std::vector<DeprecatedMessageCallback>>

@ -258,7 +258,7 @@ void OvenHandler::RegisterMessages() {
base::Unretained(this))); base::Unretained(this)));
} }
void OvenHandler::HandleBakeDonuts(base::Value::ConstListView args) { void OvenHandler::HandleBakeDonuts(const base::Value::List& args) {
AllowJavascript(); AllowJavascript();
// IMPORTANT: Fully validate `args`. // IMPORTANT: Fully validate `args`.