summaryrefslogtreecommitdiffstats
path: root/webkit/glue/webcursor.h
diff options
context:
space:
mode:
authorananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-09 01:20:38 +0000
committerananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-09 01:20:38 +0000
commitcf4e5eb1df0fcbf192584b61e83e0b85cf23a1cf (patch)
treebce3c121d9679666d8acdf73cb082a684cf491e4 /webkit/glue/webcursor.h
parent710e056bd5005f8d0f9f9d5f4b8623f9c9dd7004 (diff)
downloadchromium_src-cf4e5eb1df0fcbf192584b61e83e0b85cf23a1cf.zip
chromium_src-cf4e5eb1df0fcbf192584b61e83e0b85cf23a1cf.tar.gz
chromium_src-cf4e5eb1df0fcbf192584b61e83e0b85cf23a1cf.tar.bz2
Add support for custom cursors set by windowless plugins. Windowless plugins typically set the cursor in NPP_HandleEvent for WM_MOUSEMOVE.The current implementation looks for the cursor type and if the typedoes not match predefinedcursor types defaults to the pointer cursor.
The fixes are as below:- 1. Marshal the HCURSOR after copying it to ensure that it remains valid. This works as a HCURSOR is a user object and can be used across processes. Ideally we would like to convert it to a skia bitmap but there are issues with converting monochrome cursors. 2. Added support for marshaling platform specific data in the webcursor Serialize/Deserialize functions. This is in the form of functions like InitPlatformData, SerializePlatformData, DeserializePlatformData, etc. which are stubbed out for the other platforms. 3. Mimic webkit windowless plugin behavior where it sets a flag to ignore the next setCursor after HandleEvent of WM_MOUSEMOVE. If we don't do this the cursor keeps changing between a pointerCursor and the cursor set by the plugin which also causes flicker. 4. Fixed the WebCursor::IsEqual function to ensure that it checks all fields for equality. 5. The browser(RenderWidgetHostViewWin) now maintains a WebCursor instance representing the current cursor. Any cursor updates received from the renderer update the current cursor member maintained by the browser. 6. We intercept the SetCursor API for windowless plugins like Flash and Silverlight and remember the cursor being set. We don't invoke the original API as the browser UI thread would do it anyways. This fixes the annoying cursor flicker caused by the windowless flash plugin instance constantly setting the cursor even when the tab is not visible. This fixes bug http://code.google.com/p/chromium/issues/detail?id=3800. Review URL: http://codereview.chromium.org/15088 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@7798 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue/webcursor.h')
-rw-r--r--webkit/glue/webcursor.h59
1 files changed, 47 insertions, 12 deletions
diff --git a/webkit/glue/webcursor.h b/webkit/glue/webcursor.h
index a64df6c..1dbf3c3 100644
--- a/webkit/glue/webcursor.h
+++ b/webkit/glue/webcursor.h
@@ -5,6 +5,7 @@
#ifndef WEBKIT_GLUE_WEBCURSOR_H_
#define WEBKIT_GLUE_WEBCURSOR_H_
+#include "base/basictypes.h"
#include "base/gfx/point.h"
#include "base/gfx/size.h"
@@ -40,6 +41,11 @@ class WebCursor {
public:
WebCursor();
explicit WebCursor(const WebCore::PlatformCursor& platform_cursor);
+ ~WebCursor();
+
+ // Copy constructor/assignment operator combine.
+ WebCursor(const WebCursor& other);
+ const WebCursor& operator=(const WebCursor& other);
// Serialization / De-serialization
bool Deserialize(const Pickle* pickle, void** iter);
@@ -55,18 +61,16 @@ class WebCursor {
bool IsEqual(const WebCursor& other) const;
#if defined(OS_WIN)
- // If the underlying cursor type is not a custom cursor, this functions uses
- // the LoadCursor API to load the cursor and returns it. The caller SHOULD
- // NOT pass the resulting handling to DestroyCursor. Returns NULL on error.
- HCURSOR GetCursor(HINSTANCE module_handle) const;
-
- // If the underlying cursor type is a custom cursor, this function generates
- // a cursor and returns it. The responsiblity of freeing the cursor handle
- // lies with the caller. Returns NULL on error.
- HCURSOR GetCustomCursor() const;
-
- // Initialize this from the given Windows cursor.
- void InitFromCursor(HCURSOR handle);
+ // Returns a HCURSOR representing the current WebCursor instance.
+ // The ownership of the HCURSOR (does not apply to external cursors) remains
+ // with the WebCursor instance.
+ HCURSOR GetCursor(HINSTANCE module_handle);
+
+ // Initialize this from the given Windows cursor. The caller must ensure that
+ // the HCURSOR remains valid by not invoking the DestroyCursor/DestroyIcon
+ // APIs on it.
+ void InitFromExternalCursor(HCURSOR handle);
+
#elif defined(OS_LINUX)
// Return the stock GdkCursorType for this cursor, or GDK_CURSOR_IS_PIXMAP
// if it's a custom cursor.
@@ -80,6 +84,29 @@ class WebCursor {
#endif
private:
+ // Copies the contents of the WebCursor instance passed in.
+ void Copy(const WebCursor& other);
+
+ // Cleans up the WebCursor instance.
+ void Clear();
+
+ // Platform specific initialization goes here.
+ void InitPlatformData();
+
+ // Platform specific Serialization / De-serialization
+ bool SerializePlatformData(Pickle* pickle) const;
+ bool DeserializePlatformData(const Pickle* pickle, void** iter);
+
+ // Returns true if the platform data in the current cursor object
+ // matches that of the cursor passed in.
+ bool IsPlatformDataEqual(const WebCursor& other) const ;
+
+ // Copies platform specific data from the WebCursor instance passed in.
+ void CopyPlatformData(const WebCursor& other);
+
+ // Platform specific cleanup.
+ void CleanupPlatformData();
+
void SetCustomData(WebCore::Image* image);
// WebCore::PlatformCursor type.
@@ -91,6 +118,14 @@ class WebCursor {
// Platform-inspecific because it can be serialized.
gfx::Size custom_size_;
std::vector<char> custom_data_;
+
+#if defined(OS_WIN)
+ // An externally generated HCURSOR. We assume that it remains valid, i.e we
+ // don't attempt to copy the HCURSOR.
+ HCURSOR external_cursor_;
+ // A custom cursor created from custom bitmap data by Webkit.
+ HCURSOR custom_cursor_;
+#endif // OS_WIN
};
#endif // WEBKIT_GLUE_WEBCURSOR_H_