OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/cancelable_callback.h" | 11 #include "base/cancelable_callback.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/location.h" | 15 #include "base/location.h" |
16 #include "base/macros.h" | 16 #include "base/macros.h" |
17 #include "base/memory/ptr_util.h" | 17 #include "base/memory/ptr_util.h" |
18 #include "base/memory/ref_counted.h" | 18 #include "base/memory/ref_counted.h" |
19 #include "base/path_service.h" | 19 #include "base/path_service.h" |
20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
22 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
23 #include "base/strings/utf_string_conversions.h" | 23 #include "base/strings/utf_string_conversions.h" |
24 #include "base/test/test_timeouts.h" | 24 #include "base/test/test_timeouts.h" |
25 #include "base/threading/sequenced_worker_pool.h" | 25 #include "base/threading/sequenced_worker_pool.h" |
26 #include "base/threading/thread_task_runner_handle.h" | 26 #include "base/threading/thread_task_runner_handle.h" |
27 #include "build/build_config.h" | 27 #include "build/build_config.h" |
28 #include "chrome/browser/chrome_notification_types.h" | 28 #include "chrome/browser/chrome_notification_types.h" |
| 29 #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" |
29 #include "chrome/browser/devtools/device/tcp_device_provider.h" | 30 #include "chrome/browser/devtools/device/tcp_device_provider.h" |
30 #include "chrome/browser/devtools/devtools_window_testing.h" | 31 #include "chrome/browser/devtools/devtools_window_testing.h" |
31 #include "chrome/browser/extensions/extension_apitest.h" | 32 #include "chrome/browser/extensions/extension_apitest.h" |
32 #include "chrome/browser/extensions/extension_browsertest.h" | 33 #include "chrome/browser/extensions/extension_browsertest.h" |
33 #include "chrome/browser/extensions/extension_service.h" | 34 #include "chrome/browser/extensions/extension_service.h" |
34 #include "chrome/browser/extensions/test_extension_dir.h" | 35 #include "chrome/browser/extensions/test_extension_dir.h" |
35 #include "chrome/browser/extensions/unpacked_installer.h" | 36 #include "chrome/browser/extensions/unpacked_installer.h" |
36 #include "chrome/browser/lifetime/application_lifetime.h" | 37 #include "chrome/browser/lifetime/application_lifetime.h" |
37 #include "chrome/browser/profiles/profile.h" | 38 #include "chrome/browser/profiles/profile.h" |
38 #include "chrome/browser/ui/browser.h" | 39 #include "chrome/browser/ui/browser.h" |
39 #include "chrome/browser/ui/browser_commands.h" | 40 #include "chrome/browser/ui/browser_commands.h" |
| 41 #include "chrome/browser/ui/browser_window.h" |
| 42 #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" |
40 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 43 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
41 #include "chrome/common/chrome_paths.h" | 44 #include "chrome/common/chrome_paths.h" |
42 #include "chrome/common/chrome_switches.h" | 45 #include "chrome/common/chrome_switches.h" |
43 #include "chrome/common/extensions/extension_process_policy.h" | 46 #include "chrome/common/extensions/extension_process_policy.h" |
44 #include "chrome/common/pref_names.h" | 47 #include "chrome/common/pref_names.h" |
45 #include "chrome/common/url_constants.h" | 48 #include "chrome/common/url_constants.h" |
46 #include "chrome/test/base/in_process_browser_test.h" | 49 #include "chrome/test/base/in_process_browser_test.h" |
47 #include "chrome/test/base/test_chrome_web_ui_controller_factory.h" | 50 #include "chrome/test/base/test_chrome_web_ui_controller_factory.h" |
48 #include "chrome/test/base/ui_test_utils.h" | 51 #include "chrome/test/base/ui_test_utils.h" |
49 #include "components/app_modal/javascript_app_modal_dialog.h" | 52 #include "components/app_modal/javascript_app_modal_dialog.h" |
(...skipping 28 matching lines...) Expand all Loading... |
78 #include "net/test/spawned_test_server/spawned_test_server.h" | 81 #include "net/test/spawned_test_server/spawned_test_server.h" |
79 #include "net/test/url_request/url_request_mock_http_job.h" | 82 #include "net/test/url_request/url_request_mock_http_job.h" |
80 #include "net/url_request/url_request_context.h" | 83 #include "net/url_request/url_request_context.h" |
81 #include "net/url_request/url_request_filter.h" | 84 #include "net/url_request/url_request_filter.h" |
82 #include "net/url_request/url_request_http_job.h" | 85 #include "net/url_request/url_request_http_job.h" |
83 #include "third_party/WebKit/public/platform/WebInputEvent.h" | 86 #include "third_party/WebKit/public/platform/WebInputEvent.h" |
84 #include "ui/compositor/compositor_switches.h" | 87 #include "ui/compositor/compositor_switches.h" |
85 #include "ui/gl/gl_switches.h" | 88 #include "ui/gl/gl_switches.h" |
86 #include "url/gurl.h" | 89 #include "url/gurl.h" |
87 | 90 |
| 91 #if defined(OS_MACOSX) |
| 92 #include "ui/base/test/scoped_fake_nswindow_fullscreen.h" |
| 93 #endif |
| 94 |
88 using app_modal::AppModalDialog; | 95 using app_modal::AppModalDialog; |
89 using app_modal::JavaScriptAppModalDialog; | 96 using app_modal::JavaScriptAppModalDialog; |
90 using app_modal::NativeAppModalDialog; | 97 using app_modal::NativeAppModalDialog; |
91 using content::BrowserThread; | 98 using content::BrowserThread; |
92 using content::DevToolsAgentHost; | 99 using content::DevToolsAgentHost; |
93 using content::NavigationController; | 100 using content::NavigationController; |
94 using content::RenderFrameHost; | 101 using content::RenderFrameHost; |
95 using content::RenderViewHost; | 102 using content::RenderViewHost; |
96 using content::WebContents; | 103 using content::WebContents; |
97 using content::WorkerService; | 104 using content::WorkerService; |
(...skipping 1962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2060 RunTestFunction(window, "testWindowInitializedOnNavigateBack"); | 2067 RunTestFunction(window, "testWindowInitializedOnNavigateBack"); |
2061 | 2068 |
2062 DevToolsWindowTesting::CloseDevToolsWindowSync(window); | 2069 DevToolsWindowTesting::CloseDevToolsWindowSync(window); |
2063 content::WebUIControllerFactory::UnregisterFactoryForTesting(&test_factory); | 2070 content::WebUIControllerFactory::UnregisterFactoryForTesting(&test_factory); |
2064 } | 2071 } |
2065 | 2072 |
2066 // Tests scripts panel showing. | 2073 // Tests scripts panel showing. |
2067 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsSharedWorker) { | 2074 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsSharedWorker) { |
2068 RunTest("testDevToolsSharedWorker", url::kAboutBlankURL); | 2075 RunTest("testDevToolsSharedWorker", url::kAboutBlankURL); |
2069 } | 2076 } |
| 2077 |
| 2078 // Encapsulates waiting for the browser window to change state. This is |
| 2079 // needed for example on Chrome desktop linux, where window state change is done |
| 2080 // asynchronously as an event received from a different process. |
| 2081 class CheckWaiter { |
| 2082 public: |
| 2083 explicit CheckWaiter(base::Callback<bool()> callback, bool expected) |
| 2084 : callback_(callback), |
| 2085 expected_(expected), |
| 2086 timeout_(base::Time::NowFromSystemTime() + |
| 2087 base::TimeDelta::FromMilliseconds(1000)) {} |
| 2088 ~CheckWaiter() = default; |
| 2089 |
| 2090 // Blocks until the browser window becomes maximized. |
| 2091 void Wait() { |
| 2092 if (Check()) |
| 2093 return; |
| 2094 |
| 2095 base::RunLoop run_loop; |
| 2096 quit_ = run_loop.QuitClosure(); |
| 2097 run_loop.Run(); |
| 2098 } |
| 2099 |
| 2100 private: |
| 2101 bool Check() { |
| 2102 if (callback_.Run() != expected_ && |
| 2103 base::Time::NowFromSystemTime() < timeout_) { |
| 2104 base::MessageLoop::current()->task_runner()->PostTask( |
| 2105 FROM_HERE, base::Bind(base::IgnoreResult(&CheckWaiter::Check), |
| 2106 base::Unretained(this))); |
| 2107 return false; |
| 2108 } |
| 2109 |
| 2110 // Quit the run_loop to end the wait. |
| 2111 if (!quit_.is_null()) |
| 2112 base::ResetAndReturn(&quit_).Run(); |
| 2113 return true; |
| 2114 } |
| 2115 |
| 2116 base::Callback<bool()> callback_; |
| 2117 bool expected_; |
| 2118 base::Time timeout_; |
| 2119 // The waiter's RunLoop quit closure. |
| 2120 base::Closure quit_; |
| 2121 |
| 2122 DISALLOW_COPY_AND_ASSIGN(CheckWaiter); |
| 2123 }; |
| 2124 |
| 2125 class DevToolsManagerDelegateTest : public InProcessBrowserTest { |
| 2126 public: |
| 2127 std::unique_ptr<base::DictionaryValue> SendCommand(std::string state) { |
| 2128 auto params = base::MakeUnique<base::DictionaryValue>(); |
| 2129 auto bounds_object = base::MakeUnique<base::DictionaryValue>(); |
| 2130 bounds_object->SetString("windowState", state); |
| 2131 params->Set("bounds", std::move(bounds_object)); |
| 2132 params->SetInteger("windowId", browser()->session_id().id()); |
| 2133 return ChromeDevToolsManagerDelegate::SetWindowBounds(0, params.get()); |
| 2134 } |
| 2135 |
| 2136 std::unique_ptr<base::DictionaryValue> UpdateBounds() { |
| 2137 auto params = base::MakeUnique<base::DictionaryValue>(); |
| 2138 auto bounds_object = base::MakeUnique<base::DictionaryValue>(); |
| 2139 bounds_object->SetString("windowState", "normal"); |
| 2140 bounds_object->SetInteger("left", 200); |
| 2141 bounds_object->SetInteger("height", 400); |
| 2142 params->Set("bounds", std::move(bounds_object)); |
| 2143 params->SetInteger("windowId", browser()->session_id().id()); |
| 2144 return ChromeDevToolsManagerDelegate::SetWindowBounds(0, params.get()); |
| 2145 } |
| 2146 |
| 2147 void CheckIsMaximized(bool maximized) { |
| 2148 CheckWaiter(base::Bind(&BrowserWindow::IsMaximized, |
| 2149 base::Unretained(browser()->window())), |
| 2150 maximized) |
| 2151 .Wait(); |
| 2152 EXPECT_EQ(maximized, browser()->window()->IsMaximized()); |
| 2153 } |
| 2154 |
| 2155 void CheckIsMinimized(bool minimized) { |
| 2156 CheckWaiter(base::Bind(&BrowserWindow::IsMinimized, |
| 2157 base::Unretained(browser()->window())), |
| 2158 minimized) |
| 2159 .Wait(); |
| 2160 EXPECT_EQ(minimized, browser()->window()->IsMinimized()); |
| 2161 } |
| 2162 |
| 2163 void CheckIsFullscreen(bool fullscreen) { |
| 2164 CheckWaiter(base::Bind(&BrowserWindow::IsFullscreen, |
| 2165 base::Unretained(browser()->window())), |
| 2166 fullscreen) |
| 2167 .Wait(); |
| 2168 EXPECT_EQ(fullscreen, browser()->window()->IsFullscreen()); |
| 2169 } |
| 2170 |
| 2171 bool IsWindowBoundsEqual(gfx::Rect expected) { |
| 2172 return browser()->window()->GetBounds() == expected; |
| 2173 } |
| 2174 |
| 2175 void CheckWindowBounds(gfx::Rect expected) { |
| 2176 CheckWaiter(base::Bind(&DevToolsManagerDelegateTest::IsWindowBoundsEqual, |
| 2177 base::Unretained(this), expected), |
| 2178 true) |
| 2179 .Wait(); |
| 2180 EXPECT_EQ(expected, browser()->window()->GetBounds()); |
| 2181 } |
| 2182 }; |
| 2183 |
| 2184 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalWindowChangeBounds) { |
| 2185 browser()->window()->SetBounds(gfx::Rect(100, 100, 500, 600)); |
| 2186 CheckWindowBounds(gfx::Rect(100, 100, 500, 600)); |
| 2187 UpdateBounds(); |
| 2188 CheckWindowBounds(gfx::Rect(200, 100, 500, 400)); |
| 2189 } |
| 2190 |
| 2191 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalToMaximizedWindow) { |
| 2192 CheckIsMaximized(false); |
| 2193 SendCommand("maximized"); |
| 2194 CheckIsMaximized(true); |
| 2195 } |
| 2196 |
| 2197 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalToMinimizedWindow) { |
| 2198 CheckIsMinimized(false); |
| 2199 SendCommand("minimized"); |
| 2200 CheckIsMinimized(true); |
| 2201 } |
| 2202 |
| 2203 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalToFullscreenWindow) { |
| 2204 #if defined(OS_MACOSX) |
| 2205 ui::test::ScopedFakeNSWindowFullscreen faker; |
| 2206 #endif |
| 2207 CheckIsFullscreen(false); |
| 2208 SendCommand("fullscreen"); |
| 2209 #if defined(OS_MACOSX) |
| 2210 faker.FinishTransition(); |
| 2211 #endif |
| 2212 CheckIsFullscreen(true); |
| 2213 } |
| 2214 |
| 2215 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, |
| 2216 MaximizedToMinimizedWindow) { |
| 2217 browser()->window()->Maximize(); |
| 2218 CheckIsMaximized(true); |
| 2219 |
| 2220 CheckIsMinimized(false); |
| 2221 SendCommand("minimized"); |
| 2222 CheckIsMinimized(true); |
| 2223 } |
| 2224 |
| 2225 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, |
| 2226 MaximizedToFullscreenWindow) { |
| 2227 browser()->window()->Maximize(); |
| 2228 CheckIsMaximized(true); |
| 2229 |
| 2230 #if defined(OS_MACOSX) |
| 2231 ui::test::ScopedFakeNSWindowFullscreen faker; |
| 2232 #endif |
| 2233 CheckIsFullscreen(false); |
| 2234 SendCommand("fullscreen"); |
| 2235 #if defined(OS_MACOSX) |
| 2236 faker.FinishTransition(); |
| 2237 #endif |
| 2238 CheckIsFullscreen(true); |
| 2239 } |
| 2240 |
| 2241 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, ShowMinimizedWindow) { |
| 2242 browser()->window()->Minimize(); |
| 2243 CheckIsMinimized(true); |
| 2244 SendCommand("normal"); |
| 2245 CheckIsMinimized(false); |
| 2246 } |
| 2247 |
| 2248 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, RestoreMaximizedWindow) { |
| 2249 browser()->window()->Maximize(); |
| 2250 CheckIsMaximized(true); |
| 2251 SendCommand("normal"); |
| 2252 CheckIsMaximized(false); |
| 2253 } |
| 2254 |
| 2255 IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, ExitFullscreenWindow) { |
| 2256 #if defined(OS_MACOSX) |
| 2257 ui::test::ScopedFakeNSWindowFullscreen faker; |
| 2258 #endif |
| 2259 browser()->window()->GetExclusiveAccessContext()->EnterFullscreen( |
| 2260 GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE); |
| 2261 #if defined(OS_MACOSX) |
| 2262 faker.FinishTransition(); |
| 2263 #endif |
| 2264 CheckIsFullscreen(true); |
| 2265 SendCommand("normal"); |
| 2266 #if defined(OS_MACOSX) |
| 2267 faker.FinishTransition(); |
| 2268 #endif |
| 2269 CheckIsFullscreen(false); |
| 2270 } |
OLD | NEW |