Added support for plugins receiving lifecycle events such as gain/lose focus.
diff --git a/WebCore/plugins/android/PluginViewAndroid.cpp b/WebCore/plugins/android/PluginViewAndroid.cpp
index 9a2f7f6..0cb33f8 100644
--- a/WebCore/plugins/android/PluginViewAndroid.cpp
+++ b/WebCore/plugins/android/PluginViewAndroid.cpp
@@ -149,22 +149,22 @@
m_isWindowed = false; // we don't support windowed yet
m_window = new PluginWidgetAndroid(this);
-
+
m_npWindow.type = NPWindowTypeDrawable;
m_npWindow.window = 0;
}
-
+
PluginView::~PluginView()
{
stop();
-
+
deleteAllValues(m_requests);
-
+
freeStringArray(m_paramNames, m_paramCount);
freeStringArray(m_paramValues, m_paramCount);
-
+
m_parentFrame->script()->cleanupScriptObjectsForPlugin(this);
-
+
// Since we have no legacy plugins to check, we ignore the quirks check
// if (m_plugin && !m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin))
if (m_plugin) {
@@ -186,38 +186,47 @@
ASSERT(m_status == PluginStatusCanNotFindPlugin);
return;
}
-
+
if (!m_plugin->load()) {
m_plugin = 0;
m_status = PluginStatusCanNotLoadPlugin;
return;
}
-
+
if (!start()) {
m_status = PluginStatusCanNotLoadPlugin;
return;
}
-
+
m_status = PluginStatusLoadedSuccessfully;
}
-
+
void PluginView::handleMouseEvent(MouseEvent* event)
{
const AtomicString& type = event->type();
bool isDown = (eventNames().mousedownEvent == type);
bool isUp = (eventNames().mouseupEvent == type);
- if (!isDown && !isUp) {
- return;
- }
-
- ANPEvent evt;
- SkANP::InitEvent(&evt, kTouch_ANPEventType);
+ bool isOver = (eventNames().mouseoverEvent == type);
+ bool isOut = (eventNames().mouseoutEvent == type);
- evt.data.touch.action = isDown ? kDown_ANPTouchAction : kUp_ANPTouchAction;
- evt.data.touch.modifiers = 0; // todo
- // these are relative to plugin
- evt.data.touch.x = event->pageX() - m_npWindow.x;
- evt.data.touch.y = event->pageY() - m_npWindow.y;
+ ANPEvent evt;
+
+ if (isDown || isUp) {
+ SkANP::InitEvent(&evt, kTouch_ANPEventType);
+ evt.data.touch.action = isDown ? kDown_ANPTouchAction : kUp_ANPTouchAction;
+ evt.data.touch.modifiers = 0; // todo
+ // these are relative to plugin
+ evt.data.touch.x = event->pageX() - m_npWindow.x;
+ evt.data.touch.y = event->pageY() - m_npWindow.y;
+ }
+ else if (isOver || isOut) {
+ SkANP::InitEvent(&evt, kLifecycle_ANPEventType);
+ evt.data.lifecycle.action = isOver ? kGainFocus_ANPLifecycleAction : kLooseFocus_ANPLifecycleAction;
+ }
+ else {
+ return;
+ }
+
if (m_plugin->pluginFuncs()->event(m_instance, &evt)) {
event->setDefaultHandled();
}
@@ -272,7 +281,7 @@
evt.data.key.repeatCount = pke->repeatCount();
evt.data.key.modifiers = make_modifiers(pke->shiftKey(), pke->altKey());
evt.data.key.unichar = pke->unichar();
-
+
if (m_plugin->pluginFuncs()->event(m_instance, &evt)) {
event->setDefaultHandled();
}
@@ -309,7 +318,7 @@
{
if (!m_isStarted)
return;
-
+
const int width = rect.width();
const int height = rect.height();
@@ -317,24 +326,24 @@
IntPoint p = parent()->convertToContainingWindow(rect.location());
m_npWindow.x = p.x();
m_npWindow.y = p.y();
-
+
m_npWindow.width = width;
m_npWindow.height = height;
-
+
m_npWindow.clipRect.left = 0;
m_npWindow.clipRect.top = 0;
m_npWindow.clipRect.right = width;
m_npWindow.clipRect.bottom = height;
if (m_plugin->pluginFuncs()->setwindow) {
-#if USE(JSC)
+#if USE(JSC)
JSC::JSLock::DropAllLocks dropAllLocks(false);
-#endif
+#endif
setCallingPlugin(true);
m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
setCallingPlugin(false);
}
-
+
m_window->setWindow(m_npWindow.x, m_npWindow.y, width, height,
m_isTransparent);
}
@@ -446,13 +455,13 @@
*retValue = !networkStateNotifier().onLine();
return NPERR_NO_ERROR;
}
-
+
case kSupportedDrawingModel_ANPGetValue: {
uint32_t* bits = reinterpret_cast<uint32_t*>(value);
*bits = (1 << kBitmap_ANPDrawingModel);
return NPERR_NO_ERROR;
}
-
+
default: {
NPError error = NPERR_GENERIC_ERROR;
(void)anp_getInterface(variable, value, &error);
@@ -538,12 +547,12 @@
paintMissingPluginIcon(context, rect);
return;
}
-
+
IntRect frame = frameRect();
if (!frame.width() || !frame.height()) {
return;
}
-
+
m_window->inval(rect, false);
m_window->draw(android_gc2canvas(context));
}
@@ -559,8 +568,8 @@
}
// new as of SVN 38068, Nov 5 2008
-void PluginView::setParentVisible(bool) {
- notImplemented();
+void PluginView::setParentVisible(bool) {
+ notImplemented();
}
} // namespace WebCore
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index f50dd1a..1abb90a 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -2412,14 +2412,16 @@
static void Pause(JNIEnv* env, jobject obj)
{
ANPEvent event;
- SkANP::InitEvent(&event, kPause_ANPEventType);
+ SkANP::InitEvent(&event, kLifecycle_ANPEventType);
+ event.data.lifecycle.action = kPause_ANPLifecycleAction;
GET_NATIVE_VIEW(env, obj)->sendPluginEvent(event);
}
static void Resume(JNIEnv* env, jobject obj)
{
ANPEvent event;
- SkANP::InitEvent(&event, kResume_ANPEventType);
+ SkANP::InitEvent(&event, kLifecycle_ANPEventType);
+ event.data.lifecycle.action = kResume_ANPLifecycleAction;
GET_NATIVE_VIEW(env, obj)->sendPluginEvent(event);
}
diff --git a/WebKit/android/plugins/android_npapi.h b/WebKit/android/plugins/android_npapi.h
index a3ffdfb..ba48321 100644
--- a/WebKit/android/plugins/android_npapi.h
+++ b/WebKit/android/plugins/android_npapi.h
@@ -24,10 +24,10 @@
*/
/* Defines the android-specific types and functions as part of npapi
-
+
In particular, defines the window and event types that are passed to
NPN_GetValue, NPP_SetWindow and NPP_HandleEvent.
-
+
To minimize what native libraries the plugin links against, some
functionality is provided via function-ptrs (e.g. time, sound)
*/
@@ -91,9 +91,9 @@
// NPN_GetValue
/* queries for a specific ANPInterface.
-
+
Maybe called with NULL for the NPP instance
-
+
NPN_GetValue(inst, interface_enum, ANPInterface*)
*/
#define kLogInterfaceV0_ANPGetValue ((NPNVariable)1000)
@@ -106,9 +106,9 @@
#define kWindowInterfaceV0_ANPGetValue ((NPNVariable)1007)
/* queries for which drawing model is desired (for the draw event)
-
+
Should be called inside NPP_New(...)
-
+
NPN_GetValue(inst, ANPSupportedDrawingModel_EnumValue, uint32_t* bits)
*/
#define kSupportedDrawingModel_ANPGetValue ((NPNVariable)2000)
@@ -117,7 +117,7 @@
// NPN_GetValue
/** Reqeust to set the drawing model.
-
+
NPN_SetValue(inst, ANPRequestDrawingModel_EnumValue, (void*)foo_DrawingModel)
*/
#define kRequestDrawingModel_ANPSetValue ((NPPVariable)1000)
@@ -138,7 +138,7 @@
/* Interfaces provide additional functionality to the plugin via function ptrs.
Once an interface is retrived, it is valid for the lifetime of the plugin
(just like browserfuncs).
-
+
All ANPInterfaces begin with an inSize field, which must be set by the
caller (plugin) with the number of bytes allocated for the interface.
e.g. SomeInterface si; si.inSize = sizeof(si); browser->getvalue(..., &si);
@@ -351,7 +351,7 @@
*/
ANPTypeface* (*createFromTypeface)(const ANPTypeface* family,
ANPTypefaceStyle);
-
+
/** Return the owner count of the typeface. A newly created typeface has an
owner count of 1. When the owner count is reaches 0, the typeface is
deleted.
@@ -366,7 +366,7 @@
the typeface is deleted.
*/
void (*unref)(ANPTypeface*);
-
+
/** Return the style bits for the specified typeface
*/
ANPTypefaceStyle (*getStyle)(const ANPTypeface*);
@@ -376,19 +376,19 @@
/* Return a new paint object, which holds all of the color and style
attributes that affect how things (geometry, text, bitmaps) are drawn
in a ANPCanvas.
-
+
The paint that is returned is not tied to any particular plugin
instance, but it must only be accessed from one thread at a time.
*/
ANPPaint* (*newPaint)();
void (*deletePaint)(ANPPaint*);
-
+
ANPPaintFlags (*getFlags)(const ANPPaint*);
void (*setFlags)(ANPPaint*, ANPPaintFlags);
-
+
ANPColor (*getColor)(const ANPPaint*);
void (*setColor)(ANPPaint*, ANPColor);
-
+
ANPPaintStyle (*getStyle)(const ANPPaint*);
void (*setStyle)(ANPPaint*, ANPPaintStyle);
@@ -400,7 +400,7 @@
void (*setStrokeMiter)(ANPPaint*, float);
void (*setStrokeCap)(ANPPaint*, ANPPaintCap);
void (*setStrokeJoin)(ANPPaint*, ANPPaintJoin);
-
+
ANPTextEncoding (*getTextEncoding)(const ANPPaint*);
ANPPaintAlign (*getTextAlign)(const ANPPaint*);
float (*getTextSize)(const ANPPaint*);
@@ -428,7 +428,7 @@
*/
float (*measureText)(ANPPaint*, const void* text, uint32_t byteLength,
ANPRectF* bounds);
-
+
/** Return the number of unichars specifed by the text.
If widths is not null, returns the array of advance widths for each
unichar.
@@ -436,7 +436,7 @@
*/
int (*getTextWidths)(ANPPaint*, const void* text, uint32_t byteLength,
float widths[], ANPRectF bounds[]);
-
+
/** Return in metrics the spacing values for text, respecting the paint's
typeface and pointsize, and return the spacing between lines
(descent - ascent + leading). If metrics is NULL, it will be ignored.
@@ -452,7 +452,7 @@
goes out of scope. In the case of creating a canvas to draw into the
pixels provided by kDraw_ANPEventType, those pixels are only while
handling that event.
-
+
The canvas that is returned is not tied to any particular plugin
instance, but it must only be accessed from one thread at a time.
*/
@@ -505,7 +505,7 @@
describing the subset of the window that will be drawn to (may be null)
return true if the bitmap for that window can be accessed, and if so,
fill out the specified ANPBitmap to point to the window's pixels.
-
+
When drawing is complete, call unlock(window)
*/
bool (*lockRect)(void* window, const ANPRectI* inval, ANPBitmap*);
@@ -567,11 +567,11 @@
/** Called to feed sample data to the track. This will be called in a separate
thread. However, you may call trackStop() from the callback (but you
cannot delete the track).
-
+
For example, when you have written the last chunk of sample data, you can
immediately call trackStop(). This will take effect after the current
buffer has been played.
-
+
The "user" parameter is the same value that was passed to newTrack()
*/
typedef void (*ANPAudioCallbackProc)(ANPAudioEvent event, void* user,
@@ -606,8 +606,7 @@
kKey_ANPEventType = 1,
kTouch_ANPEventType = 2,
kDraw_ANPEventType = 3,
- kPause_ANPEventType = 4, // no extra data in the event
- kResume_ANPEventType = 5 // no extra data in the event
+ kLifecycle_ANPEventType = 4
};
typedef int32_t ANPEventType;
@@ -643,6 +642,14 @@
} data;
};
+enum ANPLifecycleActions {
+ kPause_ANPLifecycleAction = 0,
+ kResume_ANPLifecycleAction = 1,
+ kGainFocus_ANPLifecycleAction = 2,
+ kLooseFocus_ANPLifecycleAction = 3,
+};
+typedef uint32_t ANPLifecycleAction;
+
/* This is what is passed to NPP_HandleEvent() */
struct ANPEvent {
uint32_t inSize; // size of this struct in bytes
@@ -663,6 +670,9 @@
int32_t x; // relative to your "window" (0...width)
int32_t y; // relative to your "window" (0...height)
} touch;
+ struct {
+ ANPLifecycleAction action;
+ } lifecycle;
ANPDrawContext drawContext;
int32_t other[8];
} data;