Bug 1416319 - 1. Move content-document-is-displayed flag to native code; r?rbarker
One fix I forgot to make in
bug 1416310 is to change the code to reset
the flag in LayerView. I think it's better if we just moved the whole
thing to native code, since we don't really use the flag in Java.
MozReview-Commit-ID: 9cbcYb89LhC
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java
@@ -26,18 +26,16 @@ public class LayerSession {
// Special message sent from UiCompositorControllerChild once it is open.
/* package */ final static int COMPOSITOR_CONTROLLER_OPEN = 20;
// Special message sent from controller to query if the compositor controller is open.
/* package */ final static int IS_COMPOSITOR_CONTROLLER_OPEN = 21;
protected class Compositor extends JNIObject {
public LayerView layerView;
- private volatile boolean mContentDocumentIsDisplayed;
-
public boolean isReady() {
return LayerSession.this.isCompositorReady();
}
@WrapForJNI(calledFrom = "ui")
private void onCompositorAttached() {
LayerSession.this.onCompositorAttached();
}
@@ -124,33 +122,22 @@ public class LayerSession {
@WrapForJNI(calledFrom = "ui", dispatchTo = "current")
public native void enableLayerUpdateNotifications(boolean enable);
@WrapForJNI(calledFrom = "ui", dispatchTo = "current")
public native void sendToolbarPixelsToCompositor(final int width, final int height,
final int[] pixels);
- @WrapForJNI(calledFrom = "gecko")
- private void contentDocumentChanged() {
- mContentDocumentIsDisplayed = false;
- }
-
- @WrapForJNI(calledFrom = "gecko")
- private boolean isContentDocumentDisplayed() {
- return mContentDocumentIsDisplayed;
- }
-
// The compositor invokes this function just before compositing a frame where the
// document is different from the document composited on the last frame. In these
// cases, the viewport information we have in Java is no longer valid and needs to
// be replaced with the new viewport information provided.
@WrapForJNI(calledFrom = "ui")
public void updateRootFrameMetrics(float scrollX, float scrollY, float zoom) {
- mContentDocumentIsDisplayed = true;
if (layerView != null) {
layerView.onMetricsChanged(scrollX, scrollY, zoom);
}
}
}
protected final Compositor mCompositor = new Compositor();
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
@@ -314,20 +314,16 @@ public class LayerView extends FrameLayo
mGetPixelsResult = null;
}
}
protected void attachCompositor(final LayerSession session) {
mCompositor = session.mCompositor;
mCompositor.layerView = this;
- // Reset the content-document-is-displayed flag.
- mCompositor.updateRootFrameMetrics(/* scroolX */ 0, /* scrollY */ 0,
- /* zoom */ 1.0f);
-
mToolbarAnimator.notifyCompositorCreated(mCompositor);
final NativePanZoomController npzc = (NativePanZoomController) mPanZoomController;
if (GeckoThread.isStateAtLeast(GeckoThread.State.PROFILE_READY)) {
mCompositor.attachToJava(npzc);
} else {
GeckoThread.queueNativeCallUntil(GeckoThread.State.PROFILE_READY,
--- a/widget/android/AndroidBridge.cpp
+++ b/widget/android/AndroidBridge.cpp
@@ -868,47 +868,46 @@ NS_IMETHODIMP nsAndroidBridge::SetBrowse
return NS_OK;
}
extern "C"
__attribute__ ((visibility("default")))
jobject JNICALL
Java_org_mozilla_gecko_GeckoAppShell_allocateDirectBuffer(JNIEnv *env, jclass, jlong size);
-static jni::DependentRef<java::LayerSession::Compositor>
-GetJavaCompositor(mozIDOMWindowProxy* aWindow)
+static RefPtr<nsWindow>
+GetWidget(mozIDOMWindowProxy* aWindow)
{
MOZ_ASSERT(aWindow);
nsCOMPtr<nsPIDOMWindowOuter> domWindow = nsPIDOMWindowOuter::From(aWindow);
nsCOMPtr<nsIWidget> widget =
widget::WidgetUtils::DOMWindowToWidget(domWindow);
MOZ_ASSERT(widget);
- return static_cast<nsWindow*>(widget.get())->GetJavaCompositor();
+ return RefPtr<nsWindow>(static_cast<nsWindow*>(widget.get()));
}
void
AndroidBridge::ContentDocumentChanged(mozIDOMWindowProxy* aWindow)
{
- auto layerClient = GetJavaCompositor(aWindow);
- if (!layerClient) {
- return;
+ auto widget = GetWidget(aWindow);
+ if (widget) {
+ widget->SetContentDocumentDisplayed(false);
}
- layerClient->ContentDocumentChanged();
}
bool
AndroidBridge::IsContentDocumentDisplayed(mozIDOMWindowProxy* aWindow)
{
- auto layerClient = GetJavaCompositor(aWindow);
- if (!layerClient) {
- return false;
+ auto widget = GetWidget(aWindow);
+ if (widget) {
+ return widget->IsContentDocumentDisplayed();
}
- return layerClient->IsContentDocumentDisplayed();
+ return false;
}
jni::Object::LocalRef AndroidBridge::ChannelCreate(jni::Object::Param stream) {
JNIEnv* const env = jni::GetEnvForThread();
auto rv = jni::Object::LocalRef::Adopt(env, env->CallStaticObjectMethod(
sBridge->jChannels, sBridge->jChannelCreate, stream.Get()));
MOZ_CATCH_JNI_EXCEPTION(env);
return rv;
--- a/widget/android/GeneratedJNIWrappers.cpp
+++ b/widget/android/GeneratedJNIWrappers.cpp
@@ -1249,41 +1249,25 @@ const char LayerSession::name[] =
"org/mozilla/gecko/gfx/LayerSession";
const char LayerSession::Compositor::name[] =
"org/mozilla/gecko/gfx/LayerSession$Compositor";
constexpr char LayerSession::Compositor::AttachToJava_t::name[];
constexpr char LayerSession::Compositor::AttachToJava_t::signature[];
-constexpr char LayerSession::Compositor::ContentDocumentChanged_t::name[];
-constexpr char LayerSession::Compositor::ContentDocumentChanged_t::signature[];
-
-auto LayerSession::Compositor::ContentDocumentChanged() const -> void
-{
- return mozilla::jni::Method<ContentDocumentChanged_t>::Call(Compositor::mCtx, nullptr);
-}
-
constexpr char LayerSession::Compositor::CreateCompositor_t::name[];
constexpr char LayerSession::Compositor::CreateCompositor_t::signature[];
constexpr char LayerSession::Compositor::DisposeNative_t::name[];
constexpr char LayerSession::Compositor::DisposeNative_t::signature[];
constexpr char LayerSession::Compositor::EnableLayerUpdateNotifications_t::name[];
constexpr char LayerSession::Compositor::EnableLayerUpdateNotifications_t::signature[];
-constexpr char LayerSession::Compositor::IsContentDocumentDisplayed_t::name[];
-constexpr char LayerSession::Compositor::IsContentDocumentDisplayed_t::signature[];
-
-auto LayerSession::Compositor::IsContentDocumentDisplayed() const -> bool
-{
- return mozilla::jni::Method<IsContentDocumentDisplayed_t>::Call(Compositor::mCtx, nullptr);
-}
-
constexpr char LayerSession::Compositor::OnBoundsChanged_t::name[];
constexpr char LayerSession::Compositor::OnBoundsChanged_t::signature[];
constexpr char LayerSession::Compositor::OnCompositorAttached_t::name[];
constexpr char LayerSession::Compositor::OnCompositorAttached_t::signature[];
auto LayerSession::Compositor::OnCompositorAttached() const -> void
{
--- a/widget/android/GeneratedJNIWrappers.h
+++ b/widget/android/GeneratedJNIWrappers.h
@@ -3807,35 +3807,16 @@ public:
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
static const mozilla::jni::CallingThread callingThread =
mozilla::jni::CallingThread::ANY;
static const mozilla::jni::DispatchTarget dispatchTarget =
mozilla::jni::DispatchTarget::GECKO;
};
- struct ContentDocumentChanged_t {
- typedef Compositor Owner;
- typedef void ReturnType;
- typedef void SetterType;
- typedef mozilla::jni::Args<> Args;
- static constexpr char name[] = "contentDocumentChanged";
- static constexpr char signature[] =
- "()V";
- static const bool isStatic = false;
- static const mozilla::jni::ExceptionMode exceptionMode =
- mozilla::jni::ExceptionMode::ABORT;
- static const mozilla::jni::CallingThread callingThread =
- mozilla::jni::CallingThread::GECKO;
- static const mozilla::jni::DispatchTarget dispatchTarget =
- mozilla::jni::DispatchTarget::CURRENT;
- };
-
- auto ContentDocumentChanged() const -> void;
-
struct CreateCompositor_t {
typedef Compositor Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
int32_t,
int32_t,
mozilla::jni::Object::Param> Args;
@@ -3881,35 +3862,16 @@ public:
static const mozilla::jni::ExceptionMode exceptionMode =
mozilla::jni::ExceptionMode::ABORT;
static const mozilla::jni::CallingThread callingThread =
mozilla::jni::CallingThread::UI;
static const mozilla::jni::DispatchTarget dispatchTarget =
mozilla::jni::DispatchTarget::CURRENT;
};
- struct IsContentDocumentDisplayed_t {
- typedef Compositor Owner;
- typedef bool ReturnType;
- typedef bool SetterType;
- typedef mozilla::jni::Args<> Args;
- static constexpr char name[] = "isContentDocumentDisplayed";
- static constexpr char signature[] =
- "()Z";
- static const bool isStatic = false;
- static const mozilla::jni::ExceptionMode exceptionMode =
- mozilla::jni::ExceptionMode::ABORT;
- static const mozilla::jni::CallingThread callingThread =
- mozilla::jni::CallingThread::GECKO;
- static const mozilla::jni::DispatchTarget dispatchTarget =
- mozilla::jni::DispatchTarget::CURRENT;
- };
-
- auto IsContentDocumentDisplayed() const -> bool;
-
struct OnBoundsChanged_t {
typedef Compositor Owner;
typedef void ReturnType;
typedef void SetterType;
typedef mozilla::jni::Args<
int32_t,
int32_t,
int32_t,
--- a/widget/android/nsWindow.cpp
+++ b/widget/android/nsWindow.cpp
@@ -2318,39 +2318,44 @@ nsWindow::GetWidgetScreen()
do_GetService("@mozilla.org/gfx/screenmanager;1");
MOZ_ASSERT(screenMgr, "Failed to get nsIScreenManager");
RefPtr<nsScreenManagerAndroid> screenMgrAndroid =
(nsScreenManagerAndroid*) screenMgr.get();
return screenMgrAndroid->ScreenForId(mScreenId);
}
-jni::DependentRef<java::LayerSession::Compositor>
-nsWindow::GetJavaCompositor()
+void
+nsWindow::SetContentDocumentDisplayed(bool aDisplayed)
{
- if (NativePtr<LayerViewSupport>::Locked lvs{mLayerViewSupport}) {
- return lvs->GetJavaCompositor().Get();
- }
- return nullptr;
+ mContentDocumentDisplayed = aDisplayed;
}
+
+bool
+nsWindow::IsContentDocumentDisplayed()
+{
+ return mContentDocumentDisplayed;
+}
+
void
nsWindow::RecvToolbarAnimatorMessageFromCompositor(int32_t aMessage)
{
MOZ_ASSERT(AndroidBridge::IsJavaUiThread());
if (NativePtr<LayerViewSupport>::Locked lvs{mLayerViewSupport}) {
lvs->RecvToolbarAnimatorMessage(aMessage);
}
}
void
nsWindow::UpdateRootFrameMetrics(const ScreenPoint& aScrollOffset, const CSSToScreenScale& aZoom)
{
MOZ_ASSERT(AndroidBridge::IsJavaUiThread());
if (NativePtr<LayerViewSupport>::Locked lvs{mLayerViewSupport}) {
const auto& compositor = lvs->GetJavaCompositor();
+ mContentDocumentDisplayed = true;
compositor->UpdateRootFrameMetrics(aScrollOffset.x, aScrollOffset.y, aZoom.scale);
}
}
void
nsWindow::RecvScreenPixels(Shmem&& aMem, const ScreenIntSize& aSize)
{
MOZ_ASSERT(AndroidBridge::IsJavaUiThread());
--- a/widget/android/nsWindow.h
+++ b/widget/android/nsWindow.h
@@ -191,16 +191,18 @@ private:
// nullptr for nsWindows that were not opened from GeckoView.
// 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;
// Class that implements native PresentationMediaPlayerManager calls.
class PMPMSupport;
+ mozilla::Atomic<bool, mozilla::ReleaseAcquire> mContentDocumentDisplayed;
+
public:
static nsWindow* TopWindow();
static mozilla::Modifiers GetModifiers(int32_t aMetaState);
static mozilla::TimeStamp GetEventTimeStamp(int64_t aEventTime);
void OnSizeChanged(const mozilla::gfx::IntSize& aSize);
@@ -295,17 +297,18 @@ public:
uint32_t aNativeMessage,
uint32_t aModifierFlags,
nsIObserver* aObserver) override;
nsresult SynthesizeNativeMouseMove(LayoutDeviceIntPoint aPoint,
nsIObserver* aObserver) override;
mozilla::layers::CompositorBridgeChild* GetCompositorBridgeChild() const;
- mozilla::jni::DependentRef<mozilla::java::LayerSession::Compositor> GetJavaCompositor();
+ void SetContentDocumentDisplayed(bool aDisplayed);
+ bool IsContentDocumentDisplayed();
// Call this function when the users activity is the direct cause of an
// event (like a keypress or mouse click).
void UserActivity();
mozilla::java::GeckoEditable::Ref& GetEditableParent() { return mEditable; }
void RecvToolbarAnimatorMessageFromCompositor(int32_t aMessage) override;