gecko-dev/widget/android/nsWindow.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

284 строки
10 KiB
C
Исходник Обычный вид История

/* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
* vim: set sw=2 ts=4 expandtab:
2012-05-21 15:12:37 +04:00
* 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/. */
#ifndef NSWINDOW_H_
#define NSWINDOW_H_
#include "nsBaseWidget.h"
#include "gfxPoint.h"
#include "nsIUserIdleServiceInternal.h"
#include "nsTArray.h"
Bug 1307820 - Implement per-GeckoView messaging; r=snorp r=sebastian Bug 1307820 - 1a. Move GeckoApp EventDispatcher to GeckoView; r=snorp Make it a GeckoView-specific EventDispatcher instead of GeckoApp-specific, so that GeckoView consumers can benefit from a per-view EventDispatcher. In addition, a few events like Gecko:Ready are moved back to the global EventDispatcher because that makes more sense. Bug 1307820 - 1b. Don't use GeckoApp EventDispatcher during inflation; r=snorp During layout inflation, we don't yet have GeckoView and therefore the GeckoView EventDispatcher, so we should not register events until later, typically during onAttachedToWindow. Bug 1307820 - 2. Introduce GeckoBundle; r=snorp The Android Bundle class has several disadvantages when used for holding structured data from JS. The most obvious one is the differentiation between int and double, which doesn't exist in JS. So when a JS number is converted to either a Bundle int or double, we run the risk of making a wrong conversion, resulting in a type mismatch exception when Java uses the Bundle. This extends to number arrays from JS. There is one more gotcha when using arrays. When we receive an empty array from JS, there is no way for us to determine the type of the array, because even empty arrays in Java have types. We are forced to pick an arbitrary type like boolean[], which can easily result in a type mismatch exception when using the array on the Java side. In addition, Bundle is fairly cumbersome, and we cannot access the inner structures of Bundle from Java or JNI, making it harder to use. With these factors in mind, this patch introduces GeckoBundle as a better choice for Gecko/Java communication. It is almost fully API-compatible with the Android Bundle; only the Bundle array methods are different. It resolves the numbers problem by performing conversions if necessary, and it is a lot more lightweight than Bundle. Bug 1307820 - 3. Convert BundleEventListener to use GeckoBundle; r=snorp Convert BundleEventListener from using Bundle to using GeckoBundle. Because NativeJSContainer still only supports Bundle, we do an extra conversion when sending Bundle messages, but eventually, as we eliminate the use of NativeJSContainer, that will go away as well. Bug 1307820 - 4. Introduce EventDispatcher interfaces; r=snorp Introduce several new XPCOM interfaces for the new EventDispatcher API, these interfaces are mostly mirrored after their Java counterparts. * nsIAndroidEventDispatcher is the main interface for registering/unregistering listeners and for dispatching events from JS/C++. * nsIAndroidEventListener is the interface that JS/C++ clients implement to receive events. * nsIAndroidEventCallback is the interface that JS/C++ clients implement to receive responses from dispatched events. * nsIAndroidView is the new interface that every window receives that is specific to the window/GeckoView pair. It is passed to chrome scripts through window arguments. Bug 1307820 - 5. Remove EventDispatcher references from gfx code; r=snorp EventDispatcher was used for JPZC, but NPZC doesn't use it anymore. Bug 1307820 - 6. General JNI template improvements; r=snorp This patch includes several improvements to the JNI templates. * Context::RawClassRef is removed to avoid misuse, as Context::ClassRef should be used instead. * Fix a compile error, in certain usages, in the DisposeNative overload in NativeStub. * Add Ref::IsInstanceOf and Context::IsInstanceOf to mirror the JNIEnv::IsInstanceOf call. * Add Ref::operator* and Context::operator* to provide an easy way to get a Context object. * Add built-in declarations for boxed Java objects (e.g. Boolean, Integer, etc). * Add ObjectArray::New for creating new object arrays of specific types. * Add lvalue qualifiers to LocalRef::operator= and GlobalRef::operator=, to prevent accidentally assigning to rvalues. (e.g. `objectArray->GetElement(0) = newObject;`, which won't work as intended.) Bug 1307820 - 7. Support ownership through RefPtr for native JNI objects; r=snorp In addition to direct ownership and weak pointer ownership, add a third ownership model where a native JNI object owns a RefPtr that holds a strong reference to the actual C++ object. This ownership model works well with ref-counted objects such as XPCOM objects, and is activated through the presence of public members AddRef() and Release() in the C++ object. Bug 1307820 - 8. Implement Gecko-side EventDispatcher; r=snorp Add a skeletal implementation of EventDispatcher on the Gecko side. Each widget::EventDispatcher will be associated with a Java EventDispatcher, so events can be dispatched from Gecko to Java and vice versa. AndroidBridge and nsWindow will implement nsIAndroidEventDispatcher through widget::EventDispatcher. Other patches will add more complete functionality such as GeckoBundle/JSObject translation and support for callbacks. Bug 1307820 - 9. Implement dispatching between Gecko/Java; r=snorp Implement translation between JSObject and GeckoBundle, and use that for dispatching events from Gecko to Java and vice versa. Bug 1307820 - 10. Implement callback support; r=snorp Implement callback support for both Gecko-to-Java events and Java-to-Gecko events. For Gecko-to-Java, we translate nsIAndroidEventCallback to a Java EventCallback through NativeCallbackDelegate and pass it to the Java listener. For Java-to-Gecko, we translate EventCallback to a nsIAndroidEventCallback through JavaCallbackDelegate and pass it to the Gecko listener. There is another JavaCallbackDelegate on the Java side that redirects the callback to a particular thread. For example, if the event was dispatched from the UI thread, we make sure the callback happens on the UI thread as well. Bug 1307820 - 11. Add BundleEventListener support for Gecko thread; r=snorp Add support for BundleEventListener on the Gecko thread, so that we can use it to replace any existing GeckoEventListener or NativeEventListener implementations that require the listener be run synchronously on the Gecko thread. Bug 1307820 - 12. Add global EventDispatcher in AndroidBridge; r=snorp Add an instance of EventDispatcher to AndroidBridge to act as a global event dispatcher. Bug 1307820 - 13. Add per-nsWindow EventDispatcher; r=snorp Add an instance of EventDispatcher to each nsWindow through an AndroidView object, which implements nsIAndroidView. The nsIAndroidView is passed to the chrome script through the window argument when opening the window. Bug 1307820 - 14. Update auto-generated bindings; r=me Bug 1307820 - 15. Update testEventDispatcher; r=snorp Update testEventDispatcher to include new functionalities in EventDisptcher. * Add tests for dispatching events to UI/background thread through nsIAndroidEventDispatcher::dispatch. * Add tests for dispatching events to UI/background thread through EventDispatcher.dispatch. * Add tests for dispatching events to Gecko thread through EventDispatcher.dispatch. Each kind of test exercises both the global EventDispatcher through EventDispatcher.getInstance() and the per-GeckoView EventDispatcher through GeckoApp.getEventDispatcher().
2016-11-14 16:29:50 +03:00
#include "EventDispatcher.h"
#include "mozilla/EventForwards.h"
#include "mozilla/java/GeckoSessionNatives.h"
#include "mozilla/java/WebResponseWrappers.h"
#include "mozilla/MozPromise.h"
2016-08-19 01:03:04 +03:00
#include "mozilla/Mutex.h"
#include "mozilla/StaticPtr.h"
#include "mozilla/TextRange.h"
#include "mozilla/UniquePtr.h"
struct ANPEvent;
namespace mozilla {
class WidgetTouchEvent;
namespace layers {
class CompositorBridgeChild;
class LayerManager;
class APZCTreeManager;
class UiCompositorControllerChild;
} // namespace layers
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
namespace widget {
class AndroidView;
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
class GeckoEditableSupport;
class GeckoViewSupport;
class LayerViewSupport;
class NPZCSupport;
Bug 1741156 - Initial GPU process implementation on Android. r=aosmond,agi Declare a GPU process and corresponding Service in the AndroidManifest. This is of a new class GeckoServiceGpuProcess which inherits from GeckoServiceChildProcess, and provides a binder interface ICompositorSurfaceManager which allows the parent process to set the compositor Surface for a given widget ID, and the compositor in the GPU process to look up the Surface for a widget ID. The ICompositorSurfaceManager interface is exposed to the parent process through a new method getCompositorSurfaceManager() in the IChildProcess interface. Add a new connection type for GPU processes to GeckoProcessManager, along with a function to look up the GPU process connection and fetch the ICompositorSurfaceManager binder. When the GPU process is launched we store the returned binder in the GPUProcessHost, and when each widget's compositor is created we store a reference to the binder in the UiCompositorControllerChild. Each nsWindow is given a unique ID, and whenever the Surface changes due to an Android resume event, it sends the new surface for that ID to the GPU process (if enabled) by calling ICompositorSurfaceManager.onSurfaceChanged(). Stop inheriting AndroidCompositorWidget from InProcessCompositorWidget and instead inherit from CompositorWidget directly. This class holds a reference to the Surface that will be rendered in to. The CompositorBridgeParent notifies the CompositorWidget whenever it has been resumed, allowing it to fetch the new Surface. For the cross-process CompositorWidgetParent implementation it fetches that Surface from the CompositorSurfaceManagerService, whereas the InProcessAndroidCompositorWidget can read it directly from the real widget. AndroidCompositorWidget::GetClientSize() can now calculate its size from the Surface, rather than racily reading the value from the nsWindow. This means RenderCompositorEGL and RenderCompositorOGLSWGL can now use GetClientSize() again rather than querying their own size from the Surface. With this patch, setting layers.gpu-process.enabled to true will cause us to launch a GPU process and render from it. We do not yet gracefully recover from a GPU process crash, nor can we render anything using SurfaceTextures (eg video or webgl). Those will come in future patches. Differential Revision: https://phabricator.services.mozilla.com/D131231
2021-11-29 23:52:31 +03:00
class PlatformCompositorWidgetDelegate;
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
} // namespace widget
namespace ipc {
class Shmem;
} // namespace ipc
namespace a11y {
class SessionAccessibility;
} // namespace a11y
} // namespace mozilla
class nsWindow final : public nsBaseWidget {
private:
virtual ~nsWindow();
public:
using nsBaseWidget::GetWindowRenderer;
nsWindow();
NS_INLINE_DECL_REFCOUNTING_INHERITED(nsWindow, nsBaseWidget)
static void InitNatives();
void OnGeckoViewReady();
RefPtr<mozilla::MozPromise<bool, bool, false>> OnLoadRequest(
nsIURI* aUri, int32_t aWindowType, int32_t aFlags,
nsIPrincipal* aTriggeringPrincipal, bool aHasUserGesture,
bool aIsTopLevel);
private:
Bug 1741156 - Initial GPU process implementation on Android. r=aosmond,agi Declare a GPU process and corresponding Service in the AndroidManifest. This is of a new class GeckoServiceGpuProcess which inherits from GeckoServiceChildProcess, and provides a binder interface ICompositorSurfaceManager which allows the parent process to set the compositor Surface for a given widget ID, and the compositor in the GPU process to look up the Surface for a widget ID. The ICompositorSurfaceManager interface is exposed to the parent process through a new method getCompositorSurfaceManager() in the IChildProcess interface. Add a new connection type for GPU processes to GeckoProcessManager, along with a function to look up the GPU process connection and fetch the ICompositorSurfaceManager binder. When the GPU process is launched we store the returned binder in the GPUProcessHost, and when each widget's compositor is created we store a reference to the binder in the UiCompositorControllerChild. Each nsWindow is given a unique ID, and whenever the Surface changes due to an Android resume event, it sends the new surface for that ID to the GPU process (if enabled) by calling ICompositorSurfaceManager.onSurfaceChanged(). Stop inheriting AndroidCompositorWidget from InProcessCompositorWidget and instead inherit from CompositorWidget directly. This class holds a reference to the Surface that will be rendered in to. The CompositorBridgeParent notifies the CompositorWidget whenever it has been resumed, allowing it to fetch the new Surface. For the cross-process CompositorWidgetParent implementation it fetches that Surface from the CompositorSurfaceManagerService, whereas the InProcessAndroidCompositorWidget can read it directly from the real widget. AndroidCompositorWidget::GetClientSize() can now calculate its size from the Surface, rather than racily reading the value from the nsWindow. This means RenderCompositorEGL and RenderCompositorOGLSWGL can now use GetClientSize() again rather than querying their own size from the Surface. With this patch, setting layers.gpu-process.enabled to true will cause us to launch a GPU process and render from it. We do not yet gracefully recover from a GPU process crash, nor can we render anything using SurfaceTextures (eg video or webgl). Those will come in future patches. Differential Revision: https://phabricator.services.mozilla.com/D131231
2021-11-29 23:52:31 +03:00
// Unique ID given to each widget, used to map Surfaces to widgets
// in the CompositorSurfaceManager.
int32_t mWidgetId;
Bug 1307820 - Implement per-GeckoView messaging; r=snorp r=sebastian Bug 1307820 - 1a. Move GeckoApp EventDispatcher to GeckoView; r=snorp Make it a GeckoView-specific EventDispatcher instead of GeckoApp-specific, so that GeckoView consumers can benefit from a per-view EventDispatcher. In addition, a few events like Gecko:Ready are moved back to the global EventDispatcher because that makes more sense. Bug 1307820 - 1b. Don't use GeckoApp EventDispatcher during inflation; r=snorp During layout inflation, we don't yet have GeckoView and therefore the GeckoView EventDispatcher, so we should not register events until later, typically during onAttachedToWindow. Bug 1307820 - 2. Introduce GeckoBundle; r=snorp The Android Bundle class has several disadvantages when used for holding structured data from JS. The most obvious one is the differentiation between int and double, which doesn't exist in JS. So when a JS number is converted to either a Bundle int or double, we run the risk of making a wrong conversion, resulting in a type mismatch exception when Java uses the Bundle. This extends to number arrays from JS. There is one more gotcha when using arrays. When we receive an empty array from JS, there is no way for us to determine the type of the array, because even empty arrays in Java have types. We are forced to pick an arbitrary type like boolean[], which can easily result in a type mismatch exception when using the array on the Java side. In addition, Bundle is fairly cumbersome, and we cannot access the inner structures of Bundle from Java or JNI, making it harder to use. With these factors in mind, this patch introduces GeckoBundle as a better choice for Gecko/Java communication. It is almost fully API-compatible with the Android Bundle; only the Bundle array methods are different. It resolves the numbers problem by performing conversions if necessary, and it is a lot more lightweight than Bundle. Bug 1307820 - 3. Convert BundleEventListener to use GeckoBundle; r=snorp Convert BundleEventListener from using Bundle to using GeckoBundle. Because NativeJSContainer still only supports Bundle, we do an extra conversion when sending Bundle messages, but eventually, as we eliminate the use of NativeJSContainer, that will go away as well. Bug 1307820 - 4. Introduce EventDispatcher interfaces; r=snorp Introduce several new XPCOM interfaces for the new EventDispatcher API, these interfaces are mostly mirrored after their Java counterparts. * nsIAndroidEventDispatcher is the main interface for registering/unregistering listeners and for dispatching events from JS/C++. * nsIAndroidEventListener is the interface that JS/C++ clients implement to receive events. * nsIAndroidEventCallback is the interface that JS/C++ clients implement to receive responses from dispatched events. * nsIAndroidView is the new interface that every window receives that is specific to the window/GeckoView pair. It is passed to chrome scripts through window arguments. Bug 1307820 - 5. Remove EventDispatcher references from gfx code; r=snorp EventDispatcher was used for JPZC, but NPZC doesn't use it anymore. Bug 1307820 - 6. General JNI template improvements; r=snorp This patch includes several improvements to the JNI templates. * Context::RawClassRef is removed to avoid misuse, as Context::ClassRef should be used instead. * Fix a compile error, in certain usages, in the DisposeNative overload in NativeStub. * Add Ref::IsInstanceOf and Context::IsInstanceOf to mirror the JNIEnv::IsInstanceOf call. * Add Ref::operator* and Context::operator* to provide an easy way to get a Context object. * Add built-in declarations for boxed Java objects (e.g. Boolean, Integer, etc). * Add ObjectArray::New for creating new object arrays of specific types. * Add lvalue qualifiers to LocalRef::operator= and GlobalRef::operator=, to prevent accidentally assigning to rvalues. (e.g. `objectArray->GetElement(0) = newObject;`, which won't work as intended.) Bug 1307820 - 7. Support ownership through RefPtr for native JNI objects; r=snorp In addition to direct ownership and weak pointer ownership, add a third ownership model where a native JNI object owns a RefPtr that holds a strong reference to the actual C++ object. This ownership model works well with ref-counted objects such as XPCOM objects, and is activated through the presence of public members AddRef() and Release() in the C++ object. Bug 1307820 - 8. Implement Gecko-side EventDispatcher; r=snorp Add a skeletal implementation of EventDispatcher on the Gecko side. Each widget::EventDispatcher will be associated with a Java EventDispatcher, so events can be dispatched from Gecko to Java and vice versa. AndroidBridge and nsWindow will implement nsIAndroidEventDispatcher through widget::EventDispatcher. Other patches will add more complete functionality such as GeckoBundle/JSObject translation and support for callbacks. Bug 1307820 - 9. Implement dispatching between Gecko/Java; r=snorp Implement translation between JSObject and GeckoBundle, and use that for dispatching events from Gecko to Java and vice versa. Bug 1307820 - 10. Implement callback support; r=snorp Implement callback support for both Gecko-to-Java events and Java-to-Gecko events. For Gecko-to-Java, we translate nsIAndroidEventCallback to a Java EventCallback through NativeCallbackDelegate and pass it to the Java listener. For Java-to-Gecko, we translate EventCallback to a nsIAndroidEventCallback through JavaCallbackDelegate and pass it to the Gecko listener. There is another JavaCallbackDelegate on the Java side that redirects the callback to a particular thread. For example, if the event was dispatched from the UI thread, we make sure the callback happens on the UI thread as well. Bug 1307820 - 11. Add BundleEventListener support for Gecko thread; r=snorp Add support for BundleEventListener on the Gecko thread, so that we can use it to replace any existing GeckoEventListener or NativeEventListener implementations that require the listener be run synchronously on the Gecko thread. Bug 1307820 - 12. Add global EventDispatcher in AndroidBridge; r=snorp Add an instance of EventDispatcher to AndroidBridge to act as a global event dispatcher. Bug 1307820 - 13. Add per-nsWindow EventDispatcher; r=snorp Add an instance of EventDispatcher to each nsWindow through an AndroidView object, which implements nsIAndroidView. The nsIAndroidView is passed to the chrome script through the window argument when opening the window. Bug 1307820 - 14. Update auto-generated bindings; r=me Bug 1307820 - 15. Update testEventDispatcher; r=snorp Update testEventDispatcher to include new functionalities in EventDisptcher. * Add tests for dispatching events to UI/background thread through nsIAndroidEventDispatcher::dispatch. * Add tests for dispatching events to UI/background thread through EventDispatcher.dispatch. * Add tests for dispatching events to Gecko thread through EventDispatcher.dispatch. Each kind of test exercises both the global EventDispatcher through EventDispatcher.getInstance() and the per-GeckoView EventDispatcher through GeckoApp.getEventDispatcher().
2016-11-14 16:29:50 +03:00
private:
RefPtr<mozilla::widget::AndroidView> mAndroidView;
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
2016-08-19 01:03:04 +03:00
// Object that implements native LayerView calls.
// Owned by the Java Compositor instance.
mozilla::jni::NativeWeakPtr<mozilla::widget::LayerViewSupport>
mLayerViewSupport;
// Object that implements native NativePanZoomController calls.
// Owned by the Java NativePanZoomController instance.
mozilla::jni::NativeWeakPtr<mozilla::widget::NPZCSupport> mNPZCSupport;
// Object that implements native GeckoEditable calls.
// Strong referenced by the Java instance.
mozilla::jni::NativeWeakPtr<mozilla::widget::GeckoEditableSupport>
mEditableSupport;
mozilla::jni::Object::GlobalRef mEditableParent;
// Object that implements native SessionAccessibility calls.
// Strong referenced by the Java instance.
mozilla::jni::NativeWeakPtr<mozilla::a11y::SessionAccessibility>
mSessionAccessibility;
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
// Object that implements native GeckoView calls and associated states.
// nullptr for nsWindows that were not opened from GeckoView.
mozilla::jni::NativeWeakPtr<mozilla::widget::GeckoViewSupport>
mGeckoViewSupport;
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
mozilla::Atomic<bool, mozilla::ReleaseAcquire> mContentDocumentDisplayed;
public:
static already_AddRefed<nsWindow> From(nsPIDOMWindowOuter* aDOMWindow);
static already_AddRefed<nsWindow> From(nsIWidget* aWidget);
static nsWindow* TopWindow();
static mozilla::Modifiers GetModifiers(int32_t aMetaState);
static mozilla::TimeStamp GetEventTimeStamp(int64_t aEventTime);
void OnSizeChanged(const mozilla::gfx::IntSize& aSize);
void InitEvent(mozilla::WidgetGUIEvent& event,
LayoutDeviceIntPoint* aPoint = 0);
void UpdateOverscrollVelocity(const float aX, const float aY);
void UpdateOverscrollOffset(const float aX, const float aY);
mozilla::widget::EventDispatcher* GetEventDispatcher() const;
void PassExternalResponse(mozilla::java::WebResponse::Param aResponse);
void ShowDynamicToolbar();
void DetachNatives();
//
// nsIWidget
//
using nsBaseWidget::Create; // for Create signature not overridden here
[[nodiscard]] virtual nsresult Create(nsIWidget* aParent,
nsNativeWidget aNativeParent,
const LayoutDeviceIntRect& aRect,
nsWidgetInitData* aInitData) override;
virtual void Destroy() override;
virtual void SetParent(nsIWidget* aNewParent) override;
virtual nsIWidget* GetParent(void) override;
virtual float GetDPI() override;
virtual double GetDefaultScaleInternal() override;
virtual void Show(bool aState) override;
virtual bool IsVisible() const override;
virtual void ConstrainPosition(bool aAllowSlop, int32_t* aX,
int32_t* aY) override;
virtual void Move(double aX, double aY) override;
virtual void Resize(double aWidth, double aHeight, bool aRepaint) override;
virtual void Resize(double aX, double aY, double aWidth, double aHeight,
bool aRepaint) override;
void SetZIndex(int32_t aZIndex) override;
virtual void SetSizeMode(nsSizeMode aMode) override;
virtual void Enable(bool aState) override;
virtual bool IsEnabled() const override;
virtual void Invalidate(const LayoutDeviceIntRect& aRect) override;
virtual void SetFocus(Raise, mozilla::dom::CallerType aCallerType) override;
virtual LayoutDeviceIntRect GetScreenBounds() override;
virtual LayoutDeviceIntPoint WidgetToScreenOffset() override;
virtual nsresult DispatchEvent(mozilla::WidgetGUIEvent* aEvent,
nsEventStatus& aStatus) override;
nsEventStatus DispatchEvent(mozilla::WidgetGUIEvent* aEvent);
virtual nsresult MakeFullScreen(bool aFullScreen) override;
void SetCursor(const Cursor& aDefaultCursor) override;
void* GetNativeData(uint32_t aDataType) override;
void SetNativeData(uint32_t aDataType, uintptr_t aVal) override;
virtual nsresult SetTitle(const nsAString& aTitle) override { return NS_OK; }
[[nodiscard]] virtual nsresult GetAttention(int32_t aCycleCount) override {
return NS_ERROR_NOT_IMPLEMENTED;
}
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
TextEventDispatcherListener* GetNativeTextEventDispatcherListener() override;
virtual void SetInputContext(const InputContext& aContext,
const InputContextAction& aAction) override;
virtual InputContext GetInputContext() override;
WindowRenderer* GetWindowRenderer() override;
Bug 1741156 - Reinitialize compositor and request repaint after GPU process restart. r=aosmond,geckoview-reviewers,agi This patch ensures that, following a GPU process crash, we re-initialize the compositor and resume painting on Android. nsWindow::GetWindowRenderer() is made to always reinitialize the window renderer if there is none, like on other platforms. We therefore no longer need to track whether webrender is being disabled, as this is no longer a special case. Previously we started the compositor as initially paused in nsBaseWidget::CreateCompositorSession only if the widget did not yet have a surface. Now we must unconditionally (re)start it as initially paused, as even though the widget in the parent process may have a surface, we will not have been able to send it to the GPU process yet. We will send the surface to the compositor once control flow returns to nsWindow::CreateLayerManager, where we will also now resume the compositor if required. Finally, we must ensure that we manually trigger a paint, both in the parent and content processes. On other platforms this occurs automatically following a GPU process loss through various refresh driver events. On Android, however, nothing causes the refresh driver to paint by itself, and we cannot receive input without first initializing our APZ controllers, which does not happen until the compositor receives a display list. We therefore must manually schedule a paint. We do so from nsWindow::NotifyCompositorSessionLost for the parent process, and BrowserChild::ReinitRendering for content processes. Differential Revision: https://phabricator.services.mozilla.com/D131232
2021-11-29 23:52:31 +03:00
void NotifyCompositorSessionLost(
mozilla::layers::CompositorSession* aSession) override;
virtual bool NeedsPaint() override;
virtual bool WidgetPaintsBackground() override;
virtual uint32_t GetMaxTouchPoints() const override;
void UpdateZoomConstraints(
const uint32_t& aPresShellId, const ScrollableLayerGuid::ViewID& aViewId,
const mozilla::Maybe<ZoomConstraints>& aConstraints) override;
nsresult SynthesizeNativeTouchPoint(uint32_t aPointerId,
TouchPointerState aPointerState,
LayoutDeviceIntPoint aPoint,
double aPointerPressure,
uint32_t aPointerOrientation,
nsIObserver* aObserver) override;
nsresult SynthesizeNativeMouseEvent(LayoutDeviceIntPoint aPoint,
NativeMouseMessage aNativeMessage,
mozilla::MouseButton aButton,
nsIWidget::Modifiers aModifierFlags,
nsIObserver* aObserver) override;
nsresult SynthesizeNativeMouseMove(LayoutDeviceIntPoint aPoint,
nsIObserver* aObserver) override;
Bug 1741156 - Initial GPU process implementation on Android. r=aosmond,agi Declare a GPU process and corresponding Service in the AndroidManifest. This is of a new class GeckoServiceGpuProcess which inherits from GeckoServiceChildProcess, and provides a binder interface ICompositorSurfaceManager which allows the parent process to set the compositor Surface for a given widget ID, and the compositor in the GPU process to look up the Surface for a widget ID. The ICompositorSurfaceManager interface is exposed to the parent process through a new method getCompositorSurfaceManager() in the IChildProcess interface. Add a new connection type for GPU processes to GeckoProcessManager, along with a function to look up the GPU process connection and fetch the ICompositorSurfaceManager binder. When the GPU process is launched we store the returned binder in the GPUProcessHost, and when each widget's compositor is created we store a reference to the binder in the UiCompositorControllerChild. Each nsWindow is given a unique ID, and whenever the Surface changes due to an Android resume event, it sends the new surface for that ID to the GPU process (if enabled) by calling ICompositorSurfaceManager.onSurfaceChanged(). Stop inheriting AndroidCompositorWidget from InProcessCompositorWidget and instead inherit from CompositorWidget directly. This class holds a reference to the Surface that will be rendered in to. The CompositorBridgeParent notifies the CompositorWidget whenever it has been resumed, allowing it to fetch the new Surface. For the cross-process CompositorWidgetParent implementation it fetches that Surface from the CompositorSurfaceManagerService, whereas the InProcessAndroidCompositorWidget can read it directly from the real widget. AndroidCompositorWidget::GetClientSize() can now calculate its size from the Surface, rather than racily reading the value from the nsWindow. This means RenderCompositorEGL and RenderCompositorOGLSWGL can now use GetClientSize() again rather than querying their own size from the Surface. With this patch, setting layers.gpu-process.enabled to true will cause us to launch a GPU process and render from it. We do not yet gracefully recover from a GPU process crash, nor can we render anything using SurfaceTextures (eg video or webgl). Those will come in future patches. Differential Revision: https://phabricator.services.mozilla.com/D131231
2021-11-29 23:52:31 +03:00
void SetCompositorWidgetDelegate(CompositorWidgetDelegate* delegate) override;
virtual void GetCompositorWidgetInitData(
mozilla::widget::CompositorWidgetInitData* aInitData) override;
mozilla::layers::CompositorBridgeChild* GetCompositorBridgeChild() const;
void SetContentDocumentDisplayed(bool aDisplayed);
bool IsContentDocumentDisplayed();
Bug 1137567 - Make nsWindow for Android use TextEventDispatcher; r=esawin r=rbarker r=masayuki r=snorp Bug 1137567 - 1. Allow dispatching key events during composition; r=esawin We potentially dispatch key events during composition to provide compatibility for pages that only listen to key events. Bug 1137567 - 2. Allow keyboard events in DispatchInputEvent when not on APZ thread; r=rbarker We use nsIWidget::DispatchInputEvent to dispatch our keyboard events on the Gecko thread, which on Android is not the APZ controller thread. We should allow these events to pass instead of crashing. Bug 1137567 - 3. Add GeckoEditableSupport class to support TextEventDispatcher; r=masayuki Add a separate GeckoEditableSupport class, which implements TextEventDispatcherListener and uses TextEventDispatcher for IME operations. The new class is entirely separate from nsWindow to allow it to be independently used in content processes as well. Most of the code is copied from nsWindow::GeckoViewSupport, and adapted to use TextEventDispatcher. Bug 1137567 - 4. Make nsWindow::WindowPtr available for outside classes; r=snorp Make nsWindow::WindowPtr available not just for classes inside nsWindow but for outside classes as well. Also, add support for RefPtr native objects to nsWindow::NativePtr. Bug 1137567 - 5. Use GeckoEditableSupport in nsWindow; r=esawin Use the new GeckoEditableSupport class in nsWindow to replace the previous code in nsWindow::GeckoViewSupport. GeckoEditable native methods now go to GeckoEditableSupport instead of GeckoViewSupport. Several native methods in GeckoEditable are changed from dispatchTo="proxy" to dispatchTo="gecko", because we no longer need the special nsWindow::WindowEvent wrapper for our native calls. Bug 1137567 - 6. Use pushPrefEnv in test_assign_event_data.html; r=masayuki setAndObserveCompositionPref in test_assign_event_data.html does not invoke the callback if the pref is already set. This patch changes it to use SpecialPowers.pushPrefEnv so the callback is always invoked.
2017-03-01 23:29:30 +03:00
// Call this function when the users activity is the direct cause of an
// event (like a keypress or mouse click).
void UserActivity();
mozilla::jni::Object::Ref& GetEditableParent() { return mEditableParent; }
RefPtr<mozilla::a11y::SessionAccessibility> GetSessionAccessibility();
void RecvToolbarAnimatorMessageFromCompositor(int32_t aMessage) override;
void UpdateRootFrameMetrics(const ScreenPoint& aScrollOffset,
const CSSToScreenScale& aZoom) override;
void RecvScreenPixels(mozilla::ipc::Shmem&& aMem, const ScreenIntSize& aSize,
bool aNeedsYFlip) override;
void UpdateDynamicToolbarMaxHeight(mozilla::ScreenIntCoord aHeight) override;
mozilla::ScreenIntCoord GetDynamicToolbarMaxHeight() const override {
return mDynamicToolbarMaxHeight;
}
void UpdateDynamicToolbarOffset(mozilla::ScreenIntCoord aOffset);
virtual mozilla::ScreenIntMargin GetSafeAreaInsets() const override;
void UpdateSafeAreaInsets(const mozilla::ScreenIntMargin& aSafeAreaInsets);
protected:
void BringToFront();
nsWindow* FindTopLevel();
bool IsTopLevel();
void ConfigureAPZControllerThread() override;
void DispatchHitTest(const mozilla::WidgetTouchEvent& aEvent);
already_AddRefed<GeckoContentController> CreateRootContentController()
override;
bool mIsVisible;
nsTArray<nsWindow*> mChildren;
nsWindow* mParent;
nsCOMPtr<nsIUserIdleServiceInternal> mIdleService;
mozilla::ScreenIntCoord mDynamicToolbarMaxHeight;
mozilla::ScreenIntMargin mSafeAreaInsets;
bool mIsFullScreen;
bool UseExternalCompositingSurface() const override { return true; }
static void DumpWindows();
static void DumpWindows(const nsTArray<nsWindow*>& wins, int indent = 0);
static void LogWindow(nsWindow* win, int index, int indent);
private:
void CreateLayerManager();
void RedrawAll();
mozilla::layers::LayersId GetRootLayerId() const;
RefPtr<mozilla::layers::UiCompositorControllerChild>
GetUiCompositorControllerChild();
Bug 1741156 - Initial GPU process implementation on Android. r=aosmond,agi Declare a GPU process and corresponding Service in the AndroidManifest. This is of a new class GeckoServiceGpuProcess which inherits from GeckoServiceChildProcess, and provides a binder interface ICompositorSurfaceManager which allows the parent process to set the compositor Surface for a given widget ID, and the compositor in the GPU process to look up the Surface for a widget ID. The ICompositorSurfaceManager interface is exposed to the parent process through a new method getCompositorSurfaceManager() in the IChildProcess interface. Add a new connection type for GPU processes to GeckoProcessManager, along with a function to look up the GPU process connection and fetch the ICompositorSurfaceManager binder. When the GPU process is launched we store the returned binder in the GPUProcessHost, and when each widget's compositor is created we store a reference to the binder in the UiCompositorControllerChild. Each nsWindow is given a unique ID, and whenever the Surface changes due to an Android resume event, it sends the new surface for that ID to the GPU process (if enabled) by calling ICompositorSurfaceManager.onSurfaceChanged(). Stop inheriting AndroidCompositorWidget from InProcessCompositorWidget and instead inherit from CompositorWidget directly. This class holds a reference to the Surface that will be rendered in to. The CompositorBridgeParent notifies the CompositorWidget whenever it has been resumed, allowing it to fetch the new Surface. For the cross-process CompositorWidgetParent implementation it fetches that Surface from the CompositorSurfaceManagerService, whereas the InProcessAndroidCompositorWidget can read it directly from the real widget. AndroidCompositorWidget::GetClientSize() can now calculate its size from the Surface, rather than racily reading the value from the nsWindow. This means RenderCompositorEGL and RenderCompositorOGLSWGL can now use GetClientSize() again rather than querying their own size from the Surface. With this patch, setting layers.gpu-process.enabled to true will cause us to launch a GPU process and render from it. We do not yet gracefully recover from a GPU process crash, nor can we render anything using SurfaceTextures (eg video or webgl). Those will come in future patches. Differential Revision: https://phabricator.services.mozilla.com/D131231
2021-11-29 23:52:31 +03:00
mozilla::widget::PlatformCompositorWidgetDelegate* mCompositorWidgetDelegate;
friend class mozilla::widget::GeckoViewSupport;
friend class mozilla::widget::LayerViewSupport;
friend class mozilla::widget::NPZCSupport;
};
#endif /* NSWINDOW_H_ */