From 983cc6b2d1218167f7d4eb8cf206190899685d64 Mon Sep 17 00:00:00 2001 From: Randall Barker Date: Mon, 8 Aug 2016 17:15:41 -0700 Subject: [PATCH] Bug 1291373 - [geckoview] part 4, Remove GeckoEvent and AndroidGeckoEvent r=jchen --- dom/mobilemessage/android/SmsManager.cpp | 2 + .../mozilla/gecko/db/FormHistoryProvider.java | 1 - .../mozilla/gecko/db/PasswordsProvider.java | 1 - .../gecko/distribution/Distribution.java | 1 - .../gecko/distribution/ReferrerReceiver.java | 1 - .../gecko/dlc/DownloadContentService.java | 1 - .../org/mozilla/gecko/home/HomeBanner.java | 1 - .../mozilla/gecko/home/PanelAuthLayout.java | 1 - .../mozilla/gecko/home/PanelInfoManager.java | 1 - .../gecko/home/PanelRefreshLayout.java | 1 - .../preferences/PrivateDataPreference.java | 1 - .../preferences/SearchPreferenceCategory.java | 1 - .../org/mozilla/gecko/prompts/Prompt.java | 1 - .../gecko/tabs/TabHistoryFragment.java | 1 - .../mozilla/gecko/tabs/TabStripItemView.java | 1 - .../gecko/toolbar/PageActionLayout.java | 1 - .../gecko/toolbar/SiteIdentityPopup.java | 1 - mobile/android/base/moz.build | 1 - .../org/mozilla/gecko/EventDispatcher.java | 1 - .../java/org/mozilla/gecko/GeckoAppShell.java | 36 -- .../java/org/mozilla/gecko/GeckoEvent.java | 256 -------- .../mozilla/gecko/GeckoNetworkManager.java | 2 +- .../java/org/mozilla/gecko/GeckoThread.java | 18 - .../mozilla/gecko/gfx/GeckoLayerClient.java | 18 - .../java/org/mozilla/gecko/gfx/LayerView.java | 42 +- .../gecko/gfx/NativePanZoomController.java | 17 - .../mozilla/gecko/gfx/PanZoomController.java | 3 - .../gecko/gfx/SubdocumentScrollHelper.java | 1 - .../mozilla/gecko/tests/BaseRobocopTest.java | 1 - .../mozilla/gecko/tests/testFilePicker.java | 1 - .../gecko/tests/testTrackingProtection.java | 1 - mozglue/android/jni-stubs.inc | 19 - widget/android/AndroidBridge.cpp | 76 --- widget/android/AndroidBridge.h | 8 +- widget/android/AndroidJNI.cpp | 8 - widget/android/AndroidJavaWrappers.cpp | 579 ------------------ widget/android/AndroidJavaWrappers.h | 335 ---------- widget/android/GeneratedJNIWrappers.cpp | 16 - widget/android/GeneratedJNIWrappers.h | 47 -- widget/android/nsAppShell.cpp | 112 ---- widget/android/nsAppShell.h | 5 - widget/android/nsIAndroidBridge.idl | 27 - widget/android/nsWindow.cpp | 237 ------- widget/android/nsWindow.h | 8 - 44 files changed, 10 insertions(+), 1883 deletions(-) delete mode 100644 mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoEvent.java diff --git a/dom/mobilemessage/android/SmsManager.cpp b/dom/mobilemessage/android/SmsManager.cpp index cc59daaeda17..5a75efca4bf6 100644 --- a/dom/mobilemessage/android/SmsManager.cpp +++ b/dom/mobilemessage/android/SmsManager.cpp @@ -15,6 +15,8 @@ #include "mozilla/Services.h" #include "nsIMobileMessageDatabaseService.h" #include "nsIObserverService.h" +#include "nsThreadUtils.h" +#include "AndroidJavaWrappers.h" using namespace mozilla::dom; using namespace mozilla::dom::mobilemessage; diff --git a/mobile/android/base/java/org/mozilla/gecko/db/FormHistoryProvider.java b/mobile/android/base/java/org/mozilla/gecko/db/FormHistoryProvider.java index b1d559364a5e..ff2f5238e6dc 100644 --- a/mobile/android/base/java/org/mozilla/gecko/db/FormHistoryProvider.java +++ b/mobile/android/base/java/org/mozilla/gecko/db/FormHistoryProvider.java @@ -8,7 +8,6 @@ import java.lang.IllegalArgumentException; import java.util.HashMap; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.db.BrowserContract.FormHistory; import org.mozilla.gecko.db.BrowserContract.DeletedFormHistory; import org.mozilla.gecko.db.BrowserContract; diff --git a/mobile/android/base/java/org/mozilla/gecko/db/PasswordsProvider.java b/mobile/android/base/java/org/mozilla/gecko/db/PasswordsProvider.java index 0589812f8c73..2f5e11ed4697 100644 --- a/mobile/android/base/java/org/mozilla/gecko/db/PasswordsProvider.java +++ b/mobile/android/base/java/org/mozilla/gecko/db/PasswordsProvider.java @@ -9,7 +9,6 @@ import java.util.HashMap; import org.mozilla.gecko.CrashHandler; import org.mozilla.gecko.GeckoApp; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoMessageReceiver; import org.mozilla.gecko.NSSBridge; import org.mozilla.gecko.db.BrowserContract.DeletedPasswords; diff --git a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java index 762f42797525..186979837e69 100644 --- a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java +++ b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java @@ -39,7 +39,6 @@ import org.json.JSONObject; import org.mozilla.gecko.annotation.RobocopTarget; import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoSharedPrefs; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.annotation.WrapForJNI; diff --git a/mobile/android/base/java/org/mozilla/gecko/distribution/ReferrerReceiver.java b/mobile/android/base/java/org/mozilla/gecko/distribution/ReferrerReceiver.java index 8e7db12d5553..13ac453443b9 100644 --- a/mobile/android/base/java/org/mozilla/gecko/distribution/ReferrerReceiver.java +++ b/mobile/android/base/java/org/mozilla/gecko/distribution/ReferrerReceiver.java @@ -9,7 +9,6 @@ import org.mozilla.gecko.AdjustConstants; import org.mozilla.gecko.annotation.RobocopTarget; import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.json.JSONException; import org.json.JSONObject; diff --git a/mobile/android/base/java/org/mozilla/gecko/dlc/DownloadContentService.java b/mobile/android/base/java/org/mozilla/gecko/dlc/DownloadContentService.java index 087ed242ec34..3729cf2e0627 100644 --- a/mobile/android/base/java/org/mozilla/gecko/dlc/DownloadContentService.java +++ b/mobile/android/base/java/org/mozilla/gecko/dlc/DownloadContentService.java @@ -7,7 +7,6 @@ package org.mozilla.gecko.dlc; import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.dlc.catalog.DownloadContent; import org.mozilla.gecko.dlc.catalog.DownloadContentCatalog; import org.mozilla.gecko.util.HardwareUtils; diff --git a/mobile/android/base/java/org/mozilla/gecko/home/HomeBanner.java b/mobile/android/base/java/org/mozilla/gecko/home/HomeBanner.java index da8a1eb61e25..eef36d0800bb 100644 --- a/mobile/android/base/java/org/mozilla/gecko/home/HomeBanner.java +++ b/mobile/android/base/java/org/mozilla/gecko/home/HomeBanner.java @@ -9,7 +9,6 @@ import org.json.JSONObject; import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.R; import org.mozilla.gecko.animation.PropertyAnimator; import org.mozilla.gecko.animation.PropertyAnimator.Property; diff --git a/mobile/android/base/java/org/mozilla/gecko/home/PanelAuthLayout.java b/mobile/android/base/java/org/mozilla/gecko/home/PanelAuthLayout.java index 9e0742a28dc8..1ad91b7caf57 100644 --- a/mobile/android/base/java/org/mozilla/gecko/home/PanelAuthLayout.java +++ b/mobile/android/base/java/org/mozilla/gecko/home/PanelAuthLayout.java @@ -6,7 +6,6 @@ package org.mozilla.gecko.home; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.R; import org.mozilla.gecko.home.HomeConfig.AuthConfig; import org.mozilla.gecko.home.HomeConfig.PanelConfig; diff --git a/mobile/android/base/java/org/mozilla/gecko/home/PanelInfoManager.java b/mobile/android/base/java/org/mozilla/gecko/home/PanelInfoManager.java index 10db65ea1a30..cc208193daf6 100644 --- a/mobile/android/base/java/org/mozilla/gecko/home/PanelInfoManager.java +++ b/mobile/android/base/java/org/mozilla/gecko/home/PanelInfoManager.java @@ -15,7 +15,6 @@ import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.home.HomeConfig.PanelConfig; import org.mozilla.gecko.util.GeckoEventListener; import org.mozilla.gecko.util.ThreadUtils; diff --git a/mobile/android/base/java/org/mozilla/gecko/home/PanelRefreshLayout.java b/mobile/android/base/java/org/mozilla/gecko/home/PanelRefreshLayout.java index 91855085b453..d43a97f31a2f 100644 --- a/mobile/android/base/java/org/mozilla/gecko/home/PanelRefreshLayout.java +++ b/mobile/android/base/java/org/mozilla/gecko/home/PanelRefreshLayout.java @@ -8,7 +8,6 @@ package org.mozilla.gecko.home; import org.mozilla.gecko.R; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.home.PanelLayout.DatasetBacked; import org.mozilla.gecko.home.PanelLayout.FilterManager; diff --git a/mobile/android/base/java/org/mozilla/gecko/preferences/PrivateDataPreference.java b/mobile/android/base/java/org/mozilla/gecko/preferences/PrivateDataPreference.java index 255db9d1af2f..1ab69cb9efe7 100644 --- a/mobile/android/base/java/org/mozilla/gecko/preferences/PrivateDataPreference.java +++ b/mobile/android/base/java/org/mozilla/gecko/preferences/PrivateDataPreference.java @@ -6,7 +6,6 @@ package org.mozilla.gecko.preferences; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; diff --git a/mobile/android/base/java/org/mozilla/gecko/preferences/SearchPreferenceCategory.java b/mobile/android/base/java/org/mozilla/gecko/preferences/SearchPreferenceCategory.java index e649e26d1f5c..08d65caa339a 100644 --- a/mobile/android/base/java/org/mozilla/gecko/preferences/SearchPreferenceCategory.java +++ b/mobile/android/base/java/org/mozilla/gecko/preferences/SearchPreferenceCategory.java @@ -15,7 +15,6 @@ import org.json.JSONObject; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.TelemetryContract.Method; diff --git a/mobile/android/base/java/org/mozilla/gecko/prompts/Prompt.java b/mobile/android/base/java/org/mozilla/gecko/prompts/Prompt.java index 88188f7b3109..401c9a999174 100644 --- a/mobile/android/base/java/org/mozilla/gecko/prompts/Prompt.java +++ b/mobile/android/base/java/org/mozilla/gecko/prompts/Prompt.java @@ -9,7 +9,6 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.R; import org.mozilla.gecko.gfx.LayerView; import org.mozilla.gecko.util.ThreadUtils; diff --git a/mobile/android/base/java/org/mozilla/gecko/tabs/TabHistoryFragment.java b/mobile/android/base/java/org/mozilla/gecko/tabs/TabHistoryFragment.java index ce238cfa82f8..ff2a6aac0e6c 100644 --- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabHistoryFragment.java +++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabHistoryFragment.java @@ -9,7 +9,6 @@ import java.util.List; import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.GeckoApplication; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.R; import android.content.Context; diff --git a/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java b/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java index 226a4874d04f..27eaed125dfd 100644 --- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java +++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabStripItemView.java @@ -7,7 +7,6 @@ package org.mozilla.gecko.tabs; import org.mozilla.gecko.AboutPages; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.R; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java index fdde25ee20de..62d93f8d5e2b 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java @@ -7,7 +7,6 @@ package org.mozilla.gecko.toolbar; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.R; import org.mozilla.gecko.gfx.BitmapUtils; import org.mozilla.gecko.util.EventCallback; diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java index b06bc73fcc9d..221116547e08 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java @@ -21,7 +21,6 @@ import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.R; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.SiteIdentity; import org.mozilla.gecko.SiteIdentity.SecurityMode; import org.mozilla.gecko.SiteIdentity.MixedMode; diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 8fc3c06aab45..afc1ce8bc694 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -212,7 +212,6 @@ geckoview_java_files = [ 'GeckoEditable.java', 'GeckoEditableClient.java', 'GeckoEditableListener.java', - 'GeckoEvent.java', 'GeckoHalDefines.java', 'GeckoInputConnection.java', 'GeckoJavaSampler.java', diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java index 24eafc367bde..e472aa1bfaf8 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java @@ -6,7 +6,6 @@ package org.mozilla.gecko; import org.mozilla.gecko.annotation.RobocopTarget; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.util.BundleEventListener; import org.mozilla.gecko.util.EventCallback; import org.mozilla.gecko.util.GeckoEventListener; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java index bf90a1c9df0f..6dc07fa19332 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java @@ -270,45 +270,12 @@ public class GeckoAppShell return sLayerView; } - /** - * If the Gecko thread is running, immediately dispatches the event to - * Gecko. - * - * If the Gecko thread is not running, queues the event. If the queue is - * full, throws {@link IllegalStateException}. - * - * Queued events will be dispatched in order of arrival when the Gecko - * thread becomes live. - * - * This method can be called from any thread. - * - * @param e - * the event to dispatch. Cannot be null. - */ - @RobocopTarget - public static void sendEventToGecko(GeckoEvent e) { - if (e == null) { - throw new IllegalArgumentException("e cannot be null."); - } - - if (GeckoThread.isRunning()) { - notifyGeckoOfEvent(e); - // Gecko will copy the event data into a normal C++ object. - // We can recycle the event now. - e.recycle(); - return; - } - - GeckoThread.addPendingEvent(e); - } - /** * Sends an asynchronous request to Gecko. * * The response data will be passed to {@link GeckoRequest#onResponse(NativeJSObject)} if the * request succeeds; otherwise, {@link GeckoRequest#onError()} will fire. * - * This method follows the same queuing conditions as {@link #sendEventToGecko(GeckoEvent)}. * It can be called from any thread. The GeckoRequest callbacks will be executed on the Gecko thread. * * @param request The request to dispatch. Cannot be null. @@ -332,9 +299,6 @@ public class GeckoAppShell notifyObservers(request.getName(), request.getData()); } - // Tell the Gecko event loop that an event is available. - public static native void notifyGeckoOfEvent(GeckoEvent event); - // Synchronously notify a Gecko observer; must be called from Gecko thread. @WrapForJNI(calledFrom = "gecko") public static native void syncNotifyObservers(String topic, String data); diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoEvent.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoEvent.java deleted file mode 100644 index 04aa093f92df..000000000000 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoEvent.java +++ /dev/null @@ -1,256 +0,0 @@ -/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.gecko; - -import java.nio.ByteBuffer; -import java.util.concurrent.ArrayBlockingQueue; - -import org.mozilla.gecko.AppConstants.Versions; -import org.mozilla.gecko.gfx.DisplayPortMetrics; -import org.mozilla.gecko.gfx.ImmutableViewportMetrics; - -import android.graphics.Point; -import android.graphics.PointF; -import android.graphics.Rect; -import android.os.SystemClock; -import android.util.Log; -import android.util.SparseArray; -import android.view.KeyEvent; -import android.view.MotionEvent; -import org.mozilla.gecko.annotation.JNITarget; -import org.mozilla.gecko.annotation.RobocopTarget; - -/** - * We're not allowed to hold on to most events given to us - * so we save the parts of the events we want to use in GeckoEvent. - * Fields have different meanings depending on the event type. - */ -@JNITarget -public class GeckoEvent { - private static final String LOGTAG = "GeckoEvent"; - - private static final int EVENT_FACTORY_SIZE = 5; - - // Maybe we're probably better to just make mType non final, and just store GeckoEvents in here... - private static final SparseArray> mEvents = new SparseArray>(); - - public static GeckoEvent get(NativeGeckoEvent type) { - synchronized (mEvents) { - ArrayBlockingQueue events = mEvents.get(type.value); - if (events != null && events.size() > 0) { - return events.poll(); - } - } - - return new GeckoEvent(type); - } - - public void recycle() { - synchronized (mEvents) { - ArrayBlockingQueue events = mEvents.get(mType); - if (events == null) { - events = new ArrayBlockingQueue(EVENT_FACTORY_SIZE); - mEvents.put(mType, events); - } - - events.offer(this); - } - } - - // Make sure to keep these values in sync with the enum in - // AndroidGeckoEvent in widget/android/AndroidJavaWrappers.h - @JNITarget - public enum NativeGeckoEvent { - MOTION_EVENT(2), - VIEWPORT(20), - NATIVE_GESTURE_EVENT(31), - LONG_PRESS(47); - - public final int value; - - private NativeGeckoEvent(int value) { - this.value = value; - } - } - - public static final int ACTION_MAGNIFY_START = 11; - public static final int ACTION_MAGNIFY = 12; - public static final int ACTION_MAGNIFY_END = 13; - - private final int mType; - private int mAction; - private long mTime; - private Point[] mPoints; - private int[] mPointIndicies; - private int mPointerIndex; // index of the point that has changed - private float[] mOrientations; - private float[] mPressures; - private int[] mToolTypes; - private Point[] mPointRadii; - private double mX; - - private int mMetaState; - private int mCount; - private String mCharacters; - private String mCharactersExtra; - - private GeckoEvent(NativeGeckoEvent event) { - mType = event.value; - } - - public static GeckoEvent createNativeGestureEvent(int action, PointF pt, double size) { - try { - GeckoEvent event = GeckoEvent.get(NativeGeckoEvent.NATIVE_GESTURE_EVENT); - event.mAction = action; - event.mCount = 1; - event.mPoints = new Point[1]; - - PointF geckoPoint = new PointF(pt.x, pt.y); - geckoPoint = GeckoAppShell.getLayerView().convertViewPointToLayerPoint(geckoPoint); - - if (geckoPoint == null) { - // This could happen if Gecko isn't ready yet. - return null; - } - - event.mPoints[0] = new Point((int)Math.floor(geckoPoint.x), (int)Math.floor(geckoPoint.y)); - - event.mX = size; - event.mTime = System.currentTimeMillis(); - return event; - } catch (Exception e) { - // This can happen if Gecko isn't ready yet - return null; - } - } - - /** - * Creates a GeckoEvent that contains the data from the MotionEvent. - * The keepInViewCoordinates parameter can be set to false to convert from the Java - * coordinate system (device pixels relative to the LayerView) to a coordinate system - * relative to gecko's coordinate system (CSS pixels relative to gecko scroll position). - */ - public static GeckoEvent createMotionEvent(MotionEvent m, boolean keepInViewCoordinates) { - GeckoEvent event = GeckoEvent.get(NativeGeckoEvent.MOTION_EVENT); - event.initMotionEvent(m, keepInViewCoordinates); - return event; - } - - /** - * Creates a GeckoEvent that contains the data from the LongPressEvent, to be - * dispatched in CSS pixels relative to gecko's scroll position. - */ - public static GeckoEvent createLongPressEvent(MotionEvent m) { - GeckoEvent event = GeckoEvent.get(NativeGeckoEvent.LONG_PRESS); - event.initMotionEvent(m, false); - return event; - } - - private void initMotionEvent(MotionEvent m, boolean keepInViewCoordinates) { - mAction = m.getActionMasked(); - mTime = (System.currentTimeMillis() - SystemClock.elapsedRealtime()) + m.getEventTime(); - mMetaState = m.getMetaState(); - - switch (mAction) { - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_POINTER_DOWN: - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: - case MotionEvent.ACTION_HOVER_ENTER: - case MotionEvent.ACTION_HOVER_MOVE: - case MotionEvent.ACTION_HOVER_EXIT: { - mCount = m.getPointerCount(); - mPoints = new Point[mCount]; - mPointIndicies = new int[mCount]; - mOrientations = new float[mCount]; - mPressures = new float[mCount]; - mToolTypes = new int[mCount]; - mPointRadii = new Point[mCount]; - mPointerIndex = m.getActionIndex(); - for (int i = 0; i < mCount; i++) { - addMotionPoint(i, i, m, keepInViewCoordinates); - } - break; - } - default: { - mCount = 0; - mPointerIndex = -1; - mPoints = new Point[mCount]; - mPointIndicies = new int[mCount]; - mOrientations = new float[mCount]; - mPressures = new float[mCount]; - mToolTypes = new int[mCount]; - mPointRadii = new Point[mCount]; - } - } - } - - private void addMotionPoint(int index, int eventIndex, MotionEvent event, boolean keepInViewCoordinates) { - try { - PointF geckoPoint = new PointF(event.getX(eventIndex), event.getY(eventIndex)); - if (!keepInViewCoordinates) { - geckoPoint = GeckoAppShell.getLayerView().convertViewPointToLayerPoint(geckoPoint); - } - - mPoints[index] = new Point((int)Math.floor(geckoPoint.x), (int)Math.floor(geckoPoint.y)); - mPointIndicies[index] = event.getPointerId(eventIndex); - - double radians = event.getOrientation(eventIndex); - mOrientations[index] = (float) Math.toDegrees(radians); - // w3c touchevents spec does not allow orientations == 90 - // this shifts it to -90, which will be shifted to zero below - if (mOrientations[index] == 90) - mOrientations[index] = -90; - - // w3c touchevent radius are given by an orientation between 0 and 90 - // the radius is found by removing the orientation and measuring the x and y - // radius of the resulting ellipse - // for android orientations >= 0 and < 90, the major axis should correspond to - // just reporting the y radius as the major one, and x as minor - // however, for a radius < 0, we have to shift the orientation by adding 90, and - // reverse which radius is major and minor - if (mOrientations[index] < 0) { - mOrientations[index] += 90; - mPointRadii[index] = new Point((int) event.getToolMajor(eventIndex) / 2, - (int) event.getToolMinor(eventIndex) / 2); - } else { - mPointRadii[index] = new Point((int) event.getToolMinor(eventIndex) / 2, - (int) event.getToolMajor(eventIndex) / 2); - } - - if (!keepInViewCoordinates) { - // If we are converting to gecko CSS pixels, then we should adjust the - // radii as well - float zoom = GeckoAppShell.getLayerView().getViewportMetrics().zoomFactor; - mPointRadii[index].x /= zoom; - mPointRadii[index].y /= zoom; - } - mPressures[index] = event.getPressure(eventIndex); - if (Versions.feature14Plus) { - mToolTypes[index] = event.getToolType(index); - } - } catch (Exception ex) { - Log.e(LOGTAG, "Error creating motion point " + index, ex); - mPointRadii[index] = new Point(0, 0); - mPoints[index] = new Point(0, 0); - } - } - - public static GeckoEvent createViewportEvent(ImmutableViewportMetrics metrics, DisplayPortMetrics displayPort) { - GeckoEvent event = GeckoEvent.get(NativeGeckoEvent.VIEWPORT); - event.mCharacters = "Viewport:Change"; - StringBuilder sb = new StringBuilder(256); - sb.append("{ \"x\" : ").append(metrics.viewportRectLeft) - .append(", \"y\" : ").append(metrics.viewportRectTop) - .append(", \"zoom\" : ").append(metrics.zoomFactor) - .append(", \"displayPort\" :").append(displayPort.toJSON()) - .append('}'); - event.mCharactersExtra = sb.toString(); - return event; - } -} diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoNetworkManager.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoNetworkManager.java index 8d7e3ee086ec..0cb56a7d28eb 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoNetworkManager.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoNetworkManager.java @@ -318,7 +318,7 @@ public class GeckoNetworkManager extends BroadcastReceiver implements NativeEven private static native void onStatusChanged(String status); /** - * Send current network state and connection type as a GeckoEvent, to whomever is listening. + * Send current network state and connection type to whomever is listening. */ private void sendNetworkStateToListeners(final Context context) { if (currentConnectionType != previousConnectionType || diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java index c410c70e14e3..d25c4f01deaa 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java @@ -346,12 +346,6 @@ public class GeckoThread extends Thread { // Mark as handled. QUEUED_CALLS.set(i, null); - if (call.method == null) { - final GeckoEvent e = (GeckoEvent) call.target; - GeckoAppShell.notifyGeckoOfEvent(e); - e.recycle(); - continue; - } invokeMethod(call.method, call.target, call.args); } if (lastSkipped < 0) { @@ -534,18 +528,6 @@ public class GeckoThread extends Thread { Looper.myQueue().removeIdleHandler(idleHandler); } - public static void addPendingEvent(final GeckoEvent e) { - synchronized (QUEUED_CALLS) { - if (isRunning()) { - // We may just have switched to running state. - GeckoAppShell.notifyGeckoOfEvent(e); - e.recycle(); - } else { - QUEUED_CALLS.add(new QueuedCall(null, e, null, State.RUNNING)); - } - } - } - @WrapForJNI(calledFrom = "gecko") private static boolean pumpMessageLoop(final Message msg) { final Handler geckoHandler = ThreadUtils.sGeckoHandler; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/GeckoLayerClient.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/GeckoLayerClient.java index 9c8867890dad..b9bc92cf7ecf 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/GeckoLayerClient.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/GeckoLayerClient.java @@ -8,7 +8,6 @@ package org.mozilla.gecko.gfx; import org.mozilla.gecko.annotation.RobocopTarget; import org.mozilla.gecko.annotation.WrapForJNI; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.gfx.LayerView.DrawListener; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; @@ -404,23 +403,6 @@ class GeckoLayerClient implements LayerView.Listener, PanZoomTarget return mDisplayPort; } - @WrapForJNI(calledFrom = "gecko") - DisplayPortMetrics getDisplayPort(boolean pageSizeUpdate, boolean isBrowserContentDisplayed, int tabId, ImmutableViewportMetrics metrics) { - Tabs tabs = Tabs.getInstance(); - if (isBrowserContentDisplayed && tabs.isSelectedTabId(tabId)) { - // for foreground tabs, send the viewport update unless the document - // displayed is different from the content document. In that case, just - // calculate the display port. - return handleViewportMessage(metrics, pageSizeUpdate ? ViewportMessageType.PAGE_SIZE : ViewportMessageType.UPDATE); - } else { - // for background tabs, request a new display port calculation, so that - // when we do switch to that tab, we have the correct display port and - // don't need to draw twice (once to allow the first-paint viewport to - // get to java, and again once java figures out the display port). - return DisplayPortCalculator.calculate(metrics, null); - } - } - @WrapForJNI(calledFrom = "gecko") void contentDocumentChanged() { mContentDocumentIsDisplayed = false; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java index 5c29c97a464b..05419ceb8bfd 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java @@ -16,7 +16,6 @@ import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAccessibility; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoThread; import org.mozilla.gecko.mozglue.JNIObject; import org.mozilla.gecko.Tab; @@ -65,8 +64,6 @@ public class LayerView extends ScrollView implements Tabs.OnTabsChangedListener private Listener mListener; - private PointF mInitialTouchPoint; - private float mSurfaceTranslation; /* This should only be modified on the Java UI thread. */ @@ -219,34 +216,6 @@ public class LayerView extends ScrollView implements Tabs.OnTabsChangedListener (int)event.getToolMinor() / 2); } - private boolean sendEventToGecko(MotionEvent event) { - if (!mLayerClient.isGeckoReady()) { - return false; - } - - int action = event.getActionMasked(); - PointF point = new PointF(event.getX(), event.getY()); - if (action == MotionEvent.ACTION_DOWN) { - mInitialTouchPoint = point; - } - - if (mInitialTouchPoint != null && action == MotionEvent.ACTION_MOVE) { - Point p = getEventRadius(event); - - if (PointUtils.subtract(point, mInitialTouchPoint).length() < - Math.max(PanZoomController.CLICK_THRESHOLD, Math.min(Math.min(p.x, p.y), PanZoomController.PAN_THRESHOLD))) { - // Don't send the touchmove event if if the users finger hasn't moved far. - // Necessary for Google Maps to work correctly. See bug 771099. - return true; - } else { - mInitialTouchPoint = null; - } - } - - GeckoAppShell.sendEventToGecko(GeckoEvent.createMotionEvent(event, false)); - return true; - } - public void showSurface() { // Fix this if TextureView support is turned back on above mSurfaceView.setVisibility(View.VISIBLE); @@ -301,7 +270,7 @@ public class LayerView extends ScrollView implements Tabs.OnTabsChangedListener if (mPanZoomController != null && mPanZoomController.onTouchEvent(event)) { return true; } - return sendEventToGecko(event); + return false; } @Override @@ -323,7 +292,7 @@ public class LayerView extends ScrollView implements Tabs.OnTabsChangedListener return true; } - return sendEventToGecko(event); + return false; } @Override @@ -797,17 +766,10 @@ public class LayerView extends ScrollView implements Tabs.OnTabsChangedListener @Override public void setOverScrollMode(int overscrollMode) { super.setOverScrollMode(overscrollMode); - if (mPanZoomController != null) { - mPanZoomController.setOverScrollMode(overscrollMode); - } } @Override public int getOverScrollMode() { - if (mPanZoomController != null) { - return mPanZoomController.getOverScrollMode(); - } - return super.getOverScrollMode(); } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/NativePanZoomController.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/NativePanZoomController.java index 07dbd1f3ac57..f7f1ef752aa6 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/NativePanZoomController.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/NativePanZoomController.java @@ -6,7 +6,6 @@ package org.mozilla.gecko.gfx; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoThread; import org.mozilla.gecko.PrefsHelper; import org.mozilla.gecko.annotation.WrapForJNI; @@ -255,22 +254,6 @@ class NativePanZoomController extends JNIObject implements PanZoomController { @Override @WrapForJNI(calledFrom = "ui") // JNIObject protected native void disposeNative(); - @Override - public void setOverScrollMode(int overscrollMode) { - // FIXME implement this - } - - @Override - public int getOverScrollMode() { - // FIXME implement this - return 0; - } - - @WrapForJNI(calledFrom = "ui") - private void requestContentRepaint(float x, float y, float width, float height, float resolution) { - mTarget.forceRedraw(new DisplayPortMetrics(x, y, x + width, y + height, resolution)); - } - @Override public void setOverscrollHandler(final Overscroll handler) { mOverscroll = handler; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/PanZoomController.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/PanZoomController.java index c9c464e0035b..d0ca251e0e24 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/PanZoomController.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/PanZoomController.java @@ -42,9 +42,6 @@ public interface PanZoomController { public void abortPanning(); public void abortAnimation(); - public void setOverScrollMode(int overscrollMode); - public int getOverScrollMode(); - public void setOverscrollHandler(final Overscroll controller); public void setIsLongpressEnabled(boolean isLongpressEnabled); diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/SubdocumentScrollHelper.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/SubdocumentScrollHelper.java index 18c8fe29ad77..20f4826f62cd 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/SubdocumentScrollHelper.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/SubdocumentScrollHelper.java @@ -6,7 +6,6 @@ package org.mozilla.gecko.gfx; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.util.GeckoEventListener; diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseRobocopTest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseRobocopTest.java index 1a26a71fd7e0..3033524e8a15 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseRobocopTest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseRobocopTest.java @@ -25,7 +25,6 @@ import org.mozilla.gecko.FennecNativeActions; import org.mozilla.gecko.FennecNativeDriver; import org.mozilla.gecko.FennecTalosAssert; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoProfile; import org.mozilla.gecko.updater.UpdateServiceHelper; diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testFilePicker.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testFilePicker.java index 25bbc1942ab9..1c338e02b321 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testFilePicker.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testFilePicker.java @@ -8,7 +8,6 @@ import static org.mozilla.gecko.tests.helpers.AssertionHelper.fFail; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.util.GeckoEventListener; import org.json.JSONException; diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java index 8d781fe1cda0..866a463633ec 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java @@ -8,7 +8,6 @@ import static org.mozilla.gecko.tests.helpers.AssertionHelper.fFail; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.util.GeckoEventListener; import org.json.JSONException; diff --git a/mozglue/android/jni-stubs.inc b/mozglue/android/jni-stubs.inc index 81822aa3fca8..ef504667f502 100644 --- a/mozglue/android/jni-stubs.inc +++ b/mozglue/android/jni-stubs.inc @@ -172,25 +172,6 @@ Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden(JNIEnv * arg0, jcl #ifdef JNI_STUBS -typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent_t)(JNIEnv *, jclass, jobject); -static Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent; -extern "C" NS_EXPORT void MOZ_JNICALL -Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(JNIEnv * arg0, jclass arg1, jobject arg2) { - if (!f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent) { - arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), - "JNI Function called before it was loaded"); - return ; - } - f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(arg0, arg1, arg2); -} -#endif - -#ifdef JNI_BINDINGS - xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent); -#endif - -#ifdef JNI_STUBS - typedef void (*Java_org_mozilla_gecko_GeckoAppShell_syncNotifyObservers_t)(JNIEnv *, jclass, jstring, jstring); static Java_org_mozilla_gecko_GeckoAppShell_syncNotifyObservers_t f_Java_org_mozilla_gecko_GeckoAppShell_syncNotifyObservers; extern "C" NS_EXPORT void MOZ_JNICALL diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index 27546974d638..e269fefdfddc 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -230,8 +230,6 @@ AndroidBridge::AndroidBridge() jInputStream = inputStream.getGlobalRef(); jClose = inputStream.getMethod("close", "()V"); jAvailable = inputStream.getMethod("available", "()I"); - - InitAndroidJavaWrappers(jEnv); } // Raw JNIEnv variants. @@ -275,19 +273,6 @@ jstring AndroidBridge::NewJavaString(AutoLocalJNIFrame* frame, const nsACString& return NewJavaString(frame, NS_ConvertUTF8toUTF16(string)); } -void AutoGlobalWrappedJavaObject::Dispose() { - if (isNull()) { - return; - } - - GetEnvForThread()->DeleteGlobalRef(wrapped_obj); - wrapped_obj = nullptr; -} - -AutoGlobalWrappedJavaObject::~AutoGlobalWrappedJavaObject() { - Dispose(); -} - static void getHandlersFromStringArray(JNIEnv *aJNIEnv, jobjectArray jArr, jsize aLen, nsIMutableArray *aHandlersArray, @@ -1233,12 +1218,6 @@ NS_IMETHODIMP nsAndroidBridge::HandleGeckoMessage(JS::HandleValue val, return NS_OK; } -NS_IMETHODIMP nsAndroidBridge::GetDisplayPort(bool aPageSizeUpdate, bool aIsBrowserContentDisplayed, int32_t tabId, nsIAndroidViewport* metrics, nsIAndroidDisplayport** displayPort) -{ - AndroidBridge::Bridge()->GetDisplayPort(aPageSizeUpdate, aIsBrowserContentDisplayed, tabId, metrics, displayPort); - return NS_OK; -} - NS_IMETHODIMP nsAndroidBridge::ContentDocumentChanged() { AndroidBridge::Bridge()->ContentDocumentChanged(); @@ -1437,61 +1416,6 @@ AndroidBridge::GetFrameNameJavaProfiling(uint32_t aThreadId, uint32_t aSampleId, return true; } -void -AndroidBridge::GetDisplayPort(bool aPageSizeUpdate, bool aIsBrowserContentDisplayed, int32_t tabId, nsIAndroidViewport* metrics, nsIAndroidDisplayport** displayPort) -{ - - ALOG_BRIDGE("Enter: %s", __PRETTY_FUNCTION__); - if (!mLayerClient) { - ALOG_BRIDGE("Exceptional Exit: %s", __PRETTY_FUNCTION__); - return; - } - - JNIEnv* const env = jni::GetGeckoThreadEnv(); - AutoLocalJNIFrame jniFrame(env, 1); - - int width, height; - float x, y, - pageLeft, pageTop, pageRight, pageBottom, - cssPageLeft, cssPageTop, cssPageRight, cssPageBottom, - zoom; - metrics->GetX(&x); - metrics->GetY(&y); - metrics->GetWidth(&width); - metrics->GetHeight(&height); - metrics->GetPageLeft(&pageLeft); - metrics->GetPageTop(&pageTop); - metrics->GetPageRight(&pageRight); - metrics->GetPageBottom(&pageBottom); - metrics->GetCssPageLeft(&cssPageLeft); - metrics->GetCssPageTop(&cssPageTop); - metrics->GetCssPageRight(&cssPageRight); - metrics->GetCssPageBottom(&cssPageBottom); - metrics->GetZoom(&zoom); - - auto jmetrics = ImmutableViewportMetrics::New( - pageLeft, pageTop, pageRight, pageBottom, - cssPageLeft, cssPageTop, cssPageRight, cssPageBottom, - x, y, width, height, - zoom); - - DisplayPortMetrics::LocalRef displayPortMetrics = mLayerClient->GetDisplayPort( - aPageSizeUpdate, aIsBrowserContentDisplayed, tabId, jmetrics); - - if (!displayPortMetrics) { - ALOG_BRIDGE("Exceptional Exit: %s", __PRETTY_FUNCTION__); - return; - } - - AndroidRectF rect(env, displayPortMetrics->MPosition().Get()); - float resolution = displayPortMetrics->Resolution(); - - *displayPort = new nsAndroidDisplayport(rect, resolution); - (*displayPort)->AddRef(); - - ALOG_BRIDGE("Exit: %s", __PRETTY_FUNCTION__); -} - void AndroidBridge::ContentDocumentChanged() { diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index 240a805cd4d5..5fc1c311bf70 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -17,7 +17,6 @@ #include "nsCOMArray.h" #include "GeneratedJNIWrappers.h" -#include "AndroidJavaWrappers.h" #include "nsIMutableArray.h" #include "nsIMIMEInfo.h" @@ -35,12 +34,15 @@ #include "mozilla/gfx/Point.h" #include "mozilla/jni/Utils.h" #include "nsIObserver.h" +#include "nsDataHashtable.h" + +#include "Units.h" // Some debug #defines // #define DEBUG_ANDROID_EVENTS // #define DEBUG_ANDROID_WIDGET -class nsIObserver; +class nsPIDOMWindowOuter; namespace base { class Thread; @@ -50,6 +52,7 @@ typedef void* EGLSurface; namespace mozilla { +class AutoLocalJNIFrame; class Runnable; namespace hal { @@ -145,7 +148,6 @@ public: bool GetThreadNameJavaProfiling(uint32_t aThreadId, nsCString & aResult); bool GetFrameNameJavaProfiling(uint32_t aThreadId, uint32_t aSampleId, uint32_t aFrameId, nsCString & aResult); - void GetDisplayPort(bool aPageSizeUpdate, bool aIsBrowserContentDisplayed, int32_t tabId, nsIAndroidViewport* metrics, nsIAndroidDisplayport** displayPort); void ContentDocumentChanged(); bool IsContentDocumentDisplayed(); diff --git a/widget/android/AndroidJNI.cpp b/widget/android/AndroidJNI.cpp index 57631d291ff5..21786c6b69d7 100644 --- a/widget/android/AndroidJNI.cpp +++ b/widget/android/AndroidJNI.cpp @@ -49,14 +49,6 @@ extern "C" { /* * Incoming JNI methods */ - -NS_EXPORT void JNICALL -Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(JNIEnv *jenv, jclass jc, jobject event) -{ - // poke the appshell - nsAppShell::PostEvent(AndroidGeckoEvent::MakeFromJavaObject(jenv, event)); -} - NS_EXPORT jlong JNICALL Java_org_mozilla_gecko_GeckoAppShell_runUiThreadCallback(JNIEnv* env, jclass) { diff --git a/widget/android/AndroidJavaWrappers.cpp b/widget/android/AndroidJavaWrappers.cpp index 8997eaf5501c..eb657a9c4eb5 100644 --- a/widget/android/AndroidJavaWrappers.cpp +++ b/widget/android/AndroidJavaWrappers.cpp @@ -4,587 +4,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "AndroidJavaWrappers.h" -#include "AndroidBridge.h" -#include "AndroidBridgeUtilities.h" -#include "nsIDOMKeyEvent.h" -#include "nsIWidget.h" -#include "mozilla/BasicEvents.h" -#include "mozilla/TimeStamp.h" -#include "mozilla/TouchEvents.h" using namespace mozilla; -using namespace mozilla::dom; - -jclass AndroidGeckoEvent::jGeckoEventClass = 0; -jfieldID AndroidGeckoEvent::jActionField = 0; -jfieldID AndroidGeckoEvent::jTypeField = 0; -jfieldID AndroidGeckoEvent::jTimeField = 0; -jfieldID AndroidGeckoEvent::jPoints = 0; -jfieldID AndroidGeckoEvent::jPointIndicies = 0; -jfieldID AndroidGeckoEvent::jPressures = 0; -jfieldID AndroidGeckoEvent::jToolTypes = 0; -jfieldID AndroidGeckoEvent::jPointRadii = 0; -jfieldID AndroidGeckoEvent::jOrientations = 0; -jfieldID AndroidGeckoEvent::jXField = 0; - -jfieldID AndroidGeckoEvent::jCharactersField = 0; -jfieldID AndroidGeckoEvent::jCharactersExtraField = 0; -jfieldID AndroidGeckoEvent::jMetaStateField = 0; -jfieldID AndroidGeckoEvent::jCountField = 0; -jfieldID AndroidGeckoEvent::jPointerIndexField = 0; - -jclass AndroidPoint::jPointClass = 0; -jfieldID AndroidPoint::jXField = 0; -jfieldID AndroidPoint::jYField = 0; - -jclass AndroidRect::jRectClass = 0; -jfieldID AndroidRect::jBottomField = 0; -jfieldID AndroidRect::jLeftField = 0; -jfieldID AndroidRect::jRightField = 0; -jfieldID AndroidRect::jTopField = 0; - -jclass AndroidRectF::jRectClass = 0; -jfieldID AndroidRectF::jBottomField = 0; -jfieldID AndroidRectF::jLeftField = 0; -jfieldID AndroidRectF::jRightField = 0; -jfieldID AndroidRectF::jTopField = 0; - -RefCountedJavaObject::~RefCountedJavaObject() { - if (mObject) - GetEnvForThread()->DeleteGlobalRef(mObject); - mObject = nullptr; -} - -void -mozilla::InitAndroidJavaWrappers(JNIEnv *jEnv) -{ - AndroidGeckoEvent::InitGeckoEventClass(jEnv); - AndroidPoint::InitPointClass(jEnv); - AndroidRect::InitRectClass(jEnv); - AndroidRectF::InitRectFClass(jEnv); -} - -void -AndroidGeckoEvent::InitGeckoEventClass(JNIEnv *jEnv) -{ - AutoJNIClass geckoEvent(jEnv, "org/mozilla/gecko/GeckoEvent"); - jGeckoEventClass = geckoEvent.getGlobalRef(); - - jActionField = geckoEvent.getField("mAction", "I"); - jTypeField = geckoEvent.getField("mType", "I"); - jTimeField = geckoEvent.getField("mTime", "J"); - jPoints = geckoEvent.getField("mPoints", "[Landroid/graphics/Point;"); - jPointIndicies = geckoEvent.getField("mPointIndicies", "[I"); - jOrientations = geckoEvent.getField("mOrientations", "[F"); - jPressures = geckoEvent.getField("mPressures", "[F"); - jToolTypes = geckoEvent.getField("mToolTypes", "[I"); - jPointRadii = geckoEvent.getField("mPointRadii", "[Landroid/graphics/Point;"); - jXField = geckoEvent.getField("mX", "D"); - - jCharactersField = geckoEvent.getField("mCharacters", "Ljava/lang/String;"); - jCharactersExtraField = geckoEvent.getField("mCharactersExtra", "Ljava/lang/String;"); - jMetaStateField = geckoEvent.getField("mMetaState", "I"); - jCountField = geckoEvent.getField("mCount", "I"); - jPointerIndexField = geckoEvent.getField("mPointerIndex", "I"); -} - -void -AndroidPoint::InitPointClass(JNIEnv *jEnv) -{ - AutoJNIClass point(jEnv, "android/graphics/Point"); - jPointClass = point.getGlobalRef(); - - jXField = point.getField("x", "I"); - jYField = point.getField("y", "I"); -} - -void -AndroidRect::InitRectClass(JNIEnv *jEnv) -{ - AutoJNIClass rect(jEnv, "android/graphics/Rect"); - jRectClass = rect.getGlobalRef(); - - jBottomField = rect.getField("bottom", "I"); - jLeftField = rect.getField("left", "I"); - jTopField = rect.getField("top", "I"); - jRightField = rect.getField("right", "I"); -} - -void -AndroidRectF::InitRectFClass(JNIEnv *jEnv) -{ - AutoJNIClass rect(jEnv, "android/graphics/RectF"); - jRectClass = rect.getGlobalRef(); - - jBottomField = rect.getField("bottom", "F"); - jLeftField = rect.getField("left", "F"); - jTopField = rect.getField("top", "F"); - jRightField = rect.getField("right", "F"); -} - -void -AndroidGeckoEvent::ReadPointArray(nsTArray &points, - JNIEnv *jenv, - jfieldID field, - int32_t count) -{ - jobjectArray jObjArray = (jobjectArray)jenv->GetObjectField(wrapped_obj, field); - for (int32_t i = 0; i < count; i++) { - jobject jObj = jenv->GetObjectArrayElement(jObjArray, i); - AndroidPoint jpoint(jenv, jObj); - - nsIntPoint p(jpoint.X(), jpoint.Y()); - points.AppendElement(p); - } -} - -void -AndroidGeckoEvent::ReadIntArray(nsTArray &aVals, - JNIEnv *jenv, - jfieldID field, - int32_t count) -{ - jintArray jIntArray = (jintArray)jenv->GetObjectField(wrapped_obj, field); - jint *vals = jenv->GetIntArrayElements(jIntArray, nullptr); - for (int32_t i = 0; i < count; i++) { - aVals.AppendElement(vals[i]); - } - jenv->ReleaseIntArrayElements(jIntArray, vals, JNI_ABORT); -} - -void -AndroidGeckoEvent::ReadFloatArray(nsTArray &aVals, - JNIEnv *jenv, - jfieldID field, - int32_t count) -{ - jfloatArray jFloatArray = (jfloatArray)jenv->GetObjectField(wrapped_obj, field); - jfloat *vals = jenv->GetFloatArrayElements(jFloatArray, nullptr); - for (int32_t i = 0; i < count; i++) { - aVals.AppendElement(vals[i]); - } - jenv->ReleaseFloatArrayElements(jFloatArray, vals, JNI_ABORT); -} - -void -AndroidGeckoEvent::ReadStringArray(nsTArray &array, - JNIEnv *jenv, - jfieldID field) -{ - jarray jArray = (jarray)jenv->GetObjectField(wrapped_obj, field); - jsize length = jenv->GetArrayLength(jArray); - jobjectArray jStringArray = (jobjectArray)jArray; - nsString *strings = array.AppendElements(length); - for (jsize i = 0; i < length; ++i) { - jstring javastring = (jstring) jenv->GetObjectArrayElement(jStringArray, i); - ReadStringFromJString(strings[i], jenv, javastring); - } -} - -void -AndroidGeckoEvent::ReadStringFromJString(nsString &aString, JNIEnv *jenv, - jstring s) -{ - if (!s) { - aString.SetIsVoid(true); - return; - } - - int len = jenv->GetStringLength(s); - aString.SetLength(len); - jenv->GetStringRegion(s, 0, len, reinterpret_cast(aString.BeginWriting())); -} - -void -AndroidGeckoEvent::ReadCharactersField(JNIEnv *jenv) -{ - jstring s = (jstring) jenv->GetObjectField(wrapped_obj, jCharactersField); - ReadStringFromJString(mCharacters, jenv, s); -} - -void -AndroidGeckoEvent::ReadCharactersExtraField(JNIEnv *jenv) -{ - jstring s = (jstring) jenv->GetObjectField(wrapped_obj, jCharactersExtraField); - ReadStringFromJString(mCharactersExtra, jenv, s); -} - -void -AndroidGeckoEvent::Init(JNIEnv *jenv, jobject jobj) -{ - NS_ASSERTION(!wrapped_obj, "Init called on non-null wrapped_obj!"); - - wrapped_obj = jobj; - - if (!jobj) - return; - - mAction = jenv->GetIntField(jobj, jActionField); - mType = jenv->GetIntField(jobj, jTypeField); - - switch (mType) { - case NATIVE_GESTURE_EVENT: - mTime = jenv->GetLongField(jobj, jTimeField); - mMetaState = jenv->GetIntField(jobj, jMetaStateField); - mCount = jenv->GetIntField(jobj, jCountField); - ReadPointArray(mPoints, jenv, jPoints, mCount); - mX = jenv->GetDoubleField(jobj, jXField); - - break; - - case MOTION_EVENT: - case LONG_PRESS: - mTime = jenv->GetLongField(jobj, jTimeField); - mMetaState = jenv->GetIntField(jobj, jMetaStateField); - mCount = jenv->GetIntField(jobj, jCountField); - mPointerIndex = jenv->GetIntField(jobj, jPointerIndexField); - - ReadPointArray(mPointRadii, jenv, jPointRadii, mCount); - ReadFloatArray(mOrientations, jenv, jOrientations, mCount); - ReadFloatArray(mPressures, jenv, jPressures, mCount); - ReadIntArray(mToolTypes, jenv, jToolTypes, mCount); - ReadPointArray(mPoints, jenv, jPoints, mCount); - ReadIntArray(mPointIndicies, jenv, jPointIndicies, mCount); - - break; - - case VIEWPORT: { - ReadCharactersField(jenv); - ReadCharactersExtraField(jenv); - break; - } - - default: - break; - } - -#ifdef DEBUG_ANDROID_EVENTS - ALOG("AndroidGeckoEvent: %p : %d", (void*)jobj, mType); -#endif -} - -void -AndroidGeckoEvent::Init(int aType) -{ - mType = aType; -} - -bool -AndroidGeckoEvent::CanCoalesceWith(AndroidGeckoEvent* ae) -{ - if (Type() == MOTION_EVENT && ae->Type() == MOTION_EVENT) { - return Action() == AndroidMotionEvent::ACTION_MOVE - && ae->Action() == AndroidMotionEvent::ACTION_MOVE; - } else if (Type() == APZ_INPUT_EVENT && ae->Type() == APZ_INPUT_EVENT) { - return mApzInput.mType == MultiTouchInput::MULTITOUCH_MOVE - && ae->mApzInput.mType == MultiTouchInput::MULTITOUCH_MOVE; - } - return false; -} - -mozilla::layers::ScrollableLayerGuid -AndroidGeckoEvent::ApzGuid() -{ - MOZ_ASSERT(Type() == APZ_INPUT_EVENT); - return mApzGuid; -} - -uint64_t -AndroidGeckoEvent::ApzInputBlockId() -{ - MOZ_ASSERT(Type() == APZ_INPUT_EVENT); - return mApzInputBlockId; -} - -nsEventStatus -AndroidGeckoEvent::ApzEventStatus() -{ - MOZ_ASSERT(Type() == APZ_INPUT_EVENT); - return mApzEventStatus; -} - -WidgetTouchEvent -AndroidGeckoEvent::MakeTouchEvent(nsIWidget* widget) -{ - if (Type() == APZ_INPUT_EVENT) { - return mApzInput.ToWidgetTouchEvent(widget); - } - - EventMessage type = eVoidEvent; - int startIndex = 0; - int endIndex = Count(); - - switch (Action()) { - case AndroidMotionEvent::ACTION_HOVER_ENTER: { - if (ToolTypes()[0] == AndroidMotionEvent::TOOL_TYPE_MOUSE) { - break; - } - } - MOZ_FALLTHROUGH; - case AndroidMotionEvent::ACTION_DOWN: - MOZ_FALLTHROUGH; - case AndroidMotionEvent::ACTION_POINTER_DOWN: { - type = eTouchStart; - break; - } - case AndroidMotionEvent::ACTION_HOVER_MOVE: { - if (ToolTypes()[0] == AndroidMotionEvent::TOOL_TYPE_MOUSE) { - break; - } - } - MOZ_FALLTHROUGH; - case AndroidMotionEvent::ACTION_MOVE: { - type = eTouchMove; - break; - } - case AndroidMotionEvent::ACTION_HOVER_EXIT: { - if (ToolTypes()[0] == AndroidMotionEvent::TOOL_TYPE_MOUSE) { - break; - } - } - MOZ_FALLTHROUGH; - case AndroidMotionEvent::ACTION_UP: - MOZ_FALLTHROUGH; - case AndroidMotionEvent::ACTION_POINTER_UP: { - type = eTouchEnd; - // for pointer-up events we only want the data from - // the one pointer that went up - startIndex = PointerIndex(); - endIndex = startIndex + 1; - break; - } - case AndroidMotionEvent::ACTION_OUTSIDE: - MOZ_FALLTHROUGH; - case AndroidMotionEvent::ACTION_CANCEL: { - type = eTouchCancel; - break; - } - } - - WidgetTouchEvent event(true, type, widget); - if (type == eVoidEvent) { - // An event we don't know about - return event; - } - - event.mModifiers = DOMModifiers(); - event.mTime = Time(); - - const LayoutDeviceIntPoint& offset = widget->WidgetToScreenOffset(); - event.mTouches.SetCapacity(endIndex - startIndex); - for (int i = startIndex; i < endIndex; i++) { - // In this code branch, we are dispatching this event directly - // into Gecko (as opposed to going through the AsyncPanZoomController), - // and the Points() array has points in CSS pixels, which we need - // to convert. - CSSToLayoutDeviceScale scale = widget->GetDefaultScale(); - auto pt = LayoutDeviceIntPoint::Truncate( - (Points()[i].x * scale.scale) - offset.x, - (Points()[i].y * scale.scale) - offset.y); - auto radius = LayoutDeviceIntPoint::Truncate( - PointRadii()[i].x * scale.scale, - PointRadii()[i].y * scale.scale); - RefPtr t = new Touch(PointIndicies()[i], - pt, - radius, - Orientations()[i], - Pressures()[i]); - event.mTouches.AppendElement(t); - } - - return event; -} - -MultiTouchInput -AndroidGeckoEvent::MakeMultiTouchInput(nsIWidget* widget) -{ - MultiTouchInput::MultiTouchType type = (MultiTouchInput::MultiTouchType)-1; - int startIndex = 0; - int endIndex = Count(); - - switch (Action()) { - case AndroidMotionEvent::ACTION_DOWN: - case AndroidMotionEvent::ACTION_POINTER_DOWN: { - type = MultiTouchInput::MULTITOUCH_START; - break; - } - case AndroidMotionEvent::ACTION_MOVE: { - type = MultiTouchInput::MULTITOUCH_MOVE; - break; - } - case AndroidMotionEvent::ACTION_UP: - case AndroidMotionEvent::ACTION_POINTER_UP: { - // for pointer-up events we only want the data from - // the one pointer that went up - startIndex = PointerIndex(); - endIndex = startIndex + 1; - type = MultiTouchInput::MULTITOUCH_END; - break; - } - case AndroidMotionEvent::ACTION_OUTSIDE: - case AndroidMotionEvent::ACTION_CANCEL: { - type = MultiTouchInput::MULTITOUCH_CANCEL; - break; - } - } - - MultiTouchInput event(type, Time(), TimeStamp(), 0); - event.modifiers = DOMModifiers(); - - if (type < 0) { - // An event we don't know about - return event; - } - - const nsIntPoint& offset = widget->WidgetToScreenOffset().ToUnknownPoint(); - event.mTouches.SetCapacity(endIndex - startIndex); - for (int i = startIndex; i < endIndex; i++) { - nsIntPoint point = Points()[i] - offset; - nsIntPoint radius = PointRadii()[i]; - SingleTouchData data(PointIndicies()[i], - ScreenIntPoint::FromUnknownPoint( - gfx::IntPoint(point.x, point.y)), - ScreenSize::FromUnknownSize( - gfx::Size(radius.x, radius.y)), - Orientations()[i], - Pressures()[i]); - event.mTouches.AppendElement(data); - } - - return event; -} - -WidgetMouseEvent -AndroidGeckoEvent::MakeMouseEvent(nsIWidget* widget) -{ - EventMessage msg = eVoidEvent; - if (Points().Length() > 0) { - switch (Action()) { - case AndroidMotionEvent::ACTION_HOVER_MOVE: - msg = eMouseMove; - break; - case AndroidMotionEvent::ACTION_HOVER_ENTER: - msg = eMouseEnterIntoWidget; - break; - case AndroidMotionEvent::ACTION_HOVER_EXIT: - msg = eMouseExitFromWidget; - break; - default: - break; - } - } - - WidgetMouseEvent event(true, msg, widget, - WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal); - - if (msg == eVoidEvent) { - // unknown type, or no point data. abort - return event; - } - - // XXX can we synthesize different buttons? - event.button = WidgetMouseEvent::eLeftButton; - if (msg != eMouseMove) { - event.mClickCount = 1; - } - event.mModifiers = DOMModifiers(); - event.mTime = Time(); - - // We are dispatching this event directly into Gecko (as opposed to going - // through the AsyncPanZoomController), and the Points() array has points - // in CSS pixels, which we need to convert to LayoutDevice pixels. - const LayoutDeviceIntPoint& offset = widget->WidgetToScreenOffset(); - CSSToLayoutDeviceScale scale = widget->GetDefaultScale(); - event.mRefPoint = - LayoutDeviceIntPoint::Truncate((Points()[0].x * scale.scale) - offset.x, - (Points()[0].y * scale.scale) - offset.y); - return event; -} - -Modifiers -AndroidGeckoEvent::DOMModifiers() const -{ - Modifiers result = 0; - if (mMetaState & AMETA_ALT_MASK) { - result |= MODIFIER_ALT; - } - if (mMetaState & AMETA_SHIFT_MASK) { - result |= MODIFIER_SHIFT; - } - if (mMetaState & AMETA_CTRL_MASK) { - result |= MODIFIER_CONTROL; - } - if (mMetaState & AMETA_META_MASK) { - result |= MODIFIER_META; - } - if (mMetaState & AMETA_FUNCTION_ON) { - result |= MODIFIER_FN; - } - if (mMetaState & AMETA_CAPS_LOCK_ON) { - result |= MODIFIER_CAPSLOCK; - } - if (mMetaState & AMETA_NUM_LOCK_ON) { - result |= MODIFIER_NUMLOCK; - } - if (mMetaState & AMETA_SCROLL_LOCK_ON) { - result |= MODIFIER_SCROLLLOCK; - } - return result; -} - -void -AndroidPoint::Init(JNIEnv *jenv, jobject jobj) -{ - if (jobj) { - mX = jenv->GetIntField(jobj, jXField); - mY = jenv->GetIntField(jobj, jYField); - } else { - mX = 0; - mY = 0; - } -} - -NS_IMPL_ISUPPORTS(nsAndroidDisplayport, nsIAndroidDisplayport) - -void -AndroidRect::Init(JNIEnv *jenv, jobject jobj) -{ - NS_ASSERTION(wrapped_obj == nullptr, "Init called on non-null wrapped_obj!"); - - wrapped_obj = jobj; - - if (jobj) { - mTop = jenv->GetIntField(jobj, jTopField); - mLeft = jenv->GetIntField(jobj, jLeftField); - mRight = jenv->GetIntField(jobj, jRightField); - mBottom = jenv->GetIntField(jobj, jBottomField); - } else { - mTop = 0; - mLeft = 0; - mRight = 0; - mBottom = 0; - } -} - -void -AndroidRectF::Init(JNIEnv *jenv, jobject jobj) -{ - NS_ASSERTION(wrapped_obj == nullptr, "Init called on non-null wrapped_obj!"); - - wrapped_obj = jobj; - - if (jobj) { - mTop = jenv->GetFloatField(jobj, jTopField); - mLeft = jenv->GetFloatField(jobj, jLeftField); - mRight = jenv->GetFloatField(jobj, jRightField); - mBottom = jenv->GetFloatField(jobj, jBottomField); - } else { - mTop = 0; - mLeft = 0; - mRight = 0; - mBottom = 0; - } -} nsJNIString::nsJNIString(jstring jstr, JNIEnv *jenv) { diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h index 098b4a70dea8..fadf97353a4c 100644 --- a/widget/android/AndroidJavaWrappers.h +++ b/widget/android/AndroidJavaWrappers.h @@ -29,185 +29,6 @@ class nsIWidget; namespace mozilla { -class AutoLocalJNIFrame; - -void InitAndroidJavaWrappers(JNIEnv *jEnv); - -class RefCountedJavaObject { -public: - RefCountedJavaObject(JNIEnv* env, jobject obj) : mRefCnt(0), mObject(env->NewGlobalRef(obj)) {} - - ~RefCountedJavaObject(); - - int32_t AddRef() { return ++mRefCnt; } - - int32_t Release() { - int32_t refcnt = --mRefCnt; - if (refcnt == 0) - delete this; - return refcnt; - } - - jobject GetObject() { return mObject; } -private: - int32_t mRefCnt; - jobject mObject; -}; - -/* - * Note: do not store global refs to any WrappedJavaObject; - * these are live only during a particular JNI method, as - * NewGlobalRef is -not- called on the jobject. - * - * If this is needed, WrappedJavaObject can be extended to - * handle it. - */ -class WrappedJavaObject { -public: - WrappedJavaObject() : - wrapped_obj(nullptr) - { } - - WrappedJavaObject(jobject jobj) : wrapped_obj(nullptr) { - Init(jobj); - } - - void Init(jobject jobj) { - wrapped_obj = jobj; - } - - bool isNull() const { - return wrapped_obj == nullptr; - } - - jobject wrappedObject() const { - return wrapped_obj; - } - -protected: - jobject wrapped_obj; -}; - -class AutoGlobalWrappedJavaObject : protected WrappedJavaObject{ -public: - AutoGlobalWrappedJavaObject() : - wrapped_obj(nullptr) - { } - - AutoGlobalWrappedJavaObject(jobject jobj, JNIEnv* env) : wrapped_obj(nullptr) { - Init(jobj, env); - } - - virtual ~AutoGlobalWrappedJavaObject(); - void Dispose(); - - void Init(jobject jobj, JNIEnv* env) { - if (!isNull()) { - env->DeleteGlobalRef(wrapped_obj); - } - wrapped_obj = env->NewGlobalRef(jobj); - } - - bool isNull() const { - return wrapped_obj == nullptr; - } - - jobject wrappedObject() const { - return wrapped_obj; - } - -protected: - jobject wrapped_obj; -}; - -class AndroidPoint : public WrappedJavaObject -{ -public: - static void InitPointClass(JNIEnv *jEnv); - - AndroidPoint() { } - AndroidPoint(JNIEnv *jenv, jobject jobj) { - Init(jenv, jobj); - } - - void Init(JNIEnv *jenv, jobject jobj); - - int X() { return mX; } - int Y() { return mY; } - -protected: - int mX; - int mY; - - static jclass jPointClass; - static jfieldID jXField; - static jfieldID jYField; -}; - -class AndroidRect : public WrappedJavaObject -{ -public: - static void InitRectClass(JNIEnv *jEnv); - - AndroidRect() { } - AndroidRect(JNIEnv *jenv, jobject jobj) { - Init(jenv, jobj); - } - - void Init(JNIEnv *jenv, jobject jobj); - - int Bottom() { return mBottom; } - int Left() { return mLeft; } - int Right() { return mRight; } - int Top() { return mTop; } - int Width() { return mRight - mLeft; } - int Height() { return mBottom - mTop; } - -protected: - int mBottom; - int mLeft; - int mRight; - int mTop; - - static jclass jRectClass; - static jfieldID jBottomField; - static jfieldID jLeftField; - static jfieldID jRightField; - static jfieldID jTopField; -}; - -class AndroidRectF : public WrappedJavaObject -{ -public: - static void InitRectFClass(JNIEnv *jEnv); - - AndroidRectF() { } - AndroidRectF(JNIEnv *jenv, jobject jobj) { - Init(jenv, jobj); - } - - void Init(JNIEnv *jenv, jobject jobj); - - float Bottom() { return mBottom; } - float Left() { return mLeft; } - float Right() { return mRight; } - float Top() { return mTop; } - float Width() { return mRight - mLeft; } - float Height() { return mBottom - mTop; } - -protected: - float mBottom; - float mLeft; - float mRight; - float mTop; - - static jclass jRectClass; - static jfieldID jBottomField; - static jfieldID jLeftField; - static jfieldID jRightField; - static jfieldID jTopField; -}; - enum { // These keycode masks are not defined in android/keycodes.h: #if __ANDROID_API__ < 13 @@ -345,29 +166,6 @@ enum { AMETA_SHIFT_MASK = AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_RIGHT_ON | AMETA_SHIFT_ON, }; -class nsAndroidDisplayport final : public nsIAndroidDisplayport -{ -public: - NS_DECL_ISUPPORTS - virtual nsresult GetLeft(float *aLeft) override { *aLeft = mLeft; return NS_OK; } - virtual nsresult GetTop(float *aTop) override { *aTop = mTop; return NS_OK; } - virtual nsresult GetRight(float *aRight) override { *aRight = mRight; return NS_OK; } - virtual nsresult GetBottom(float *aBottom) override { *aBottom = mBottom; return NS_OK; } - virtual nsresult GetResolution(float *aResolution) override { *aResolution = mResolution; return NS_OK; } - virtual nsresult SetLeft(float aLeft) override { mLeft = aLeft; return NS_OK; } - virtual nsresult SetTop(float aTop) override { mTop = aTop; return NS_OK; } - virtual nsresult SetRight(float aRight) override { mRight = aRight; return NS_OK; } - virtual nsresult SetBottom(float aBottom) override { mBottom = aBottom; return NS_OK; } - virtual nsresult SetResolution(float aResolution) override { mResolution = aResolution; return NS_OK; } - - nsAndroidDisplayport(AndroidRectF aRect, float aResolution): - mLeft(aRect.Left()), mTop(aRect.Top()), mRight(aRect.Right()), mBottom(aRect.Bottom()), mResolution(aResolution) {} - -private: - ~nsAndroidDisplayport() {} - float mLeft, mTop, mRight, mBottom, mResolution; -}; - class AndroidMotionEvent { public: @@ -403,139 +201,6 @@ public: }; }; -class AndroidGeckoEvent : public WrappedJavaObject -{ -private: - AndroidGeckoEvent() { - } - - void Init(JNIEnv *jenv, jobject jobj); - void Init(int aType); - -public: - static void InitGeckoEventClass(JNIEnv *jEnv); - - static AndroidGeckoEvent* MakeFromJavaObject(JNIEnv *jenv, jobject jobj) { - AndroidGeckoEvent *event = new AndroidGeckoEvent(); - event->Init(jenv, jobj); - return event; - } - - static AndroidGeckoEvent* MakeApzInputEvent(const MultiTouchInput& aInput, const mozilla::layers::ScrollableLayerGuid& aGuid, uint64_t aInputBlockId, nsEventStatus aEventStatus) { - AndroidGeckoEvent* event = new AndroidGeckoEvent(); - event->Init(APZ_INPUT_EVENT); - event->mApzInput = aInput; - event->mApzGuid = aGuid; - event->mApzInputBlockId = aInputBlockId; - event->mApzEventStatus = aEventStatus; - return event; - } - - bool IsInputEvent() const { - return mType == AndroidGeckoEvent::MOTION_EVENT || - mType == AndroidGeckoEvent::NATIVE_GESTURE_EVENT || - mType == AndroidGeckoEvent::LONG_PRESS || - mType == AndroidGeckoEvent::APZ_INPUT_EVENT; - } - - int Action() { return mAction; } - int Type() { return mType; } - int64_t Time() { return mTime; } - const nsTArray& Points() { return mPoints; } - const nsTArray& PointIndicies() { return mPointIndicies; } - const nsTArray& Pressures() { return mPressures; } - const nsTArray& ToolTypes() { return mToolTypes; } - const nsTArray& Orientations() { return mOrientations; } - const nsTArray& PointRadii() { return mPointRadii; } - double X() { return mX; } - nsString& Characters() { return mCharacters; } - nsString& CharactersExtra() { return mCharactersExtra; } - int MetaState() { return mMetaState; } - Modifiers DOMModifiers() const; - bool IsAltPressed() const { return (mMetaState & AMETA_ALT_MASK) != 0; } - bool IsShiftPressed() const { return (mMetaState & AMETA_SHIFT_MASK) != 0; } - bool IsCtrlPressed() const { return (mMetaState & AMETA_CTRL_MASK) != 0; } - bool IsMetaPressed() const { return (mMetaState & AMETA_META_MASK) != 0; } - int Count() { return mCount; } - int PointerIndex() { return mPointerIndex; } - int RequestId() { return mCount; } // for convenience - bool CanCoalesceWith(AndroidGeckoEvent* ae); - WidgetTouchEvent MakeTouchEvent(nsIWidget* widget); - MultiTouchInput MakeMultiTouchInput(nsIWidget* widget); - WidgetMouseEvent MakeMouseEvent(nsIWidget* widget); - mozilla::layers::ScrollableLayerGuid ApzGuid(); - uint64_t ApzInputBlockId(); - nsEventStatus ApzEventStatus(); - -protected: - int mAction; - int mType; - int64_t mTime; - nsTArray mPoints; - nsTArray mPointRadii; - nsTArray mPointIndicies; - nsTArray mOrientations; - nsTArray mPressures; - nsTArray mToolTypes; - int mMetaState; - int mCount; - double mX; - int mPointerIndex; - nsString mCharacters, mCharactersExtra; - MultiTouchInput mApzInput; - mozilla::layers::ScrollableLayerGuid mApzGuid; - uint64_t mApzInputBlockId; - nsEventStatus mApzEventStatus; - - void ReadIntArray(nsTArray &aVals, - JNIEnv *jenv, - jfieldID field, - int32_t count); - void ReadFloatArray(nsTArray &aVals, - JNIEnv *jenv, - jfieldID field, - int32_t count); - void ReadPointArray(nsTArray &mPoints, - JNIEnv *jenv, - jfieldID field, - int32_t count); - void ReadStringArray(nsTArray &aStrings, - JNIEnv *jenv, - jfieldID field); - void ReadCharactersField(JNIEnv *jenv); - void ReadCharactersExtraField(JNIEnv *jenv); - void ReadStringFromJString(nsString &aString, JNIEnv *jenv, jstring s); - - static jclass jGeckoEventClass; - static jfieldID jActionField; - static jfieldID jTypeField; - static jfieldID jTimeField; - static jfieldID jPoints; - static jfieldID jPointIndicies; - static jfieldID jOrientations; - static jfieldID jPressures; - static jfieldID jToolTypes; - static jfieldID jPointRadii; - static jfieldID jXField; - - static jfieldID jCharactersField; - static jfieldID jCharactersExtraField; - static jfieldID jMetaStateField; - static jfieldID jCountField; - static jfieldID jPointerIndexField; - -public: - enum { - MOTION_EVENT = 2, - NOOP = 15, - APZ_INPUT_EVENT = 17, // used internally in AndroidJNI/nsAppShell/nsWindow - VIEWPORT = 20, - NATIVE_GESTURE_EVENT = 31, - LONG_PRESS = 47, - dummy_java_enum_list_end - }; -}; - class nsJNIString : public nsString { public: diff --git a/widget/android/GeneratedJNIWrappers.cpp b/widget/android/GeneratedJNIWrappers.cpp index 1f0496f9c0c6..fed995afea10 100644 --- a/widget/android/GeneratedJNIWrappers.cpp +++ b/widget/android/GeneratedJNIWrappers.cpp @@ -1277,14 +1277,6 @@ auto GeckoLayerClient::DeactivateProgramAndRestoreState(bool a0, int32_t a1, int return mozilla::jni::Method::Call(GeckoLayerClient::mCtx, nullptr, a0, a1, a2, a3, a4); } -constexpr char GeckoLayerClient::GetDisplayPort_t::name[]; -constexpr char GeckoLayerClient::GetDisplayPort_t::signature[]; - -auto GeckoLayerClient::GetDisplayPort(bool a0, bool a1, int32_t a2, mozilla::jni::Object::Param a3) const -> mozilla::jni::Object::LocalRef -{ - return mozilla::jni::Method::Call(GeckoLayerClient::mCtx, nullptr, a0, a1, a2, a3); -} - constexpr char GeckoLayerClient::IsContentDocumentDisplayed_t::name[]; constexpr char GeckoLayerClient::IsContentDocumentDisplayed_t::signature[]; @@ -1500,14 +1492,6 @@ auto NativePanZoomController::OnSelectionDragState(bool a0) const -> void return mozilla::jni::Method::Call(NativePanZoomController::mCtx, nullptr, a0); } -constexpr char NativePanZoomController::RequestContentRepaint_t::name[]; -constexpr char NativePanZoomController::RequestContentRepaint_t::signature[]; - -auto NativePanZoomController::RequestContentRepaint(float a0, float a1, float a2, float a3, float a4) const -> void -{ - return mozilla::jni::Method::Call(NativePanZoomController::mCtx, nullptr, a0, a1, a2, a3, a4); -} - constexpr char NativePanZoomController::SetScrollingRootContent_t::name[]; constexpr char NativePanZoomController::SetScrollingRootContent_t::signature[]; diff --git a/widget/android/GeneratedJNIWrappers.h b/widget/android/GeneratedJNIWrappers.h index 8e32b3856037..c2fbfa996244 100644 --- a/widget/android/GeneratedJNIWrappers.h +++ b/widget/android/GeneratedJNIWrappers.h @@ -4072,29 +4072,6 @@ public: auto DeactivateProgramAndRestoreState(bool, int32_t, int32_t, int32_t, int32_t) const -> void; - struct GetDisplayPort_t { - typedef GeckoLayerClient Owner; - typedef mozilla::jni::Object::LocalRef ReturnType; - typedef mozilla::jni::Object::Param SetterType; - typedef mozilla::jni::Args< - bool, - bool, - int32_t, - mozilla::jni::Object::Param> Args; - static constexpr char name[] = "getDisplayPort"; - static constexpr char signature[] = - "(ZZILorg/mozilla/gecko/gfx/ImmutableViewportMetrics;)Lorg/mozilla/gecko/gfx/DisplayPortMetrics;"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::GECKO; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto GetDisplayPort(bool, bool, int32_t, mozilla::jni::Object::Param) const -> mozilla::jni::Object::LocalRef; - struct IsContentDocumentDisplayed_t { typedef GeckoLayerClient Owner; typedef bool ReturnType; @@ -4889,30 +4866,6 @@ public: auto OnSelectionDragState(bool) const -> void; - struct RequestContentRepaint_t { - typedef NativePanZoomController Owner; - typedef void ReturnType; - typedef void SetterType; - typedef mozilla::jni::Args< - float, - float, - float, - float, - float> Args; - static constexpr char name[] = "requestContentRepaint"; - static constexpr char signature[] = - "(FFFFF)V"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::UI; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto RequestContentRepaint(float, float, float, float, float) const -> void; - struct SetScrollingRootContent_t { typedef NativePanZoomController Owner; typedef void ReturnType; diff --git a/widget/android/nsAppShell.cpp b/widget/android/nsAppShell.cpp index 435e9dbacdeb..144d17ccea5f 100644 --- a/widget/android/nsAppShell.cpp +++ b/widget/android/nsAppShell.cpp @@ -607,118 +607,6 @@ nsAppShell::ResolveURI(const nsCString& aUriStr) return nullptr; } -class nsAppShell::LegacyGeckoEvent : public Event -{ - mozilla::UniquePtr ae; - -public: - LegacyGeckoEvent(AndroidGeckoEvent* e) : ae(e) {} - - void Run() override; - void PostTo(mozilla::LinkedList& queue) override; - - Event::Type ActivityType() const override - { - return ae->IsInputEvent() ? mozilla::HangMonitor::kUIActivity - : mozilla::HangMonitor::kGeneralActivity; - } -}; - -void -nsAppShell::PostEvent(AndroidGeckoEvent* event) -{ - mozilla::MutexAutoLock lock(*sAppShellLock); - if (!sAppShell) { - return; - } - sAppShell->mEventQueue.Post(mozilla::MakeUnique(event)); -} - -void -nsAppShell::LegacyGeckoEvent::Run() -{ - const mozilla::UniquePtr& curEvent = ae; - - EVLOG("nsAppShell: event %p %d", (void*)curEvent.get(), curEvent->Type()); - - switch (curEvent->Type()) { - case AndroidGeckoEvent::VIEWPORT: { - if (curEvent->Characters().Length() == 0) - break; - - nsCOMPtr obsServ = - mozilla::services::GetObserverService(); - - const NS_ConvertUTF16toUTF8 topic(curEvent->Characters()); - - obsServ->NotifyObservers(nullptr, topic.get(), curEvent->CharactersExtra().get()); - break; - } - - case AndroidGeckoEvent::NOOP: - break; - - default: - nsWindow::OnGlobalAndroidEvent(curEvent.get()); - break; - } - - EVLOG("nsAppShell: -- done event %p %d", (void*)curEvent.get(), curEvent->Type()); -} - -void -nsAppShell::LegacyGeckoEvent::PostTo(mozilla::LinkedList& queue) -{ - { - EVLOG("nsAppShell::PostEvent %p %d", ae, ae->Type()); - switch (ae->Type()) { - case AndroidGeckoEvent::VIEWPORT: - // Coalesce a previous viewport event with this one, while - // allowing coalescing to happen across native callback events. - for (Event* event = queue.getLast(); event; - event = event->getPrevious()) - { - if (event->HasSameTypeAs(this) && - static_cast(event)->ae->Type() - == AndroidGeckoEvent::VIEWPORT) { - // Found a previous viewport event; remove it. - delete event; - break; - } - NativeCallbackEvent callbackEvent(nullptr); - if (event->HasSameTypeAs(&callbackEvent)) { - // Allow coalescing viewport events across callback events. - continue; - } - // End of search for viewport events to coalesce. - break; - } - queue.insertBack(this); - break; - - case AndroidGeckoEvent::MOTION_EVENT: - case AndroidGeckoEvent::APZ_INPUT_EVENT: - if (sAppShell->mAllowCoalescingTouches) { - Event* const event = queue.getLast(); - if (event && event->HasSameTypeAs(this) && ae->CanCoalesceWith( - static_cast(event)->ae.get())) { - - // consecutive motion-move events; drop the last one before adding the new one - EVLOG("nsAppShell: Dropping old move event at %p in favour of new move event %p", event, ae); - // Delete the event and remove from list. - delete event; - } - } - queue.insertBack(this); - break; - - default: - queue.insertBack(this); - break; - } - } -} - nsresult nsAppShell::AddObserver(const nsAString &aObserverKey, nsIObserver *aObserver) { diff --git a/widget/android/nsAppShell.h b/widget/android/nsAppShell.h index e399b0cf5ea1..e4938a9633d8 100644 --- a/widget/android/nsAppShell.h +++ b/widget/android/nsAppShell.h @@ -21,7 +21,6 @@ #include "nsIAndroidBridge.h" namespace mozilla { -class AndroidGeckoEvent; bool ProcessNextEvent(); void NotifyEvent(); } @@ -57,8 +56,6 @@ public: } }; - class LegacyGeckoEvent; - template class LambdaEvent : public Event { @@ -132,8 +129,6 @@ public: mozilla::Move(lambda))); } - static void PostEvent(mozilla::AndroidGeckoEvent* event); - // Post a event and wait for it to finish running on the Gecko thread. static void SyncRunEvent(Event&& event, mozilla::UniquePtr(*eventFactory)( diff --git a/widget/android/nsIAndroidBridge.idl b/widget/android/nsIAndroidBridge.idl index f07b1d438681..c85e7a858980 100644 --- a/widget/android/nsIAndroidBridge.idl +++ b/widget/android/nsIAndroidBridge.idl @@ -32,38 +32,11 @@ interface nsIAndroidBrowserApp : nsISupports { nsIUITelemetryObserver getUITelemetryObserver(); }; -[scriptable, uuid(92ae801d-da9c-4a24-b2b6-344c4af7008b)] -interface nsIAndroidViewport : nsISupports { - readonly attribute float x; - readonly attribute float y; - readonly attribute int32_t width; - readonly attribute int32_t height; - readonly attribute float pageLeft; - readonly attribute float pageTop; - readonly attribute float pageRight; - readonly attribute float pageBottom; - readonly attribute float cssPageLeft; - readonly attribute float cssPageTop; - readonly attribute float cssPageRight; - readonly attribute float cssPageBottom; - readonly attribute float zoom; -}; - -[scriptable, uuid(e1bfbc07-dbae-409d-a5b5-ef57522c1f15)] -interface nsIAndroidDisplayport : nsISupports { - attribute float left; - attribute float top; - attribute float right; - attribute float bottom; - attribute float resolution; -}; - [scriptable, uuid(1beb70d3-70f3-4742-98cc-a3d301b26c0c)] interface nsIAndroidBridge : nsISupports { [implicit_jscontext] void handleGeckoMessage(in jsval message); attribute nsIAndroidBrowserApp browserApp; - nsIAndroidDisplayport getDisplayPort(in boolean aPageSizeUpdate, in boolean isBrowserContentDisplayed, in int32_t tabId, in nsIAndroidViewport metrics); void contentDocumentChanged(); boolean isContentDocumentDisplayed(); }; diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp index dedf92ab553f..e8cbe3370f31 100644 --- a/widget/android/nsWindow.cpp +++ b/widget/android/nsWindow.cpp @@ -1836,55 +1836,6 @@ nsWindow::CreateLayerManager(int aCompositorWidth, int aCompositorHeight) } } -void -nsWindow::OnGlobalAndroidEvent(AndroidGeckoEvent *ae) -{ - nsWindow *win = TopWindow(); - if (!win) - return; - - switch (ae->Type()) { - case AndroidGeckoEvent::APZ_INPUT_EVENT: { - win->UserActivity(); - - WidgetTouchEvent touchEvent = ae->MakeTouchEvent(win); - win->ProcessUntransformedAPZEvent(&touchEvent, ae->ApzGuid(), ae->ApzInputBlockId(), ae->ApzEventStatus()); - win->DispatchHitTest(touchEvent); - break; - } - case AndroidGeckoEvent::MOTION_EVENT: { - win->UserActivity(); - bool preventDefaultActions = win->OnMultitouchEvent(ae); - if (!preventDefaultActions && ae->Count() < 2) { - win->OnMouseEvent(ae); - } - break; - } - - // LongPress events mostly trigger contextmenu options, but can also lead to - // textSelection processing. - case AndroidGeckoEvent::LONG_PRESS: { - win->UserActivity(); - - nsCOMPtr obsServ = mozilla::services::GetObserverService(); - obsServ->NotifyObservers(nullptr, "before-build-contextmenu", nullptr); - - // Send the contextmenu event to Gecko. - if (!win->OnContextmenuEvent(ae)) { - // If not consumed, continue as a LongTap, possibly trigger - // Gecko Text Selection Carets. - win->OnLongTapEvent(ae); - } - break; - } - - case AndroidGeckoEvent::NATIVE_GESTURE_EVENT: { - win->OnNativeGestureEvent(ae); - break; - } - } -} - void nsWindow::OnSizeChanged(const gfx::IntSize& aSize) { @@ -1979,80 +1930,6 @@ nsWindow::GetNativeData(uint32_t aDataType) return nullptr; } -void -nsWindow::OnMouseEvent(AndroidGeckoEvent *ae) -{ - RefPtr kungFuDeathGrip(this); - - WidgetMouseEvent event = ae->MakeMouseEvent(this); - if (event.mMessage == eVoidEvent) { - // invalid event type, abort - return; - } - - DispatchEvent(&event); -} - -bool -nsWindow::OnContextmenuEvent(AndroidGeckoEvent *ae) -{ - RefPtr kungFuDeathGrip(this); - - CSSPoint pt; - const nsTArray& points = ae->Points(); - if (points.Length() > 0) { - pt = CSSPoint(points[0].x, points[0].y); - } - - // Send the contextmenu event. - WidgetMouseEvent contextMenuEvent(true, eContextMenu, this, - WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal); - contextMenuEvent.mRefPoint = - RoundedToInt(pt * GetDefaultScale()) - WidgetToScreenOffset(); - contextMenuEvent.mIgnoreRootScrollFrame = true; - contextMenuEvent.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH; - - nsEventStatus contextMenuStatus; - DispatchEvent(&contextMenuEvent, contextMenuStatus); - - // If the contextmenu event was consumed (preventDefault issued), we follow with a - // touchcancel event. This avoids followup touchend events passsing through and - // triggering further element behaviour such as link-clicks. - if (contextMenuStatus == nsEventStatus_eConsumeNoDefault) { - WidgetTouchEvent canceltouchEvent = ae->MakeTouchEvent(this); - canceltouchEvent.mMessage = eTouchCancel; - DispatchEvent(&canceltouchEvent); - return true; - } - - return false; -} - -void -nsWindow::OnLongTapEvent(AndroidGeckoEvent *ae) -{ - RefPtr kungFuDeathGrip(this); - - CSSPoint pt; - const nsTArray& points = ae->Points(); - if (points.Length() > 0) { - pt = CSSPoint(points[0].x, points[0].y); - } - - // Send the LongTap event to Gecko. - WidgetMouseEvent event(true, eMouseLongTap, this, - WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal); - event.button = WidgetMouseEvent::eLeftButton; - event.mRefPoint = - RoundedToInt(pt * GetDefaultScale()) - WidgetToScreenOffset(); - event.mClickCount = 1; - event.mTime = ae->Time(); - event.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH; - event.mIgnoreRootScrollFrame = true; - - DispatchEvent(&event); -} - void nsWindow::DispatchHitTest(const WidgetTouchEvent& aEvent) { @@ -2075,120 +1952,6 @@ nsWindow::DispatchHitTest(const WidgetTouchEvent& aEvent) } } -bool nsWindow::OnMultitouchEvent(AndroidGeckoEvent *ae) -{ - RefPtr kungFuDeathGrip(this); - - // End any composition in progress in case the touch event listener - // modifies the input field value (see bug 856155) - RemoveIMEComposition(); - - // This is set to true once we have called SetPreventPanning() exactly - // once for a given sequence of touch events. It is reset on the start - // of the next sequence. - static bool sDefaultPreventedNotified = false; - static bool sLastWasDownEvent = false; - - bool preventDefaultActions = false; - bool isDownEvent = false; - - WidgetTouchEvent event = ae->MakeTouchEvent(this); - if (event.mMessage != eVoidEvent) { - nsEventStatus status; - DispatchEvent(&event, status); - // We check mMultipleActionsPrevented because that's what - // sets when someone starts dragging the thumb. It doesn't set the status - // because it doesn't want to prevent the code that gives the input focus - // from running. - preventDefaultActions = (status == nsEventStatus_eConsumeNoDefault || - event.mFlags.mMultipleActionsPrevented); - isDownEvent = (event.mMessage == eTouchStart); - } - - DispatchHitTest(event); - - // if the last event we got was a down event, then by now we know for sure whether - // this block has been default-prevented or not. if we haven't already sent the - // notification for this block, do so now. - if (sLastWasDownEvent && !sDefaultPreventedNotified) { - // if this event is a down event, that means it's the start of a new block, and the - // previous block should not be default-prevented - bool defaultPrevented = isDownEvent ? false : preventDefaultActions; - if (ae->Type() == AndroidGeckoEvent::APZ_INPUT_EVENT) { - if (mAPZC) { - AndroidContentController::NotifyDefaultPrevented( - mAPZC, ae->ApzInputBlockId(), defaultPrevented); - } - } else { - GeckoAppShell::NotifyDefaultPrevented(defaultPrevented); - } - sDefaultPreventedNotified = true; - } - - // now, if this event is a down event, then we might already know that it has been - // default-prevented. if so, we send the notification right away; otherwise we wait - // for the next event. - if (isDownEvent) { - if (preventDefaultActions) { - if (ae->Type() == AndroidGeckoEvent::APZ_INPUT_EVENT) { - if (mAPZC) { - AndroidContentController::NotifyDefaultPrevented( - mAPZC, ae->ApzInputBlockId(), true); - } - } else { - GeckoAppShell::NotifyDefaultPrevented(true); - } - sDefaultPreventedNotified = true; - } else { - sDefaultPreventedNotified = false; - } - } - sLastWasDownEvent = isDownEvent; - - return preventDefaultActions; -} - -void -nsWindow::OnNativeGestureEvent(AndroidGeckoEvent *ae) -{ - LayoutDeviceIntPoint pt(ae->Points()[0].x, - ae->Points()[0].y); - double delta = ae->X(); - EventMessage msg = eVoidEvent; - - switch (ae->Action()) { - case AndroidMotionEvent::ACTION_MAGNIFY_START: - msg = eMagnifyGestureStart; - mStartDist = delta; - mLastDist = delta; - break; - case AndroidMotionEvent::ACTION_MAGNIFY: - msg = eMagnifyGestureUpdate; - delta -= mLastDist; - mLastDist += delta; - break; - case AndroidMotionEvent::ACTION_MAGNIFY_END: - msg = eMagnifyGesture; - delta -= mStartDist; - break; - default: - return; - } - - RefPtr kungFuDeathGrip(this); - - WidgetSimpleGestureEvent event(true, msg, this); - - event.mDirection = 0; - event.mDelta = delta; - event.mModifiers = 0; - event.mTime = ae->Time(); - event.mRefPoint = pt; - - DispatchEvent(&event); -} - - static unsigned int ConvertAndroidKeyCodeToDOMKeyCode(int androidKeyCode) { // Special-case alphanumeric keycodes because they are most common. diff --git a/widget/android/nsWindow.h b/widget/android/nsWindow.h index 3c468438feaf..fc9b0a8a4aa4 100644 --- a/widget/android/nsWindow.h +++ b/widget/android/nsWindow.h @@ -20,7 +20,6 @@ struct ANPEvent; namespace mozilla { - class AndroidGeckoEvent; class TextComposition; class WidgetTouchEvent; @@ -68,15 +67,8 @@ private: NPZCSupport* mNPZCSupport; public: - static void OnGlobalAndroidEvent(mozilla::AndroidGeckoEvent *ae); static nsWindow* TopWindow(); - bool OnContextmenuEvent(mozilla::AndroidGeckoEvent *ae); - void OnLongTapEvent(mozilla::AndroidGeckoEvent *ae); - bool OnMultitouchEvent(mozilla::AndroidGeckoEvent *ae); - void OnNativeGestureEvent(mozilla::AndroidGeckoEvent *ae); - void OnMouseEvent(mozilla::AndroidGeckoEvent *ae); - void OnSizeChanged(const mozilla::gfx::IntSize& aSize); void InitEvent(mozilla::WidgetGUIEvent& event,