Pass touch event time from Java to WebKit

merge from https://android-git.corp.google.com/g/#change,39356
diff --git a/WebCore/dom/Event.h b/WebCore/dom/Event.h
index 4624663..9b55bb8 100644
--- a/WebCore/dom/Event.h
+++ b/WebCore/dom/Event.h
@@ -153,6 +153,10 @@
         bool createdByDOM() const { return m_createdByDOM; }
         void setCreatedByDOM(bool createdByDOM) { m_createdByDOM = createdByDOM; }
 
+#if PLATFORM(ANDROID)
+        void setCreateTime(DOMTimeStamp time) { m_createTime = time; }
+#endif
+
     protected:
         Event();
         Event(const AtomicString& type, bool canBubble, bool cancelable);
diff --git a/WebCore/page/EventHandler.cpp b/WebCore/page/EventHandler.cpp
index cb3bca6..bdcd6aa 100644
--- a/WebCore/page/EventHandler.cpp
+++ b/WebCore/page/EventHandler.cpp
@@ -2662,7 +2662,9 @@
                                                    m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
                                                    event.ctrlKey(), event.altKey(), event.shiftKey(),
                                                    event.metaKey());
-
+#if PLATFORM(ANDROID)
+        cancelEv->setCreateTime(static_cast<DOMTimeStamp>(event.eventTime()));
+#endif
         ExceptionCode ec = 0;
         m_touchEventTarget->dispatchEvent(cancelEv.get(), ec);
         defaultPrevented |= cancelEv->defaultPrevented();
@@ -2677,6 +2679,9 @@
                                                    m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
                                                    event.ctrlKey(), event.altKey(), event.shiftKey(),
                                                    event.metaKey());
+#if PLATFORM(ANDROID)
+        endEv->setCreateTime(static_cast<DOMTimeStamp>(event.eventTime()));
+#endif
         ExceptionCode ec = 0;
         m_touchEventTarget->dispatchEvent(endEv.get(), ec);
 #if PLATFORM(ANDROID)
@@ -2703,6 +2708,7 @@
                                                        m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
                                                        event.ctrlKey(), event.altKey(), event.shiftKey(),
                                                        event.metaKey());
+            longpressEv->setCreateTime(static_cast<DOMTimeStamp>(event.eventTime()));
 
             ExceptionCode ec = 0;
             m_touchEventTarget->dispatchEvent(longpressEv.get(), ec);
@@ -2716,6 +2722,7 @@
                                                        m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
                                                        event.ctrlKey(), event.altKey(), event.shiftKey(),
                                                        event.metaKey());
+            doubleTapEv->setCreateTime(static_cast<DOMTimeStamp>(event.eventTime()));
 
             ExceptionCode ec = 0;
             m_touchEventTarget->dispatchEvent(doubleTapEv.get(), ec);
@@ -2730,6 +2737,9 @@
                                                        m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
                                                        event.ctrlKey(), event.altKey(), event.shiftKey(),
                                                        event.metaKey());
+#if PLATFORM(ANDROID)
+            startEv->setCreateTime(static_cast<DOMTimeStamp>(event.eventTime()));
+#endif
             ExceptionCode ec = 0;
             m_touchEventTarget->dispatchEvent(startEv.get(), ec);
             defaultPrevented |= startEv->defaultPrevented();
@@ -2749,6 +2759,9 @@
                                                    m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
                                                    event.ctrlKey(), event.altKey(), event.shiftKey(),
                                                    event.metaKey());
+#if PLATFORM(ANDROID)
+        moveEv->setCreateTime(static_cast<DOMTimeStamp>(event.eventTime()));
+#endif
         ExceptionCode ec = 0;
         m_touchEventTarget->dispatchEvent(moveEv.get(), ec);
         defaultPrevented |= moveEv->defaultPrevented();
