Backed out 7 changesets (bug 1651705) for mochitest failures on test_resizers_resizing_elements.html . CLOSED TREE

Backed out changeset 7fd32a3fb6e7 (bug 1651705)
Backed out changeset de4edbcb15c1 (bug 1651705)
Backed out changeset 531e71369f68 (bug 1651705)
Backed out changeset 84590e96de88 (bug 1651705)
Backed out changeset 7d9d2d44b2ee (bug 1651705)
Backed out changeset 9ffca762753c (bug 1651705)
Backed out changeset 2d79f4348b36 (bug 1651705)
This commit is contained in:
Narcis Beleuzu 2020-08-28 23:06:39 +03:00
parent bf5f2935f7
commit 3361c24c23
16 changed files with 717 additions and 1534 deletions

View File

@ -146,7 +146,7 @@ void DocAccessibleWrap::CacheViewportCallback(nsITimer* aTimer,
}
ipcDoc->SendBatch(eBatch_Viewport, cacheData);
} else if (RefPtr<SessionAccessibility> sessionAcc =
} else if (SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(docAcc)) {
nsTArray<AccessibleWrap*> accessibles(inViewAccs.Count());
for (auto iter = inViewAccs.Iter(); !iter.Done(); iter.Next()) {
@ -177,7 +177,7 @@ void DocAccessibleWrap::CacheViewportCallback(nsITimer* aTimer,
ipcDoc->GetPlatformExtension()->SendSetPivotBoundaries(
firstDoc, UNIQUE_ID(first), lastDoc, UNIQUE_ID(last));
}
} else if (RefPtr<SessionAccessibility> sessionAcc =
} else if (SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(docAcc)) {
sessionAcc->UpdateAccessibleFocusBoundaries(
first ? static_cast<AccessibleWrap*>(first) : docAcc,
@ -243,7 +243,7 @@ void DocAccessibleWrap::CacheFocusPath(AccessibleWrap* aAccessible) {
}
ipcDoc->SendBatch(eBatch_FocusPath, cacheData);
} else if (RefPtr<SessionAccessibility> sessionAcc =
} else if (SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(this)) {
nsTArray<AccessibleWrap*> accessibles;
for (AccessibleWrap* acc = aAccessible; acc && acc != this->Parent();
@ -280,7 +280,7 @@ void DocAccessibleWrap::UpdateFocusPathBounds() {
}
ipcDoc->SendBatch(eBatch_BoundsUpdate, boundsData);
} else if (RefPtr<SessionAccessibility> sessionAcc =
} else if (SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(this)) {
nsTArray<AccessibleWrap*> accessibles(mFocusPath.Count());
for (auto iter = mFocusPath.Iter(); !iter.Done(); iter.Next()) {

View File

@ -53,7 +53,7 @@ void a11y::ProxyDestroyed(ProxyAccessible* aProxy) {
}
void a11y::ProxyEvent(ProxyAccessible* aTarget, uint32_t aEventType) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aTarget);
if (!sessionAcc) {
return;
@ -68,7 +68,7 @@ void a11y::ProxyEvent(ProxyAccessible* aTarget, uint32_t aEventType) {
void a11y::ProxyStateChangeEvent(ProxyAccessible* aTarget, uint64_t aState,
bool aEnabled) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aTarget);
if (!sessionAcc) {
@ -100,7 +100,7 @@ void a11y::ProxyStateChangeEvent(ProxyAccessible* aTarget, uint64_t aState,
void a11y::ProxyCaretMoveEvent(ProxyAccessible* aTarget, int32_t aOffset,
bool aIsSelectionCollapsed) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aTarget);
if (sessionAcc) {
@ -111,7 +111,7 @@ void a11y::ProxyCaretMoveEvent(ProxyAccessible* aTarget, int32_t aOffset,
void a11y::ProxyTextChangeEvent(ProxyAccessible* aTarget, const nsString& aStr,
int32_t aStart, uint32_t aLen, bool aIsInsert,
bool aFromUser) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aTarget);
if (sessionAcc) {
@ -163,7 +163,7 @@ void a11y::ProxyScrollingEvent(ProxyAccessible* aTarget, uint32_t aEventType,
uint32_t aScrollX, uint32_t aScrollY,
uint32_t aMaxScrollX, uint32_t aMaxScrollY) {
if (aEventType == nsIAccessibleEvent::EVENT_SCROLLING) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aTarget);
if (sessionAcc) {
@ -176,7 +176,7 @@ void a11y::ProxyScrollingEvent(ProxyAccessible* aTarget, uint32_t aEventType,
void a11y::ProxyAnnouncementEvent(ProxyAccessible* aTarget,
const nsString& aAnnouncement,
uint16_t aPriority) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aTarget);
if (sessionAcc) {
@ -188,7 +188,7 @@ void a11y::ProxyAnnouncementEvent(ProxyAccessible* aTarget,
void a11y::ProxyBatch(ProxyAccessible* aDocument, const uint64_t aBatchType,
const nsTArray<ProxyAccessible*>& aAccessibles,
const nsTArray<BatchData>& aData) {
RefPtr<SessionAccessibility> sessionAcc =
SessionAccessibility* sessionAcc =
SessionAccessibility::GetInstanceFor(aDocument);
if (!sessionAcc) {
return;
@ -253,4 +253,4 @@ bool a11y::LocalizeString(const char* aToken, nsAString& aLocalized,
NS_WARNING("Failed to localize string");
aLocalized.AssignLiteral("");
return false;
}
}

View File

@ -21,7 +21,6 @@
#include "mozilla/a11y/DocAccessibleParent.h"
#include "mozilla/a11y/DocManager.h"
#include "mozilla/jni/GeckoBundleUtils.h"
#include "mozilla/widget/GeckoViewSupport.h"
#ifdef DEBUG
# include <android/log.h>
@ -43,6 +42,10 @@
acc->funcname(__VA_ARGS__); \
}
template <>
const char nsWindow::NativePtr<mozilla::a11y::SessionAccessibility>::sName[] =
"SessionAccessibility";
using namespace mozilla::a11y;
class Settings final
@ -57,13 +60,6 @@ class Settings final
}
};
SessionAccessibility::SessionAccessibility(
jni::NativeWeakPtr<widget::GeckoViewSupport> aWindow,
java::SessionAccessibility::NativeProvider::Param aSessionAccessibility)
: mWindow(aWindow), mSessionAccessibility(aSessionAccessibility) {
SetAttached(true, nullptr);
}
void SessionAccessibility::SetAttached(bool aAttached,
already_AddRefed<Runnable> aRunnable) {
if (RefPtr<nsThread> uiThread = GetAndroidUiThread()) {
@ -105,17 +101,11 @@ mozilla::jni::Object::LocalRef SessionAccessibility::GetNodeInfo(int32_t aID) {
}
RootAccessibleWrap* SessionAccessibility::GetRoot() {
auto acc(mWindow.Access());
if (!acc) {
if (!mWindow) {
return nullptr;
}
nsWindow* gkWindow = acc->GetNsWindow();
if (!gkWindow) {
return nullptr;
}
return static_cast<RootAccessibleWrap*>(gkWindow->GetRootAccessible());
return static_cast<RootAccessibleWrap*>(mWindow->GetRootAccessible());
}
void SessionAccessibility::SetText(int32_t aID, jni::String::Param aText) {
@ -160,7 +150,7 @@ void SessionAccessibility::Paste(int32_t aID) {
FORWARD_ACTION_TO_ACCESSIBLE(Paste);
}
RefPtr<SessionAccessibility> SessionAccessibility::GetInstanceFor(
SessionAccessibility* SessionAccessibility::GetInstanceFor(
ProxyAccessible* aAccessible) {
auto tab =
static_cast<dom::BrowserParent*>(aAccessible->Document()->Manager());
@ -174,7 +164,7 @@ RefPtr<SessionAccessibility> SessionAccessibility::GetInstanceFor(
return chromeDoc ? GetInstanceFor(chromeDoc) : nullptr;
}
RefPtr<SessionAccessibility> SessionAccessibility::GetInstanceFor(
SessionAccessibility* SessionAccessibility::GetInstanceFor(
Accessible* aAccessible) {
RootAccessible* rootAcc = aAccessible->RootAccessible();
nsViewManager* vm = rootAcc->PresShellPtr()->GetViewManager();

View File

@ -7,7 +7,6 @@
#define mozilla_a11y_SessionAccessibility_h_
#include "mozilla/java/SessionAccessibilityNatives.h"
#include "mozilla/widget/GeckoViewSupport.h"
#include "nsAppShell.h"
#include "nsThreadUtils.h"
#include "nsWindow.h"
@ -29,10 +28,13 @@ class SessionAccessibility final
Base;
SessionAccessibility(
jni::NativeWeakPtr<widget::GeckoViewSupport> aWindow,
java::SessionAccessibility::NativeProvider::Param aSessionAccessibility);
nsWindow::NativePtr<SessionAccessibility>* aPtr, nsWindow* aWindow,
java::SessionAccessibility::NativeProvider::Param aSessionAccessibility)
: mWindow(aPtr, aWindow), mSessionAccessibility(aSessionAccessibility) {
SetAttached(true, nullptr);
}
void OnWeakNonIntrusiveDetach(already_AddRefed<Runnable> aDisposer) {
void OnDetach(already_AddRefed<Runnable> aDisposer) {
SetAttached(false, std::move(aDisposer));
}
@ -42,8 +44,8 @@ class SessionAccessibility final
}
static void Init();
static RefPtr<SessionAccessibility> GetInstanceFor(ProxyAccessible* aAccessible);
static RefPtr<SessionAccessibility> GetInstanceFor(Accessible* aAccessible);
static SessionAccessibility* GetInstanceFor(ProxyAccessible* aAccessible);
static SessionAccessibility* GetInstanceFor(Accessible* aAccessible);
// Native implementations
using Base::AttachNative;
@ -107,7 +109,7 @@ class SessionAccessibility final
void SetAttached(bool aAttached, already_AddRefed<Runnable> aRunnable);
RootAccessibleWrap* GetRoot();
jni::NativeWeakPtr<widget::GeckoViewSupport> mWindow; // Parent only
nsWindow::WindowPtr<SessionAccessibility> mWindow; // Parent only
java::SessionAccessibility::NativeProvider::GlobalRef mSessionAccessibility;
};

View File

@ -20,7 +20,7 @@ mozilla::ipc::IPCResult DocAccessiblePlatformExtParent::RecvSetPivotBoundaries(
MOZ_ASSERT(aFirstDoc);
MOZ_ASSERT(aLastDoc);
RefPtr<SessionAccessibility> sessionAcc = SessionAccessibility::GetInstanceFor(
SessionAccessibility* sessionAcc = SessionAccessibility::GetInstanceFor(
static_cast<DocAccessibleParent*>(Manager()));
if (!sessionAcc) {
return IPC_OK();

View File

@ -2,9 +2,8 @@ package org.mozilla.gecko.mozglue;
// Class that all classes with native methods extend from.
public abstract class JNIObject {
// Pointer that references the native object. This is volatile because it may be accessed
// by multiple threads simultaneously.
private volatile long mHandle;
// Pointer to a WeakPtr object that refers to the native object.
private long mHandle;
// Dispose of any reference to a native object.
//

View File

@ -1,35 +0,0 @@
/* -*- 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

View File

@ -22,7 +22,6 @@
#include "mozilla/TextEvents.h"
#include "mozilla/ToString.h"
#include "mozilla/dom/BrowserChild.h"
#include "mozilla/widget/GeckoViewSupport.h"
#include <android/api-level.h>
#include <android/input.h>
@ -37,6 +36,10 @@
} while (0)
#endif
template <>
const char nsWindow::NativePtr<mozilla::widget::GeckoEditableSupport>::sName[] =
"GeckoEditableSupport";
static uint32_t ConvertAndroidKeyCodeToDOMKeyCode(int32_t androidKeyCode) {
// Special-case alphanumeric keycodes because they are most common.
if (androidKeyCode >= AKEYCODE_A && androidKeyCode <= AKEYCODE_Z) {
@ -462,10 +465,8 @@ void GeckoEditableSupport::OnKeyEvent(int32_t aAction, int32_t aKeyCode,
: widget ? widget->GetTextEventDispatcher() : nullptr;
NS_ENSURE_TRUE_VOID(dispatcher && widget);
if (!aIsSynthesizedImeKey) {
if (nsWindow* window = GetNsWindow()) {
window->UserActivity();
}
if (!aIsSynthesizedImeKey && mWindow) {
mWindow->UserActivity();
} else if (aIsSynthesizedImeKey && mIMEMaskEventsCount > 0) {
// Don't synthesize editor keys when not focused.
return;
@ -858,8 +859,8 @@ bool GeckoEditableSupport::DoReplaceText(int32_t aStart, int32_t aEnd,
return false;
}
if (nsWindow* window = GetNsWindow()) {
window->UserActivity();
if (mWindow) {
mWindow->UserActivity();
}
/*
@ -1263,8 +1264,7 @@ nsresult GeckoEditableSupport::NotifyIME(
if (mIsRemote) {
if (!mEditableAttached) {
// Re-attach on focus; see OnRemovedFrom().
jni::NativeWeakPtrHolder<GeckoEditableSupport>::AttachExisting(
mEditable, do_AddRef(this));
AttachNative(mEditable, this);
mEditableAttached = true;
}
// Because GeckoEditableSupport in content process doesn't
@ -1378,7 +1378,7 @@ void GeckoEditableSupport::OnRemovedFrom(
if (mIsRemote && mEditable->HasEditableParent()) {
// When we're remote, detach every time.
OnWeakNonIntrusiveDetach(NS_NewRunnableFunction(
OnDetach(NS_NewRunnableFunction(
"GeckoEditableSupport::OnRemovedFrom",
[editable = java::GeckoEditableChild::GlobalRef(mEditable)] {
DisposeNative(editable);
@ -1515,19 +1515,15 @@ void GeckoEditableSupport::SetOnBrowserChild(dom::BrowserChild* aBrowserChild) {
// We need to set a new listener.
const auto editableChild = java::GeckoEditableChild::New(
/* parent */ nullptr, /* default */ false);
// Temporarily attach so we can receive the initial editable parent.
auto editableSupport =
jni::NativeWeakPtrHolder<GeckoEditableSupport>::Attach(editableChild,
editableChild);
auto accEditableSupport(editableSupport.Access());
MOZ_RELEASE_ASSERT(accEditableSupport);
RefPtr<widget::GeckoEditableSupport> editableSupport =
new widget::GeckoEditableSupport(editableChild);
// Tell PuppetWidget to use our listener for IME operations.
widget->SetNativeTextEventDispatcherListener(
accEditableSupport.AsRefPtr().get());
widget->SetNativeTextEventDispatcherListener(editableSupport);
accEditableSupport->mEditableAttached = true;
// Temporarily attach so we can receive the initial editable parent.
AttachNative(editableChild, editableSupport);
editableSupport->mEditableAttached = true;
// Connect the new child to a parent that corresponds to the BrowserChild.
java::GeckoServiceChildProcess::GetEditableParent(editableChild, contentId,
@ -1549,8 +1545,7 @@ void GeckoEditableSupport::SetOnBrowserChild(dom::BrowserChild* aBrowserChild) {
static_cast<widget::GeckoEditableSupport*>(listener.get());
if (!support->mEditableAttached) {
// Temporarily attach so we can receive the initial editable parent.
jni::NativeWeakPtrHolder<GeckoEditableSupport>::AttachExisting(
support->GetJavaEditable(), do_AddRef(support));
AttachNative(support->GetJavaEditable(), support);
support->mEditableAttached = true;
}
@ -1559,21 +1554,5 @@ void GeckoEditableSupport::SetOnBrowserChild(dom::BrowserChild* aBrowserChild) {
contentId, tabId);
}
nsIWidget* GeckoEditableSupport::GetWidget() const {
MOZ_ASSERT(NS_IsMainThread());
return mDispatcher ? mDispatcher->GetWidget() : GetNsWindow();
}
nsWindow* GeckoEditableSupport::GetNsWindow() const {
MOZ_ASSERT(NS_IsMainThread());
auto acc(mWindow.Access());
if (!acc) {
return nullptr;
}
return acc->GetNsWindow();
}
} // namespace widget
} // namespace mozilla

View File

@ -78,7 +78,7 @@ class GeckoEditableSupport final
enum RemoveCompositionFlag { CANCEL_IME_COMPOSITION, COMMIT_IME_COMPOSITION };
const bool mIsRemote;
jni::NativeWeakPtr<GeckoViewSupport> mWindow; // Parent only
nsWindow::WindowPtr<GeckoEditableSupport> mWindow; // Parent only
RefPtr<TextEventDispatcher> mDispatcher;
java::GeckoEditableChild::GlobalRef mEditable;
bool mEditableAttached;
@ -95,8 +95,9 @@ class GeckoEditableSupport final
bool mIMETextChangedDuringFlush;
bool mIMEMonitorCursor;
nsIWidget* GetWidget() const;
nsWindow* GetNsWindow() const;
nsIWidget* GetWidget() const {
return mDispatcher ? mDispatcher->GetWidget() : mWindow;
}
nsresult BeginInputTransaction(TextEventDispatcher* aDispatcher) {
if (mIsRemote) {
@ -155,14 +156,16 @@ class GeckoEditableSupport final
static void SetOnBrowserChild(dom::BrowserChild* aBrowserChild);
// Constructor for main process GeckoEditableChild.
GeckoEditableSupport(jni::NativeWeakPtr<GeckoViewSupport> aWindow,
GeckoEditableSupport(nsWindow::NativePtr<GeckoEditableSupport>* aPtr,
nsWindow* aWindow,
java::GeckoEditableChild::Param aEditableChild)
: mIsRemote(!aWindow.IsAttached()),
mWindow(aWindow),
: mIsRemote(!aWindow),
mWindow(aPtr, aWindow),
mEditable(aEditableChild),
mEditableAttached(!mIsRemote),
mIMERanges(new TextRangeArray()),
mIMEMaskEventsCount(1), // Mask IME events since there's no focus yet
mIMEMaskEventsCount(1) // Mask IME events since there's no focus yet
,
mIMEFocusCount(0),
mIMEDelaySynchronizeReply(false),
mIMEActiveSynchronizeCount(0),
@ -172,7 +175,7 @@ class GeckoEditableSupport final
// Constructor for content process GeckoEditableChild.
explicit GeckoEditableSupport(java::GeckoEditableChild::Param aEditableChild)
: GeckoEditableSupport(nullptr, aEditableChild) {}
: GeckoEditableSupport(nullptr, nullptr, aEditableChild) {}
NS_DECL_ISUPPORTS
@ -201,7 +204,7 @@ class GeckoEditableSupport final
const java::GeckoEditableChild::Ref& GetJavaEditable() { return mEditable; }
void OnWeakNonIntrusiveDetach(already_AddRefed<Runnable> aDisposer) {
void OnDetach(already_AddRefed<Runnable> aDisposer) {
RefPtr<GeckoEditableSupport> self(this);
nsAppShell::PostEvent([this, self, disposer = RefPtr<Runnable>(aDisposer)] {
mEditableAttached = false;

View File

@ -1,106 +0,0 @@
/* -*- 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 AttachMediaSessionController(
const java::GeckoSession::Window::LocalRef& inst,
jni::Object::Param aController, const int64_t aId);
void DetachMediaSessionController(
const java::GeckoSession::Window::LocalRef& inst,
jni::Object::Param aController);
void OnWeakNonIntrusiveDetach(already_AddRefed<Runnable> aDisposer) {
RefPtr<Runnable> disposer(aDisposer);
disposer->Run();
}
};
} // namespace widget
} // namespace mozilla
#endif // mozilla_widget_GeckoViewSupport_h

View File

@ -1,57 +0,0 @@
/* -*- 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

File diff suppressed because it is too large Load Diff

View File

@ -1004,12 +1004,6 @@ ReturnToGlobal<Cls> ReturnTo(GlobalRef<Cls>* ref) {
return ReturnToGlobal<Cls>(ref);
}
// Make a LocalRef<T> from any other Ref<T>
template <typename Cls, typename JNIType>
LocalRef<Cls> ToLocalRef(const Ref<Cls, JNIType>& aRef) {
return LocalRef<Cls>(aRef);
}
} // namespace jni
} // namespace mozilla

View File

@ -101,11 +101,8 @@ sources_from_WrapForJNI = sorted(
EXPORTS.mozilla.widget += [
'AndroidCompositorWidget.h',
'AndroidUiThread.h',
'AndroidView.h',
'EventDispatcher.h',
'GeckoViewSupport.h',
'nsWindow.h',
'WindowEvent.h',
]
EXPORTS.mozilla.java += [

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,7 @@
#include "nsTArray.h"
#include "EventDispatcher.h"
#include "mozilla/EventForwards.h"
#include "mozilla/java/GeckoSessionNatives.h"
#include "mozilla/java/GeckoBundleWrappers.h"
#include "mozilla/MozPromise.h"
#include "mozilla/Mutex.h"
#include "mozilla/StaticPtr.h"
@ -33,12 +33,7 @@ class UiCompositorControllerChild;
} // namespace layers
namespace widget {
class AndroidView;
class GeckoEditableSupport;
class GeckoViewSupport;
class LayerViewSupport;
class MediaSessionSupport;
class NPZCSupport;
} // namespace widget
namespace ipc {
@ -47,7 +42,7 @@ class Shmem;
namespace a11y {
class SessionAccessibility;
} // namespace a11y
}
} // namespace mozilla
class nsWindow final : public nsBaseWidget {
@ -72,36 +67,140 @@ class nsWindow final : public nsBaseWidget {
private:
uint32_t mScreenId;
// An Event subclass that guards against stale events.
template <typename Lambda, bool IsStatic = Lambda::isStatic,
typename InstanceType = typename Lambda::ThisArgType,
class Impl = typename Lambda::TargetClass>
class WindowEvent;
public:
// Smart pointer for holding a pointer back to the nsWindow inside a native
// object class. The nsWindow pointer is automatically cleared when the
// nsWindow is destroyed, and a WindowPtr<Impl>::Locked class is provided
// for thread-safe access to the nsWindow pointer off of the Gecko thread.
template <class Impl>
class WindowPtr;
// Smart pointer for holding a pointer to a native object class. The
// pointer is automatically cleared when the object is destroyed.
template <class Impl>
class NativePtr final {
friend WindowPtr<Impl>;
friend nsWindow;
static const char sName[];
WindowPtr<Impl>* mPtr;
Impl* mImpl;
mozilla::Mutex mImplLock;
NativePtr() : mPtr(nullptr), mImpl(nullptr), mImplLock(sName) {}
~NativePtr() { MOZ_ASSERT(!mPtr); }
public:
class Locked;
operator Impl*() const {
MOZ_ASSERT(NS_IsMainThread());
return mImpl;
}
Impl* operator->() const { return operator Impl*(); }
template <class Cls, typename... Args>
void Attach(const mozilla::jni::LocalRef<Cls>& aInstance, nsWindow* aWindow,
Args&&... aArgs);
template <class Cls, typename T>
void Detach(const mozilla::jni::Ref<Cls, T>& aInstance);
};
template <class Impl>
class WindowPtr final {
friend NativePtr<Impl>;
NativePtr<Impl>* mPtr;
nsWindow* mWindow;
mozilla::Mutex mWindowLock;
public:
class Locked final : private mozilla::MutexAutoLock {
nsWindow* const mWindow;
public:
explicit Locked(WindowPtr<Impl>& aPtr)
: mozilla::MutexAutoLock(aPtr.mWindowLock), mWindow(aPtr.mWindow) {}
operator nsWindow*() const { return mWindow; }
nsWindow* operator->() const { return mWindow; }
};
WindowPtr(NativePtr<Impl>* aPtr, nsWindow* aWindow);
~WindowPtr() {
MOZ_ASSERT(NS_IsMainThread());
if (!mPtr) {
return;
}
mPtr->mPtr = nullptr;
mPtr->mImpl = nullptr;
}
operator nsWindow*() const {
MOZ_ASSERT(NS_IsMainThread());
return mWindow;
}
nsWindow* operator->() const { return operator nsWindow*(); }
};
private:
RefPtr<mozilla::widget::AndroidView> mAndroidView;
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;
};
RefPtr<AndroidView> mAndroidView;
class LayerViewSupport;
// Object that implements native LayerView calls.
// Owned by the Java Compositor instance.
mozilla::jni::NativeWeakPtr<mozilla::widget::LayerViewSupport>
mLayerViewSupport;
// Owned by the Java LayerView instance.
NativePtr<LayerViewSupport> mLayerViewSupport;
class NPZCSupport;
// Object that implements native NativePanZoomController calls.
// Owned by the Java NativePanZoomController instance.
mozilla::jni::NativeWeakPtr<mozilla::widget::NPZCSupport> mNPZCSupport;
NativePtr<NPZCSupport> mNPZCSupport;
// Object that implements native GeckoEditable calls.
// Strong referenced by the Java instance.
mozilla::jni::NativeWeakPtr<mozilla::widget::GeckoEditableSupport>
mEditableSupport;
NativePtr<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;
NativePtr<mozilla::a11y::SessionAccessibility> mSessionAccessibility;
mozilla::jni::NativeWeakPtr<mozilla::widget::MediaSessionSupport>
mMediaSessionSupport;
class MediaSessionSupport;
NativePtr<MediaSessionSupport> mMediaSessionSupport;
class GeckoViewSupport;
// 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;
// Because other objects get destroyed in the mGeckOViewSupport destructor,
// keep it last in the list, so its destructor is called first.
mozilla::UniquePtr<GeckoViewSupport> mGeckoViewSupport;
mozilla::Atomic<bool, mozilla::ReleaseAcquire> mContentDocumentDisplayed;
@ -122,12 +221,15 @@ class nsWindow final : public nsBaseWidget {
void UpdateOverscrollVelocity(const float aX, const float aY);
void UpdateOverscrollOffset(const float aX, const float aY);
mozilla::widget::EventDispatcher* GetEventDispatcher() const;
mozilla::widget::EventDispatcher* GetEventDispatcher() const {
if (mAndroidView) {
return mAndroidView->mEventDispatcher;
}
return nullptr;
}
void NotifyDisablingWebRender();
void DetachNatives();
//
// nsIWidget
//
@ -219,7 +321,9 @@ class nsWindow final : public nsBaseWidget {
mozilla::jni::Object::Ref& GetEditableParent() { return mEditableParent; }
RefPtr<mozilla::a11y::SessionAccessibility> GetSessionAccessibility();
mozilla::a11y::SessionAccessibility* GetSessionAccessibility() {
return mSessionAccessibility;
}
void RecvToolbarAnimatorMessageFromCompositor(int32_t aMessage) override;
void UpdateRootFrameMetrics(const ScreenPoint& aScrollOffset,
@ -271,10 +375,25 @@ class nsWindow final : public nsBaseWidget {
mozilla::layers::LayersId GetRootLayerId() const;
RefPtr<mozilla::layers::UiCompositorControllerChild>
GetUiCompositorControllerChild();
friend class mozilla::widget::GeckoViewSupport;
friend class mozilla::widget::LayerViewSupport;
friend class mozilla::widget::NPZCSupport;
};
// Explicit template declarations to make clang be quiet.
template <>
const char nsWindow::NativePtr<nsWindow::LayerViewSupport>::sName[];
template <>
const char nsWindow::NativePtr<mozilla::widget::GeckoEditableSupport>::sName[];
template <>
const char nsWindow::NativePtr<mozilla::a11y::SessionAccessibility>::sName[];
template <>
const char nsWindow::NativePtr<nsWindow::NPZCSupport>::sName[];
template <class Impl>
nsWindow::WindowPtr<Impl>::WindowPtr(NativePtr<Impl>* aPtr, nsWindow* aWindow)
: mPtr(aPtr), mWindow(aWindow), mWindowLock(NativePtr<Impl>::sName) {
MOZ_ASSERT(NS_IsMainThread());
if (mPtr) {
mPtr->mPtr = this;
}
}
#endif /* NSWINDOW_H_ */