Index: chrome/browser/apps/app_window_interactive_uitest.cc |
diff --git a/chrome/browser/apps/app_window_interactive_uitest.cc b/chrome/browser/apps/app_window_interactive_uitest.cc |
index 1212c206c288a42012b828fc3dd48eb2c6b4d06f..30247d7e38b91a579c4c18932491ba6e0c8d3223 100644 |
--- a/chrome/browser/apps/app_window_interactive_uitest.cc |
+++ b/chrome/browser/apps/app_window_interactive_uitest.cc |
@@ -3,6 +3,9 @@ |
// found in the LICENSE file. |
#include "chrome/browser/apps/app_browsertest_util.h" |
+#include "chrome/browser/lifetime/application_lifetime.h" |
+#include "chrome/browser/ui/browser_iterator.h" |
+#include "chrome/browser/ui/browser_window.h" |
#include "chrome/test/base/interactive_test_utils.h" |
#include "extensions/browser/app_window/native_app_window.h" |
#include "extensions/test/extension_test_message_listener.h" |
@@ -457,3 +460,78 @@ IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest, MAYBE_TestShow) { |
IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest, TestDrawAttention) { |
ASSERT_TRUE(RunAppWindowInteractiveTest("testDrawAttention")) << message_; |
} |
+ |
+// Only Linux and Windows use keep-alive to determine when to shut down. |
+#if defined(OS_LINUX) || defined(OS_WIN) |
+ |
+// In general, hidden windows should not keep Chrome alive. The exception is |
+// when windows are created hidden, we allow the app some time to show the |
+// the window. |
+class AppWindowHiddenKeepAliveTest : public extensions::PlatformAppBrowserTest { |
+ protected: |
+ AppWindowHiddenKeepAliveTest() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(AppWindowHiddenKeepAliveTest); |
+}; |
+ |
+// A window that becomes hidden should not keep Chrome alive. |
+IN_PROC_BROWSER_TEST_F(AppWindowHiddenKeepAliveTest, ShownThenHidden) { |
+ LoadAndLaunchPlatformApp("minimal", "Launched"); |
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) |
+ it->window()->Close(); |
+ |
+ EXPECT_TRUE(chrome::WillKeepAlive()); |
+ GetFirstAppWindow()->Hide(); |
+ EXPECT_FALSE(chrome::WillKeepAlive()); |
+} |
+ |
+// A window that is hidden but re-shown should still keep Chrome alive. |
+IN_PROC_BROWSER_TEST_F(AppWindowHiddenKeepAliveTest, ShownThenHiddenThenShown) { |
+ LoadAndLaunchPlatformApp("minimal", "Launched"); |
+ AppWindow* app_window = GetFirstAppWindow(); |
+ app_window->Hide(); |
+ app_window->Show(AppWindow::SHOW_ACTIVE); |
+ |
+ EXPECT_TRUE(chrome::WillKeepAlive()); |
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) |
+ it->window()->Close(); |
+ EXPECT_TRUE(chrome::WillKeepAlive()); |
+ app_window->GetBaseWindow()->Close(); |
+} |
+ |
+// A window that is created hidden and stays hidden should not keep Chrome |
+// alive. |
+IN_PROC_BROWSER_TEST_F(AppWindowHiddenKeepAliveTest, StaysHidden) { |
+ LoadAndLaunchPlatformApp("hidden", "Launched"); |
+ AppWindow* app_window = GetFirstAppWindow(); |
+ EXPECT_TRUE(app_window->is_hidden()); |
+ |
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) |
+ it->window()->Close(); |
+ // This will time out if the command above does not terminate Chrome. |
+ content::RunMessageLoop(); |
+} |
+ |
+// A window that is created hidden but shown soon after should keep Chrome |
+// alive. |
+IN_PROC_BROWSER_TEST_F(AppWindowHiddenKeepAliveTest, HiddenThenShown) { |
+ ExtensionTestMessageListener launched_listener("Launched", true); |
+ LoadAndLaunchPlatformApp("hidden_then_shown", &launched_listener); |
+ AppWindow* app_window = GetFirstAppWindow(); |
+ EXPECT_TRUE(app_window->is_hidden()); |
+ |
+ // Close all browser windows. |
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) |
+ it->window()->Close(); |
+ |
+ // The app window will show after 3 seconds. |
+ ExtensionTestMessageListener shown_listener("Shown", false); |
+ launched_listener.Reply(""); |
+ EXPECT_TRUE(shown_listener.WaitUntilSatisfied()); |
+ EXPECT_FALSE(app_window->is_hidden()); |
+ EXPECT_TRUE(chrome::WillKeepAlive()); |
+ app_window->GetBaseWindow()->Close(); |
+} |
+ |
+#endif |