diff --git a/WebCore/platform/PlatformTouchEvent.h b/WebCore/platform/PlatformTouchEvent.h
index 1f071ce..854db3c 100644
--- a/WebCore/platform/PlatformTouchEvent.h
+++ b/WebCore/platform/PlatformTouchEvent.h
@@ -60,7 +60,8 @@
 #if PLATFORM(QT)
     PlatformTouchEvent(QTouchEvent*);
 #elif PLATFORM(ANDROID)
-    PlatformTouchEvent(const IntPoint& windowPos, TouchEventType, PlatformTouchPoint::State);
+    // TODO (benm): eventTime is new and needs to be upstream
+    PlatformTouchEvent(const IntPoint& windowPos, TouchEventType, PlatformTouchPoint::State, long eventTime);
 #endif
 
     TouchEventType type() const { return m_type; }
@@ -71,6 +72,8 @@
     bool shiftKey() const { return m_shiftKey; }
     bool metaKey() const { return m_metaKey; }
 
+    long eventTime() const { return m_eventTime; }
+
 private:
     TouchEventType m_type;
     Vector<PlatformTouchPoint> m_touchPoints;
@@ -78,6 +81,7 @@
     bool m_altKey;
     bool m_shiftKey;
     bool m_metaKey;
+    long m_eventTime;
 };
 
 }
