Add support for setting key states with touch events on Android.

Properly guard non-upstreamed common code.

Change-Id: I109dbe97d8c96efe3660ce3893a4e730927e90ef
diff --git a/WebCore/platform/PlatformTouchEvent.h b/WebCore/platform/PlatformTouchEvent.h
index 854db3c..56d1020 100644
--- a/WebCore/platform/PlatformTouchEvent.h
+++ b/WebCore/platform/PlatformTouchEvent.h
@@ -60,8 +60,8 @@
 #if PLATFORM(QT)
     PlatformTouchEvent(QTouchEvent*);
 #elif PLATFORM(ANDROID)
-    // TODO (benm): eventTime is new and needs to be upstream
-    PlatformTouchEvent(const IntPoint& windowPos, TouchEventType, PlatformTouchPoint::State, long eventTime);
+    // TODO (benm): eventTime and metaState are new and need to be upstreamed.
+    PlatformTouchEvent(const IntPoint& windowPos, TouchEventType, PlatformTouchPoint::State, long eventTime, int metaState);
 #endif
 
     TouchEventType type() const { return m_type; }
@@ -72,7 +72,9 @@
     bool shiftKey() const { return m_shiftKey; }
     bool metaKey() const { return m_metaKey; }
 
+#if PLATFORM(ANDROID)
     long eventTime() const { return m_eventTime; }
+#endif
 
 private:
     TouchEventType m_type;
@@ -81,7 +83,9 @@
     bool m_altKey;
     bool m_shiftKey;
     bool m_metaKey;
+#if PLATFORM(ANDROID)
     long m_eventTime;
+#endif
 };
 
 }
diff --git a/WebCore/platform/android/PlatformTouchEventAndroid.cpp b/WebCore/platform/android/PlatformTouchEventAndroid.cpp
index d2fcebb..085eb0a 100644
--- a/WebCore/platform/android/PlatformTouchEventAndroid.cpp
+++ b/WebCore/platform/android/PlatformTouchEventAndroid.cpp
@@ -30,16 +30,26 @@
 
 namespace WebCore {
 
-// TODO (benm): eventTime is new and needs to be upstream
-PlatformTouchEvent::PlatformTouchEvent(const IntPoint& windowPos, TouchEventType type, PlatformTouchPoint::State state, long eventTime)
+// TODO(benm): This enum needs upstreaming.
+// These values should be kept in sync with those defined in the android.view.KeyEvent class from the Android SDK.
+enum AndroidMetaKeyState {
+    META_SHIFT_ON = 0x01,
+    META_ALT_ON = 0x02,
+    META_SYM_ON = 0x04
+};
+
+// TODO (benm): eventTime and metaState are new and needs to be upstreamed.
+PlatformTouchEvent::PlatformTouchEvent(const IntPoint& windowPos, TouchEventType type, PlatformTouchPoint::State state, long eventTime, int metaState)
     : m_type(type)
-    , m_ctrlKey(false)
-    , m_altKey(false)
-    , m_shiftKey(false)
     , m_metaKey(false)
     , m_eventTime(eventTime)
 {
     m_touchPoints.append(PlatformTouchPoint(windowPos, state));
+
+    // TODO(benm): metaState needs upstreaming.
+    m_altKey = metaState & META_ALT_ON;
+    m_shiftKey = metaState & META_SHIFT_ON;
+    m_ctrlKey = metaState & META_SYM_ON;
 }
 
 }
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index 0c37380..a68ada8 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, long time)
+int WebViewCore::handleTouchEvent(int action, int x, int y, long time, int metaState)
 {
     int preventDefault = 0;
 
@@ -1984,7 +1984,7 @@
 
     m_lastTouchPoint = pt;
 
-    WebCore::PlatformTouchEvent te(pt, type, touchState, time);
+    WebCore::PlatformTouchEvent te(pt, type, touchState, time, metaState);
     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, jlong time)
+static jint HandleTouchEvent(JNIEnv *env, jobject obj, jint action, jint x, jint y, jlong time, jint metaState)
 {
 #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, time);
+    return viewImpl->handleTouchEvent(action, x, y, time, metaState);
 }
 
 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", "(IIIJ)I",
+    { "nativeHandleTouchEvent", "(IIIJI)I",
             (void*) HandleTouchEvent },
     { "nativeTouchUp", "(IIIII)V",
         (void*) TouchUp },
diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h
index fc5ffc7..c6c3dee 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, long time);
+        int handleTouchEvent(int action, int x, int y, long time, int metaState);
 
         /**
          * Handle motionUp event from the UI thread (called touchUp in the