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

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

Issue 580713002: Close the App Info Dialog if the app or profile becomes invalid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small fixes Created 6 years, 3 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
new file mode 100644
index 0000000000000000000000000000000000000000..4e80702f0214a1d5b4e237133ffa48e8783341f7
--- /dev/null
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
@@ -0,0 +1,197 @@
+// Copyright 2014 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/ui/views/apps/app_info_dialog/app_info_dialog_views.h"
+
+#include "ash/test/ash_test_base.h"
+#include "base/command_line.h"
+#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/test/base/testing_profile.h"
+#include "extensions/browser/extension_prefs.h"
+#include "extensions/common/extension_builder.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
+#include "ui/views/window/dialog_delegate.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
+#include "chrome/browser/chromeos/settings/device_settings_service.h"
+#endif
+
+namespace {
+
+const char kTestExtensionId[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+const char kTestOtherExtensionId[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
+
+} // namespace
+
+class AppInfoDialogViewsTest : public ash::test::AshTestBase,
+ public views::WidgetObserver {
+ public:
+ AppInfoDialogViewsTest()
+ : widget_(NULL),
+ widget_destroyed_(false),
+ command_line_(CommandLine::NO_PROGRAM) {}
+ virtual ~AppInfoDialogViewsTest() {}
+
+ // Overridden from testing::Test:
+ virtual void SetUp() OVERRIDE {
+ ash::test::AshTestBase::SetUp();
+
+ widget_ = views::DialogDelegate::CreateDialogWidget(
+ new views::DialogDelegateView(), CurrentContext(), NULL);
+ widget_->AddObserver(this);
+
+ profile_.reset(new TestingProfile());
+ CreateExtensionSystemForProfile(profile_.get());
+
+ app_ = extensions::ExtensionBuilder()
+ .SetManifest(ValidAppManifest())
+ .SetID(kTestExtensionId)
+ .Build();
+ InstallApp(profile_.get(), app_.get());
+
+ dialog_ = new AppInfoDialog(
+ widget_->GetNativeWindow(), profile_.get(), app_.get());
+ widget_->GetContentsView()->AddChildView(dialog_);
+ }
+
+ virtual void TearDown() OVERRIDE {
+ if (!widget_destroyed_)
+ widget_->CloseNow();
+ widget_ = NULL;
+ profile_.reset();
+ ash::test::AshTestBase::TearDown();
+ }
+
+ protected:
+ // Overridden from views::WidgetObserver:
+ virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE {
+ widget_destroyed_ = true;
+ widget_->RemoveObserver(this);
+ widget_ = NULL;
+ }
+
+ void CreateExtensionSystemForProfile(Profile* profile) {
+ extensions::TestExtensionSystem* test_extension_system =
+ static_cast<extensions::TestExtensionSystem*>(
+ extensions::ExtensionSystem::Get(profile));
+ test_extension_system->CreateExtensionService(
+ &command_line_,
+ base::FilePath() /* install_directory */,
+ false /* autoupdate_enabled*/);
+ }
+
+ void InstallApp(Profile* profile, const extensions::Extension* app) {
+ extensions::ExtensionSystem::Get(profile)
+ ->extension_service()
+ ->AddExtension(app);
+ }
+
+ void UninstallApp(const std::string& app_id) {
+ extensions::ExtensionSystem::Get(profile_.get())
+ ->extension_service()
+ ->UninstallExtension(
+ app_id,
+ extensions::UninstallReason::UNINSTALL_REASON_FOR_TESTING,
+ base::Closure(),
+ NULL);
+ }
+
+ // TODO(sashab): Move this into extension_test_util.h and update the calls
+ // from AppInfoPermissionsPanelTest as well.
+ scoped_ptr<base::DictionaryValue> ValidAppManifest() {
+ return extensions::DictionaryBuilder()
+ .Set("name", "Test App Name")
+ .Set("version", "2.0")
+ .Set("manifest_version", 2)
+ .Set("app",
+ extensions::DictionaryBuilder().Set(
+ "background",
+ extensions::DictionaryBuilder().Set(
+ "scripts",
+ extensions::ListBuilder().Append("background.js"))))
+ .Build();
+ }
+
+ protected:
+ scoped_ptr<TestingProfile> profile_;
+ views::Widget* widget_;
+ bool widget_destroyed_;
+
+ private:
+ CommandLine command_line_;
+
+ scoped_refptr<const extensions::Extension> app_;
+ AppInfoDialog* dialog_; // Owned by widget_ through views heirarchy.
+
+#if defined OS_CHROMEOS
+ // Set up a user manager so these tests will run on ChromeOS. These member
+ // variables need to be initialized in this order.
+ chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
+ chromeos::ScopedTestCrosSettings test_cros_settings_;
+ chromeos::ScopedTestUserManager test_user_manager_;
+#endif
+
+ DISALLOW_COPY_AND_ASSIGN(AppInfoDialogViewsTest);
+};
+
+// Tests that the dialog closes when the current app is uninstalled.
+TEST_F(AppInfoDialogViewsTest, UninstallingAppClosesDialog) {
+ EXPECT_FALSE(widget_->IsClosed());
+ EXPECT_FALSE(widget_destroyed_);
+ UninstallApp(kTestExtensionId);
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(widget_destroyed_);
+}
+
+// Tests that the dialog does not close when a different app is uninstalled.
+TEST_F(AppInfoDialogViewsTest, UninstallingOtherAppDoesNotCloseDialog) {
+ scoped_refptr<const extensions::Extension> other_app =
+ extensions::ExtensionBuilder()
+ .SetManifest(ValidAppManifest())
+ .SetID(kTestOtherExtensionId)
+ .Build();
+ extensions::ExtensionSystem::Get(profile_.get())
+ ->extension_service()
+ ->AddExtension(other_app.get());
+
+ EXPECT_FALSE(widget_->IsClosed());
+ EXPECT_FALSE(widget_destroyed_);
+ UninstallApp(kTestOtherExtensionId);
+ RunAllPendingInMessageLoop();
+ EXPECT_FALSE(widget_destroyed_);
+}
+
+// Tests that the dialog closes when the current profile is destroyed.
+TEST_F(AppInfoDialogViewsTest, DestroyedProfileClosesDialog) {
+ EXPECT_FALSE(widget_->IsClosed());
+ EXPECT_FALSE(widget_destroyed_);
+ profile_.reset();
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(widget_destroyed_);
+}
+
+// Tests that the dialog does not close when a different profile is destroyed.
+TEST_F(AppInfoDialogViewsTest, DestroyedOtherProfileDoesNotCloseDialog) {
+ scoped_ptr<TestingProfile> other_profile;
+ other_profile.reset(new TestingProfile());
+ CreateExtensionSystemForProfile(other_profile.get());
+ scoped_refptr<const extensions::Extension> other_app =
+ extensions::ExtensionBuilder()
+ .SetManifest(ValidAppManifest())
+ .SetID(kTestOtherExtensionId)
+ .Build();
+ InstallApp(other_profile.get(), other_app.get());
+
+ EXPECT_FALSE(widget_->IsClosed());
+ EXPECT_FALSE(widget_destroyed_);
+ other_profile.reset();
+ RunAllPendingInMessageLoop();
+ EXPECT_FALSE(widget_destroyed_);
+}

Powered by Google App Engine
This is Rietveld 408576698