Commit 88648d20 authored by Maggie Cai's avatar Maggie Cai Committed by Commit Bot

[IntentHandling] Delete all preferred apps settings for an app id.

This CL adds the functionality to delete all preferred apps settings for
an particular app id.

BUG=853604

Change-Id: I9d5306d6b1cac860306a2fb568d828b1bebff4db
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1913280
Commit-Queue: Maggie Cai <mxcai@chromium.org>
Reviewed-by: default avatarNancy Wang <nancylingwang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714842}
parent 9b140c8d
......@@ -371,6 +371,30 @@ bool PreferredApps::DeletePreferredApp(
return true;
}
// static
void PreferredApps::DeleteAppId(const std::string& app_id,
base::Value* preferred_apps) {
if (!preferred_apps) {
return;
}
std::vector<std::string> keys_to_remove;
for (const auto& key_value : preferred_apps->DictItems()) {
if (key_value.first == kAppId) {
if (key_value.second.GetString() == app_id) {
keys_to_remove.push_back(kAppId);
}
} else {
DeleteAppId(app_id, &key_value.second);
if (key_value.second.DictEmpty()) {
keys_to_remove.push_back(key_value.first);
}
}
}
for (const auto& key_to_remove : keys_to_remove) {
preferred_apps->RemoveKey(key_to_remove);
}
}
void PreferredApps::Init(std::unique_ptr<base::Value> preferred_apps) {
if (preferred_apps && VerifyPreferredApps(preferred_apps.get())) {
preferred_apps_ = std::move(preferred_apps);
......@@ -398,6 +422,13 @@ bool PreferredApps::DeletePreferredApp(
return DeletePreferredApp(app_id, intent_filter, preferred_apps_.get());
}
void PreferredApps::DeleteAppId(const std::string& app_id) {
if (!preferred_apps_) {
return;
}
DeleteAppId(app_id, preferred_apps_.get());
}
base::Optional<std::string> PreferredApps::FindPreferredAppForIntent(
const apps::mojom::IntentPtr& intent) {
base::Optional<std::string> best_match_app_id = base::nullopt;
......
......@@ -56,6 +56,10 @@ class PreferredApps {
const apps::mojom::IntentFilterPtr& intent_filter,
base::Value* preferred_apps);
// Delete all settings for an |app_id|.
static void DeleteAppId(const std::string& app_id,
base::Value* preferred_apps);
void Init(std::unique_ptr<base::Value> preferred_apps);
// Add a preferred app for an |intent_filter|.
......@@ -66,6 +70,9 @@ class PreferredApps {
bool DeletePreferredApp(const std::string& app_id,
const apps::mojom::IntentFilterPtr& intent_filter);
// Delete all settings for an |app_id|.
void DeleteAppId(const std::string& app_id);
// Find preferred app id for an |intent|.
base::Optional<std::string> FindPreferredAppForIntent(
const apps::mojom::IntentPtr& intent);
......
......@@ -402,3 +402,116 @@ TEST_F(PreferredAppTest, DeleteForNotCompletedFilter) {
EXPECT_EQ(base::nullopt, preferred_apps_.FindPreferredAppForUrl(url));
}
// Test that DeleteAppId() can delete the setting for one filter.
TEST_F(PreferredAppTest, DeleteAppIdForOneFilter) {
preferred_apps_.Init(
std::make_unique<base::Value>(base::Value::Type::DICTIONARY));
GURL filter_url = GURL("https://www.google.com/abc");
auto intent_filter = apps_util::CreateIntentFilterForUrlScope(filter_url);
preferred_apps_.AddPreferredApp(kAppId1, intent_filter);
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(filter_url));
preferred_apps_.DeleteAppId(kAppId1);
EXPECT_EQ(base::nullopt, preferred_apps_.FindPreferredAppForUrl(filter_url));
EXPECT_TRUE(preferred_apps_.GetValue().DictEmpty());
}
// Test that when multiple filters set to the same app id, DeleteAppId() can
// delete all of them.
TEST_F(PreferredAppTest, DeleteAppIdForMultipleFilters) {
preferred_apps_.Init(
std::make_unique<base::Value>(base::Value::Type::DICTIONARY));
GURL filter_url_1 = GURL("https://www.google.com/abc");
auto intent_filter_1 = apps_util::CreateIntentFilterForUrlScope(filter_url_1);
preferred_apps_.AddPreferredApp(kAppId1, intent_filter_1);
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(filter_url_1));
GURL filter_url_2 = GURL("https://www.abc.com/google");
auto intent_filter_2 = apps_util::CreateIntentFilterForUrlScope(filter_url_2);
preferred_apps_.AddPreferredApp(kAppId1, intent_filter_2);
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(filter_url_2));
GURL filter_url_3 = GURL("tel://12345678/");
auto intent_filter_3 = apps_util::CreateIntentFilterForUrlScope(filter_url_3);
preferred_apps_.AddPreferredApp(kAppId1, intent_filter_3);
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(filter_url_3));
preferred_apps_.DeleteAppId(kAppId1);
EXPECT_EQ(base::nullopt,
preferred_apps_.FindPreferredAppForUrl(filter_url_1));
EXPECT_EQ(base::nullopt,
preferred_apps_.FindPreferredAppForUrl(filter_url_2));
EXPECT_EQ(base::nullopt,
preferred_apps_.FindPreferredAppForUrl(filter_url_3));
EXPECT_TRUE(preferred_apps_.GetValue().DictEmpty());
}
// Test that for filter with multiple condition values, DeleteAppId() can
// delete them all.
TEST_F(PreferredAppTest, DeleteAppIdForMultipleConditionValues) {
preferred_apps_.Init(
std::make_unique<base::Value>(base::Value::Type::DICTIONARY));
auto intent_filter =
apps_util::CreateIntentFilterForUrlScope(GURL("https://www.google.com/"));
intent_filter->conditions[0]->condition_values.push_back(
apps_util::MakeConditionValue("http",
apps::mojom::PatternMatchType::kNone));
preferred_apps_.AddPreferredApp(kAppId1, intent_filter);
GURL url_https = GURL("https://www.google.com/");
GURL url_http = GURL("http://www.google.com/");
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(url_https));
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(url_http));
preferred_apps_.DeleteAppId(kAppId1);
EXPECT_EQ(base::nullopt, preferred_apps_.FindPreferredAppForUrl(url_https));
EXPECT_EQ(base::nullopt, preferred_apps_.FindPreferredAppForUrl(url_http));
}
// Test that for multiple filters set to different app ids, DeleteAppId() only
// deletes the correct app id.
TEST_F(PreferredAppTest, DeleteAppIdForMultipleAppIds) {
preferred_apps_.Init(
std::make_unique<base::Value>(base::Value::Type::DICTIONARY));
GURL filter_url_1 = GURL("https://www.google.com/abc");
auto intent_filter_1 = apps_util::CreateIntentFilterForUrlScope(filter_url_1);
preferred_apps_.AddPreferredApp(kAppId1, intent_filter_1);
EXPECT_EQ(kAppId1, preferred_apps_.FindPreferredAppForUrl(filter_url_1));
GURL filter_url_2 = GURL("https://www.abc.com/google");
auto intent_filter_2 = apps_util::CreateIntentFilterForUrlScope(filter_url_2);
preferred_apps_.AddPreferredApp(kAppId2, intent_filter_2);
EXPECT_EQ(kAppId2, preferred_apps_.FindPreferredAppForUrl(filter_url_2));
GURL filter_url_3 = GURL("tel://12345678/");
auto intent_filter_3 = apps_util::CreateIntentFilterForUrlScope(filter_url_3);
preferred_apps_.AddPreferredApp(kAppId3, intent_filter_3);
EXPECT_EQ(kAppId3, preferred_apps_.FindPreferredAppForUrl(filter_url_3));
preferred_apps_.DeleteAppId(kAppId1);
EXPECT_EQ(base::nullopt,
preferred_apps_.FindPreferredAppForUrl(filter_url_1));
EXPECT_EQ(kAppId2, preferred_apps_.FindPreferredAppForUrl(filter_url_2));
EXPECT_EQ(kAppId3, preferred_apps_.FindPreferredAppForUrl(filter_url_3));
preferred_apps_.DeleteAppId(kAppId2);
EXPECT_EQ(base::nullopt,
preferred_apps_.FindPreferredAppForUrl(filter_url_2));
EXPECT_EQ(kAppId3, preferred_apps_.FindPreferredAppForUrl(filter_url_3));
preferred_apps_.DeleteAppId(kAppId3);
EXPECT_EQ(base::nullopt,
preferred_apps_.FindPreferredAppForUrl(filter_url_3));
EXPECT_TRUE(preferred_apps_.GetValue().DictEmpty());
}
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