gecko-dev/widget/android/WindowEvent.h
Aaron Klotz 66f053ebc4 Bug 1651705: Part 3 - Move nested classes out of nsWindow, switch over to NativeWeakPtr in those class definitions; r=geckoview-reviewers,agi
* Having `AndroidView` and `GeckoViewSupport` as nested classes inside of
  `nsWindow` make it impossible to forward declare them. We move those classes
  into their own headers. We also move `WindowEvent` into its own header.

* We remove the old `NativePtr` and `WindowPtr` implementations from `nsWindow`
  and convert the class definitions in this patch to use the new `NativeWeakPtr`.

* `GeckoViewSupport` had a unique quirk where it was owned by `nsWindow`
  instead of its Java counterpart. To make `GeckoViewSupport`'s ownership work
  like the other classes that use `NativeWeakPtr` (and to substantially simplify
  the implementation of `NativeWeakPtr` itself), I have reversed that: now
  `nsWindow` holds a `NativeWeakPtr` to `GeckoViewSupport`, while
  `GeckoViewSupport` is owned by its Java counterpart and holds a strong ref to
  the `nsWindow`.

* `GeckoViewSupport` no longer inherits from `SupportsWeakPtr`, since using it
  with `NativeWeakPtr` provides stronger and safer guarantees.

Differential Revision: https://phabricator.services.mozilla.com/D87362
2020-09-21 21:48:26 +00:00

58 lines
1.7 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 mozilla_widget_WindowEvent_h
#define mozilla_widget_WindowEvent_h
#include "nsThreadUtils.h"
#include "mozilla/jni/Natives.h"
namespace mozilla {
namespace widget {
// An Event subclass that guards against stale events.
// (See the implmentation of mozilla::jni::detail::ProxyNativeCall for info
// about the default template parameters for this class)
template <typename Lambda, bool IsStatic = Lambda::isStatic,
typename InstanceType = typename Lambda::ThisArgType,
class Impl = typename Lambda::TargetClass>
class WindowEvent : public Runnable {
bool IsStaleCall() {
if (IsStatic) {
// Static calls are never stale.
return false;
}
return jni::NativePtrTraits<Impl>::IsStale(mInstance);
}
Lambda mLambda;
const InstanceType mInstance;
public:
WindowEvent(Lambda&& aLambda, InstanceType&& aInstance)
: Runnable("mozilla::widget::WindowEvent"),
mLambda(std::move(aLambda)),
mInstance(std::forward<InstanceType>(aInstance)) {}
explicit WindowEvent(Lambda&& aLambda)
: Runnable("mozilla::widget::WindowEvent"),
mLambda(std::move(aLambda)),
mInstance(mLambda.GetThisArg()) {}
NS_IMETHOD Run() override {
if (!IsStaleCall()) {
mLambda();
}
return NS_OK;
}
};
} // namespace widget
} // namespace mozilla
#endif // mozilla_widget_WindowEvent_h