From f6e5f80eca82ff88735c78a5e7bb877fb5440593 Mon Sep 17 00:00:00 2001 From: Eugen Sawin Date: Wed, 12 Apr 2017 21:51:00 +0200 Subject: [PATCH] Bug 1351169 - [1.2] Update GeckoView's state after finishing window reattachment. r=jchen --- .../org/mozilla/gecko/EventDispatcher.java | 3 ++- .../java/org/mozilla/gecko/GeckoView.java | 17 +++++++++------- widget/android/GeneratedJNIWrappers.cpp | 8 ++++++++ widget/android/GeneratedJNIWrappers.h | 20 +++++++++++++++++++ widget/android/nsWindow.cpp | 2 ++ 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java index 1ffe1c8ec322..06bee18a3c02 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java @@ -237,7 +237,8 @@ public final class EventDispatcher extends JNIObject { public void dispatch(final String type, final GeckoBundle message, final EventCallback callback) { synchronized (this) { - if (isReadyForDispatchingToGecko() && hasGeckoListener(type)) { + if (isReadyForDispatchingToGecko() && mAttachedToGecko && + hasGeckoListener(type)) { dispatchToGecko(type, message, JavaCallbackDelegate.wrap(callback)); return; } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoView.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoView.java index c51fad3a4c5f..b875fa983356 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoView.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoView.java @@ -110,6 +110,16 @@ public class GeckoView extends LayerView private synchronized void setState(final State newState) { mNativeQueue.setState(newState); } + + @WrapForJNI(calledFrom = "gecko") + private synchronized void onReattach(final GeckoView view) { + if (view.mNativeQueue == mNativeQueue) { + return; + } + view.mNativeQueue.setState(mNativeQueue.getState()); + mNativeQueue = view.mNativeQueue; + } + } // Object to hold onto our nsWindow connection when GeckoView gets destroyed. @@ -299,13 +309,6 @@ public class GeckoView extends LayerView } protected void reattachWindow() { - synchronized (mWindow) { - if (mNativeQueue != mWindow.mNativeQueue) { - mNativeQueue.setState(mWindow.mNativeQueue.getState()); - mWindow.mNativeQueue = mNativeQueue; - } - } - if (GeckoThread.isStateAtLeast(GeckoThread.State.PROFILE_READY)) { mWindow.reattach(this, getCompositor(), mEventDispatcher); } else { diff --git a/widget/android/GeneratedJNIWrappers.cpp b/widget/android/GeneratedJNIWrappers.cpp index dc1640eb63e7..50fcac11b33a 100644 --- a/widget/android/GeneratedJNIWrappers.cpp +++ b/widget/android/GeneratedJNIWrappers.cpp @@ -998,6 +998,14 @@ constexpr char GeckoView::Window::DisposeNative_t::signature[]; constexpr char GeckoView::Window::LoadUri_t::name[]; constexpr char GeckoView::Window::LoadUri_t::signature[]; +constexpr char GeckoView::Window::OnReattach_t::name[]; +constexpr char GeckoView::Window::OnReattach_t::signature[]; + +auto GeckoView::Window::OnReattach(GeckoView::Param a0) const -> void +{ + return mozilla::jni::Method::Call(Window::mCtx, nullptr, a0); +} + constexpr char GeckoView::Window::Open_t::name[]; constexpr char GeckoView::Window::Open_t::signature[]; diff --git a/widget/android/GeneratedJNIWrappers.h b/widget/android/GeneratedJNIWrappers.h index 59beec93bd97..eb114a5bceaa 100644 --- a/widget/android/GeneratedJNIWrappers.h +++ b/widget/android/GeneratedJNIWrappers.h @@ -3004,6 +3004,26 @@ public: mozilla::jni::DispatchTarget::PROXY; }; + struct OnReattach_t { + typedef Window Owner; + typedef void ReturnType; + typedef void SetterType; + typedef mozilla::jni::Args< + GeckoView::Param> Args; + static constexpr char name[] = "onReattach"; + static constexpr char signature[] = + "(Lorg/mozilla/gecko/GeckoView;)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 OnReattach(GeckoView::Param) const -> void; + struct Open_t { typedef Window Owner; typedef void ReturnType; diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp index 7fbbcda42c22..55e923ee902f 100644 --- a/widget/android/nsWindow.cpp +++ b/widget/android/nsWindow.cpp @@ -1332,6 +1332,8 @@ nsWindow::GeckoViewSupport::Reattach(const GeckoView::Window::LocalRef& inst, MOZ_ASSERT(window.mAndroidView); window.mAndroidView->mEventDispatcher->Attach( java::EventDispatcher::Ref::From(aDispatcher), mDOMWindow); + + mGeckoViewWindow->OnReattach(aView); } void