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 #ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_WEB_WEB_CONTROLLER_UTIL_H_
6 #define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_WEB_WEB_CONTROLLER_UTIL_H_
7
8 #include <string>
9 #include "base/values.h"
10 #include "components/autofill_assistant/browser/client_status.h"
11 #include "components/autofill_assistant/browser/devtools/devtools/domains/types_runtime.h"
12 #include "components/autofill_assistant/browser/devtools/devtools_client.h"
13
14 namespace autofill_assistant {
15
16 // Builds a ClientStatus appropriate for an unexpected error.
17 //
18 // This should only be used in situations where getting an error cannot be
19 // anything but a bug in the client and no devtools ReplyStatus is available.
20 ClientStatus UnexpectedErrorStatus(const std::string& file, int line);
21
22 // Builds a ClientStatus appropriate for an unexpected error in a devtools
23 // response.
24 //
25 // This should only be used in situations where getting an error cannot be
26 // anything but a bug in the client.
27 ClientStatus UnexpectedDevtoolsErrorStatus(
28 const DevtoolsClient::ReplyStatus& reply_status,
29 const std::string& file,
30 int line);
31
32 // Builds a ClientStatus appropriate for a JavaScript error.
33 ClientStatus JavaScriptErrorStatus(
34 const DevtoolsClient::ReplyStatus& reply_status,
35 const std::string& file,
36 int line,
37 const runtime::ExceptionDetails* exception);
38
39 // Makes sure that the given EvaluateResult exists, is successful and contains a
40 // result.
41 template <typename T>
CheckJavaScriptResult(const DevtoolsClient::ReplyStatus & reply_status,T * result,const char * file,int line)42 ClientStatus CheckJavaScriptResult(
43 const DevtoolsClient::ReplyStatus& reply_status,
44 T* result,
45 const char* file,
46 int line) {
47 if (!result)
48 return JavaScriptErrorStatus(reply_status, file, line, nullptr);
49 if (result->HasExceptionDetails())
50 return JavaScriptErrorStatus(reply_status, file, line,
51 result->GetExceptionDetails());
52 if (!result->GetResult())
53 return JavaScriptErrorStatus(reply_status, file, line, nullptr);
54 return OkClientStatus();
55 }
56
57 // Fills a ClientStatus with appropriate details for a Chrome Autofill error.
58 ClientStatus FillAutofillErrorStatus(ClientStatus status);
59
60 // Safely gets an object id from a RemoteObject
61 bool SafeGetObjectId(const runtime::RemoteObject* result, std::string* out);
62
63 // Safely gets a string value from a RemoteObject
64 bool SafeGetStringValue(const runtime::RemoteObject* result, std::string* out);
65
66 // Safely gets a int value from a RemoteObject.
67 bool SafeGetIntValue(const runtime::RemoteObject* result, int* out);
68
69 // Safely gets a boolean value from a RemoteObject
70 bool SafeGetBool(const runtime::RemoteObject* result, bool* out);
71
72 // Add a new runtime::CallArgument to the list.
73 template <typename T>
AddRuntimeCallArgument(const T & value,std::vector<std::unique_ptr<runtime::CallArgument>> * arguments)74 void AddRuntimeCallArgument(
75 const T& value,
76 std::vector<std::unique_ptr<runtime::CallArgument>>* arguments) {
77 arguments->emplace_back(
78 runtime::CallArgument::Builder()
79 .SetValue(base::Value::ToUniquePtrValue(base::Value(value)))
80 .Build());
81 }
82
83 // Add a new runtime::CallArgument from the object_id.
84 void AddRuntimeCallArgumentObjectId(
85 const std::string& object_id,
86 std::vector<std::unique_ptr<runtime::CallArgument>>* arguments);
87
88 } // namespace autofill_assistant
89
90 #endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_WEB_WEB_CONTROLLER_UTIL_H_
91