Commit 40757f53 authored by nancy's avatar nancy Committed by Commit Bot

Reland "Use AppService to uninstall apps on Chrome OS."

The browser test AppListClientImplBrowserTest.UninstallApp is flaky,
because AppService is mojom based, which is slow when loading icon,
compared with sync Extensions. Update the test case to flush mojo call.

BUG=1009248

Change-Id: I7e5702392ec9369991ffb357c5dcb402dd6cb0f1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1885134Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Nancy Wang <nancylingwang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#710615}
parent 1e385552
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/native_window_tracker.h"
#include "chrome/services/app_service/public/cpp/icon_loader.h" #include "chrome/services/app_service/public/cpp/icon_loader.h"
#include "extensions/browser/uninstall_reason.h" #include "extensions/browser/uninstall_reason.h"
...@@ -36,6 +37,9 @@ UninstallDialog::UninstallDialog(Profile* profile, ...@@ -36,6 +37,9 @@ UninstallDialog::UninstallDialog(Profile* profile,
app_name_(app_name), app_name_(app_name),
parent_window_(parent_window), parent_window_(parent_window),
uninstall_callback_(std::move(uninstall_callback)) { uninstall_callback_(std::move(uninstall_callback)) {
if (parent_window)
parent_window_tracker_ = NativeWindowTracker::Create(parent_window);
int32_t size_hint_in_dip; int32_t size_hint_in_dip;
switch (app_type) { switch (app_type) {
case apps::mojom::AppType::kCrostini: case apps::mojom::AppType::kCrostini:
...@@ -86,6 +90,12 @@ void UninstallDialog::OnDialogClosed(bool uninstall, ...@@ -86,6 +90,12 @@ void UninstallDialog::OnDialogClosed(bool uninstall,
void UninstallDialog::OnLoadIcon(apps::mojom::IconValuePtr icon_value) { void UninstallDialog::OnLoadIcon(apps::mojom::IconValuePtr icon_value) {
if (icon_value->icon_compression != if (icon_value->icon_compression !=
apps::mojom::IconCompression::kUncompressed) { apps::mojom::IconCompression::kUncompressed) {
OnDialogClosed(false, false, false);
return;
}
if (parent_window_ && parent_window_tracker_->WasNativeWindowClosed()) {
OnDialogClosed(false, false, false);
return; return;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "chrome/services/app_service/public/mojom/types.mojom.h" #include "chrome/services/app_service/public/mojom/types.mojom.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/native_widget_types.h"
class NativeWindowTracker;
class Profile; class Profile;
namespace gfx { namespace gfx {
...@@ -103,6 +104,9 @@ class UninstallDialog { ...@@ -103,6 +104,9 @@ class UninstallDialog {
gfx::NativeWindow parent_window_; gfx::NativeWindow parent_window_;
UninstallCallback uninstall_callback_; UninstallCallback uninstall_callback_;
// Tracks whether |parent_window_| got destroyed.
std::unique_ptr<NativeWindowTracker> parent_window_tracker_;
base::WeakPtrFactory<UninstallDialog> weak_ptr_factory_{this}; base::WeakPtrFactory<UninstallDialog> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(UninstallDialog); DISALLOW_COPY_AND_ASSIGN(UninstallDialog);
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include "build/branding_buildflags.h" #include "build/branding_buildflags.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/apps/app_service/app_launch_params.h" #include "chrome/browser/apps/app_service/app_launch_params.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/apps/launch_service/launch_service.h" #include "chrome/browser/apps/launch_service/launch_service.h"
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h" #include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
...@@ -114,6 +116,12 @@ IN_PROC_BROWSER_TEST_F(AppListClientImplBrowserTest, UninstallApp) { ...@@ -114,6 +116,12 @@ IN_PROC_BROWSER_TEST_F(AppListClientImplBrowserTest, UninstallApp) {
// Open the uninstall dialog. // Open the uninstall dialog.
base::RunLoop run_loop; base::RunLoop run_loop;
client->UninstallApp(profile(), app->id()); client->UninstallApp(profile(), app->id());
apps::AppServiceProxy* app_service_proxy_ =
apps::AppServiceProxyFactory::GetForProfile(profile());
DCHECK(app_service_proxy_);
app_service_proxy_->FlushMojoCallsForTesting();
run_loop.RunUntilIdle(); run_loop.RunUntilIdle();
EXPECT_FALSE(wm::GetTransientChildren(client->GetAppListWindow()).empty()); EXPECT_FALSE(wm::GetTransientChildren(client->GetAppListWindow()).empty());
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/install_tracker_factory.h" #include "chrome/browser/extensions/install_tracker_factory.h"
#include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/extensions/launch_util.h"
...@@ -127,10 +129,10 @@ void AppListControllerDelegate::DoShowAppInfoFlow( ...@@ -127,10 +129,10 @@ void AppListControllerDelegate::DoShowAppInfoFlow(
void AppListControllerDelegate::UninstallApp(Profile* profile, void AppListControllerDelegate::UninstallApp(Profile* profile,
const std::string& app_id) { const std::string& app_id) {
// ExtensionUninstall deletes itself when done or aborted. apps::AppServiceProxy* proxy =
ExtensionUninstaller* uninstaller = apps::AppServiceProxyFactory::GetForProfile(profile);
new ExtensionUninstaller(profile, app_id, GetAppListWindow()); DCHECK(proxy);
uninstaller->Run(); proxy->Uninstall(app_id, GetAppListWindow());
} }
bool AppListControllerDelegate::IsAppFromWebStore(Profile* profile, bool AppListControllerDelegate::IsAppFromWebStore(Profile* profile,
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include "ash/public/cpp/tablet_mode.h" #include "ash/public/cpp/tablet_mode.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/feature_list.h" #include "base/feature_list.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/chromeos/arc/app_shortcuts/arc_app_shortcuts_menu_builder.h" #include "chrome/browser/chromeos/arc/app_shortcuts/arc_app_shortcuts_menu_builder.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/app_context_menu_delegate.h" #include "chrome/browser/ui/app_list/app_context_menu_delegate.h"
...@@ -89,7 +91,11 @@ void ArcAppContextMenu::ExecuteCommand(int command_id, int event_flags) { ...@@ -89,7 +91,11 @@ void ArcAppContextMenu::ExecuteCommand(int command_id, int event_flags) {
if (command_id == ash::LAUNCH_NEW) { if (command_id == ash::LAUNCH_NEW) {
delegate()->ExecuteLaunchCommand(event_flags); delegate()->ExecuteLaunchCommand(event_flags);
} else if (command_id == ash::UNINSTALL) { } else if (command_id == ash::UNINSTALL) {
arc::ShowArcAppUninstallDialog(profile(), controller(), app_id()); apps::AppServiceProxy* proxy =
apps::AppServiceProxyFactory::GetForProfile(profile());
DCHECK(proxy);
proxy->Uninstall(app_id(),
controller() ? controller()->GetAppListWindow() : nullptr);
} else if (command_id == ash::SHOW_APP_INFO) { } else if (command_id == ash::SHOW_APP_INFO) {
ShowPackageInfo(); ShowPackageInfo();
} else if (command_id >= ash::LAUNCH_APP_SHORTCUT_FIRST && } else if (command_id >= ash::LAUNCH_APP_SHORTCUT_FIRST &&
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "ash/public/cpp/app_menu_constants.h" #include "ash/public/cpp/app_menu_constants.h"
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/crostini/crostini_util.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
...@@ -31,11 +33,14 @@ bool CrostiniAppContextMenu::IsCommandIdEnabled(int command_id) const { ...@@ -31,11 +33,14 @@ bool CrostiniAppContextMenu::IsCommandIdEnabled(int command_id) const {
void CrostiniAppContextMenu::ExecuteCommand(int command_id, int event_flags) { void CrostiniAppContextMenu::ExecuteCommand(int command_id, int event_flags) {
switch (command_id) { switch (command_id) {
case ash::UNINSTALL: case ash::UNINSTALL: {
DCHECK_NE(app_id(), crostini::kCrostiniTerminalId); DCHECK_NE(app_id(), crostini::kCrostiniTerminalId);
crostini::ShowCrostiniAppUninstallerView(profile(), app_id()); apps::AppServiceProxy* proxy =
apps::AppServiceProxyFactory::GetForProfile(profile());
DCHECK(proxy);
proxy->Uninstall(app_id(), nullptr /* parent_window */);
return; return;
}
case ash::STOP_APP: case ash::STOP_APP:
if (app_id() == crostini::kCrostiniTerminalId) { if (app_id() == crostini::kCrostiniTerminalId) {
crostini::CrostiniManager::GetForProfile(profile())->StopVm( crostini::CrostiniManager::GetForProfile(profile())->StopVm(
......
...@@ -67,7 +67,6 @@ void ArcLauncherContextMenu::ExecuteCommand(int command_id, int event_flags) { ...@@ -67,7 +67,6 @@ void ArcLauncherContextMenu::ExecuteCommand(int command_id, int event_flags) {
return; return;
} }
if (command_id == ash::UNINSTALL) { if (command_id == ash::UNINSTALL) {
if (base::FeatureList::IsEnabled(features::kAppServiceShelf)) {
apps::AppServiceProxy* proxy = apps::AppServiceProxy* proxy =
apps::AppServiceProxyFactory::GetForProfile(controller()->profile()); apps::AppServiceProxyFactory::GetForProfile(controller()->profile());
DCHECK(proxy); DCHECK(proxy);
...@@ -75,11 +74,6 @@ void ArcLauncherContextMenu::ExecuteCommand(int command_id, int event_flags) { ...@@ -75,11 +74,6 @@ void ArcLauncherContextMenu::ExecuteCommand(int command_id, int event_flags) {
return; return;
} }
arc::ShowArcAppUninstallDialog(controller()->profile(),
nullptr /* controller */, item().id.app_id);
return;
}
LauncherContextMenu::ExecuteCommand(command_id, event_flags); LauncherContextMenu::ExecuteCommand(command_id, event_flags);
} }
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "ash/public/cpp/app_menu_constants.h" #include "ash/public/cpp/app_menu_constants.h"
#include "ash/public/cpp/shelf_item.h" #include "ash/public/cpp/shelf_item.h"
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/crostini/crostini_registry_service.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_registry_service_factory.h"
...@@ -68,11 +70,14 @@ bool CrostiniShelfContextMenu::IsCommandIdEnabled(int command_id) const { ...@@ -68,11 +70,14 @@ bool CrostiniShelfContextMenu::IsCommandIdEnabled(int command_id) const {
void CrostiniShelfContextMenu::ExecuteCommand(int command_id, int event_flags) { void CrostiniShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
switch (command_id) { switch (command_id) {
case ash::UNINSTALL: case ash::UNINSTALL: {
DCHECK_NE(item().id.app_id, crostini::kCrostiniTerminalId); DCHECK_NE(item().id.app_id, crostini::kCrostiniTerminalId);
crostini::ShowCrostiniAppUninstallerView(controller()->profile(), apps::AppServiceProxy* proxy =
item().id.app_id); apps::AppServiceProxyFactory::GetForProfile(controller()->profile());
DCHECK(proxy);
proxy->Uninstall(item().id.app_id, nullptr /* parent_window */);
return; return;
}
case ash::STOP_APP: case ash::STOP_APP:
if (item().id.app_id == crostini::kCrostiniTerminalId) { if (item().id.app_id == crostini::kCrostiniTerminalId) {
crostini::CrostiniManager::GetForProfile(controller()->profile()) crostini::CrostiniManager::GetForProfile(controller()->profile())
......
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