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