blob: 5896211da8b810d85de12cc4c10cdd9db7e0544d [file] [log] [blame]
// Copyright (c) 2016 The Chromium Embedded Framework 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 "include/base/cef_bind.h"
#include "include/cef_pack_strings.h"
#include "include/views/cef_panel.h"
#include "include/views/cef_panel_delegate.h"
#include "include/views/cef_scroll_view.h"
#include "include/wrapper/cef_closure_task.h"
#include "tests/ceftests/thread_helper.h"
#include "tests/ceftests/views/test_window_delegate.h"
#include "tests/gtest/include/gtest/gtest.h"
#define SCROLL_VIEW_TEST_ASYNC(name) \
UI_THREAD_TEST_ASYNC(ViewsScrollViewTest, name)
namespace {
const int kScrollViewID = 1;
const int kContentPanelID = 2;
// Make the Panel larger then the Window so scroll bars appear.
const int kContentPanelSize = TestWindowDelegate::kWSize + 200;
class TestScrollViewDelegate : public CefViewDelegate {
public:
TestScrollViewDelegate() {}
CefSize GetPreferredSize(CefRefPtr<CefView> view) override {
EXPECT_EQ(kScrollViewID, view->GetID());
got_get_preferred_size_ = true;
return CefSize(kContentPanelSize, kContentPanelSize);
}
bool got_get_preferred_size_ = false;
private:
IMPLEMENT_REFCOUNTING(TestScrollViewDelegate);
DISALLOW_COPY_AND_ASSIGN(TestScrollViewDelegate);
};
class TestPanelDelegate : public CefPanelDelegate {
public:
TestPanelDelegate() {}
CefSize GetPreferredSize(CefRefPtr<CefView> view) override {
EXPECT_EQ(kContentPanelID, view->GetID());
got_get_preferred_size_ = true;
return CefSize(kContentPanelSize, kContentPanelSize);
}
bool got_get_preferred_size_ = false;
private:
IMPLEMENT_REFCOUNTING(TestPanelDelegate);
DISALLOW_COPY_AND_ASSIGN(TestPanelDelegate);
};
void RunScrollViewLayout(bool with_delegate, CefRefPtr<CefWindow> window) {
CefRefPtr<TestScrollViewDelegate> scroll_view_delegate;
CefRefPtr<TestPanelDelegate> panel_delegate;
if (with_delegate) {
scroll_view_delegate = new TestScrollViewDelegate();
panel_delegate = new TestPanelDelegate();
}
CefRefPtr<CefScrollView> scroll_view =
CefScrollView::CreateScrollView(scroll_view_delegate);
EXPECT_TRUE(scroll_view.get());
EXPECT_TRUE(scroll_view->AsScrollView().get());
// Verify default state.
EXPECT_FALSE(scroll_view->GetContentView().get());
EXPECT_EQ(CefRect(0, 0, 0, 0), scroll_view->GetVisibleContentRect());
EXPECT_FALSE(scroll_view->HasHorizontalScrollbar());
EXPECT_FALSE(scroll_view->HasVerticalScrollbar());
scroll_view->SetID(kScrollViewID);
scroll_view->SetBackgroundColor(CefColorSetARGB(255, 0, 255, 0));
CefRefPtr<CefPanel> content_panel = CefPanel::CreatePanel(panel_delegate);
content_panel->SetID(kContentPanelID);
content_panel->SetBackgroundColor(CefColorSetARGB(255, 255, 0, 0));
if (!with_delegate) {
// Explicitly set the content panel size. Otherwise, it will come from the
// delegate.
content_panel->SetSize(CefSize(kContentPanelSize, kContentPanelSize));
}
scroll_view->SetContentView(content_panel);
EXPECT_TRUE(content_panel->IsSame(scroll_view->GetContentView()));
window->AddChildView(scroll_view);
// Force layout.
window->Layout();
EXPECT_TRUE(scroll_view->HasHorizontalScrollbar());
EXPECT_TRUE(scroll_view->HasVerticalScrollbar());
if (with_delegate) {
EXPECT_TRUE(scroll_view_delegate->got_get_preferred_size_);
EXPECT_TRUE(panel_delegate->got_get_preferred_size_);
}
window->Show();
// With default FillLayout the ScrollView should be the size of the Window's
// client area.
const CefRect& client_bounds = window->GetClientAreaBoundsInScreen();
const CefRect& scroll_view_bounds = scroll_view->GetBoundsInScreen();
EXPECT_EQ(client_bounds, scroll_view_bounds);
// Content panel size should be unchanged.
const CefSize& content_panel_size = content_panel->GetSize();
EXPECT_EQ(CefSize(kContentPanelSize, kContentPanelSize), content_panel_size);
const int sb_height = scroll_view->GetHorizontalScrollbarHeight();
EXPECT_GT(sb_height, 0);
const int sb_width = scroll_view->GetVerticalScrollbarWidth();
EXPECT_GT(sb_width, 0);
// Verify visible content panel region.
const CefRect& visible_rect = scroll_view->GetVisibleContentRect();
EXPECT_EQ(CefRect(0, 0, scroll_view_bounds.width - sb_width,
scroll_view_bounds.height - sb_height),
visible_rect);
}
void ScrollViewLayout(CefRefPtr<CefWaitableEvent> event, bool with_delegate) {
TestWindowDelegate::Config config;
config.on_window_created = base::Bind(RunScrollViewLayout, with_delegate);
TestWindowDelegate::RunTest(event, config);
}
void ScrollViewLayoutWithDelegateImpl(CefRefPtr<CefWaitableEvent> event) {
ScrollViewLayout(event, true);
}
void ScrollViewLayoutNoDelegateImpl(CefRefPtr<CefWaitableEvent> event) {
ScrollViewLayout(event, false);
}
} // namespace
// Test ScrollView layout. This is primarily to exercise exposed CEF APIs and is
// not intended to comprehensively test ScrollView-related behavior (which we
// presume that Chromium is testing).
SCROLL_VIEW_TEST_ASYNC(ScrollViewLayoutWithDelegate)
SCROLL_VIEW_TEST_ASYNC(ScrollViewLayoutNoDelegate)