Home | History | Annotate | Download | only in cursors
      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 
     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 
     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 
    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 
    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 
    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