Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(752)

Unified Diff: chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc

Issue 2700523002: arc: Fix crash on accessing app info for secondary user. (Closed)
Patch Set: clean up Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
index 73ad28dc30a862fee0f2d7683d919de77e5e38b6..2e5063ca67f1af7b4a30b74529e3e8b26b9e7524 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/extensions/test_extension_environment.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.h"
+#include "chrome/common/extensions/extension_constants.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "chrome/test/base/testing_profile.h"
#include "extensions/browser/extension_system.h"
@@ -25,9 +26,25 @@
#include "ui/views/window/dialog_delegate.h"
#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
-#include "components/arc/arc_session_runner.h"
-#include "components/arc/test/fake_arc_session.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_test.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
+#endif
+
+#if defined(OS_CHROMEOS)
+namespace {
+
+std::vector<arc::mojom::AppInfoPtr> GetArcSettingsAppMojoInfo() {
msw 2017/02/15 21:48:28 It's a little odd to return a vector for one item,
khmel 2017/02/16 15:47:52 Done.
+ std::vector<arc::mojom::AppInfoPtr> apps;
+ arc::mojom::AppInfoPtr app(arc::mojom::AppInfo::New());
+ app->name = "settings";
+ app->package_name = "com.android.settings";
+ app->activity = "com.android.settings.Settings";
+ app->sticky = false;
+ apps.push_back(std::move(app));
+ return apps;
+}
+} // namespace
msw 2017/02/15 21:48:28 nit: add a blank line above
khmel 2017/02/16 15:47:51 Done.
#endif
namespace test {
@@ -69,35 +86,19 @@ class AppInfoDialogViewsTest : public BrowserWithTestWindowTest,
void SetUp() override {
BrowserWithTestWindowTest::SetUp();
#if defined(OS_CHROMEOS)
- arc::ArcSessionManager::DisableUIForTesting();
khmel 2017/02/15 16:38:45 This actually does not start ARC (we need extra pr
msw 2017/02/15 21:48:28 Acknowledged.
- arc_session_manager_ = base::MakeUnique<arc::ArcSessionManager>(
- base::MakeUnique<arc::ArcSessionRunner>(
- base::Bind(arc::FakeArcSession::Create)));
- arc_session_manager_->OnPrimaryUserProfilePrepared(
- extension_environment_.profile());
+ arc_test_.SetUp(extension_environment_.profile());
#endif
- widget_ = views::DialogDelegate::CreateDialogWidget(
- new views::DialogDelegateView(), GetContext(), nullptr);
- widget_->AddObserver(this);
extension_ = extension_environment_.MakePackagedApp(kTestExtensionId, true);
- dialog_ = new AppInfoDialog(widget_->GetNativeWindow(),
khmel 2017/02/15 16:38:45 Move creation and closing to separate methods Show
msw 2017/02/15 21:48:28 Acknowledged.
- extension_environment_.profile(),
- extension_.get());
-
- widget_->GetContentsView()->AddChildView(dialog_);
- widget_->Show();
+ chrome_app_ = extension_environment_.MakePackagedApp(
+ extension_misc::kChromeAppId, true);
}
void TearDown() override {
- if (!widget_destroyed_)
- widget_->CloseNow();
- EXPECT_TRUE(widget_destroyed_);
+ CloseAppInfo();
extension_ = nullptr;
+ chrome_app_ = nullptr;
#if defined(OS_CHROMEOS)
- if (arc_session_manager_) {
- arc_session_manager_->Shutdown();
- arc_session_manager_ = nullptr;
- }
+ arc_test_.TearDown();
#endif
BrowserWithTestWindowTest::TearDown();
}
@@ -109,14 +110,43 @@ class AppInfoDialogViewsTest : public BrowserWithTestWindowTest,
void DestroyProfile(TestingProfile* profile) override {
#if defined(OS_CHROMEOS)
- if (arc_session_manager_) {
- arc_session_manager_->Shutdown();
- arc_session_manager_ = nullptr;
- }
+ arc_test_.TearDown();
#endif
}
protected:
+ void ShowAppInfo(const std::string& app_id) {
+ ShowAppInfoForProfile(app_id, extension_environment_.profile());
+ }
+
+ void ShowAppInfoForProfile(const std::string& app_id, Profile* profile) {
+ const extensions::Extension* extension =
+ extensions::ExtensionSystem::Get(profile)
+ ->extension_service()
+ ->GetExtensionById(app_id, true);
+ DCHECK(extension);
+
+ DCHECK(!widget_);
+ widget_destroyed_ = false;
+ widget_ = views::DialogDelegate::CreateDialogWidget(
+ new views::DialogDelegateView(), GetContext(), nullptr);
+ widget_->AddObserver(this);
+ dialog_ = new AppInfoDialog(widget_->GetNativeWindow(), profile, extension);
+
+ widget_->GetContentsView()->AddChildView(dialog_);
+ widget_->Show();
+ }
+
+ void CloseAppInfo() {
+ if (!widget_destroyed_) {
+ DCHECK(widget_);
+ widget_->CloseNow();
+ }
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(widget_destroyed_);
+ DCHECK(!widget_);
+ }
+
// Overridden from views::WidgetObserver:
void OnWidgetDestroyed(views::Widget* widget) override {
widget_destroyed_ = true;
@@ -134,12 +164,13 @@ class AppInfoDialogViewsTest : public BrowserWithTestWindowTest,
protected:
views::Widget* widget_ = nullptr;
- bool widget_destroyed_ = false;
+ bool widget_destroyed_ = true;
msw 2017/02/15 21:48:28 optional nit: invert this member as |widget_exists
khmel 2017/02/16 15:47:52 Good catch. removed.
AppInfoDialog* dialog_ = nullptr; // Owned by |widget_|'s views hierarchy.
scoped_refptr<extensions::Extension> extension_;
+ scoped_refptr<extensions::Extension> chrome_app_;
extensions::TestExtensionEnvironment extension_environment_;
#if defined(OS_CHROMEOS)
- std::unique_ptr<arc::ArcSessionManager> arc_session_manager_;
+ ArcAppTest arc_test_;
#endif
private:
@@ -148,6 +179,7 @@ class AppInfoDialogViewsTest : public BrowserWithTestWindowTest,
// Tests that the dialog closes when the current app is uninstalled.
TEST_F(AppInfoDialogViewsTest, UninstallingAppClosesDialog) {
+ ShowAppInfo(kTestExtensionId);
EXPECT_FALSE(widget_->IsClosed());
EXPECT_FALSE(widget_destroyed_);
UninstallApp(kTestExtensionId);
@@ -157,6 +189,7 @@ TEST_F(AppInfoDialogViewsTest, UninstallingAppClosesDialog) {
// Tests that the dialog does not close when a different app is uninstalled.
TEST_F(AppInfoDialogViewsTest, UninstallingOtherAppDoesNotCloseDialog) {
+ ShowAppInfo(kTestExtensionId);
extension_environment_.MakePackagedApp(kTestOtherExtensionId, true);
EXPECT_FALSE(widget_->IsClosed());
@@ -168,6 +201,7 @@ TEST_F(AppInfoDialogViewsTest, UninstallingOtherAppDoesNotCloseDialog) {
// Tests that the dialog closes when the current profile is destroyed.
TEST_F(AppInfoDialogViewsTest, DestroyedProfileClosesDialog) {
+ ShowAppInfo(kTestExtensionId);
// First delete the test browser window. This ensures the test harness isn't
// surprised by it being closed in response to the profile deletion below.
// Note the base class doesn't own the profile, so that part is skipped.
@@ -187,6 +221,7 @@ TEST_F(AppInfoDialogViewsTest, DestroyedProfileClosesDialog) {
// Tests that the dialog does not close when a different profile is destroyed.
TEST_F(AppInfoDialogViewsTest, DestroyedOtherProfileDoesNotCloseDialog) {
+ ShowAppInfo(kTestExtensionId);
std::unique_ptr<TestingProfile> other_profile(new TestingProfile);
extension_environment_.CreateExtensionServiceForProfile(other_profile.get());
@@ -206,6 +241,7 @@ TEST_F(AppInfoDialogViewsTest, DestroyedOtherProfileDoesNotCloseDialog) {
// Tests that clicking the View in Store link opens a browser tab and closes the
// dialog cleanly.
TEST_F(AppInfoDialogViewsTest, ViewInStore) {
+ ShowAppInfo(kTestExtensionId);
EXPECT_TRUE(extension_->from_webstore()); // Otherwise there is no link.
views::Link* link = test::AppInfoDialogTestApi(dialog_).view_in_store_link();
EXPECT_TRUE(link);
@@ -231,3 +267,39 @@ TEST_F(AppInfoDialogViewsTest, ViewInStore) {
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(widget_destroyed_);
}
+
+#if defined(OS_CHROMEOS)
+TEST_F(AppInfoDialogViewsTest, ArcAppInfoLinks) {
+ ShowAppInfo(extension_misc::kChromeAppId);
+ EXPECT_FALSE(widget_->IsClosed());
+ // App Info should not have ARC App info links section because ARC Settings
+ // app is not available yet.
+ EXPECT_FALSE(dialog_->arc_app_info_links_);
+
+ // Re-show App Info but with ARC Settings app enabled.
+ CloseAppInfo();
+ ArcAppListPrefs* arc_prefs =
+ ArcAppListPrefs::Get(extension_environment_.profile());
+ ASSERT_TRUE(arc_prefs);
+ arc::mojom::AppHost* app_host = arc_prefs;
+ app_host->OnAppListRefreshed(GetArcSettingsAppMojoInfo());
+ EXPECT_TRUE(arc_prefs->IsRegistered(arc::kSettingsAppId));
+ ShowAppInfo(extension_misc::kChromeAppId);
+ EXPECT_FALSE(widget_->IsClosed());
+ EXPECT_TRUE(dialog_->arc_app_info_links_);
+
+ // Re-show App Info but for non-primary profie.
msw 2017/02/15 21:48:28 nit: 'profile'
khmel 2017/02/16 15:47:52 Done.
+ CloseAppInfo();
+ std::unique_ptr<TestingProfile> other_profile(new TestingProfile);
msw 2017/02/15 21:48:28 nit: base::MakeUnique
khmel 2017/02/16 15:47:51 Done.
+ extension_environment_.CreateExtensionServiceForProfile(other_profile.get());
+ scoped_refptr<const extensions::Extension> other_app =
+ extension_environment_.MakePackagedApp(extension_misc::kChromeAppId,
+ true);
+ extensions::ExtensionSystem::Get(other_profile.get())
+ ->extension_service()
+ ->AddExtension(other_app.get());
+ ShowAppInfoForProfile(extension_misc::kChromeAppId, other_profile.get());
+ EXPECT_FALSE(widget_->IsClosed());
+ EXPECT_FALSE(dialog_->arc_app_info_links_);
msw 2017/02/15 21:48:28 nit: add some explanation as to why the links aren
khmel 2017/02/16 15:47:52 Thanks for ready-to-use proposal :)
+}
+#endif

Powered by Google App Engine
This is Rietveld 408576698