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;
