blob: 6658f1f3a7fa1dd6d97a43e8cd2f6062a94a9588 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill_assistant/browser/web/web_controller_util.h"
#include "components/autofill_assistant/browser/devtools/devtools/domains/types_runtime.h"
#include "components/autofill_assistant/browser/service.pb.h"
namespace autofill_assistant {
ClientStatus UnexpectedErrorStatus(const std::string& file, int line) {
ClientStatus status(OTHER_ACTION_STATUS);
auto* info = status.mutable_details()->mutable_unexpected_error_info();
info->set_source_file(file);
info->set_source_line_number(line);
return status;
}
ClientStatus UnexpectedDevtoolsErrorStatus(
const DevtoolsClient::ReplyStatus& reply_status,
const std::string& file,
int line) {
ClientStatus status = UnexpectedErrorStatus(file, line);
if (!reply_status.is_ok()) {
auto* info = status.mutable_details()->mutable_unexpected_error_info();
info->set_devtools_error_code(reply_status.error_code);
info->set_devtools_error_message(reply_status.error_message);
}
return status;
}
ClientStatus JavaScriptErrorStatus(
const DevtoolsClient::ReplyStatus& reply_status,
const std::string& file,
int line,
const runtime::ExceptionDetails* exception) {
ClientStatus status = UnexpectedDevtoolsErrorStatus(reply_status, file, line);
status.set_proto_status(UNEXPECTED_JS_ERROR);
if (exception) {
auto* info = status.mutable_details()->mutable_unexpected_error_info();
if (exception->HasException() &&
exception->GetException()->HasClassName()) {
info->set_js_exception_classname(
exception->GetException()->GetClassName());
}
info->set_js_exception_line_number(exception->GetLineNumber());
info->set_js_exception_column_number(exception->GetColumnNumber());
}
return status;
}
void FillWebControllerErrorInfo(
WebControllerErrorInfoProto::WebAction failed_web_action,
ClientStatus* status) {
status->mutable_details()
->mutable_web_controller_error_info()
->set_failed_web_action(failed_web_action);
}
bool SafeGetObjectId(const runtime::RemoteObject* result, std::string* out) {
if (result && result->HasObjectId()) {
*out = result->GetObjectId();
return true;
}
return false;
}
bool SafeGetStringValue(const runtime::RemoteObject* result, std::string* out) {
if (result && result->HasValue() && result->GetValue()->is_string()) {
*out = result->GetValue()->GetString();
return true;
}
return false;
}
bool SafeGetIntValue(const runtime::RemoteObject* result, int* out) {
if (result && result->HasValue() && result->GetValue()->is_int()) {
*out = result->GetValue()->GetInt();
return true;
}
*out = 0;
return false;
}
bool SafeGetBool(const runtime::RemoteObject* result, bool* out) {
if (result && result->HasValue() && result->GetValue()->is_bool()) {
*out = result->GetValue()->GetBool();
return true;
}
*out = false;
return false;
}
void AddRuntimeCallArgumentObjectId(
const std::string& object_id,
std::vector<std::unique_ptr<runtime::CallArgument>>* arguments) {
arguments->emplace_back(
runtime::CallArgument::Builder().SetObjectId(object_id).Build());
}
} // namespace autofill_assistant