Commit ebb1342e authored by James Cook's avatar James Cook Committed by Chromium LUCI CQ

lacros: Add a smoke test for entering and exiting tablet mode

We have a large library of existing window frame tests that are
currently skipped for lacros. Many of these tests have sections that
exercise tablet mode. They will be easier to port to lacros if we
provide a test API for tablet mode.

Add a crosapi for entering and exiting tablet mode. Add a basic
smoke test, which is basically a clone of the overview mode test.

Bug: none
Test: lacros_chrome_browsertests
Change-Id: I04eb60db33b446df75a509836b2e408fc5018569
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2625815
Commit-Queue: James Cook <jamescook@chromium.org>
Reviewed-by: default avatarJenny Zhang <jennyz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#843614}
parent f46e7ff3
......@@ -4,9 +4,11 @@
#include "chrome/browser/chromeos/crosapi/test_controller_ash.h"
#include "ash/public/cpp/tablet_mode.h"
#include "ash/shell.h"
#include "ash/wm/overview/overview_controller.h"
#include "ash/wm/overview/overview_observer.h"
#include "ash/wm/tablet_mode/tablet_mode_controller.h"
#include "base/task/post_task.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/chromeos/crosapi/window_util.h"
......@@ -33,6 +35,15 @@ bool DispatchMouseEvent(aura::Window* window, ui::EventType type) {
dispatch_details.target_destroyed;
}
// Enables or disables tablet mode and waits for the transition to finish.
void SetTabletModeEnabled(bool enabled) {
// This does not use ShellTestApi or TabletModeControllerTestApi because those
// are implemented in test-only files.
ash::TabletMode::Waiter waiter(enabled);
ash::Shell::Get()->tablet_mode_controller()->SetEnabledForTest(enabled);
waiter.Wait();
}
} // namespace
TestControllerAsh::TestControllerAsh() = default;
......@@ -77,6 +88,16 @@ void TestControllerAsh::ExitOverviewMode(ExitOverviewModeCallback callback) {
ash::Shell::Get()->overview_controller()->EndOverview();
}
void TestControllerAsh::EnterTabletMode(EnterTabletModeCallback callback) {
SetTabletModeEnabled(true);
std::move(callback).Run();
}
void TestControllerAsh::ExitTabletMode(ExitTabletModeCallback callback) {
SetTabletModeEnabled(false);
std::move(callback).Run();
}
void TestControllerAsh::WaiterFinished(OverviewWaiter* waiter) {
for (size_t i = 0; i < overview_waiters_.size(); ++i) {
if (waiter == overview_waiters_[i].get()) {
......
......@@ -28,6 +28,8 @@ class TestControllerAsh : public mojom::TestController {
void ClickWindow(const std::string& window_id) override;
void EnterOverviewMode(EnterOverviewModeCallback callback) override;
void ExitOverviewMode(ExitOverviewModeCallback callback) override;
void EnterTabletMode(EnterTabletModeCallback callback) override;
void ExitTabletMode(ExitTabletModeCallback callback) override;
private:
class OverviewWaiter;
......
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/lacros/browser_test_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h"
#include "chromeos/lacros/lacros_chrome_service_impl.h"
#include "content/public/test/browser_test.h"
#include "ui/aura/window.h"
namespace {
using TabletModeBrowserTest = InProcessBrowserTest;
// Smoke test for tablet mode. Ensures lacros does not crash when entering and
// exiting tablet mode.
// TODO(https://crbug.com/1157314): This test is not safe to run in parallel
// with other lacros tests as tablet mode applies to all processes.
IN_PROC_BROWSER_TEST_F(TabletModeBrowserTest, Smoke) {
auto* lacros_chrome_service = chromeos::LacrosChromeServiceImpl::Get();
ASSERT_TRUE(lacros_chrome_service->IsTestControllerAvailable());
// This test requires the tablet mode API.
if (lacros_chrome_service->GetInterfaceVersion(
crosapi::mojom::TestController::Uuid_) < 2) {
LOG(WARNING) << "Unsupported ash version.";
return;
}
// Wait for the window to be visible.
aura::Window* main_window = browser()->window()->GetNativeWindow();
std::string main_id =
browser_test_util::GetWindowId(main_window->GetRootWindow());
browser_test_util::WaitForWindowCreation(main_id);
// Create an incognito window and make it visible.
Browser* incognito_browser = Browser::Create(Browser::CreateParams(
browser()->profile()->GetPrimaryOTRProfile(), true));
AddBlankTabAndShow(incognito_browser);
aura::Window* incognito_window =
incognito_browser->window()->GetNativeWindow();
std::string incognito_id =
browser_test_util::GetWindowId(incognito_window->GetRootWindow());
browser_test_util::WaitForWindowCreation(incognito_id);
// Enter tablet mode.
crosapi::mojom::TestControllerAsyncWaiter waiter(
lacros_chrome_service->test_controller_remote().get());
waiter.EnterTabletMode();
// Close the incognito window by closing all tabs and wait for it to stop
// existing in ash.
incognito_browser->tab_strip_model()->CloseAllTabs();
browser_test_util::WaitForWindowDestruction(incognito_id);
// Exit tablet mode.
waiter.ExitTabletMode();
}
} // namespace
......@@ -3249,6 +3249,7 @@ if (is_chromeos_lacros) {
"../browser/lacros/metrics_reporting_lacros_browsertest.cc",
"../browser/lacros/overview_lacros_browsertest.cc",
"../browser/lacros/screen_manager_lacros_browsertest.cc",
"../browser/lacros/tablet_mode_lacros_browsertest.cc",
]
deps = [
......
......@@ -7,8 +7,8 @@ module crosapi.mojom;
// This interface is implemented by Ash-Chrome.
// This interface provides tests a mechanism to mutate or query ash.
// In the future, this interface may merge with an automation or a11y interface.
// Next version: 2
// Next method id: 4
// Next version: 3
// Next method id: 6
[Stable, Uuid="1f93f9d7-e466-466c-a675-c21b48cf30d3"]
interface TestController {
// Queries whether a window with the given |window_id| exists. |window_id|
......@@ -28,4 +28,15 @@ interface TestController {
EnterOverviewMode@2() => ();
[MinVersion=1]
ExitOverviewMode@3() => ();
// Causes ash to enter tablet mode. The callback is invoked after animations
// are finished. Note that tablet mode cannot be activated if mouse devices
// are connected; the callback will run, but ash will not be in tablet mode.
[MinVersion=2]
EnterTabletMode@4() => ();
// Causes ash to exit tablet mode. The callback is invoked after animations
// are finished.
[MinVersion=2]
ExitTabletMode@5() => ();
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment