• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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.
4 
5 #include "base/pickle.h"
6 #include "content/common/cursors/webcursor.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "third_party/WebKit/public/platform/WebCursorInfo.h"
9 
10 using blink::WebCursorInfo;
11 
12 namespace content {
13 
TEST(WebCursorTest,OKCursorSerialization)14 TEST(WebCursorTest, OKCursorSerialization) {
15   WebCursor custom_cursor;
16   // This is a valid custom cursor.
17   Pickle ok_custom_pickle;
18   // Type and hotspots.
19   ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
20   ok_custom_pickle.WriteInt(0);
21   ok_custom_pickle.WriteInt(0);
22   // X & Y
23   ok_custom_pickle.WriteInt(1);
24   ok_custom_pickle.WriteInt(1);
25   // Scale
26   ok_custom_pickle.WriteFloat(1.0);
27   // Data len including enough data for a 1x1 image.
28   ok_custom_pickle.WriteInt(4);
29   ok_custom_pickle.WriteUInt32(0);
30   // Custom Windows message.
31   ok_custom_pickle.WriteUInt32(0);
32   PickleIterator iter(ok_custom_pickle);
33   EXPECT_TRUE(custom_cursor.Deserialize(&iter));
34 }
35 
TEST(WebCursorTest,BrokenCursorSerialization)36 TEST(WebCursorTest, BrokenCursorSerialization) {
37   WebCursor custom_cursor;
38   // This custom cursor has not been send with enough data.
39   Pickle short_custom_pickle;
40   // Type and hotspots.
41   short_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
42   short_custom_pickle.WriteInt(0);
43   short_custom_pickle.WriteInt(0);
44   // X & Y
45   short_custom_pickle.WriteInt(1);
46   short_custom_pickle.WriteInt(1);
47   // Scale
48   short_custom_pickle.WriteFloat(1.0);
49   // Data len not including enough data for a 1x1 image.
50   short_custom_pickle.WriteInt(3);
51   short_custom_pickle.WriteUInt32(0);
52   PickleIterator iter(short_custom_pickle);
53   EXPECT_FALSE(custom_cursor.Deserialize(&iter));
54 
55   // This custom cursor has enough data but is too big.
56   Pickle large_custom_pickle;
57   // Type and hotspots.
58   large_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
59   large_custom_pickle.WriteInt(0);
60   large_custom_pickle.WriteInt(0);
61   // X & Y
62   static const int kTooBigSize = 4096 + 1;
63   large_custom_pickle.WriteInt(kTooBigSize);
64   large_custom_pickle.WriteInt(1);
65   // Scale
66   large_custom_pickle.WriteFloat(1.0);
67   // Data len including enough data for a 4097x1 image.
68   large_custom_pickle.WriteInt(kTooBigSize * 4);
69   for (int i = 0; i < kTooBigSize; ++i)
70     large_custom_pickle.WriteUInt32(0);
71   iter = PickleIterator(large_custom_pickle);
72   EXPECT_FALSE(custom_cursor.Deserialize(&iter));
73 
74   // This custom cursor uses negative lengths.
75   Pickle neg_custom_pickle;
76   // Type and hotspots.
77   neg_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
78   neg_custom_pickle.WriteInt(0);
79   neg_custom_pickle.WriteInt(0);
80   // X & Y
81   neg_custom_pickle.WriteInt(-1);
82   neg_custom_pickle.WriteInt(-1);
83   // Scale
84   neg_custom_pickle.WriteFloat(1.0);
85   // Data len including enough data for a 1x1 image.
86   neg_custom_pickle.WriteInt(4);
87   neg_custom_pickle.WriteUInt32(0);
88   // Custom Windows message.
89   neg_custom_pickle.WriteUInt32(0);
90   iter = PickleIterator(neg_custom_pickle);
91   EXPECT_FALSE(custom_cursor.Deserialize(&iter));
92 
93   // This custom cursor uses zero scale.
94   Pickle scale_zero_custom_pickle;
95   // Type and hotspots.
96   scale_zero_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
97   scale_zero_custom_pickle.WriteInt(0);
98   scale_zero_custom_pickle.WriteInt(0);
99   // X & Y
100   scale_zero_custom_pickle.WriteInt(1);
101   scale_zero_custom_pickle.WriteInt(1);
102   // Scale
103   scale_zero_custom_pickle.WriteFloat(0);
104   // Data len including enough data for a 1x1 image.
105   scale_zero_custom_pickle.WriteInt(4);
106   scale_zero_custom_pickle.WriteUInt32(0);
107   // Custom Windows message.
108   scale_zero_custom_pickle.WriteUInt32(0);
109   iter = PickleIterator(scale_zero_custom_pickle);
110   EXPECT_FALSE(custom_cursor.Deserialize(&iter));
111 
112   // This custom cursor uses tiny scale.
113   Pickle scale_tiny_custom_pickle;
114   // Type and hotspots.
115   scale_tiny_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
116   scale_tiny_custom_pickle.WriteInt(0);
117   scale_tiny_custom_pickle.WriteInt(0);
118   // X & Y
119   scale_tiny_custom_pickle.WriteInt(1);
120   scale_tiny_custom_pickle.WriteInt(1);
121   // Scale
122   scale_tiny_custom_pickle.WriteFloat(0.001f);
123   // Data len including enough data for a 1x1 image.
124   scale_tiny_custom_pickle.WriteInt(4);
125   scale_tiny_custom_pickle.WriteUInt32(0);
126   // Custom Windows message.
127   scale_tiny_custom_pickle.WriteUInt32(0);
128   iter = PickleIterator(scale_tiny_custom_pickle);
129   EXPECT_FALSE(custom_cursor.Deserialize(&iter));
130 }
131 
TEST(WebCursorTest,ClampHotspot)132 TEST(WebCursorTest, ClampHotspot) {
133   WebCursor custom_cursor;
134   // This is a valid custom cursor.
135   Pickle ok_custom_pickle;
136   // Type and hotspots.
137   ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
138   // Hotspot is invalid --- outside the bounds of the image.
139   ok_custom_pickle.WriteInt(5);
140   ok_custom_pickle.WriteInt(5);
141   // X & Y
142   ok_custom_pickle.WriteInt(2);
143   ok_custom_pickle.WriteInt(2);
144   // Scale
145   ok_custom_pickle.WriteFloat(1.0);
146   // Data len including enough data for a 2x2 image.
147   ok_custom_pickle.WriteInt(4 * 4);
148   for (size_t i = 0; i < 4; i++)
149     ok_custom_pickle.WriteUInt32(0);
150   // Custom Windows message.
151   ok_custom_pickle.WriteUInt32(0);
152   PickleIterator iter(ok_custom_pickle);
153   ASSERT_TRUE(custom_cursor.Deserialize(&iter));
154 
155   // Convert to WebCursorInfo, make sure the hotspot got clamped.
156   WebCursor::CursorInfo info;
157   custom_cursor.GetCursorInfo(&info);
158   EXPECT_EQ(gfx::Point(1, 1), info.hotspot);
159 
160   // Set hotspot to an invalid point again, pipe back through WebCursor,
161   // and make sure the hotspot got clamped again.
162   info.hotspot = gfx::Point(-1, -1);
163   custom_cursor.InitFromCursorInfo(info);
164   custom_cursor.GetCursorInfo(&info);
165   EXPECT_EQ(gfx::Point(0, 0), info.hotspot);
166 }
167 
TEST(WebCursorTest,EmptyImage)168 TEST(WebCursorTest, EmptyImage) {
169   WebCursor custom_cursor;
170   Pickle broken_cursor_pickle;
171   broken_cursor_pickle.WriteInt(WebCursorInfo::TypeCustom);
172   // Hotspot is at origin
173   broken_cursor_pickle.WriteInt(0);
174   broken_cursor_pickle.WriteInt(0);
175   // X & Y are empty
176   broken_cursor_pickle.WriteInt(0);
177   broken_cursor_pickle.WriteInt(0);
178   // Scale
179   broken_cursor_pickle.WriteFloat(1.0);
180   // No data for the image since the size is 0.
181   broken_cursor_pickle.WriteInt(0);
182   // Custom Windows message.
183   broken_cursor_pickle.WriteInt(0);
184 
185   // Make sure we can read this on all platforms; it is technicaally a valid
186   // cursor.
187   PickleIterator iter(broken_cursor_pickle);
188   ASSERT_TRUE(custom_cursor.Deserialize(&iter));
189 }
190 
TEST(WebCursorTest,Scale2)191 TEST(WebCursorTest, Scale2) {
192   WebCursor custom_cursor;
193   // This is a valid custom cursor.
194   Pickle ok_custom_pickle;
195   // Type and hotspots.
196   ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
197   ok_custom_pickle.WriteInt(0);
198   ok_custom_pickle.WriteInt(0);
199   // X & Y
200   ok_custom_pickle.WriteInt(1);
201   ok_custom_pickle.WriteInt(1);
202   // Scale - 2 image pixels per UI pixel.
203   ok_custom_pickle.WriteFloat(2.0);
204   // Data len including enough data for a 1x1 image.
205   ok_custom_pickle.WriteInt(4);
206   ok_custom_pickle.WriteUInt32(0);
207   // Custom Windows message.
208   ok_custom_pickle.WriteUInt32(0);
209   PickleIterator iter(ok_custom_pickle);
210   EXPECT_TRUE(custom_cursor.Deserialize(&iter));
211 }
212 
213 }  // namespace content
214