Bug 1416319 - 1. Move content-document-is-displayed flag to native code; r?rbarker draft
authorJim Chen <nchen@mozilla.com>
Wed, 22 Nov 2017 14:12:22 -0500
changeset 702124 190e24ed0c1b765448c34b91145f706d49994e1d
parent 701250 72ee4800d4156931c89b58bd807af4a3083702bb
child 702125 7c0d22091ad36f188bc8603e4086b18f91848815
push id90386
push userbmo:nchen@mozilla.com
push dateWed, 22 Nov 2017 19:12:37 +0000
reviewersrbarker
bugs1416319, 1416310
milestone59.0a1
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
mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java
mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
widget/android/AndroidBridge.cpp
widget/android/GeneratedJNIWrappers.cpp
widget/android/GeneratedJNIWrappers.h
widget/android/nsWindow.cpp
widget/android/nsWindow.h
--- 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;