[NaCl SDK]: use standard __BEGIN_DECLS macros in sys/select.h
[chromium-blink-merge.git] / cc / blink / web_layer_impl_fixed_bounds_unittest.cc
blobe8f48358e824e4301fa4b4a24e609bde45cbb19c
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include <vector>
6 #include "cc/blink/web_layer_impl_fixed_bounds.h"
7 #include "cc/layers/picture_image_layer.h"
8 #include "cc/test/fake_layer_tree_host.h"
9 #include "cc/test/geometry_test_utils.h"
10 #include "cc/trees/layer_tree_host_common.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "third_party/WebKit/public/platform/WebFloatPoint.h"
13 #include "third_party/WebKit/public/platform/WebSize.h"
14 #include "third_party/skia/include/utils/SkMatrix44.h"
15 #include "ui/gfx/point3_f.h"
17 using blink::WebFloatPoint;
18 using blink::WebSize;
20 namespace cc_blink {
21 namespace {
23 TEST(WebLayerImplFixedBoundsTest, IdentityBounds) {
24 scoped_ptr<WebLayerImplFixedBounds> layer(new WebLayerImplFixedBounds());
25 layer->SetFixedBounds(gfx::Size(100, 100));
26 layer->setBounds(WebSize(100, 100));
27 EXPECT_EQ(WebSize(100, 100), layer->bounds());
28 EXPECT_EQ(gfx::Size(100, 100), layer->layer()->bounds());
29 EXPECT_EQ(gfx::Transform(), layer->layer()->transform());
32 gfx::Point3F TransformPoint(const gfx::Transform& transform,
33 const gfx::Point3F& point) {
34 gfx::Point3F result = point;
35 transform.TransformPoint(&result);
36 return result;
39 void CheckBoundsScaleSimple(WebLayerImplFixedBounds* layer,
40 const WebSize& bounds,
41 const gfx::Size& fixed_bounds) {
42 layer->setBounds(bounds);
43 layer->SetFixedBounds(fixed_bounds);
45 EXPECT_EQ(bounds, layer->bounds());
46 EXPECT_EQ(fixed_bounds, layer->layer()->bounds());
47 EXPECT_TRUE(layer->transform().isIdentity());
49 // An arbitrary point to check the scale and transforms.
50 gfx::Point3F original_point(10, 20, 1);
51 gfx::Point3F scaled_point(
52 original_point.x() * bounds.width / fixed_bounds.width(),
53 original_point.y() * bounds.height / fixed_bounds.height(),
54 original_point.z());
55 // Test if the bounds scale is correctly applied in transform.
56 EXPECT_POINT3F_EQ(
57 scaled_point,
58 TransformPoint(layer->layer()->transform(), original_point));
61 TEST(WebLayerImplFixedBoundsTest, BoundsScaleSimple) {
62 scoped_ptr<WebLayerImplFixedBounds> layer(new WebLayerImplFixedBounds());
63 CheckBoundsScaleSimple(layer.get(), WebSize(100, 200), gfx::Size(150, 250));
64 // Change fixed_bounds.
65 CheckBoundsScaleSimple(layer.get(), WebSize(100, 200), gfx::Size(75, 100));
66 // Change bounds.
67 CheckBoundsScaleSimple(layer.get(), WebSize(300, 100), gfx::Size(75, 100));
70 void ExpectEqualLayerRectsInTarget(cc::Layer* layer1, cc::Layer* layer2) {
71 gfx::RectF layer1_rect_in_target(layer1->content_bounds());
72 layer1->draw_transform().TransformRect(&layer1_rect_in_target);
74 gfx::RectF layer2_rect_in_target(layer2->content_bounds());
75 layer2->draw_transform().TransformRect(&layer2_rect_in_target);
77 EXPECT_FLOAT_RECT_EQ(layer1_rect_in_target, layer2_rect_in_target);
80 void CompareFixedBoundsLayerAndNormalLayer(const WebFloatPoint& anchor_point,
81 const gfx::Transform& transform) {
82 const gfx::Size kDeviceViewportSize(800, 600);
83 const float kDeviceScaleFactor = 2.f;
84 const float kPageScaleFactor = 1.5f;
86 WebSize bounds(150, 200);
87 WebFloatPoint position(20, 30);
88 gfx::Size fixed_bounds(160, 70);
90 scoped_ptr<WebLayerImplFixedBounds> root_layer(new WebLayerImplFixedBounds());
92 WebLayerImplFixedBounds* fixed_bounds_layer =
93 new WebLayerImplFixedBounds(cc::PictureImageLayer::Create());
94 fixed_bounds_layer->setBounds(bounds);
95 fixed_bounds_layer->SetFixedBounds(fixed_bounds);
96 fixed_bounds_layer->setTransform(transform.matrix());
97 fixed_bounds_layer->setPosition(position);
98 root_layer->addChild(fixed_bounds_layer);
100 WebLayerImpl* normal_layer(new WebLayerImpl(cc::PictureImageLayer::Create()));
102 normal_layer->setBounds(bounds);
103 normal_layer->setTransform(transform.matrix());
104 normal_layer->setPosition(position);
105 root_layer->addChild(normal_layer);
107 scoped_ptr<cc::FakeLayerTreeHost> host = cc::FakeLayerTreeHost::Create();
108 host->SetRootLayer(root_layer->layer());
111 cc::RenderSurfaceLayerList render_surface_layer_list;
112 cc::LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
113 root_layer->layer(), kDeviceViewportSize, &render_surface_layer_list);
114 inputs.device_scale_factor = kDeviceScaleFactor;
115 inputs.page_scale_factor = kPageScaleFactor;
116 inputs.page_scale_application_layer = root_layer->layer(),
117 cc::LayerTreeHostCommon::CalculateDrawProperties(&inputs);
119 ExpectEqualLayerRectsInTarget(normal_layer->layer(),
120 fixed_bounds_layer->layer());
123 // Change of fixed bounds should not affect the target geometries.
124 fixed_bounds_layer->SetFixedBounds(
125 gfx::Size(fixed_bounds.width() / 2, fixed_bounds.height() * 2));
128 cc::RenderSurfaceLayerList render_surface_layer_list;
129 cc::LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
130 root_layer->layer(), kDeviceViewportSize, &render_surface_layer_list);
131 inputs.device_scale_factor = kDeviceScaleFactor;
132 inputs.page_scale_factor = kPageScaleFactor;
133 inputs.page_scale_application_layer = root_layer->layer(),
134 cc::LayerTreeHostCommon::CalculateDrawProperties(&inputs);
136 ExpectEqualLayerRectsInTarget(normal_layer->layer(),
137 fixed_bounds_layer->layer());
141 // TODO(perkj): CompareToWebLayerImplSimple disabled on LSAN due to crbug/386080
142 #if defined(LEAK_SANITIZER)
143 #define MAYBE_CompareToWebLayerImplSimple DISABLED_CompareToWebLayerImplSimple
144 #else
145 #define MAYBE_CompareToWebLayerImplSimple CompareToWebLayerImplSimple
146 #endif
147 // A black box test that ensures WebLayerImplFixedBounds won't change target
148 // geometries. Simple case: identity transforms and zero anchor point.
149 TEST(WebLayerImplFixedBoundsTest, MAYBE_CompareToWebLayerImplSimple) {
150 CompareFixedBoundsLayerAndNormalLayer(WebFloatPoint(0, 0), gfx::Transform());
153 // TODO(perkj): CompareToWebLayerImplComplex disabled on LSAN due to
154 // crbug/386080
155 #if defined(LEAK_SANITIZER)
156 #define MAYBE_CompareToWebLayerImplComplex DISABLED_CompareToWebLayerImplComplex
157 #else
158 #define MAYBE_CompareToWebLayerImplComplex CompareToWebLayerImplComplex
159 #endif
160 // A black box test that ensures WebLayerImplFixedBounds won't change target
161 // geometries. Complex case: complex transforms and non-zero anchor point.
162 TEST(WebLayerImplFixedBoundsTest, MAYBE_CompareToWebLayerImplComplex) {
163 gfx::Transform transform;
164 // These are arbitrary values that should not affect the results.
165 transform.Translate3d(50, 60, 70);
166 transform.Scale3d(2, 3, 4);
167 transform.RotateAbout(gfx::Vector3dF(33, 44, 55), 99);
169 CompareFixedBoundsLayerAndNormalLayer(WebFloatPoint(0, 0), transform);
171 // With non-zero anchor point, WebLayerImplFixedBounds will fall back to
172 // WebLayerImpl.
173 CompareFixedBoundsLayerAndNormalLayer(WebFloatPoint(0.4f, 0.6f), transform);
176 } // namespace
177 } // namespace cc_blink