|  | // 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 "base/message_loop/message_loop.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "components/exo/buffer.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" | 
|  | #include "third_party/khronos/GLES2/gl2.h" | 
|  | #include "ui/aura/window.h" | 
|  | #include "ui/views/widget/widget.h" | 
|  |  | 
|  | namespace exo { | 
|  | namespace { | 
|  |  | 
|  | using ShellSurfaceTest = test::ExoTestBase; | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, Init) { | 
|  | gfx::Size small_buffer_size(64, 64); | 
|  | scoped_ptr<Buffer> small_buffer( | 
|  | new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(small_buffer_size), | 
|  | GL_TEXTURE_2D)); | 
|  | gfx::Size large_buffer_size(256, 256); | 
|  | scoped_ptr<Buffer> large_buffer( | 
|  | new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(large_buffer_size), | 
|  | GL_TEXTURE_2D)); | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | ASSERT_TRUE(shell_surface->GetWidget()); | 
|  |  | 
|  | surface->Attach(small_buffer.get()); | 
|  | surface->Commit(); | 
|  | EXPECT_EQ( | 
|  | small_buffer_size.ToString(), | 
|  | shell_surface->GetWidget()->GetWindowBoundsInScreen().size().ToString()); | 
|  |  | 
|  | surface->Attach(large_buffer.get()); | 
|  | surface->Commit(); | 
|  | EXPECT_EQ( | 
|  | large_buffer_size.ToString(), | 
|  | shell_surface->GetWidget()->GetWindowBoundsInScreen().size().ToString()); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, Maximize) { | 
|  | gfx::Size buffer_size(256, 256); | 
|  | scoped_ptr<Buffer> buffer(new Buffer( | 
|  | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D)); | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | surface->Attach(buffer.get()); | 
|  | shell_surface->Maximize(); | 
|  | surface->Commit(); | 
|  | EXPECT_EQ(CurrentContext()->bounds().width(), | 
|  | shell_surface->GetWidget()->GetWindowBoundsInScreen().width()); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, SetFullscreen) { | 
|  | gfx::Size buffer_size(256, 256); | 
|  | scoped_ptr<Buffer> buffer(new Buffer( | 
|  | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D)); | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | shell_surface->SetFullscreen(true); | 
|  | surface->Attach(buffer.get()); | 
|  | surface->Commit(); | 
|  | EXPECT_EQ(CurrentContext()->bounds().ToString(), | 
|  | shell_surface->GetWidget()->GetWindowBoundsInScreen().ToString()); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, SetTitle) { | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->SetTitle(base::string16(base::ASCIIToUTF16("test"))); | 
|  | surface->Commit(); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, SetApplicationId) { | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | surface->Commit(); | 
|  | EXPECT_EQ("", ShellSurface::GetApplicationId( | 
|  | shell_surface->GetWidget()->GetNativeWindow())); | 
|  | shell_surface->SetApplicationId("test"); | 
|  | EXPECT_EQ("test", ShellSurface::GetApplicationId( | 
|  | shell_surface->GetWidget()->GetNativeWindow())); | 
|  | } | 
|  |  | 
|  | void DestroyShellSurface(scoped_ptr<ShellSurface>* shell_surface) { | 
|  | shell_surface->reset(); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, Move) { | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | // Map shell surface. | 
|  | shell_surface->Init(); | 
|  | surface->Commit(); | 
|  |  | 
|  | // Post a task that will destroy the shell surface and then start an | 
|  | // interactive move. The interactive move should end when surface is | 
|  | // destroyed. | 
|  | base::MessageLoopForUI::current()->PostTask( | 
|  | FROM_HERE, | 
|  | base::Bind(&DestroyShellSurface, base::Unretained(&shell_surface))); | 
|  | shell_surface->Move(); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, SetGeometry) { | 
|  | gfx::Size buffer_size(64, 64); | 
|  | scoped_ptr<Buffer> buffer(new Buffer( | 
|  | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D)); | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | gfx::Rect geometry(16, 16, 32, 32); | 
|  | shell_surface->SetGeometry(geometry); | 
|  | surface->Attach(buffer.get()); | 
|  | surface->Commit(); | 
|  | EXPECT_EQ( | 
|  | geometry.size().ToString(), | 
|  | shell_surface->GetWidget()->GetWindowBoundsInScreen().size().ToString()); | 
|  | EXPECT_EQ(gfx::Rect(gfx::Point() - geometry.OffsetFromOrigin(), buffer_size) | 
|  | .ToString(), | 
|  | surface->bounds().ToString()); | 
|  | } | 
|  |  | 
|  | void Close(int* close_call_count) { | 
|  | (*close_call_count)++; | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, CloseCallback) { | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | int close_call_count = 0; | 
|  | shell_surface->set_close_callback( | 
|  | base::Bind(&Close, base::Unretained(&close_call_count))); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | surface->Commit(); | 
|  |  | 
|  | EXPECT_EQ(0, close_call_count); | 
|  | shell_surface->GetWidget()->Close(); | 
|  | EXPECT_EQ(1, close_call_count); | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, SurfaceDestroyedCallback) { | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->set_surface_destroyed_callback( | 
|  | base::Bind(&DestroyShellSurface, base::Unretained(&shell_surface))); | 
|  |  | 
|  | shell_surface->Init(); | 
|  | surface->Commit(); | 
|  |  | 
|  | EXPECT_TRUE(shell_surface.get()); | 
|  | surface.reset(); | 
|  | EXPECT_FALSE(shell_surface.get()); | 
|  | } | 
|  |  | 
|  | void Configure(gfx::Size* suggested_size, const gfx::Size& size) { | 
|  | *suggested_size = size; | 
|  | } | 
|  |  | 
|  | TEST_F(ShellSurfaceTest, ConfigureCallback) { | 
|  | scoped_ptr<Surface> surface(new Surface); | 
|  | scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get())); | 
|  |  | 
|  | shell_surface->Init(); | 
|  |  | 
|  | gfx::Size suggested_size; | 
|  | shell_surface->set_configure_callback( | 
|  | base::Bind(&Configure, base::Unretained(&suggested_size))); | 
|  | shell_surface->Maximize(); | 
|  | EXPECT_EQ(CurrentContext()->bounds().width(), suggested_size.width()); | 
|  |  | 
|  | shell_surface->SetFullscreen(true); | 
|  | EXPECT_EQ(CurrentContext()->bounds().size().ToString(), | 
|  | suggested_size.ToString()); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace exo |