Home | History | Annotate | Download | only in glue
      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 
     11 using WebKit::WebCursorInfo;
     12 
     13 TEST(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 
     97 TEST(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