1// Copyright (c) 2009 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 "testing/gtest/include/gtest/gtest.h"
7#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h"
8#include "webkit/glue/webcursor.h"
9#include "webkit/tools/test_shell/test_shell_test.h"
10
11using WebKit::WebCursorInfo;
12
13TEST(WebCursorTest, CursorSerialization) {
14  WebCursor custom_cursor;
15  // This is a valid custom cursor.
16  Pickle ok_custom_pickle;
17  // Type and hotspots.
18  ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
19  ok_custom_pickle.WriteInt(0);
20  ok_custom_pickle.WriteInt(0);
21  // X & Y
22  ok_custom_pickle.WriteInt(1);
23  ok_custom_pickle.WriteInt(1);
24  // Data len including enough data for a 1x1 image.
25  ok_custom_pickle.WriteInt(4);
26  ok_custom_pickle.WriteUInt32(0);
27  // Custom Windows message.
28  ok_custom_pickle.WriteUInt32(0);
29  void* iter = NULL;
30  EXPECT_TRUE(custom_cursor.Deserialize(&ok_custom_pickle, &iter));
31
32  // This custom cursor has not been send with enough data.
33  Pickle short_custom_pickle;
34  // Type and hotspots.
35  short_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
36  short_custom_pickle.WriteInt(0);
37  short_custom_pickle.WriteInt(0);
38  // X & Y
39  short_custom_pickle.WriteInt(1);
40  short_custom_pickle.WriteInt(1);
41  // Data len not including enough data for a 1x1 image.
42  short_custom_pickle.WriteInt(3);
43  short_custom_pickle.WriteUInt32(0);
44  // Custom Windows message.
45  ok_custom_pickle.WriteUInt32(0);
46  iter = NULL;
47  EXPECT_FALSE(custom_cursor.Deserialize(&short_custom_pickle, &iter));
48
49  // This custom cursor has enough data but is too big.
50  Pickle large_custom_pickle;
51  // Type and hotspots.
52  large_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
53  large_custom_pickle.WriteInt(0);
54  large_custom_pickle.WriteInt(0);
55  // X & Y
56  static const int kTooBigSize = 4096 + 1;
57  large_custom_pickle.WriteInt(kTooBigSize);
58  large_custom_pickle.WriteInt(1);
59  // Data len including enough data for a 4097x1 image.
60  large_custom_pickle.WriteInt(kTooBigSize * 4);
61  for (int i = 0; i < kTooBigSize; ++i)
62    large_custom_pickle.WriteUInt32(0);
63  // Custom Windows message.
64  ok_custom_pickle.WriteUInt32(0);
65  iter = NULL;
66  EXPECT_FALSE(custom_cursor.Deserialize(&large_custom_pickle, &iter));
67
68  // This custom cursor uses negative lengths.
69  Pickle neg_custom_pickle;
70  // Type and hotspots.
71  neg_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
72  neg_custom_pickle.WriteInt(0);
73  neg_custom_pickle.WriteInt(0);
74  // X & Y
75  neg_custom_pickle.WriteInt(-1);
76  neg_custom_pickle.WriteInt(-1);
77  // Data len including enough data for a 1x1 image.
78  neg_custom_pickle.WriteInt(4);
79  neg_custom_pickle.WriteUInt32(0);
80  // Custom Windows message.
81  neg_custom_pickle.WriteUInt32(0);
82  iter = NULL;
83  EXPECT_FALSE(custom_cursor.Deserialize(&neg_custom_pickle, &iter));
84
85#if defined(OS_WIN)
86  Pickle win32_custom_pickle;
87  WebCursor win32_custom_cursor;
88  win32_custom_cursor.InitFromExternalCursor(
89      reinterpret_cast<HCURSOR>(1000));
90  EXPECT_TRUE(win32_custom_cursor.Serialize(&win32_custom_pickle));
91  iter = NULL;
92  EXPECT_TRUE(custom_cursor.Deserialize(&win32_custom_pickle, &iter));
93  EXPECT_EQ(reinterpret_cast<HCURSOR>(1000), custom_cursor.GetCursor(NULL));
94#endif  // OS_WIN
95}
96
97TEST(WebCursorTest, ClampHotspot) {
98  WebCursor custom_cursor;
99  // This is a valid custom cursor.
100  Pickle ok_custom_pickle;
101  // Type and hotspots.
102  ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom);
103  // Hotspot is invalid --- outside the bounds of the image.
104  ok_custom_pickle.WriteInt(5);
105  ok_custom_pickle.WriteInt(5);
106  // X & Y
107  ok_custom_pickle.WriteInt(2);
108  ok_custom_pickle.WriteInt(2);
109  // Data len including enough data for a 2x2 image.
110  ok_custom_pickle.WriteInt(4 * 4);
111  for (size_t i = 0; i < 4; i++)
112    ok_custom_pickle.WriteUInt32(0);
113  // Custom Windows message.
114  ok_custom_pickle.WriteUInt32(0);
115  void* iter = NULL;
116  ASSERT_TRUE(custom_cursor.Deserialize(&ok_custom_pickle, &iter));
117
118  // Convert to WebCursorInfo, make sure the hotspot got clamped.
119  WebCursorInfo info;
120  custom_cursor.GetCursorInfo(&info);
121  EXPECT_EQ(gfx::Point(1, 1), gfx::Point(info.hotSpot));
122
123  // Set hotspot to an invalid point again, pipe back through WebCursor,
124  // and make sure the hotspot got clamped again.
125  info.hotSpot = gfx::Point(-1, -1);
126  custom_cursor.InitFromCursorInfo(info);
127  custom_cursor.GetCursorInfo(&info);
128  EXPECT_EQ(gfx::Point(0, 0), gfx::Point(info.hotSpot));
129}
130