forked from Floorp-Projects/Floorp
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Bug 1651705: Part 3 - Move nested classes out of nsWindow, switch ove…
…r 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
- Loading branch information
Showing
6 changed files
with
220 additions
and
189 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* -*- 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_AndroidView_h | ||
#define mozilla_widget_AndroidView_h | ||
|
||
#include "mozilla/widget/EventDispatcher.h" | ||
|
||
namespace mozilla { | ||
namespace widget { | ||
|
||
class AndroidView final : public nsIAndroidView { | ||
virtual ~AndroidView() {} | ||
|
||
public: | ||
const RefPtr<mozilla::widget::EventDispatcher> mEventDispatcher{ | ||
new mozilla::widget::EventDispatcher()}; | ||
|
||
AndroidView() {} | ||
|
||
NS_DECL_ISUPPORTS | ||
NS_DECL_NSIANDROIDVIEW | ||
|
||
NS_FORWARD_NSIANDROIDEVENTDISPATCHER(mEventDispatcher->) | ||
|
||
mozilla::java::GeckoBundle::GlobalRef mInitData; | ||
}; | ||
|
||
} // namespace widget | ||
} // namespace mozilla | ||
|
||
#endif // mozilla_widget_AndroidView_h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
/* -*- 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_GeckoViewSupport_h | ||
#define mozilla_widget_GeckoViewSupport_h | ||
|
||
#include "mozilla/java/GeckoResultWrappers.h" | ||
#include "mozilla/java/GeckoSessionNatives.h" | ||
#include "mozilla/widget/WindowEvent.h" | ||
|
||
class nsWindow; | ||
|
||
namespace mozilla { | ||
namespace widget { | ||
|
||
class GeckoViewSupport final | ||
: public java::GeckoSession::Window::Natives<GeckoViewSupport> { | ||
RefPtr<nsWindow> mWindow; | ||
|
||
// We hold a WeakRef because we want to allow the | ||
// GeckoSession.Window to be garbage collected. | ||
// Callers need to create a LocalRef from this | ||
// before calling methods. | ||
java::GeckoSession::Window::WeakRef mGeckoViewWindow; | ||
|
||
public: | ||
typedef java::GeckoSession::Window::Natives<GeckoViewSupport> Base; | ||
|
||
template <typename Functor> | ||
static void OnNativeCall(Functor&& aCall) { | ||
NS_DispatchToMainThread(new WindowEvent<Functor>(std::move(aCall))); | ||
} | ||
|
||
GeckoViewSupport(nsWindow* aWindow, | ||
const java::GeckoSession::Window::LocalRef& aInstance, | ||
nsPIDOMWindowOuter* aDOMWindow) | ||
: mWindow(aWindow), mGeckoViewWindow(aInstance), mDOMWindow(aDOMWindow) {} | ||
|
||
~GeckoViewSupport(); | ||
|
||
nsWindow* GetNsWindow() const { return mWindow; } | ||
|
||
using Base::DisposeNative; | ||
|
||
/** | ||
* GeckoView methods | ||
*/ | ||
private: | ||
nsCOMPtr<nsPIDOMWindowOuter> mDOMWindow; | ||
bool mIsReady{false}; | ||
|
||
public: | ||
// Create and attach a window. | ||
static void Open(const jni::Class::LocalRef& aCls, | ||
java::GeckoSession::Window::Param aWindow, | ||
jni::Object::Param aQueue, jni::Object::Param aCompositor, | ||
jni::Object::Param aDispatcher, | ||
jni::Object::Param aSessionAccessibility, | ||
jni::Object::Param aInitData, jni::String::Param aId, | ||
jni::String::Param aChromeURI, int32_t aScreenId, | ||
bool aPrivateMode, bool aRemote); | ||
|
||
// Close and destroy the nsWindow. | ||
void Close(); | ||
|
||
// Transfer this nsWindow to new GeckoSession objects. | ||
void Transfer(const java::GeckoSession::Window::LocalRef& inst, | ||
jni::Object::Param aQueue, jni::Object::Param aCompositor, | ||
jni::Object::Param aDispatcher, | ||
jni::Object::Param aSessionAccessibility, | ||
jni::Object::Param aInitData); | ||
|
||
void AttachEditable(const java::GeckoSession::Window::LocalRef& inst, | ||
jni::Object::Param aEditableParent); | ||
|
||
void AttachAccessibility(const java::GeckoSession::Window::LocalRef& inst, | ||
jni::Object::Param aSessionAccessibility); | ||
|
||
void OnReady(jni::Object::Param aQueue = nullptr); | ||
|
||
auto OnLoadRequest(mozilla::jni::String::Param aUri, int32_t aWindowType, | ||
int32_t aFlags, mozilla::jni::String::Param aTriggeringUri, | ||
bool aHasUserGesture, bool aIsTopLevel) const | ||
-> java::GeckoResult::LocalRef; | ||
|
||
void OnWeakNonIntrusiveDetach(already_AddRefed<Runnable> aDisposer) { | ||
RefPtr<Runnable> disposer(aDisposer); | ||
disposer->Run(); | ||
} | ||
}; | ||
|
||
} // namespace widget | ||
} // namespace mozilla | ||
|
||
#endif // mozilla_widget_GeckoViewSupport_h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* -*- 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.