Index: chrome/browser/devtools/devtools_sanity_browsertest.cc |
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc |
index 75002d3c3f5387f780372ab9b0154e97a7030cf6..012a8902a66a572e6c3afb66b8ced57b08944d3a 100644 |
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc |
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc |
@@ -25,7 +25,9 @@ |
#include "base/threading/thread_task_runner_handle.h" |
#include "build/build_config.h" |
#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" |
#include "chrome/browser/devtools/device/tcp_device_provider.h" |
+#include "chrome/browser/devtools/devtools_protocol_constants.h" |
#include "chrome/browser/devtools/devtools_window_testing.h" |
#include "chrome/browser/extensions/extension_apitest.h" |
#include "chrome/browser/extensions/extension_browsertest.h" |
@@ -36,6 +38,8 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_commands.h" |
+#include "chrome/browser/ui/browser_window.h" |
+#include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
@@ -1601,3 +1605,152 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, |
IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsSharedWorker) { |
RunTest("testDevToolsSharedWorker", url::kAboutBlankURL); |
} |
+ |
+// Encapsulates waiting for the browser window to change state. This is |
+// needed for example on Chrome desktop linux, where window state change is done |
+// asynchronously as an event received from a different process. |
+class CheckWaiter { |
+ public: |
+ explicit CheckWaiter(base::Callback<bool()> callback, bool expected) |
+ : callback_(callback), expected_(expected) {} |
+ ~CheckWaiter() = default; |
+ |
+ // Blocks until the browser window becomes maximized. |
+ void Wait() { |
+ if (Check()) |
+ return; |
+ |
+ base::RunLoop run_loop; |
+ quit_ = run_loop.QuitClosure(); |
+ run_loop.Run(); |
+ } |
+ |
+ private: |
+ bool Check() { |
+ if (callback_.Run() != expected_) { |
+ base::MessageLoop::current()->task_runner()->PostTask( |
+ FROM_HERE, base::Bind(base::IgnoreResult(&CheckWaiter::Check), |
+ base::Unretained(this))); |
+ return false; |
+ } |
+ |
+ // Quit the run_loop to end the wait. |
+ if (!quit_.is_null()) |
+ base::ResetAndReturn(&quit_).Run(); |
+ return true; |
+ } |
+ |
+ base::Callback<bool()> callback_; |
+ bool expected_; |
+ |
+ // The waiter's RunLoop quit closure. |
+ base::Closure quit_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CheckWaiter); |
+}; |
+ |
+class DevToolsManagerDelegateTest : public InProcessBrowserTest { |
+ public: |
+ std::unique_ptr<base::DictionaryValue> SendCommand(std::string state) { |
+ std::unique_ptr<base::DictionaryValue> params(new base::DictionaryValue); |
+ base::DictionaryValue* bounds_object = new base::DictionaryValue(); |
+ bounds_object->SetString("windowState", state); |
+ params->Set("bounds", bounds_object); |
+ params->SetInteger("windowId", browser()->session_id().id()); |
+ return ChromeDevToolsManagerDelegate::SetWindowBounds(0, params.release()); |
+ } |
+ |
+ void CheckIsMaximized(bool maximized) { |
+ CheckWaiter(base::Bind(&BrowserWindow::IsMaximized, |
+ base::Unretained(browser()->window())), |
+ maximized) |
+ .Wait(); |
+ } |
+ |
+ void CheckIsMinimized(bool minimized) { |
+ CheckWaiter(base::Bind(&BrowserWindow::IsMinimized, |
+ base::Unretained(browser()->window())), |
+ minimized) |
+ .Wait(); |
+ } |
+ |
+ void CheckIsFullscreen(bool fullscreen) { |
+ CheckWaiter(base::Bind(&BrowserWindow::IsFullscreen, |
+ base::Unretained(browser()->window())), |
+ fullscreen) |
+ .Wait(); |
+ } |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, MaximizeWindow) { |
+ browser()->window()->SetBounds(gfx::Rect(500, 600)); |
+ CheckIsMaximized(false); |
+ SendCommand("maximized"); |
+ CheckIsMaximized(true); |
+ |
+ browser()->window()->Restore(); |
+ browser()->window()->Minimize(); |
+ CheckIsMaximized(false); |
+ CheckIsMinimized(true); |
+ SendCommand("maximized"); |
+ CheckIsMaximized(true); |
+ CheckIsMinimized(false); |
+ |
+ browser()->window()->Restore(); |
+ browser()->window()->GetExclusiveAccessContext()->EnterFullscreen( |
+ GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE); |
+ CheckIsMaximized(false); |
+ CheckIsFullscreen(true); |
+ SendCommand("maximized"); |
+ CheckIsMaximized(true); |
+ CheckIsFullscreen(false); |
+ |
+ browser()->window()->Maximize(); |
+ CheckIsMaximized(true); |
+ SendCommand("maximized"); |
+ CheckIsMaximized(true); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, MinimizeWindow) { |
+ browser()->window()->SetBounds(gfx::Rect(500, 600)); |
+ CheckIsMinimized(false); |
+ SendCommand("minimized"); |
+ CheckIsMinimized(true); |
+ |
+ browser()->window()->Show(); |
+ browser()->window()->Maximize(); |
+ CheckIsMinimized(false); |
+ CheckIsMaximized(true); |
+ SendCommand("minimized"); |
+ CheckIsMinimized(true); |
+ |
+ browser()->window()->Show(); |
+ browser()->window()->GetExclusiveAccessContext()->EnterFullscreen( |
+ GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE); |
+ CheckIsMinimized(false); |
+ CheckIsFullscreen(true); |
+ SendCommand("minimized"); |
+ CheckIsMinimized(true); |
+ CheckIsFullscreen(false); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, FullscreenWindow) { |
+ browser()->window()->SetBounds(gfx::Rect(500, 600)); |
+ CheckIsFullscreen(false); |
+ SendCommand("fullscreen"); |
+ CheckIsFullscreen(true); |
+ |
+ browser()->window()->GetExclusiveAccessContext()->ExitFullscreen(); |
+ browser()->window()->Maximize(); |
+ CheckIsFullscreen(false); |
+ CheckIsMaximized(true); |
+ SendCommand("fullscreen"); |
+ CheckIsFullscreen(true); |
+ |
+ browser()->window()->GetExclusiveAccessContext()->ExitFullscreen(); |
+ browser()->window()->Minimize(); |
+ CheckIsFullscreen(false); |
+ CheckIsMinimized(true); |
+ SendCommand("fullscreen"); |
+ CheckIsFullscreen(true); |
+} |