123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- // Copyright 2019 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 "components/exo/wayland/zaura_shell.h"
- #include <aura-shell-server-protocol.h>
- #include <sys/socket.h>
- #include <memory>
- #include "ash/session/session_controller_impl.h"
- #include "ash/shell.h"
- #include "ash/wm/desks/desks_util.h"
- #include "ash/wm/window_util.h"
- #include "base/time/time.h"
- #include "components/exo/buffer.h"
- #include "components/exo/test/exo_test_base.h"
- #include "components/exo/wayland/scoped_wl.h"
- #include "components/exo/wayland/wayland_display_observer.h"
- #include "components/exo/wayland/wayland_display_output.h"
- #include "components/exo/wayland/wayland_display_util.h"
- #include "components/exo/wayland/wl_output.h"
- #include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "ui/aura/window_occlusion_tracker.h"
- #include "ui/compositor/layer.h"
- #include "ui/compositor/layer_animation_observer.h"
- #include "ui/compositor/layer_animation_sequence.h"
- #include "ui/compositor/layer_animator.h"
- #include "ui/compositor/scoped_animation_duration_scale_mode.h"
- #include "ui/compositor/scoped_layer_animation_settings.h"
- #include "ui/compositor/test/layer_animator_test_controller.h"
- #include "ui/gfx/geometry/size_f.h"
- #include "ui/views/widget/widget.h"
- #include "ui/wm/core/window_util.h"
- #include "ui/wm/public/activation_change_observer.h"
- #include "ui/wm/public/activation_client.h"
- namespace exo {
- namespace wayland {
- namespace {
- constexpr auto kTransitionDuration = base::Seconds(3);
- class TestAuraSurface : public AuraSurface {
- public:
- explicit TestAuraSurface(Surface* surface)
- : AuraSurface(surface, /*resource=*/nullptr) {}
- TestAuraSurface(const TestAuraSurface&) = delete;
- TestAuraSurface& operator=(const TestAuraSurface&) = delete;
- float last_sent_occlusion_fraction() const {
- return last_sent_occlusion_fraction_;
- }
- aura::Window::OcclusionState last_sent_occlusion_state() const {
- return last_sent_occlusion_state_;
- }
- int num_occlusion_updates() const { return num_occlusion_updates_; }
- protected:
- void SendOcclusionFraction(float occlusion_fraction) override {
- last_sent_occlusion_fraction_ = occlusion_fraction;
- num_occlusion_updates_++;
- }
- void SendOcclusionState(
- const aura::Window::OcclusionState occlusion_state) override {
- last_sent_occlusion_state_ = occlusion_state;
- }
- private:
- float last_sent_occlusion_fraction_ = -1.0f;
- aura::Window::OcclusionState last_sent_occlusion_state_ =
- aura::Window::OcclusionState::UNKNOWN;
- int num_occlusion_updates_ = 0;
- };
- class MockSurfaceDelegate : public SurfaceDelegate {
- public:
- MOCK_METHOD(void, OnSurfaceCommit, (), (override));
- MOCK_METHOD(bool, IsSurfaceSynchronized, (), (const, override));
- MOCK_METHOD(bool, IsInputEnabled, (Surface * surface), (const, override));
- MOCK_METHOD(void, OnSetFrame, (SurfaceFrameType type), (override));
- MOCK_METHOD(void,
- OnSetFrameColors,
- (SkColor active_color, SkColor inactive_color),
- (override));
- MOCK_METHOD(void,
- OnSetParent,
- (Surface * parent, const gfx::Point& position),
- (override));
- MOCK_METHOD(void, OnSetStartupId, (const char* startup_id), (override));
- MOCK_METHOD(void,
- OnSetApplicationId,
- (const char* application_id),
- (override));
- MOCK_METHOD(void, SetUseImmersiveForFullscreen, (bool value), (override));
- MOCK_METHOD(void, OnActivationRequested, (), (override));
- MOCK_METHOD(void, OnNewOutputAdded, (), (override));
- MOCK_METHOD(void, OnSetServerStartResize, (), (override));
- MOCK_METHOD(void, ShowSnapPreviewToPrimary, (), (override));
- MOCK_METHOD(void, ShowSnapPreviewToSecondary, (), (override));
- MOCK_METHOD(void, HideSnapPreview, (), (override));
- MOCK_METHOD(void, SetSnappedToSecondary, (), (override));
- MOCK_METHOD(void, SetSnappedToPrimary, (), (override));
- MOCK_METHOD(void, UnsetSnap, (), (override));
- MOCK_METHOD(void, SetCanGoBack, (), (override));
- MOCK_METHOD(void, UnsetCanGoBack, (), (override));
- MOCK_METHOD(void, SetPip, (), (override));
- MOCK_METHOD(void, UnsetPip, (), (override));
- MOCK_METHOD(void,
- SetAspectRatio,
- (const gfx::SizeF& aspect_ratio),
- (override));
- MOCK_METHOD(void, MoveToDesk, (int desk_index), (override));
- MOCK_METHOD(void, SetVisibleOnAllWorkspaces, (), (override));
- MOCK_METHOD(void,
- SetInitialWorkspace,
- (const char* initial_workspace),
- (override));
- MOCK_METHOD(void, Pin, (bool trusted), (override));
- MOCK_METHOD(void, Unpin, (), (override));
- MOCK_METHOD(void, SetSystemModal, (bool modal), (override));
- MOCK_METHOD(SecurityDelegate*, GetSecurityDelegate, (), (override));
- };
- } // namespace
- class ZAuraSurfaceTest : public test::ExoTestBase,
- public ::wm::ActivationChangeObserver {
- public:
- ZAuraSurfaceTest() {}
- ZAuraSurfaceTest(const ZAuraSurfaceTest&) = delete;
- ZAuraSurfaceTest& operator=(const ZAuraSurfaceTest&) = delete;
- ~ZAuraSurfaceTest() override {}
- // test::ExoTestBase overrides:
- void SetUp() override {
- test::ExoTestBase::SetUp();
- gfx::Size buffer_size(10, 10);
- std::unique_ptr<Buffer> buffer(
- new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
- surface_ = std::make_unique<Surface>();
- surface_->Attach(buffer.get());
- aura_surface_ = std::make_unique<TestAuraSurface>(surface_.get());
- gfx::Transform transform;
- transform.Scale(1.5f, 1.5f);
- parent_widget_ = CreateTestWidget();
- parent_widget_->SetBounds(gfx::Rect(0, 0, 10, 10));
- parent_widget_->GetNativeWindow()->SetTransform(transform);
- parent_widget_->GetNativeWindow()->AddChild(surface_->window());
- parent_widget_->Show();
- surface_->window()->SetBounds(gfx::Rect(5, 5, 10, 10));
- surface_->window()->Show();
- ash::Shell::Get()->activation_client()->AddObserver(this);
- aura_surface_->SetOcclusionTracking(true);
- }
- void TearDown() override {
- ash::Shell::Get()->activation_client()->RemoveObserver(this);
- parent_widget_.reset();
- aura_surface_.reset();
- surface_.reset();
- test::ExoTestBase::TearDown();
- }
- // ::wm::ActivationChangeObserver overrides:
- void OnWindowActivated(ActivationReason reason,
- aura::Window* gained_active,
- aura::Window* lost_active) override {
- if (lost_active == parent_widget_->GetNativeWindow()) {
- occlusion_fraction_on_activation_loss_ =
- aura_surface().last_sent_occlusion_fraction();
- }
- }
- protected:
- TestAuraSurface& aura_surface() { return *aura_surface_; }
- Surface& surface() { return *surface_; }
- views::Widget& parent_widget() { return *parent_widget_; }
- float occlusion_fraction_on_activation_loss() const {
- return occlusion_fraction_on_activation_loss_;
- }
- std::unique_ptr<views::Widget> CreateOpaqueWidget(const gfx::Rect& bounds) {
- return CreateTestWidget(
- /*delegate=*/nullptr,
- /*container_id=*/ash::desks_util::GetActiveDeskContainerId(), bounds,
- /*show=*/false);
- }
- private:
- std::unique_ptr<TestAuraSurface> aura_surface_;
- std::unique_ptr<Surface> surface_;
- std::unique_ptr<views::Widget> parent_widget_;
- float occlusion_fraction_on_activation_loss_ = -1.0f;
- };
- TEST_F(ZAuraSurfaceTest, OcclusionTrackingStartsAfterCommit) {
- surface().OnWindowOcclusionChanged();
- EXPECT_EQ(-1.0f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::UNKNOWN,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(0, aura_surface().num_occlusion_updates());
- EXPECT_FALSE(surface().IsTrackingOcclusion());
- auto widget = CreateOpaqueWidget(gfx::Rect(0, 0, 10, 10));
- widget->Show();
- surface().Commit();
- EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(1, aura_surface().num_occlusion_updates());
- EXPECT_TRUE(surface().IsTrackingOcclusion());
- }
- TEST_F(ZAuraSurfaceTest,
- LosingActivationWithNoAnimatingWindowsSendsCorrectOcclusionFraction) {
- surface().Commit();
- EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(1, aura_surface().num_occlusion_updates());
- ::wm::ActivateWindow(parent_widget().GetNativeWindow());
- // Creating an opaque window but don't show it.
- auto widget = CreateOpaqueWidget(gfx::Rect(0, 0, 10, 10));
- // Occlusion sent before de-activation should include that widget.
- widget->Show();
- EXPECT_EQ(0.2f, occlusion_fraction_on_activation_loss());
- EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(2, aura_surface().num_occlusion_updates());
- }
- TEST_F(ZAuraSurfaceTest,
- LosingActivationWithAnimatingWindowsSendsTargetOcclusionFraction) {
- surface().Commit();
- EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(1, aura_surface().num_occlusion_updates());
- ::wm::ActivateWindow(parent_widget().GetNativeWindow());
- // Creating an opaque window but don't show it.
- auto widget = CreateOpaqueWidget(gfx::Rect(0, 0, 10, 10));
- widget->GetNativeWindow()->layer()->SetOpacity(0.0f);
- ui::ScopedAnimationDurationScaleMode scoped_animation_duration_scale_mode(
- ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
- ui::LayerAnimatorTestController test_controller(
- ui::LayerAnimator::CreateImplicitAnimator());
- ui::ScopedLayerAnimationSettings layer_animation_settings(
- test_controller.animator());
- layer_animation_settings.SetTransitionDuration(kTransitionDuration);
- widget->GetNativeWindow()->layer()->SetAnimator(test_controller.animator());
- widget->GetNativeWindow()->layer()->SetOpacity(1.0f);
- // Opacity animation uses threaded animation.
- test_controller.StartThreadedAnimationsIfNeeded();
- test_controller.Step(kTransitionDuration / 3);
- // No occlusion updates should happen until the window is de-activated.
- EXPECT_EQ(1, aura_surface().num_occlusion_updates());
- // Occlusion sent before de-activation should include the window animating
- // to be completely opaque.
- widget->Show();
- EXPECT_EQ(0.2f, occlusion_fraction_on_activation_loss());
- EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(2, aura_surface().num_occlusion_updates());
- // Explicitly stop animation because threaded animation may have started
- // a bit later. |kTransitionDuration| may not be quite enough to reach the
- // end.
- test_controller.Step(kTransitionDuration / 3);
- test_controller.Step(kTransitionDuration / 3);
- widget->GetNativeWindow()->layer()->GetAnimator()->StopAnimating();
- widget->GetNativeWindow()->layer()->SetAnimator(nullptr);
- // Expect the occlusion tracker to send an update after the animation
- // finishes.
- EXPECT_EQ(0.2f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(3, aura_surface().num_occlusion_updates());
- }
- TEST_F(ZAuraSurfaceTest,
- LosingActivationByTriggeringTheLockScreenDoesNotSendOccludedFraction) {
- surface().Commit();
- EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- EXPECT_EQ(1, aura_surface().num_occlusion_updates());
- ::wm::ActivateWindow(parent_widget().GetNativeWindow());
- // Lock the screen.
- views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
- auto lock_widget = std::make_unique<views::Widget>();
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.context = GetContext();
- params.bounds = gfx::Rect(0, 0, 100, 100);
- lock_widget->Init(std::move(params));
- ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(),
- ash::kShellWindowId_LockScreenContainer)
- ->AddChild(lock_widget->GetNativeView());
- // Simulate real screen locker to change session state to LOCKED
- // when it is shown.
- auto* controller = ash::Shell::Get()->session_controller();
- GetSessionControllerClient()->LockScreen();
- lock_widget->Show();
- EXPECT_TRUE(controller->IsScreenLocked());
- EXPECT_TRUE(lock_widget->GetNativeView()->HasFocus());
- // We should have lost focus, but not reported that the window has been
- // fully occluded.
- EXPECT_NE(parent_widget().GetNativeWindow(),
- ash::window_util::GetActiveWindow());
- EXPECT_EQ(0.0f, occlusion_fraction_on_activation_loss());
- EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- }
- TEST_F(ZAuraSurfaceTest, OcclusionIncludesOffScreenArea) {
- UpdateDisplay("200x150");
- gfx::Size buffer_size(80, 100);
- std::unique_ptr<Buffer> buffer(
- new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
- // This is scaled by 1.5 - set the bounds to (-60, 75, 120, 150) in screen
- // coordinates so 75% of it is outside of the 100x100 screen.
- surface().window()->SetBounds(gfx::Rect(-40, 50, 80, 100));
- surface().Attach(buffer.get());
- surface().Commit();
- surface().OnWindowOcclusionChanged();
- EXPECT_EQ(0.75f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- }
- TEST_F(ZAuraSurfaceTest, ZeroSizeWindowSendsZeroOcclusionFraction) {
- // Zero sized window should not be occluded.
- surface().window()->SetBounds(gfx::Rect(0, 0, 0, 0));
- surface().Commit();
- surface().OnWindowOcclusionChanged();
- EXPECT_EQ(0.0f, aura_surface().last_sent_occlusion_fraction());
- EXPECT_EQ(aura::Window::OcclusionState::VISIBLE,
- aura_surface().last_sent_occlusion_state());
- }
- TEST_F(ZAuraSurfaceTest, CanPin) {
- MockSurfaceDelegate delegate;
- wl_resource resource;
- resource.data = &aura_surface();
- surface().SetSurfaceDelegate(&delegate);
- EXPECT_CALL(delegate, Pin(true));
- aura_surface().Pin(true);
- }
- TEST_F(ZAuraSurfaceTest, CanUnpin) {
- MockSurfaceDelegate delegate;
- wl_resource resource;
- resource.data = &aura_surface();
- surface().SetSurfaceDelegate(&delegate);
- EXPECT_CALL(delegate, Unpin());
- aura_surface().Unpin();
- }
- TEST_F(ZAuraSurfaceTest, CanSetFullscreenModeToPlain) {
- MockSurfaceDelegate delegate;
- wl_resource resource;
- resource.data = &aura_surface();
- surface().SetSurfaceDelegate(&delegate);
- EXPECT_CALL(delegate, SetUseImmersiveForFullscreen(false));
- aura_surface().SetFullscreenMode(ZAURA_SURFACE_FULLSCREEN_MODE_PLAIN);
- }
- TEST_F(ZAuraSurfaceTest, CanSetFullscreenModeToImmersive) {
- MockSurfaceDelegate delegate;
- surface().SetSurfaceDelegate(&delegate);
- EXPECT_CALL(delegate, SetUseImmersiveForFullscreen(true));
- aura_surface().SetFullscreenMode(ZAURA_SURFACE_FULLSCREEN_MODE_IMMERSIVE);
- }
- class MockAuraOutput : public AuraOutput {
- public:
- using AuraOutput::AuraOutput;
- MOCK_METHOD(void, SendInsets, (const gfx::Insets&), (override));
- MOCK_METHOD(void, SendLogicalTransform, (int32_t), (override));
- };
- class ZAuraOutputTest : public test::ExoTestBase {
- protected:
- ZAuraOutputTest() = default;
- ZAuraOutputTest(const ZAuraOutputTest&) = delete;
- ZAuraOutputTest& operator=(const ZAuraOutputTest&) = delete;
- // test::ExxoTestBase:
- ~ZAuraOutputTest() override = default;
- void SetUp() override {
- test::ExoTestBase::SetUp();
- int fds[2];
- ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, fds), 0);
- wayland_display_.reset(wl_display_create());
- client_ = wl_client_create(wayland_display_.get(), fds[0]);
- wl_resource* output_resource =
- wl_resource_create(client_, &wl_output_interface, kWlOutputVersion, 0);
- display_handler_ = std::make_unique<WaylandDisplayHandler>(&display_output_,
- output_resource);
- }
- std::unique_ptr<MockAuraOutput> CreateAuraOutput(int version) {
- return std::make_unique<::testing::NiceMock<MockAuraOutput>>(
- wl_resource_create(client_, &zaura_output_interface, version, 0),
- display_handler_.get());
- }
- std::unique_ptr<WaylandDisplayHandler> display_handler_;
- private:
- WaylandDisplayOutput display_output_{0};
- std::unique_ptr<wl_display, WlDisplayDeleter> wayland_display_;
- wl_client* client_ = nullptr;
- };
- TEST_F(ZAuraOutputTest, SendInsets) {
- auto mock_aura_output = CreateAuraOutput(ZAURA_OUTPUT_INSETS_SINCE_VERSION);
- UpdateDisplay("800x600");
- display::Display display =
- display_manager()->GetDisplayForId(display_manager()->first_display_id());
- const gfx::Rect initial_bounds{800, 600};
- EXPECT_EQ(display.bounds(), initial_bounds);
- const gfx::Rect new_work_area{10, 20, 500, 400};
- EXPECT_NE(display.work_area(), new_work_area);
- display.set_work_area(new_work_area);
- const gfx::Insets expected_insets = initial_bounds.InsetsFrom(new_work_area);
- EXPECT_CALL(*mock_aura_output, SendInsets(expected_insets)).Times(1);
- mock_aura_output->SendDisplayMetrics(
- display, display::DisplayObserver::DISPLAY_METRIC_WORK_AREA);
- }
- TEST_F(ZAuraOutputTest, SendLogicalTransform) {
- auto mock_aura_output =
- CreateAuraOutput(ZAURA_OUTPUT_LOGICAL_TRANSFORM_SINCE_VERSION);
- UpdateDisplay("800x600");
- display::Display display =
- display_manager()->GetDisplayForId(display_manager()->first_display_id());
- // Make sure the expected calls happen in order.
- ::testing::InSequence seq;
- EXPECT_EQ(display.rotation(), display::Display::ROTATE_0);
- EXPECT_EQ(display.panel_rotation(), display::Display::ROTATE_0);
- EXPECT_CALL(*mock_aura_output,
- SendLogicalTransform(OutputTransform(display.rotation())))
- .Times(1);
- mock_aura_output->SendDisplayMetrics(
- display, display::DisplayObserver::DISPLAY_METRIC_ROTATION);
- display.set_rotation(display::Display::ROTATE_270);
- display.set_panel_rotation(display::Display::ROTATE_180);
- EXPECT_CALL(*mock_aura_output,
- SendLogicalTransform(OutputTransform(display.rotation())))
- .Times(1);
- mock_aura_output->SendDisplayMetrics(
- display, display::DisplayObserver::DISPLAY_METRIC_ROTATION);
- display.set_rotation(display::Display::ROTATE_90);
- display.set_panel_rotation(display::Display::ROTATE_180);
- EXPECT_CALL(*mock_aura_output,
- SendLogicalTransform(OutputTransform(display.rotation())))
- .Times(1);
- mock_aura_output->SendDisplayMetrics(
- display, display::DisplayObserver::DISPLAY_METRIC_ROTATION);
- display.set_rotation(display::Display::ROTATE_270);
- display.set_panel_rotation(display::Display::ROTATE_270);
- EXPECT_CALL(*mock_aura_output,
- SendLogicalTransform(OutputTransform(display.rotation())))
- .Times(1);
- mock_aura_output->SendDisplayMetrics(
- display, display::DisplayObserver::DISPLAY_METRIC_ROTATION);
- }
- // Make sure that data associated with wl/aura outputs are destroyd
- // properly regardless of which one is destroyed first.
- TEST_F(ZAuraOutputTest, DestroyAuraOutput) {
- auto mock_aura_output =
- CreateAuraOutput(ZAURA_OUTPUT_LOGICAL_TRANSFORM_SINCE_VERSION);
- EXPECT_EQ(1u, display_handler_->CountObserversForTesting());
- mock_aura_output.reset();
- EXPECT_EQ(0u, display_handler_->CountObserversForTesting());
- mock_aura_output =
- CreateAuraOutput(ZAURA_OUTPUT_LOGICAL_TRANSFORM_SINCE_VERSION);
- EXPECT_EQ(1u, display_handler_->CountObserversForTesting());
- EXPECT_TRUE(mock_aura_output->HasDisplayHandlerForTesting());
- display_handler_.reset();
- EXPECT_FALSE(mock_aura_output->HasDisplayHandlerForTesting());
- }
- } // namespace wayland
- } // namespace exo
|