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