Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / browser / apps / app_window_browsertest.cc
blobeec45fac33860a786ad82f542b39e4f99a383082
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "apps/shell_window_geometry_cache.h"
6 #include "chrome/browser/apps/app_browsertest_util.h"
7 #include "chrome/browser/extensions/extension_test_message_listener.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/browser/ui/extensions/application_launch.h"
11 #include "content/public/browser/notification_service.h"
12 #include "content/public/test/test_utils.h"
13 #include "extensions/common/constants.h"
14 #include "extensions/common/extension.h"
16 using apps::ShellWindowGeometryCache;
18 // This helper class can be used to wait for changes in the shell window
19 // geometry cache registry for a specific window in a specific extension.
20 class GeometryCacheChangeHelper : ShellWindowGeometryCache::Observer {
21 public:
22 GeometryCacheChangeHelper(ShellWindowGeometryCache* cache,
23 const std::string& extension_id,
24 const std::string& window_id,
25 const gfx::Rect& bounds)
26 : cache_(cache),
27 extension_id_(extension_id),
28 window_id_(window_id),
29 bounds_(bounds),
30 satisfied_(false),
31 waiting_(false) {
32 cache_->AddObserver(this);
35 // This method will block until the shell window geometry cache registry will
36 // provide a bound for |window_id_| that is entirely different (as in x/y/w/h)
37 // from the initial |bounds_|.
38 void WaitForEntirelyChanged() {
39 if (satisfied_)
40 return;
42 waiting_ = true;
43 content::RunMessageLoop();
46 // Implements the content::NotificationObserver interface.
47 virtual void OnGeometryCacheChanged(const std::string& extension_id,
48 const std::string& window_id,
49 const gfx::Rect& bounds)
50 OVERRIDE {
51 if (extension_id != extension_id_ || window_id != window_id_)
52 return;
54 if (bounds_.x() != bounds.x() &&
55 bounds_.y() != bounds.y() &&
56 bounds_.width() != bounds.width() &&
57 bounds_.height() != bounds.height()) {
58 satisfied_ = true;
59 cache_->RemoveObserver(this);
61 if (waiting_)
62 base::MessageLoopForUI::current()->Quit();
66 private:
67 ShellWindowGeometryCache* cache_;
68 std::string extension_id_;
69 std::string window_id_;
70 gfx::Rect bounds_;
71 bool satisfied_;
72 bool waiting_;
75 // Helper class for tests related to the Apps Window API (chrome.app.window).
76 class AppWindowAPITest : public extensions::PlatformAppBrowserTest {
77 public:
78 bool RunAppWindowAPITest(const char* testName) {
79 ExtensionTestMessageListener launched_listener("Launched", true);
80 LoadAndLaunchPlatformApp("window_api");
81 if (!launched_listener.WaitUntilSatisfied()) {
82 message_ = "Did not get the 'Launched' message.";
83 return false;
86 ResultCatcher catcher;
87 launched_listener.Reply(testName);
89 if (!catcher.GetNextResult()) {
90 message_ = catcher.message();
91 return false;
94 return true;
98 // These tests are flaky after https://codereview.chromium.org/57433010/.
99 // See http://crbug.com/319613.
101 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, DISABLED_TestCreate) {
102 ASSERT_TRUE(RunAppWindowAPITest("testCreate")) << message_;
105 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, TestSingleton) {
106 ASSERT_TRUE(RunAppWindowAPITest("testSingleton")) << message_;
109 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, DISABLED_TestBounds) {
110 ASSERT_TRUE(RunAppWindowAPITest("testBounds")) << message_;
113 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, TestCloseEvent) {
114 ASSERT_TRUE(RunAppWindowAPITest("testCloseEvent")) << message_;
117 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, DISABLED_TestMaximize) {
118 ASSERT_TRUE(RunAppWindowAPITest("testMaximize")) << message_;
121 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, DISABLED_TestRestore) {
122 ASSERT_TRUE(RunAppWindowAPITest("testRestore")) << message_;
125 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, DISABLED_TestRestoreAfterClose) {
126 ASSERT_TRUE(RunAppWindowAPITest("testRestoreAfterClose")) << message_;
129 IN_PROC_BROWSER_TEST_F(AppWindowAPITest, DISABLED_TestSizeConstraints) {
130 ASSERT_TRUE(RunAppWindowAPITest("testSizeConstraints")) << message_;
133 // Flaky failures on mac_rel and WinXP, see http://crbug.com/324915.
134 IN_PROC_BROWSER_TEST_F(AppWindowAPITest,
135 DISABLED_TestRestoreGeometryCacheChange) {
136 // This test is similar to the other AppWindowAPI tests except that at some
137 // point the app will send a 'ListenGeometryChange' message at which point the
138 // test will check if the geometry cache entry for the test window has
139 // changed. When the change happens, the test will let the app know so it can
140 // continue running.
141 ExtensionTestMessageListener launched_listener("Launched", true);
143 content::WindowedNotificationObserver app_loaded_observer(
144 content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
145 content::NotificationService::AllSources());
147 const extensions::Extension* extension = LoadExtension(
148 test_data_dir_.AppendASCII("platform_apps").AppendASCII("window_api"));
149 EXPECT_TRUE(extension);
151 OpenApplication(AppLaunchParams(browser()->profile(),
152 extension,
153 extensions::LAUNCH_CONTAINER_NONE,
154 NEW_WINDOW));
156 ExtensionTestMessageListener geometry_listener("ListenGeometryChange", true);
158 ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
159 launched_listener.Reply("testRestoreAfterGeometryCacheChange");
161 ASSERT_TRUE(geometry_listener.WaitUntilSatisfied());
163 GeometryCacheChangeHelper geo_change_helper_1(
164 ShellWindowGeometryCache::Get(browser()->profile()), extension->id(),
165 // The next line has information that has to stay in sync with the app.
166 "test-ra", gfx::Rect(200, 200, 200, 200));
168 GeometryCacheChangeHelper geo_change_helper_2(
169 ShellWindowGeometryCache::Get(browser()->profile()), extension->id(),
170 // The next line has information that has to stay in sync with the app.
171 "test-rb", gfx::Rect(200, 200, 200, 200));
173 // These calls will block until the shell window geometry cache will change.
174 geo_change_helper_1.WaitForEntirelyChanged();
175 geo_change_helper_2.WaitForEntirelyChanged();
177 ResultCatcher catcher;
178 geometry_listener.Reply("");
179 ASSERT_TRUE(catcher.GetNextResult());