| // Copyright (c) 2009 The Chromium 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 "base/pickle.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" |
| #include "webkit/glue/webcursor.h" |
| #include "webkit/tools/test_shell/test_shell_test.h" |
| |
| using WebKit::WebCursorInfo; |
| |
| TEST(WebCursorTest, CursorSerialization) { |
| WebCursor custom_cursor; |
| // This is a valid custom cursor. |
| Pickle ok_custom_pickle; |
| // Type and hotspots. |
| ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom); |
| ok_custom_pickle.WriteInt(0); |
| ok_custom_pickle.WriteInt(0); |
| // X & Y |
| ok_custom_pickle.WriteInt(1); |
| ok_custom_pickle.WriteInt(1); |
| // Data len including enough data for a 1x1 image. |
| ok_custom_pickle.WriteInt(4); |
| ok_custom_pickle.WriteUInt32(0); |
| // Custom Windows message. |
| ok_custom_pickle.WriteUInt32(0); |
| void* iter = NULL; |
| EXPECT_TRUE(custom_cursor.Deserialize(&ok_custom_pickle, &iter)); |
| |
| // This custom cursor has not been send with enough data. |
| Pickle short_custom_pickle; |
| // Type and hotspots. |
| short_custom_pickle.WriteInt(WebCursorInfo::TypeCustom); |
| short_custom_pickle.WriteInt(0); |
| short_custom_pickle.WriteInt(0); |
| // X & Y |
| short_custom_pickle.WriteInt(1); |
| short_custom_pickle.WriteInt(1); |
| // Data len not including enough data for a 1x1 image. |
| short_custom_pickle.WriteInt(3); |
| short_custom_pickle.WriteUInt32(0); |
| // Custom Windows message. |
| ok_custom_pickle.WriteUInt32(0); |
| iter = NULL; |
| EXPECT_FALSE(custom_cursor.Deserialize(&short_custom_pickle, &iter)); |
| |
| // This custom cursor has enough data but is too big. |
| Pickle large_custom_pickle; |
| // Type and hotspots. |
| large_custom_pickle.WriteInt(WebCursorInfo::TypeCustom); |
| large_custom_pickle.WriteInt(0); |
| large_custom_pickle.WriteInt(0); |
| // X & Y |
| static const int kTooBigSize = 4096 + 1; |
| large_custom_pickle.WriteInt(kTooBigSize); |
| large_custom_pickle.WriteInt(1); |
| // Data len including enough data for a 4097x1 image. |
| large_custom_pickle.WriteInt(kTooBigSize * 4); |
| for (int i = 0; i < kTooBigSize; ++i) |
| large_custom_pickle.WriteUInt32(0); |
| // Custom Windows message. |
| ok_custom_pickle.WriteUInt32(0); |
| iter = NULL; |
| EXPECT_FALSE(custom_cursor.Deserialize(&large_custom_pickle, &iter)); |
| |
| // This custom cursor uses negative lengths. |
| Pickle neg_custom_pickle; |
| // Type and hotspots. |
| neg_custom_pickle.WriteInt(WebCursorInfo::TypeCustom); |
| neg_custom_pickle.WriteInt(0); |
| neg_custom_pickle.WriteInt(0); |
| // X & Y |
| neg_custom_pickle.WriteInt(-1); |
| neg_custom_pickle.WriteInt(-1); |
| // Data len including enough data for a 1x1 image. |
| neg_custom_pickle.WriteInt(4); |
| neg_custom_pickle.WriteUInt32(0); |
| // Custom Windows message. |
| neg_custom_pickle.WriteUInt32(0); |
| iter = NULL; |
| EXPECT_FALSE(custom_cursor.Deserialize(&neg_custom_pickle, &iter)); |
| |
| #if defined(OS_WIN) |
| Pickle win32_custom_pickle; |
| WebCursor win32_custom_cursor; |
| win32_custom_cursor.InitFromExternalCursor( |
| reinterpret_cast<HCURSOR>(1000)); |
| EXPECT_TRUE(win32_custom_cursor.Serialize(&win32_custom_pickle)); |
| iter = NULL; |
| EXPECT_TRUE(custom_cursor.Deserialize(&win32_custom_pickle, &iter)); |
| EXPECT_EQ(reinterpret_cast<HCURSOR>(1000), custom_cursor.GetCursor(NULL)); |
| #endif // OS_WIN |
| } |
| |
| TEST(WebCursorTest, ClampHotspot) { |
| WebCursor custom_cursor; |
| // This is a valid custom cursor. |
| Pickle ok_custom_pickle; |
| // Type and hotspots. |
| ok_custom_pickle.WriteInt(WebCursorInfo::TypeCustom); |
| // Hotspot is invalid --- outside the bounds of the image. |
| ok_custom_pickle.WriteInt(5); |
| ok_custom_pickle.WriteInt(5); |
| // X & Y |
| ok_custom_pickle.WriteInt(2); |
| ok_custom_pickle.WriteInt(2); |
| // Data len including enough data for a 2x2 image. |
| ok_custom_pickle.WriteInt(4 * 4); |
| for (size_t i = 0; i < 4; i++) |
| ok_custom_pickle.WriteUInt32(0); |
| // Custom Windows message. |
| ok_custom_pickle.WriteUInt32(0); |
| void* iter = NULL; |
| ASSERT_TRUE(custom_cursor.Deserialize(&ok_custom_pickle, &iter)); |
| |
| // Convert to WebCursorInfo, make sure the hotspot got clamped. |
| WebCursorInfo info; |
| custom_cursor.GetCursorInfo(&info); |
| EXPECT_EQ(gfx::Point(1, 1), gfx::Point(info.hotSpot)); |
| |
| // Set hotspot to an invalid point again, pipe back through WebCursor, |
| // and make sure the hotspot got clamped again. |
| info.hotSpot = gfx::Point(-1, -1); |
| custom_cursor.InitFromCursorInfo(info); |
| custom_cursor.GetCursorInfo(&info); |
| EXPECT_EQ(gfx::Point(0, 0), gfx::Point(info.hotSpot)); |
| } |