123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- // Copyright 2015 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/xdg_shell_surface.h"
- #include "components/exo/buffer.h"
- #include "components/exo/display.h"
- #include "components/exo/shell_surface.h"
- #include "components/exo/surface.h"
- #include "components/exo/test/exo_test_base.h"
- #include "components/exo/test/exo_test_helper.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace exo {
- namespace {
- struct SurfaceTriplet {
- std::unique_ptr<Surface> surface;
- std::unique_ptr<ShellSurface> shell_surface;
- std::unique_ptr<Buffer> buffer;
- };
- class XdgShellSurfaceTest : public test::ExoTestBase {
- protected:
- SurfaceTriplet BuildSurface(int w, int h) {
- auto surface = std::make_unique<Surface>();
- auto shell_surface = std::make_unique<XdgShellSurface>(
- surface.get(), gfx::Point{0, 0},
- /*can_minimize=*/true, ash::desks_util::GetActiveDeskContainerId());
- auto buffer = std::make_unique<Buffer>(
- exo_test_helper()->CreateGpuMemoryBuffer({w, h}));
- surface->Attach(buffer.get());
- return {std::move(surface), std::move(shell_surface), std::move(buffer)};
- }
- // Returns the size of the surface associated with a maximized widget. If the
- // widget is |decorated| the size will be smaller due to the widget's
- // decorations.
- gfx::Size GetMaximizedSurfaceSize(bool decorated) {
- SurfaceTriplet temp = BuildSurface(1, 1);
- temp.surface->SetFrame(decorated ? SurfaceFrameType::NORMAL
- : SurfaceFrameType::NONE);
- temp.shell_surface->Maximize();
- temp.surface->Commit();
- EXPECT_TRUE(temp.shell_surface->GetWidget()->IsMaximized());
- return temp.shell_surface->GetWidget()->client_view()->size();
- }
- };
- // We don't actually care about the size of decorations. The purpose of this
- // test is to ensure that enabling decorations in the way that we do actually
- // causes the widget to be drawn with a (nonzero-sized) frame.
- TEST_F(XdgShellSurfaceTest, DecoratedSurfaceSmallerThanUndecorated) {
- gfx::Size undecorated_size = GetMaximizedSurfaceSize(false);
- gfx::Size decorated_size = GetMaximizedSurfaceSize(true);
- // The best expectation we can have is that the window decoration must be
- // nonzero in one direction.
- int decoration_width = undecorated_size.width() - decorated_size.width();
- int decoration_height = undecorated_size.height() - decorated_size.height();
- EXPECT_GE(decoration_width, 0);
- EXPECT_GE(decoration_height, 0);
- EXPECT_GT(decoration_width + decoration_height, 0);
- }
- TEST_F(XdgShellSurfaceTest, UndecoratedSurfaceAutoMaximizes) {
- gfx::Size maximized_size = GetMaximizedSurfaceSize(/*decorated=*/false);
- SurfaceTriplet max_surface =
- BuildSurface(maximized_size.width(), maximized_size.height());
- max_surface.surface->Commit();
- EXPECT_TRUE(max_surface.shell_surface->GetWidget()->IsMaximized());
- SurfaceTriplet narrow_surface =
- BuildSurface(maximized_size.width() - 1, maximized_size.height());
- narrow_surface.surface->Commit();
- EXPECT_FALSE(narrow_surface.shell_surface->GetWidget()->IsMaximized());
- SurfaceTriplet short_surface =
- BuildSurface(maximized_size.width(), maximized_size.height() - 1);
- short_surface.surface->Commit();
- EXPECT_FALSE(short_surface.shell_surface->GetWidget()->IsMaximized());
- }
- TEST_F(XdgShellSurfaceTest, DecoratedSurfaceAutoMaximizes) {
- gfx::Size maximized_size = GetMaximizedSurfaceSize(/*decorated=*/true);
- SurfaceTriplet max_surface =
- BuildSurface(maximized_size.width(), maximized_size.height());
- max_surface.surface->SetFrame(SurfaceFrameType::NORMAL);
- max_surface.surface->Commit();
- EXPECT_TRUE(max_surface.shell_surface->GetWidget()->IsMaximized());
- SurfaceTriplet narrow_surface =
- BuildSurface(maximized_size.width() - 1, maximized_size.height());
- narrow_surface.surface->SetFrame(SurfaceFrameType::NORMAL);
- narrow_surface.surface->Commit();
- EXPECT_FALSE(narrow_surface.shell_surface->GetWidget()->IsMaximized());
- SurfaceTriplet short_surface =
- BuildSurface(maximized_size.width(), maximized_size.height() - 1);
- short_surface.surface->SetFrame(SurfaceFrameType::NORMAL);
- short_surface.surface->Commit();
- EXPECT_FALSE(short_surface.shell_surface->GetWidget()->IsMaximized());
- }
- TEST_F(XdgShellSurfaceTest, DontMaximizeIfStateWasModified) {
- gfx::Size maximized_size = GetMaximizedSurfaceSize(/*decorated=*/true);
- SurfaceTriplet test_surface =
- BuildSurface(maximized_size.width() + 1, maximized_size.height() + 1);
- // Explicitly restoring the window should prevent auto maximize.
- test_surface.shell_surface->Restore();
- test_surface.surface->Commit();
- EXPECT_FALSE(test_surface.shell_surface->GetWidget()->IsMaximized());
- }
- } // namespace
- } // namespace exo
|