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" | |
30 #include "chrome/browser/devtools/device/tcp_device_provider.h" | 29 #include "chrome/browser/devtools/device/tcp_device_provider.h" |
31 #include "chrome/browser/devtools/devtools_window_testing.h" | 30 #include "chrome/browser/devtools/devtools_window_testing.h" |
32 #include "chrome/browser/extensions/extension_apitest.h" | 31 #include "chrome/browser/extensions/extension_apitest.h" |
33 #include "chrome/browser/extensions/extension_browsertest.h" | 32 #include "chrome/browser/extensions/extension_browsertest.h" |
34 #include "chrome/browser/extensions/extension_service.h" | 33 #include "chrome/browser/extensions/extension_service.h" |
35 #include "chrome/browser/extensions/test_extension_dir.h" | 34 #include "chrome/browser/extensions/test_extension_dir.h" |
36 #include "chrome/browser/extensions/unpacked_installer.h" | 35 #include "chrome/browser/extensions/unpacked_installer.h" |
37 #include "chrome/browser/lifetime/application_lifetime.h" | 36 #include "chrome/browser/lifetime/application_lifetime.h" |
38 #include "chrome/browser/profiles/profile.h" | 37 #include "chrome/browser/profiles/profile.h" |
39 #include "chrome/browser/ui/browser.h" | 38 #include "chrome/browser/ui/browser.h" |
40 #include "chrome/browser/ui/browser_commands.h" | 39 #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" | |
43 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 40 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
44 #include "chrome/common/chrome_paths.h" | 41 #include "chrome/common/chrome_paths.h" |
45 #include "chrome/common/chrome_switches.h" | 42 #include "chrome/common/chrome_switches.h" |
46 #include "chrome/common/extensions/extension_process_policy.h" | 43 #include "chrome/common/extensions/extension_process_policy.h" |
47 #include "chrome/common/pref_names.h" | 44 #include "chrome/common/pref_names.h" |
48 #include "chrome/common/url_constants.h" | 45 #include "chrome/common/url_constants.h" |
49 #include "chrome/test/base/in_process_browser_test.h" | 46 #include "chrome/test/base/in_process_browser_test.h" |
50 #include "chrome/test/base/test_chrome_web_ui_controller_factory.h" | 47 #include "chrome/test/base/test_chrome_web_ui_controller_factory.h" |
51 #include "chrome/test/base/ui_test_utils.h" | 48 #include "chrome/test/base/ui_test_utils.h" |
52 #include "components/app_modal/javascript_app_modal_dialog.h" | 49 #include "components/app_modal/javascript_app_modal_dialog.h" |
(...skipping 28 matching lines...) Expand all Loading... |
81 #include "net/test/spawned_test_server/spawned_test_server.h" | 78 #include "net/test/spawned_test_server/spawned_test_server.h" |
82 #include "net/test/url_request/url_request_mock_http_job.h" | 79 #include "net/test/url_request/url_request_mock_http_job.h" |
83 #include "net/url_request/url_request_context.h" | 80 #include "net/url_request/url_request_context.h" |
84 #include "net/url_request/url_request_filter.h" | 81 #include "net/url_request/url_request_filter.h" |
85 #include "net/url_request/url_request_http_job.h" | 82 #include "net/url_request/url_request_http_job.h" |
86 #include "third_party/WebKit/public/platform/WebInputEvent.h" | 83 #include "third_party/WebKit/public/platform/WebInputEvent.h" |
87 #include "ui/compositor/compositor_switches.h" | 84 #include "ui/compositor/compositor_switches.h" |
88 #include "ui/gl/gl_switches.h" | 85 #include "ui/gl/gl_switches.h" |
89 #include "url/gurl.h" | 86 #include "url/gurl.h" |
90 | 87 |
91 #if defined(OS_MACOSX) | |
92 #include "ui/base/test/scoped_fake_nswindow_fullscreen.h" | |
93 #endif | |
94 | |
95 using app_modal::AppModalDialog; | 88 using app_modal::AppModalDialog; |
96 using app_modal::JavaScriptAppModalDialog; | 89 using app_modal::JavaScriptAppModalDialog; |
97 using app_modal::NativeAppModalDialog; | 90 using app_modal::NativeAppModalDialog; |
98 using content::BrowserThread; | 91 using content::BrowserThread; |
99 using content::DevToolsAgentHost; | 92 using content::DevToolsAgentHost; |
100 using content::NavigationController; | 93 using content::NavigationController; |
101 using content::RenderFrameHost; | 94 using content::RenderFrameHost; |
102 using content::RenderViewHost; | 95 using content::RenderViewHost; |
103 using content::WebContents; | 96 using content::WebContents; |
104 using content::WorkerService; | 97 using content::WorkerService; |
(...skipping 1962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 RunTestFunction(window, "testWindowInitializedOnNavigateBack"); | 2060 RunTestFunction(window, "testWindowInitializedOnNavigateBack"); |
2068 | 2061 |
2069 DevToolsWindowTesting::CloseDevToolsWindowSync(window); | 2062 DevToolsWindowTesting::CloseDevToolsWindowSync(window); |
2070 content::WebUIControllerFactory::UnregisterFactoryForTesting(&test_factory); | 2063 content::WebUIControllerFactory::UnregisterFactoryForTesting(&test_factory); |
2071 } | 2064 } |
2072 | 2065 |
2073 // Tests scripts panel showing. | 2066 // Tests scripts panel showing. |
2074 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsSharedWorker) { | 2067 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsSharedWorker) { |
2075 RunTest("testDevToolsSharedWorker", url::kAboutBlankURL); | 2068 RunTest("testDevToolsSharedWorker", url::kAboutBlankURL); |
2076 } | 2069 } |
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 |