blob: 51b96c418e85c53a7aa6b1892934a2da27e2e47c [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/test/widget_test_api.h"
#include "base/notimplemented.h"
#include "ui/views/widget/widget.h"
#if BUILDFLAG(IS_LINUX)
#include <utility>
#include "base/test/run_until.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/aura/window_tree_host_platform.h"
#include "ui/ozone/public/ozone_platform.h"
#include "ui/platform_window/extensions/wayland_extension.h"
#include "ui/platform_window/extensions/x11_extension.h"
#endif // BUILDFLAG(IS_LINUX)
namespace views {
void DisableActivationChangeHandlingForTests() {
Widget::SetDisableActivationChangeHandling(
Widget::DisableActivationChangeHandlingType::kIgnore);
}
AsyncWidgetRequestWaiter::AsyncWidgetRequestWaiter(Widget& widget)
: widget_(widget) {
#if BUILDFLAG(IS_LINUX)
if (ui::OzonePlatform::GetPlatformNameForTest() == "wayland") {
// Wait for a Wayland roundtrip to ensure all side effects have been
// processed.
auto* host = aura::WindowTreeHostPlatform::GetHostForWindow(
widget_->GetNativeWindow());
auto* wayland_extension = ui::GetWaylandExtension(*host->platform_window());
wayland_extension->SetLatchImmediately(false);
}
#endif // BUILDFLAG(IS_LINUX)
}
AsyncWidgetRequestWaiter::~AsyncWidgetRequestWaiter() {
CHECK(waited_)
<< "AsyncWidgetRequestWaiter has no effect unless `Wait` is called.";
}
void AsyncWidgetRequestWaiter::Wait() {
CHECK(!waited_) << "`Wait` may only be called once.";
#if BUILDFLAG(IS_LINUX)
auto* host = aura::WindowTreeHostPlatform::GetHostForWindow(
widget_->GetNativeWindow());
if (ui::OzonePlatform::GetPlatformNameForTest() == "wayland") {
// Wait for a Wayland roundtrip to ensure all side effects have been
// processed.
auto* wayland_extension = ui::GetWaylandExtension(*host->platform_window());
wayland_extension->RoundTripQueue();
// Wait for all in flight requests to be latched.
CHECK(base::test::RunUntil([&]() {
return !wayland_extension->HasInFlightRequestsForState() &&
wayland_extension->GetVizSequenceIdForAppliedState() ==
wayland_extension->GetVizSequenceIdForLatchedState();
})) << "Has in flight requests: "
<< wayland_extension->HasInFlightRequestsForState()
<< ", applied sequence ID: "
<< wayland_extension->GetVizSequenceIdForAppliedState()
<< ", latched sequence ID:"
<< wayland_extension->GetVizSequenceIdForLatchedState();
// Wait for all Wayland messages sent as a result of requests being latched
// to be processed on the server side.
wayland_extension->RoundTripQueue();
wayland_extension->SetLatchImmediately(true);
} else if (ui::OzonePlatform::GetPlatformNameForTest() == "x11") {
// Setting the window bounds on X11 is asynchronous, so the platform window
// pretends the bounds change completed successfully until it can sync with
// the WM. This may cause inconsistent state with respect to other caches
// such as x11::WindowCache. Wait for the WM sync to complete to ensure
// consistency.
auto* x11_extension = ui::GetX11Extension(*host->platform_window());
CHECK(base::test::RunUntil(
[&]() { return !x11_extension->IsWmSyncActiveForTest(); }));
} else {
NOTIMPLEMENTED_LOG_ONCE();
}
#else // BUILDFLAG(IS_LINUX)
NOTIMPLEMENTED_LOG_ONCE();
#endif
waited_ = true;
}
} // namespace views