Commit abf5a81c authored by sandromaggi's avatar sandromaggi Committed by Commit Bot

[Autofill Assistant] Resolve element once in SetFormFieldValueAction

Previously, each step resolved the element anew. Now the element is
resolved once and used throughout the action to perform actions on.

Bug: b/168107066
Change-Id: I4def429d89251cda5831cd5ca8268cf2bcf0ebab
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2485211
Commit-Queue: Sandro Maggi <sandromaggi@google.com>
Reviewed-by: default avatarClemens Arbesser <arbesser@google.com>
Cr-Commit-Position: refs/heads/master@{#819805}
parent d7cb8d65
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "components/autofill_assistant/browser/actions/action_delegate_util.h" #include "components/autofill_assistant/browser/actions/action_delegate_util.h"
#include "components/autofill_assistant/browser/client_status.h" #include "components/autofill_assistant/browser/client_status.h"
#include "components/autofill_assistant/browser/user_data_util.h" #include "components/autofill_assistant/browser/user_data_util.h"
#include "components/autofill_assistant/browser/web/element_finder.h"
namespace autofill_assistant { namespace autofill_assistant {
namespace { namespace {
...@@ -168,6 +169,20 @@ void SetFormFieldValueAction::OnWaitForElement( ...@@ -168,6 +169,20 @@ void SetFormFieldValueAction::OnWaitForElement(
EndAction(element_status); EndAction(element_status);
return; return;
} }
delegate_->FindElement(selector_,
base::BindOnce(&SetFormFieldValueAction::OnFindElement,
weak_ptr_factory_.GetWeakPtr()));
}
void SetFormFieldValueAction::OnFindElement(
const ClientStatus& element_status,
std::unique_ptr<ElementFinder::Result> element_result) {
if (!element_status.ok()) {
EndAction(element_status);
return;
}
element_ = std::move(element_result);
SetFieldValueSequentially(/* field_index = */ 0, OkClientStatus()); SetFieldValueSequentially(/* field_index = */ 0, OkClientStatus());
} }
...@@ -186,8 +201,8 @@ void SetFormFieldValueAction::SetFieldValueSequentially( ...@@ -186,8 +201,8 @@ void SetFormFieldValueAction::SetFieldValueSequentially(
weak_ptr_factory_.GetWeakPtr(), field_index + 1); weak_ptr_factory_.GetWeakPtr(), field_index + 1);
const auto& field_input = field_inputs_[field_index]; const auto& field_input = field_inputs_[field_index];
if (field_input.keyboard_input) { if (field_input.keyboard_input) {
action_delegate_util::SendKeyboardInput( action_delegate_util::PerformSendKeyboardInput(
delegate_, selector_, *field_input.keyboard_input, delay_in_millisecond, delegate_, *field_input.keyboard_input, delay_in_millisecond, *element_,
std::move(next_field_callback)); std::move(next_field_callback));
} else if (field_input.password_type != PasswordValueType::NOT_SET) { } else if (field_input.password_type != PasswordValueType::NOT_SET) {
switch (field_input.password_type) { switch (field_input.password_type) {
...@@ -204,9 +219,9 @@ void SetFormFieldValueAction::SetFieldValueSequentially( ...@@ -204,9 +219,9 @@ void SetFormFieldValueAction::SetFieldValueSequentially(
} }
} else { } else {
auto fill_strategy = proto_.set_form_value().fill_strategy(); auto fill_strategy = proto_.set_form_value().fill_strategy();
action_delegate_util::SetFieldValue( action_delegate_util::PerformSetFieldValue(
delegate_, selector_, field_input.value, fill_strategy, delegate_, field_input.value, fill_strategy, delay_in_millisecond,
delay_in_millisecond, *element_,
IsSimulatingKeyPresses(fill_strategy) IsSimulatingKeyPresses(fill_strategy)
? std::move(next_field_callback) ? std::move(next_field_callback)
: base::BindOnce( : base::BindOnce(
...@@ -226,9 +241,9 @@ void SetFormFieldValueAction::OnGetStoredPassword( ...@@ -226,9 +241,9 @@ void SetFormFieldValueAction::OnGetStoredPassword(
return; return;
} }
auto fill_strategy = proto_.set_form_value().fill_strategy(); auto fill_strategy = proto_.set_form_value().fill_strategy();
action_delegate_util::SetFieldValue( action_delegate_util::PerformSetFieldValue(
delegate_, selector_, password, fill_strategy, delegate_, password, fill_strategy,
proto_.set_form_value().delay_in_millisecond(), proto_.set_form_value().delay_in_millisecond(), *element_,
IsSimulatingKeyPresses(fill_strategy) IsSimulatingKeyPresses(fill_strategy)
? std::move(next_field_callback) ? std::move(next_field_callback)
: base::BindOnce( : base::BindOnce(
...@@ -245,9 +260,8 @@ void SetFormFieldValueAction::OnSetFieldValueAndCheckFallback( ...@@ -245,9 +260,8 @@ void SetFormFieldValueAction::OnSetFieldValueAndCheckFallback(
EndAction(status); EndAction(status);
return; return;
} }
action_delegate_util::FindElementAndGetProperty( delegate_->GetFieldValue(
delegate_, selector_, *element_,
base::BindOnce(&ActionDelegate::GetFieldValue, delegate_->GetWeakPtr()),
base::BindOnce(&SetFormFieldValueAction::OnGetFieldValue, base::BindOnce(&SetFormFieldValueAction::OnGetFieldValue,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
std::move(next_field_callback), requested_value)); std::move(next_field_callback), requested_value));
...@@ -273,9 +287,9 @@ void SetFormFieldValueAction::OnGetFieldValue( ...@@ -273,9 +287,9 @@ void SetFormFieldValueAction::OnGetFieldValue(
// Run |SetFieldValue| with keyboard simulation on and move on to next value // Run |SetFieldValue| with keyboard simulation on and move on to next value
// afterwards. // afterwards.
action_delegate_util::SetFieldValue( action_delegate_util::PerformSetFieldValue(
delegate_, selector_, requested_value, SIMULATE_KEY_PRESSES, delegate_, requested_value, SIMULATE_KEY_PRESSES,
proto_.set_form_value().delay_in_millisecond(), proto_.set_form_value().delay_in_millisecond(), *element_,
std::move(next_field_callback)); std::move(next_field_callback));
return; return;
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "components/autofill_assistant/browser/actions/action.h" #include "components/autofill_assistant/browser/actions/action.h"
#include "components/autofill_assistant/browser/string_conversions_util.h" #include "components/autofill_assistant/browser/string_conversions_util.h"
#include "components/autofill_assistant/browser/user_data.h" #include "components/autofill_assistant/browser/user_data.h"
#include "components/autofill_assistant/browser/web/element_finder.h"
namespace autofill_assistant { namespace autofill_assistant {
...@@ -56,6 +57,8 @@ class SetFormFieldValueAction : public Action { ...@@ -56,6 +57,8 @@ class SetFormFieldValueAction : public Action {
void InternalProcessAction(ProcessActionCallback callback) override; void InternalProcessAction(ProcessActionCallback callback) override;
void OnWaitForElement(const ClientStatus& element_status); void OnWaitForElement(const ClientStatus& element_status);
void OnFindElement(const ClientStatus& element_status,
std::unique_ptr<ElementFinder::Result> element_result);
void SetFieldValueSequentially(int field_index, const ClientStatus& status); void SetFieldValueSequentially(int field_index, const ClientStatus& status);
void OnGetStoredPassword( void OnGetStoredPassword(
base::OnceCallback<void(const ClientStatus&)> next_field_callback, base::OnceCallback<void(const ClientStatus&)> next_field_callback,
...@@ -75,6 +78,7 @@ class SetFormFieldValueAction : public Action { ...@@ -75,6 +78,7 @@ class SetFormFieldValueAction : public Action {
void EndAction(const ClientStatus& status); void EndAction(const ClientStatus& status);
Selector selector_; Selector selector_;
std::unique_ptr<ElementFinder::Result> element_;
std::vector<FieldInput> field_inputs_; std::vector<FieldInput> field_inputs_;
ProcessActionCallback process_action_callback_; ProcessActionCallback process_action_callback_;
base::WeakPtrFactory<SetFormFieldValueAction> weak_ptr_factory_{this}; base::WeakPtrFactory<SetFormFieldValueAction> weak_ptr_factory_{this};
......
...@@ -145,7 +145,7 @@ TEST_F(SetFormFieldValueActionTest, Username) { ...@@ -145,7 +145,7 @@ TEST_F(SetFormFieldValueActionTest, Username) {
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element = const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_, 2); test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL( EXPECT_CALL(
mock_action_delegate_, mock_action_delegate_,
SetValueAttribute(kFakeUsername, EqualsElement(expected_element), _)) SetValueAttribute(kFakeUsername, EqualsElement(expected_element), _))
...@@ -166,7 +166,7 @@ TEST_F(SetFormFieldValueActionTest, PasswordToFill) { ...@@ -166,7 +166,7 @@ TEST_F(SetFormFieldValueActionTest, PasswordToFill) {
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element = const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_, 2); test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL( EXPECT_CALL(
mock_action_delegate_, mock_action_delegate_,
SetValueAttribute(kFakePassword, EqualsElement(expected_element), _)) SetValueAttribute(kFakePassword, EqualsElement(expected_element), _))
...@@ -265,7 +265,7 @@ TEST_F(SetFormFieldValueActionTest, Text) { ...@@ -265,7 +265,7 @@ TEST_F(SetFormFieldValueActionTest, Text) {
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element = const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_, 2); test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL( EXPECT_CALL(
mock_action_delegate_, mock_action_delegate_,
SetValueAttribute("SomeText𠜎", EqualsElement(expected_element), _)) SetValueAttribute("SomeText𠜎", EqualsElement(expected_element), _))
...@@ -353,13 +353,17 @@ TEST_F(SetFormFieldValueActionTest, MultipleValuesAndSimulateKeypress) { ...@@ -353,13 +353,17 @@ TEST_F(SetFormFieldValueActionTest, MultipleValuesAndSimulateKeypress) {
set_form_field_proto_->set_fill_strategy(SIMULATE_KEY_PRESSES); set_form_field_proto_->set_fill_strategy(SIMULATE_KEY_PRESSES);
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
OnSendKeyboardInput(UTF8ToUnicode("SomeText"), _, _, _)) OnSendKeyboardInput(UTF8ToUnicode("SomeText"), _,
EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<3>(OkClientStatus())); .WillOnce(RunOnceCallback<3>(OkClientStatus()));
// The second entry, a deprecated keycode is transformed into a // The second entry, a deprecated keycode is transformed into a
// field_input.keyboard_input. // field_input.keyboard_input.
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
OnSendKeyboardInput(std::vector<int>{13}, _, _, _)) OnSendKeyboardInput(std::vector<int>{13}, _,
EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<3>(OkClientStatus())); .WillOnce(RunOnceCallback<3>(OkClientStatus()));
EXPECT_CALL( EXPECT_CALL(
...@@ -377,7 +381,7 @@ TEST_F(SetFormFieldValueActionTest, ClientMemoryKey) { ...@@ -377,7 +381,7 @@ TEST_F(SetFormFieldValueActionTest, ClientMemoryKey) {
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element = const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_, 2); test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL( EXPECT_CALL(
mock_action_delegate_, mock_action_delegate_,
SetValueAttribute("SomeText𠜎", EqualsElement(expected_element), _)) SetValueAttribute("SomeText𠜎", EqualsElement(expected_element), _))
...@@ -409,20 +413,15 @@ TEST_F(SetFormFieldValueActionTest, FallbackToSimulateKeystrokes) { ...@@ -409,20 +413,15 @@ TEST_F(SetFormFieldValueActionTest, FallbackToSimulateKeystrokes) {
value->set_text("123"); value->set_text("123");
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("123", SetValueAttribute("123", EqualsElement(expected_element), _))
EqualsElement(test_util::MockFindElement(
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
GetFieldValue(EqualsElement(test_util::MockFindElement( GetFieldValue(EqualsElement(expected_element), _))
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string())); .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
auto expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("", EqualsElement(expected_element), _)) SetValueAttribute("", EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
...@@ -448,20 +447,16 @@ TEST_F(SetFormFieldValueActionTest, FallbackForPassword) { ...@@ -448,20 +447,16 @@ TEST_F(SetFormFieldValueActionTest, FallbackForPassword) {
value->set_use_password(true); value->set_use_password(true);
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
EXPECT_CALL(mock_action_delegate_, const ElementFinder::Result& expected_element =
SetValueAttribute(kFakePassword, test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EqualsElement(test_util::MockFindElement( EXPECT_CALL(
mock_action_delegate_, fake_selector_)), mock_action_delegate_,
_)) SetValueAttribute(kFakePassword, EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
GetFieldValue(EqualsElement(test_util::MockFindElement( GetFieldValue(EqualsElement(expected_element), _))
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string())); .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
auto expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("", EqualsElement(expected_element), _)) SetValueAttribute("", EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
...@@ -489,50 +484,40 @@ TEST_F(SetFormFieldValueActionTest, FallbackForMultipleValues) { ...@@ -489,50 +484,40 @@ TEST_F(SetFormFieldValueActionTest, FallbackForMultipleValues) {
enter->set_text("SomeOtherText"); enter->set_text("SomeOtherText");
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
// First value. // First value.
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("SomeText", SetValueAttribute("SomeText", EqualsElement(expected_element), _))
EqualsElement(test_util::MockFindElement(
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
GetFieldValue(EqualsElement(test_util::MockFindElement( GetFieldValue(EqualsElement(expected_element), _))
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string())); .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
auto expected_element_1 =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("", EqualsElement(expected_element_1), _)) SetValueAttribute("", EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
OnSendKeyboardInput(UTF8ToUnicode("SomeText"), _, OnSendKeyboardInput(UTF8ToUnicode("SomeText"), _,
EqualsElement(expected_element_1), _)) EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<3>(OkClientStatus())); .WillOnce(RunOnceCallback<3>(OkClientStatus()));
// Second value. // Second value.
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(
SetValueAttribute("SomeOtherText", mock_action_delegate_,
EqualsElement(test_util::MockFindElement( SetValueAttribute("SomeOtherText", EqualsElement(expected_element), _))
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
GetFieldValue(EqualsElement(test_util::MockFindElement( GetFieldValue(EqualsElement(expected_element), _))
mock_action_delegate_, fake_selector_)),
_))
.WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string())); .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
auto expected_element_2 =
test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("", EqualsElement(expected_element_2), _)) SetValueAttribute("", EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
OnSendKeyboardInput(UTF8ToUnicode("SomeOtherText"), _, OnSendKeyboardInput(UTF8ToUnicode("SomeOtherText"), _,
EqualsElement(expected_element_2), _)) EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<3>(OkClientStatus())); .WillOnce(RunOnceCallback<3>(OkClientStatus()));
EXPECT_CALL(callback_, EXPECT_CALL(callback_,
...@@ -607,7 +592,7 @@ TEST_F(SetFormFieldValueActionTest, SetFieldFromProfileValue) { ...@@ -607,7 +592,7 @@ TEST_F(SetFormFieldValueActionTest, SetFieldFromProfileValue) {
SetFormFieldValueAction action(&mock_action_delegate_, proto_); SetFormFieldValueAction action(&mock_action_delegate_, proto_);
const ElementFinder::Result& expected_element = const ElementFinder::Result& expected_element =
test_util::MockFindElement(mock_action_delegate_, fake_selector_, 2); test_util::MockFindElement(mock_action_delegate_, fake_selector_);
EXPECT_CALL(mock_action_delegate_, EXPECT_CALL(mock_action_delegate_,
SetValueAttribute("John", EqualsElement(expected_element), _)) SetValueAttribute("John", EqualsElement(expected_element), _))
.WillOnce(RunOnceCallback<2>(OkClientStatus())); .WillOnce(RunOnceCallback<2>(OkClientStatus()));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment