blob: 38b4f0a1956c94ec38a7a8dcbe57e6a5f5148d86 [file] [log] [blame]
// Copyright 2020 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 "chrome/browser/chromeos/input_method/personal_info_suggester.h"
#include "ash/public/cpp/ash_pref_names.h"
#include "base/guid.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/constants/chromeos_features.h"
#include "chromeos/constants/chromeos_pref_names.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/data_model/autofill_profile.h"
#include "components/autofill/core/browser/geo/country_names.h"
#include "components/autofill/core/browser/test_autofill_client.h"
#include "components/autofill/core/browser/test_personal_data_manager.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace {
class TestSuggestionHandler : public SuggestionHandlerInterface {
public:
bool DismissSuggestion(int context_id, std::string* error) override {
suggestion_text_ = base::EmptyString16();
previous_suggestions_.clear();
confirmed_length_ = 0;
suggestion_accepted_ = false;
return true;
}
bool SetSuggestion(int context_id,
const ui::ime::SuggestionDetails& details,
std::string* error) override {
suggestion_text_ = details.text;
confirmed_length_ = details.confirmed_length;
show_annotation_ = details.show_annotation;
show_setting_link_ = details.show_setting_link;
return true;
}
bool AcceptSuggestion(int context_id, std::string* error) override {
suggestion_text_ = base::EmptyString16();
confirmed_length_ = 0;
suggestion_accepted_ = true;
return true;
}
void VerifySuggestion(const base::string16 text,
const size_t confirmed_length) {
EXPECT_EQ(suggestion_text_, text);
EXPECT_EQ(confirmed_length_, confirmed_length);
suggestion_text_ = base::EmptyString16();
confirmed_length_ = 0;
}
void VerifySuggestionDispatchedToExtension(
const std::vector<std::string>& suggestions) {
EXPECT_THAT(previous_suggestions_, testing::ContainerEq(suggestions));
}
void OnSuggestionsChanged(
const std::vector<std::string>& suggestions) override {
previous_suggestions_ = suggestions;
}
bool ShowMultipleSuggestions(int context_id,
const std::vector<base::string16>& candidates,
std::string* error) override {
return false;
}
void ClickButton(const ui::ime::AssistiveWindowButton& button) override {
button_clicked_ = button.id;
}
bool SetButtonHighlighted(int context_id,
const ui::ime::AssistiveWindowButton& button,
bool highlighted,
std::string* error) override {
return false;
}
bool AcceptSuggestionCandidate(int context_id,
const base::string16& candidate,
std::string* error) override {
return false;
}
bool SetAssistiveWindowProperties(
int context_id,
const AssistiveWindowProperties& assistive_window,
std::string* error) override {
return false;
}
void VerifyShowAnnotation(const bool show_annotation) {
EXPECT_EQ(show_annotation_, show_annotation);
}
void VerifyShowSettingLink(const bool show_setting_link) {
EXPECT_EQ(show_setting_link_, show_setting_link);
}
void VerifyButtonClicked(const ui::ime::ButtonId id) {
EXPECT_EQ(button_clicked_, id);
}
bool IsSuggestionAccepted() { return suggestion_accepted_; }
private:
base::string16 suggestion_text_;
size_t confirmed_length_ = 0;
bool show_annotation_ = false;
bool show_setting_link_ = false;
bool suggestion_accepted_ = false;
ui::ime::ButtonId button_clicked_ = ui::ime::ButtonId::kNone;
std::vector<std::string> previous_suggestions_;
};
class TestTtsHandler : public TtsHandler {
public:
explicit TestTtsHandler(Profile* profile) : TtsHandler(profile) {}
void VerifyAnnouncement(const std::string& expected_text) {
EXPECT_EQ(text_, expected_text);
}
private:
void Speak(const std::string& text) override { text_ = text; }
std::string text_ = "";
};
} // namespace
class PersonalInfoSuggesterTest : public testing::Test {
protected:
PersonalInfoSuggesterTest() {
autofill_client_.SetPrefs(autofill::test::PrefServiceForTesting());
}
void SetUp() override {
profile_ = std::make_unique<TestingProfile>();
auto tts_handler = std::make_unique<TestTtsHandler>(profile_.get());
tts_handler_ = tts_handler.get();
suggestion_handler_ = std::make_unique<TestSuggestionHandler>();
personal_data_ = std::make_unique<autofill::TestPersonalDataManager>();
personal_data_->SetPrefService(autofill_client_.GetPrefs());
suggester_ = std::make_unique<PersonalInfoSuggester>(
suggestion_handler_.get(), profile_.get(), personal_data_.get(),
std::move(tts_handler));
chrome_keyboard_controller_client_ =
ChromeKeyboardControllerClient::CreateForTest();
chrome_keyboard_controller_client_->set_keyboard_visible_for_test(false);
}
void SendKeyboardEvent(std::string key) {
InputMethodEngineBase::KeyboardEvent event;
event.key = key;
suggester_->HandleKeyEvent(event);
}
content::BrowserTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
std::unique_ptr<TestingProfile> profile_;
TestTtsHandler* tts_handler_;
std::unique_ptr<TestSuggestionHandler> suggestion_handler_;
std::unique_ptr<PersonalInfoSuggester> suggester_;
std::unique_ptr<ChromeKeyboardControllerClient>
chrome_keyboard_controller_client_;
autofill::TestAutofillClient autofill_client_;
std::unique_ptr<autofill::TestPersonalDataManager> personal_data_;
const base::string16 email_ = base::UTF8ToUTF16("johnwayne@me.xyz");
const base::string16 first_name_ = base::UTF8ToUTF16("John");
const base::string16 last_name_ = base::UTF8ToUTF16("Wayne");
const base::string16 full_name_ = base::UTF8ToUTF16("John Wayne");
const base::string16 address_ =
base::UTF8ToUTF16("1 Dream Road, Hollywood, CA 12345");
const base::string16 phone_number_ = base::UTF8ToUTF16("16505678910");
};
TEST_F(PersonalInfoSuggesterTest, SuggestEmail) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifySuggestion(email_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("My email is: "));
suggestion_handler_->VerifySuggestion(email_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("hi, my email: "));
suggestion_handler_->VerifySuggestion(email_, 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestEmailWhenFlagIsDisabled) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{},
/*disabled_features=*/{chromeos::features::kAssistPersonalInfoEmail});
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestEmailWhenPrefixDoesNotMatch) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is John"));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("our email is: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestWhenVirtualKeyboardEnabled) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
chrome_keyboard_controller_client_->set_keyboard_visible_for_test(true);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest,
SendsEmailSuggestionToExtensionWhenVirtualKeyboardEnabled) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
chrome_keyboard_controller_client_->set_keyboard_visible_for_test(true);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifySuggestionDispatchedToExtension(
std::vector<std::string>{base::UTF16ToUTF8(email_)});
}
TEST_F(PersonalInfoSuggesterTest, SuggestNames) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoName},
/*disabled_features=*/{});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FIRST,
first_name_);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_LAST, last_name_);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FULL, full_name_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my first name is "));
suggestion_handler_->VerifySuggestion(first_name_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my last name is: "));
suggestion_handler_->VerifySuggestion(last_name_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my name is "));
suggestion_handler_->VerifySuggestion(full_name_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("Hmm... my FULL name: "));
suggestion_handler_->VerifySuggestion(full_name_, 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestNamesWhenFlagIsDisabled) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{},
/*disabled_features=*/{chromeos::features::kAssistPersonalInfoName});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FIRST,
first_name_);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_LAST, last_name_);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FULL, full_name_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my first name is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("my last name is: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("my name is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestNamesWhenPrefixDoesNotMatch) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FIRST,
first_name_);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_LAST, last_name_);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FULL, full_name_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("our first name is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("our last name is: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("our name is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("our full name: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, SuggestAddress) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoAddress},
/*disabled_features=*/{});
autofill::CountryNames::SetLocaleString("en-US");
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_LINE1,
base::UTF8ToUTF16("1 Dream Road"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_CITY,
base::UTF8ToUTF16("Hollywood"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_ZIP,
base::UTF8ToUTF16("12345"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_STATE,
base::UTF8ToUTF16("CA"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_COUNTRY,
base::UTF8ToUTF16("US"));
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my address is "));
suggestion_handler_->VerifySuggestion(address_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("our address is: "));
suggestion_handler_->VerifySuggestion(address_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my shipping address: "));
suggestion_handler_->VerifySuggestion(address_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("our billing address is "));
suggestion_handler_->VerifySuggestion(address_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my current address: "));
suggestion_handler_->VerifySuggestion(address_, 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestAddressWhenFlagIsDisabled) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{},
/*disabled_features=*/{chromeos::features::kAssistPersonalInfoAddress});
autofill::CountryNames::SetLocaleString("en-US");
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_LINE1,
base::UTF8ToUTF16("1 Dream Road"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_CITY,
base::UTF8ToUTF16("Hollywood"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_ZIP,
base::UTF8ToUTF16("12345"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_STATE,
base::UTF8ToUTF16("CA"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_COUNTRY,
base::UTF8ToUTF16("US"));
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my address is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestAddressWhenPrefixDoesNotMatch) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoAddress},
/*disabled_features=*/{});
autofill::CountryNames::SetLocaleString("en-US");
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_LINE1,
base::UTF8ToUTF16("1 Dream Road"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_CITY,
base::UTF8ToUTF16("Hollywood"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_ZIP,
base::UTF8ToUTF16("12345"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_STATE,
base::UTF8ToUTF16("CA"));
autofill_profile.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_COUNTRY,
base::UTF8ToUTF16("US"));
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my address "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("my last address is: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("our address number is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, SuggestPhoneNumber) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoPhoneNumber},
/*disabled_features=*/{});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(
autofill::ServerFieldType::PHONE_HOME_WHOLE_NUMBER, phone_number_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my phone number is "));
suggestion_handler_->VerifySuggestion(phone_number_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my number is "));
suggestion_handler_->VerifySuggestion(phone_number_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my mobile number is: "));
suggestion_handler_->VerifySuggestion(phone_number_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my number: "));
suggestion_handler_->VerifySuggestion(phone_number_, 0);
SendKeyboardEvent("Esc");
suggester_->Suggest(base::UTF8ToUTF16("my telephone number is "));
suggestion_handler_->VerifySuggestion(phone_number_, 0);
}
TEST_F(PersonalInfoSuggesterTest, DoNotSuggestPhoneNumberWhenFlagIsDisabled) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{},
/*disabled_features=*/{
chromeos::features::kAssistPersonalInfoPhoneNumber});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(
autofill::ServerFieldType::PHONE_HOME_WHOLE_NUMBER, phone_number_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my phone number is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest,
DoNotSuggestPhoneNumberWhenPrefixDoesNotMatch) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoPhoneNumber},
/*disabled_features=*/{});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(
autofill::ServerFieldType::PHONE_HOME_WHOLE_NUMBER, phone_number_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("our phone number is "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("my number "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("my number phone is: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
suggester_->Suggest(base::UTF8ToUTF16("my phone phone: "));
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
}
TEST_F(PersonalInfoSuggesterTest, AcceptSuggestionWithDownEnter) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
EXPECT_TRUE(suggestion_handler_->IsSuggestionAccepted());
}
TEST_F(PersonalInfoSuggesterTest, AcceptSuggestionWithUpEnter) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
DictionaryPrefUpdate update(profile_->GetPrefs(),
prefs::kAssistiveInputFeatureSettings);
update->SetIntKey(kPersonalInfoSuggesterAcceptanceCount, 1);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
SendKeyboardEvent("Up");
SendKeyboardEvent("Enter");
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
EXPECT_TRUE(suggestion_handler_->IsSuggestionAccepted());
}
TEST_F(PersonalInfoSuggesterTest, DismissSuggestion) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoName},
/*disabled_features=*/{});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(autofill::ServerFieldType::NAME_FULL, full_name_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my name is "));
SendKeyboardEvent("Esc");
suggestion_handler_->VerifySuggestion(base::EmptyString16(), 0);
EXPECT_FALSE(suggestion_handler_->IsSuggestionAccepted());
}
TEST_F(PersonalInfoSuggesterTest, SuggestWithConfirmedLength) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoPhoneNumber},
/*disabled_features=*/{});
autofill::AutofillProfile autofill_profile(base::GenerateGUID(),
autofill::test::kEmptyOrigin);
autofill_profile.SetRawInfo(
autofill::ServerFieldType::PHONE_HOME_WHOLE_NUMBER, phone_number_);
personal_data_->AddProfile(autofill_profile);
suggester_->Suggest(base::UTF8ToUTF16("my phone number is "));
suggester_->Suggest(base::UTF8ToUTF16("my phone number is 16"));
suggestion_handler_->VerifySuggestion(phone_number_, 2);
}
TEST_F(PersonalInfoSuggesterTest,
DoNotAnnounceSpokenFeedbackWhenChromeVoxIsOff) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
profile_->set_profile_name(base::UTF16ToUTF8(email_));
profile_->GetPrefs()->SetBoolean(
ash::prefs::kAccessibilitySpokenFeedbackEnabled, false);
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(5000));
tts_handler_->VerifyAnnouncement("");
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(5000));
tts_handler_->VerifyAnnouncement("");
}
TEST_F(PersonalInfoSuggesterTest, AnnounceSpokenFeedbackWhenChromeVoxIsOn) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
profile_->set_profile_name(base::UTF16ToUTF8(email_));
profile_->GetPrefs()->SetBoolean(
ash::prefs::kAccessibilitySpokenFeedbackEnabled, true);
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(500));
tts_handler_->VerifyAnnouncement("");
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1000));
tts_handler_->VerifyAnnouncement(
"Personal info suggested. Press down arrow to access; escape to ignore.");
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(200));
tts_handler_->VerifyAnnouncement("Suggestion inserted.");
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1500));
tts_handler_->VerifyAnnouncement(
"Personal info suggested. Press down arrow to access; escape to ignore.");
SendKeyboardEvent("Esc");
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(200));
tts_handler_->VerifyAnnouncement("Suggestion dismissed.");
}
TEST_F(PersonalInfoSuggesterTest, DoNotShowAnnotationAfterMaxAcceptanceCount) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
for (int i = 0; i < kMaxAcceptanceCount; i++) {
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
suggestion_handler_->VerifyShowAnnotation(true);
}
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifyShowAnnotation(false);
}
TEST_F(PersonalInfoSuggesterTest, ShowSettingLink) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
DictionaryPrefUpdate update(profile_->GetPrefs(),
prefs::kAssistiveInputFeatureSettings);
update->RemoveKey(kPersonalInfoSuggesterShowSettingCount);
update->RemoveKey(kPersonalInfoSuggesterAcceptanceCount);
for (int i = 0; i < kMaxShowSettingCount; i++) {
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
// Dismiss suggestion.
SendKeyboardEvent("Esc");
suggestion_handler_->VerifyShowSettingLink(true);
}
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifyShowSettingLink(false);
}
TEST_F(PersonalInfoSuggesterTest, DoNotShowSettingLinkAfterAcceptance) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
DictionaryPrefUpdate update(profile_->GetPrefs(),
prefs::kAssistiveInputFeatureSettings);
update->SetIntKey(kPersonalInfoSuggesterShowSettingCount, 0);
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifyShowSettingLink(true);
// Accept suggestion.
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
suggestion_handler_->VerifyShowSettingLink(false);
}
TEST_F(PersonalInfoSuggesterTest, ClickSettingsWithDownDownEnter) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
DictionaryPrefUpdate update(profile_->GetPrefs(),
prefs::kAssistiveInputFeatureSettings);
update->RemoveKey(kPersonalInfoSuggesterShowSettingCount);
update->RemoveKey(kPersonalInfoSuggesterAcceptanceCount);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
SendKeyboardEvent("Down");
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
suggestion_handler_->VerifyButtonClicked(
ui::ime::ButtonId::kSmartInputsSettingLink);
}
TEST_F(PersonalInfoSuggesterTest, ClickSettingsWithUpEnter) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
DictionaryPrefUpdate update(profile_->GetPrefs(),
prefs::kAssistiveInputFeatureSettings);
update->RemoveKey(kPersonalInfoSuggesterShowSettingCount);
update->RemoveKey(kPersonalInfoSuggesterAcceptanceCount);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
suggester_->Suggest(base::UTF8ToUTF16("my email is "));
SendKeyboardEvent("Up");
SendKeyboardEvent("Enter");
suggestion_handler_->VerifyButtonClicked(
ui::ime::ButtonId::kSmartInputsSettingLink);
}
TEST_F(PersonalInfoSuggesterTest, RecordsTimeToAccept) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
base::HistogramTester histogram_tester;
histogram_tester.ExpectTotalCount(
"InputMethod.Assistive.TimeToAccept.PersonalInfo", 0);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
EXPECT_TRUE(suggester_->Suggest(base::UTF8ToUTF16("my email is ")));
// Press "Down" to choose and accept the suggestion.
SendKeyboardEvent("Down");
SendKeyboardEvent("Enter");
histogram_tester.ExpectTotalCount(
"InputMethod.Assistive.TimeToAccept.PersonalInfo", 1);
}
TEST_F(PersonalInfoSuggesterTest, RecordsTimeToDismiss) {
base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
/*enabled_features=*/{chromeos::features::kAssistPersonalInfoEmail},
/*disabled_features=*/{});
base::HistogramTester histogram_tester;
histogram_tester.ExpectTotalCount(
"InputMethod.Assistive.TimeToAccept.PersonalInfo", 0);
profile_->set_profile_name(base::UTF16ToUTF8(email_));
EXPECT_TRUE(suggester_->Suggest(base::UTF8ToUTF16("my email is ")));
// Press "Esc" to dismiss.
SendKeyboardEvent("Esc");
histogram_tester.ExpectTotalCount(
"InputMethod.Assistive.TimeToDismiss.PersonalInfo", 1);
}
} // namespace chromeos