1 // Copyright 2018 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 #include "components/autofill_assistant/browser/actions/select_option_action.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "base/callback.h"
11 #include "components/autofill_assistant/browser/actions/action_delegate.h"
12 #include "components/autofill_assistant/browser/client_status.h"
13 
14 namespace autofill_assistant {
15 
SelectOptionAction(ActionDelegate * delegate,const ActionProto & proto)16 SelectOptionAction::SelectOptionAction(ActionDelegate* delegate,
17                                        const ActionProto& proto)
18     : Action(delegate, proto) {
19   DCHECK(proto_.has_select_option());
20 }
21 
~SelectOptionAction()22 SelectOptionAction::~SelectOptionAction() {}
23 
InternalProcessAction(ProcessActionCallback callback)24 void SelectOptionAction::InternalProcessAction(ProcessActionCallback callback) {
25   const SelectOptionProto& select_option = proto_.select_option();
26 
27   // A non prefilled |select_option| is not supported.
28   if (!select_option.has_selected_option()) {
29     VLOG(1) << __func__ << ": empty option";
30     UpdateProcessedAction(INVALID_ACTION);
31     std::move(callback).Run(std::move(processed_action_proto_));
32     return;
33   }
34   Selector selector = Selector(select_option.element());
35   if (selector.empty()) {
36     VLOG(1) << __func__ << ": empty selector";
37     UpdateProcessedAction(INVALID_SELECTOR);
38     std::move(callback).Run(std::move(processed_action_proto_));
39     return;
40   }
41   delegate_->ShortWaitForElement(
42       selector, base::BindOnce(&SelectOptionAction::OnWaitForElement,
43                                weak_ptr_factory_.GetWeakPtr(),
44                                std::move(callback), selector));
45 }
46 
OnWaitForElement(ProcessActionCallback callback,const Selector & selector,const ClientStatus & element_status)47 void SelectOptionAction::OnWaitForElement(ProcessActionCallback callback,
48                                           const Selector& selector,
49                                           const ClientStatus& element_status) {
50   if (!element_status.ok()) {
51     UpdateProcessedAction(element_status.proto_status());
52     std::move(callback).Run(std::move(processed_action_proto_));
53     return;
54   }
55 
56   delegate_->SelectOption(
57       selector, proto_.select_option().selected_option(),
58       proto_.select_option().select_strategy(),
59       base::BindOnce(&::autofill_assistant::SelectOptionAction::OnSelectOption,
60                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
61 }
62 
OnSelectOption(ProcessActionCallback callback,const ClientStatus & status)63 void SelectOptionAction::OnSelectOption(ProcessActionCallback callback,
64                                         const ClientStatus& status) {
65   UpdateProcessedAction(status);
66   std::move(callback).Run(std::move(processed_action_proto_));
67 }
68 
69 }  // namespace autofill_assistant
70