Commit c2ffec8a authored by Renee Wright's avatar Renee Wright Committed by Commit Bot

Add method to clean up registered crostini apps

And use it to clean up registered apps before uninstalling Crostini.

Change-Id: I4331d3ca30f136f0880e9e886cad12e8fe9802ad
Reviewed-on: https://chromium-review.googlesource.com/1032672Reviewed-by: default avatarTimothy Loh <timloh@chromium.org>
Commit-Queue: Renée Wright <rjwright@chromium.org>
Cr-Commit-Position: refs/heads/master@{#554644}
parent be696555
......@@ -457,6 +457,38 @@ void CrostiniRegistryService::MaybeRequestIcon(const std::string& app_id,
RequestIcon(app_id, scale_factor);
}
void CrostiniRegistryService::ClearApplicationList(
const std::string& vm_name,
const std::string& container_name) {
std::vector<std::string> removed_apps;
// The DictionaryPrefUpdate should be destructed before calling the observer.
{
DictionaryPrefUpdate update(prefs_, kCrostiniRegistryPref);
base::DictionaryValue* apps = update.Get();
for (const auto& item : apps->DictItems()) {
if (item.first == kCrostiniTerminalId)
continue;
if (item.second.FindKey(kAppVmNameKey)->GetString() == vm_name &&
item.second.FindKey(kAppContainerNameKey)->GetString() ==
container_name) {
removed_apps.push_back(item.first);
}
}
for (const std::string& removed_app : removed_apps) {
RemoveAppData(removed_app);
apps->RemoveKey(removed_app);
}
}
if (removed_apps.empty())
return;
std::vector<std::string> updated_apps;
std::vector<std::string> inserted_apps;
for (Observer& obs : observers_)
obs.OnRegistryUpdated(this, updated_apps, removed_apps, inserted_apps);
}
void CrostiniRegistryService::UpdateApplicationList(
const vm_tools::apps::ApplicationList& app_list) {
if (app_list.vm_name().empty()) {
......
......@@ -156,6 +156,10 @@ class CrostiniRegistryService : public KeyedService {
void MaybeRequestIcon(const std::string& app_id,
ui::ScaleFactor scale_factor);
// Remove all apps from the named container. Used in the uninstall process.
void ClearApplicationList(const std::string& vm_name,
const std::string& container_name);
// The existing list of apps is replaced by |application_list|.
void UpdateApplicationList(const vm_tools::apps::ApplicationList& app_list);
......
......@@ -238,6 +238,30 @@ TEST_F(CrostiniRegistryServiceTest, MultipleContainers) {
kCrostiniTerminalId));
}
// Test that ClearApplicationList works, and only removes apps from the
// specified container.
TEST_F(CrostiniRegistryServiceTest, ClearApplicationList) {
service()->UpdateApplicationList(BasicAppList("app", "vm 1", "container 1"));
service()->UpdateApplicationList(BasicAppList("app", "vm 1", "container 2"));
ApplicationList app_list = BasicAppList("app", "vm 2", "container 1");
*app_list.add_apps() = BasicApp("app 2");
service()->UpdateApplicationList(app_list);
std::string app_id_1 = GenerateAppId("app", "vm 1", "container 1");
std::string app_id_2 = GenerateAppId("app", "vm 1", "container 2");
std::string app_id_3 = GenerateAppId("app", "vm 2", "container 1");
std::string app_id_4 = GenerateAppId("app 2", "vm 2", "container 1");
EXPECT_THAT(service()->GetRegisteredAppIds(),
testing::UnorderedElementsAre(app_id_1, app_id_2, app_id_3,
app_id_4, kCrostiniTerminalId));
service()->ClearApplicationList("vm 2", "container 1");
EXPECT_THAT(
service()->GetRegisteredAppIds(),
testing::UnorderedElementsAre(app_id_1, app_id_2, kCrostiniTerminalId));
}
TEST_F(CrostiniRegistryServiceTest, GetCrostiniAppIdNoStartupID) {
ApplicationList app_list = BasicAppList("app", "vm", "container");
*app_list.add_apps() = BasicApp("cool.app");
......
......@@ -6,6 +6,8 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
#include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
#include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h"
#include "chrome/browser/chromeos/crostini/crostini_util.h"
#include "chrome/browser/component_updater/cros_component_installer.h"
#include "chrome/browser/profiles/profile.h"
......@@ -53,6 +55,9 @@ void CrostiniRemover::OnRestartCrostini(
void CrostiniRemover::StopVmFinished(crostini::ConciergeClientResult result) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (result == crostini::ConciergeClientResult::SUCCESS) {
crostini::CrostiniRegistryServiceFactory::GetForProfile(profile_)
->ClearApplicationList(kCrostiniDefaultVmName,
kCrostiniDefaultContainerName);
crostini::CrostiniManager::GetInstance()->DestroyDiskImage(
CryptohomeIdForProfile(profile_),
base::FilePath(kCrostiniDefaultVmName),
......
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