diff --git a/WebCore/platform/android/PlatformTouchEventAndroid.cpp b/WebCore/platform/android/PlatformTouchEventAndroid.cpp
index 65d787d..d2fcebb 100644
--- a/WebCore/platform/android/PlatformTouchEventAndroid.cpp
+++ b/WebCore/platform/android/PlatformTouchEventAndroid.cpp
@@ -30,12 +30,14 @@
 
 namespace WebCore {
 
-PlatformTouchEvent::PlatformTouchEvent(const IntPoint& windowPos, TouchEventType type, PlatformTouchPoint::State state)
+// TODO (benm): eventTime is new and needs to be upstream
+PlatformTouchEvent::PlatformTouchEvent(const IntPoint& windowPos, TouchEventType type, PlatformTouchPoint::State state, long eventTime)
     : m_type(type)
     , m_ctrlKey(false)
     , m_altKey(false)
     , m_shiftKey(false)
     , m_metaKey(false)
+    , m_eventTime(eventTime)
 {
     m_touchPoints.append(PlatformTouchPoint(windowPos, state));
 }
diff --git a/WebCore/plugins/android/PluginViewAndroid.cpp b/WebCore/plugins/android/PluginViewAndroid.cpp
index 88e7f0b..0abbc13 100644
--- a/WebCore/plugins/android/PluginViewAndroid.cpp
+++ b/WebCore/plugins/android/PluginViewAndroid.cpp
@@ -185,7 +185,7 @@
         return;
 
     ANPEvent evt;
-    SkANP::InitEvent(&evt, kTouch_ANPEventType);
+    SkANP::InitEvent(&evt, kTouch_ANPEventType, event->timeStamp());
 
     bool ignoreRet = false;
     const AtomicString& type = event->type();
@@ -247,7 +247,7 @@
     ANPEvent    evt;
 
     if (isUp || isDown) {
-        SkANP::InitEvent(&evt, kMouse_ANPEventType);
+        SkANP::InitEvent(&evt, kMouse_ANPEventType, event->timeStamp());
         evt.data.mouse.action = isUp ? kUp_ANPMouseAction : kDown_ANPMouseAction;
 
         // Convert to coordinates that are relative to the plugin.
@@ -309,7 +309,7 @@
     bool ignoreEvent = false;
 
     ANPEvent evt;
-    SkANP::InitEvent(&evt, kKey_ANPEventType);
+    SkANP::InitEvent(&evt, kKey_ANPEventType, event->timeStamp());
 
     switch (pke->type()) {
         case PlatformKeyboardEvent::KeyDown:
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index 2ba29b9..8d8ebb9 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -1929,7 +1929,7 @@
     }
 }
 
-int WebViewCore::handleTouchEvent(int action, int x, int y)
+int WebViewCore::handleTouchEvent(int action, int x, int y, long time)
 {
     int preventDefault = 0;
 
@@ -1984,7 +1984,7 @@
 
     m_lastTouchPoint = pt;
 
-    WebCore::PlatformTouchEvent te(pt, type, touchState);
+    WebCore::PlatformTouchEvent te(pt, type, touchState, time);
     preventDefault = m_mainFrame->eventHandler()->handleTouchEvent(te);
 #endif
 
@@ -2677,14 +2677,14 @@
     return ret;
 }
 
-static jint HandleTouchEvent(JNIEnv *env, jobject obj, jint action, jint x, jint y)
+static jint HandleTouchEvent(JNIEnv *env, jobject obj, jint action, jint x, jint y, jlong time)
 {
 #ifdef ANDROID_INSTRUMENT
     TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
 #endif
     WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
-    return viewImpl->handleTouchEvent(action, x, y);
+    return viewImpl->handleTouchEvent(action, x, y, time);
 }
 
 static void TouchUp(JNIEnv *env, jobject obj, jint touchGeneration,
@@ -3087,7 +3087,7 @@
         (void*) SaveDocumentState },
     { "nativeFindAddress", "(Ljava/lang/String;Z)Ljava/lang/String;",
         (void*) FindAddress },
-    { "nativeHandleTouchEvent", "(III)I",
+    { "nativeHandleTouchEvent", "(IIIJ)I",
             (void*) HandleTouchEvent },
     { "nativeTouchUp", "(IIIII)V",
         (void*) TouchUp },
diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h
index 2252878..58cb7df 100644
--- a/WebKit/android/jni/WebViewCore.h
+++ b/WebKit/android/jni/WebViewCore.h
@@ -282,7 +282,7 @@
         /**
          * Handle touch event
          */
-        int handleTouchEvent(int action, int x, int y);
+        int handleTouchEvent(int action, int x, int y, long time);
 
         /**
          * Handle motionUp event from the UI thread (called touchUp in the
diff --git a/WebKit/android/plugins/SkANP.cpp b/WebKit/android/plugins/SkANP.cpp
index 9bbb09e..bb3fe45 100644
--- a/WebKit/android/plugins/SkANP.cpp
+++ b/WebKit/android/plugins/SkANP.cpp
@@ -26,6 +26,7 @@
 // must include config.h first for webkit to fiddle with new/delete
 #include "config.h"
 #include "SkANP.h"
+#include <wtf/CurrentTime.h>
 
 SkRect* SkANP::SetRect(SkRect* dst, const ANPRectF& src) {
     dst->set(SkFloatToScalar(src.left),
@@ -102,4 +103,11 @@
 void SkANP::InitEvent(ANPEvent* event, ANPEventType et) {
     event->inSize = sizeof(ANPEvent);
     event->eventType = et;
+    event->timeStamp = currentTime() * 1000.0;
+}
+
+void SkANP::InitEvent(ANPEvent* event, ANPEventType et, long time) {
+    event->inSize = sizeof(ANPEvent);
+    event->eventType = et;
+    event->timeStamp = time;
 }
diff --git a/WebKit/android/plugins/SkANP.h b/WebKit/android/plugins/SkANP.h
index 5c2a936..8590e10 100644
--- a/WebKit/android/plugins/SkANP.h
+++ b/WebKit/android/plugins/SkANP.h
@@ -74,6 +74,7 @@
     static bool SetBitmap(ANPBitmap* dst, const SkBitmap& src);
     
     static void InitEvent(ANPEvent* event, ANPEventType et);
+    static void InitEvent(ANPEvent* event, ANPEventType et, long time);
 };
 
 #endif
diff --git a/WebKit/android/plugins/android_npapi.h b/WebKit/android/plugins/android_npapi.h
index 4173528..1f2072d 100644
--- a/WebKit/android/plugins/android_npapi.h
+++ b/WebKit/android/plugins/android_npapi.h
@@ -893,6 +893,7 @@
 /* This is what is passed to NPP_HandleEvent() */
 struct ANPEvent {
     uint32_t        inSize;  // size of this struct in bytes
+    uint32_t        timeStamp;
     ANPEventType    eventType;
     // use based on the value in eventType
     union {