11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/test/layer_tree_json_parser.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/layers/layer.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/test/fake_impl_proxy.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/test/fake_layer_tree_host.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/test/geometry_test_utils.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace cc {
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool LayerTreesMatch(LayerImpl* const layer_impl,
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     Layer* const layer) {
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define RETURN_IF_EXPECTATION_FAILS(exp) \
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  do { \
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    exp; \
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (testing::UnitTest::GetInstance()->current_test_info()-> \
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            result()->Failed()) \
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return false; \
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } while (0)
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->children().size(),
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        layer->children().size()));
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_SIZE_EQ(layer_impl->bounds(),
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                             layer->bounds()));
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_POINT_EQ(layer_impl->position(),
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                              layer->position()));
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_TRANSFORMATION_MATRIX_EQ(layer_impl->draw_transform(),
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      layer->draw_transform()));
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->contents_opaque(),
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        layer->contents_opaque()));
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->scrollable(),
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        layer->scrollable()));
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_FLOAT_EQ(layer_impl->opacity(),
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                              layer->opacity()));
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(EXPECT_EQ(layer_impl->have_wheel_event_handlers(),
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        layer->have_wheel_event_handlers()));
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RETURN_IF_EXPECTATION_FAILS(
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      EXPECT_EQ(layer_impl->have_scroll_event_handlers(),
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                layer->have_scroll_event_handlers()));
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  RETURN_IF_EXPECTATION_FAILS(
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(layer_impl->touch_event_handler_region(),
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                layer->touch_event_handler_region()));
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < layer_impl->children().size(); ++i) {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RETURN_IF_EXPECTATION_FAILS(EXPECT_TRUE(LayerTreesMatch(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        layer_impl->children()[i], layer->children()[i].get())));
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#undef RETURN_IF_EXPECTATION_FAILS
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class LayerTreeJsonParserSanityCheck : public testing::Test {
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(LayerTreeJsonParserSanityCheck, Basic) {
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeImplProxy proxy;
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  LayerTreeImpl* tree = host_impl.active_tree();
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<LayerImpl> root_impl(LayerImpl::Create(tree, 1));
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<LayerImpl> parent(LayerImpl::Create(tree, 2));
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<LayerImpl> child(LayerImpl::Create(tree, 3));
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  root_impl->SetBounds(gfx::Size(100, 100));
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  parent->SetBounds(gfx::Size(50, 50));
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  child->SetBounds(gfx::Size(40, 40));
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  parent->SetPosition(gfx::Point(25, 25));
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  child->SetHaveWheelEventHandlers(true);
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  child->SetHaveScrollEventHandlers(true);
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  parent->AddChild(child.Pass());
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  root_impl->AddChild(parent.Pass());
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tree->SetRootLayer(root_impl.Pass());
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string json = host_impl.LayerTreeAsJson();
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<Layer> root = ParseTreeFromJson(json, NULL);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(root.get());
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(LayerTreesMatch(host_impl.RootLayer(), root.get()));
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(LayerTreeJsonParserSanityCheck, EventHandlerRegions) {
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FakeImplProxy proxy;
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  LayerTreeImpl* tree = host_impl.active_tree();
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<LayerImpl> root_impl(LayerImpl::Create(tree, 1));
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<LayerImpl> touch_layer(LayerImpl::Create(tree, 2));
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  root_impl->SetBounds(gfx::Size(100, 100));
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  touch_layer->SetBounds(gfx::Size(50, 50));
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Region touch_region;
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  touch_region.Union(gfx::Rect(10, 10, 20, 30));
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  touch_region.Union(gfx::Rect(40, 10, 20, 20));
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  touch_layer->SetTouchEventHandlerRegion(touch_region);
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  root_impl->AddChild(touch_layer.Pass());
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tree->SetRootLayer(root_impl.Pass());
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string json = host_impl.LayerTreeAsJson();
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<Layer> root = ParseTreeFromJson(json, NULL);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(root.get());
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(LayerTreesMatch(host_impl.RootLayer(), root.get()));
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace cc
122