Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(639)

Unified Diff: chrome/browser/devtools/devtools_sanity_browsertest.cc

Issue 2734123004: add a new set of commands to resize and position windows (Closed)
Patch Set: rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 a984c384e874482a36aa3278567527f447d9e452..8eb6afb1476d56a9f1865edd21df384868f0b9eb 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -26,6 +26,7 @@
#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_window_testing.h"
#include "chrome/browser/extensions/extension_apitest.h"
@@ -37,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"
@@ -85,6 +88,10 @@
#include "ui/gl/gl_switches.h"
#include "url/gurl.h"
+#if defined(OS_MACOSX)
+#include "ui/base/test/scoped_fake_nswindow_fullscreen.h"
+#endif
+
using app_modal::AppModalDialog;
using app_modal::JavaScriptAppModalDialog;
using app_modal::NativeAppModalDialog;
@@ -2067,3 +2074,197 @@ 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),
+ timeout_(base::Time::NowFromSystemTime() +
+ base::TimeDelta::FromMilliseconds(1000)) {}
+ ~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::Time::NowFromSystemTime() < timeout_) {
+ 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_;
+ base::Time timeout_;
+ // 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) {
+ auto params = base::MakeUnique<base::DictionaryValue>();
+ auto bounds_object = base::MakeUnique<base::DictionaryValue>();
+ bounds_object->SetString("windowState", state);
+ params->Set("bounds", std::move(bounds_object));
+ params->SetInteger("windowId", browser()->session_id().id());
+ return ChromeDevToolsManagerDelegate::SetWindowBounds(0, params.get());
+ }
+
+ std::unique_ptr<base::DictionaryValue> UpdateBounds() {
+ auto params = base::MakeUnique<base::DictionaryValue>();
+ auto bounds_object = base::MakeUnique<base::DictionaryValue>();
+ bounds_object->SetString("windowState", "normal");
+ bounds_object->SetInteger("left", 200);
+ bounds_object->SetInteger("height", 400);
+ params->Set("bounds", std::move(bounds_object));
+ params->SetInteger("windowId", browser()->session_id().id());
+ return ChromeDevToolsManagerDelegate::SetWindowBounds(0, params.get());
+ }
+
+ void CheckIsMaximized(bool maximized) {
+ CheckWaiter(base::Bind(&BrowserWindow::IsMaximized,
+ base::Unretained(browser()->window())),
+ maximized)
+ .Wait();
+ EXPECT_EQ(maximized, browser()->window()->IsMaximized());
+ }
+
+ void CheckIsMinimized(bool minimized) {
+ CheckWaiter(base::Bind(&BrowserWindow::IsMinimized,
+ base::Unretained(browser()->window())),
+ minimized)
+ .Wait();
+ EXPECT_EQ(minimized, browser()->window()->IsMinimized());
+ }
+
+ void CheckIsFullscreen(bool fullscreen) {
+ CheckWaiter(base::Bind(&BrowserWindow::IsFullscreen,
+ base::Unretained(browser()->window())),
+ fullscreen)
+ .Wait();
+ EXPECT_EQ(fullscreen, browser()->window()->IsFullscreen());
+ }
+
+ bool IsWindowBoundsEqual(gfx::Rect expected) {
+ return browser()->window()->GetBounds() == expected;
+ }
+
+ void CheckWindowBounds(gfx::Rect expected) {
+ CheckWaiter(base::Bind(&DevToolsManagerDelegateTest::IsWindowBoundsEqual,
+ base::Unretained(this), expected),
+ true)
+ .Wait();
+ EXPECT_EQ(expected, browser()->window()->GetBounds());
+ }
+};
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalWindowChangeBounds) {
+ browser()->window()->SetBounds(gfx::Rect(100, 100, 500, 600));
+ CheckWindowBounds(gfx::Rect(100, 100, 500, 600));
+ UpdateBounds();
+ CheckWindowBounds(gfx::Rect(200, 100, 500, 400));
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalToMaximizedWindow) {
+ CheckIsMaximized(false);
+ SendCommand("maximized");
+ CheckIsMaximized(true);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalToMinimizedWindow) {
+ CheckIsMinimized(false);
+ SendCommand("minimized");
+ CheckIsMinimized(true);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, NormalToFullscreenWindow) {
+#if defined(OS_MACOSX)
+ ui::test::ScopedFakeNSWindowFullscreen faker;
+#endif
+ CheckIsFullscreen(false);
+ SendCommand("fullscreen");
+#if defined(OS_MACOSX)
+ faker.FinishTransition();
+#endif
+ CheckIsFullscreen(true);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest,
+ MaximizedToMinimizedWindow) {
+ browser()->window()->Maximize();
+ CheckIsMaximized(true);
+
+ CheckIsMinimized(false);
+ SendCommand("minimized");
+ CheckIsMinimized(true);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest,
+ MaximizedToFullscreenWindow) {
+ browser()->window()->Maximize();
+ CheckIsMaximized(true);
+
+#if defined(OS_MACOSX)
+ ui::test::ScopedFakeNSWindowFullscreen faker;
+#endif
+ CheckIsFullscreen(false);
+ SendCommand("fullscreen");
+#if defined(OS_MACOSX)
+ faker.FinishTransition();
+#endif
+ CheckIsFullscreen(true);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, ShowMinimizedWindow) {
+ browser()->window()->Minimize();
+ CheckIsMinimized(true);
+ SendCommand("normal");
+ CheckIsMinimized(false);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, RestoreMaximizedWindow) {
+ browser()->window()->Maximize();
+ CheckIsMaximized(true);
+ SendCommand("normal");
+ CheckIsMaximized(false);
+}
+
+IN_PROC_BROWSER_TEST_F(DevToolsManagerDelegateTest, ExitFullscreenWindow) {
+#if defined(OS_MACOSX)
+ ui::test::ScopedFakeNSWindowFullscreen faker;
+#endif
+ browser()->window()->GetExclusiveAccessContext()->EnterFullscreen(
+ GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE);
+#if defined(OS_MACOSX)
+ faker.FinishTransition();
+#endif
+ CheckIsFullscreen(true);
+ SendCommand("normal");
+#if defined(OS_MACOSX)
+ faker.FinishTransition();
+#endif
+ CheckIsFullscreen(false);
+}

Powered by Google App Engine
This is Rietveld 408576698