Bug 1677190 - Use shared code for updating the session state on Android when SHIP is enabled. r=geckoview-reviewers,sessionstore-reviewers,farre,owlish

Differential Revision: https://phabricator.services.mozilla.com/D210757
This commit is contained in:
kycn 2024-05-23 06:45:36 +00:00
parent 0f44717f92
commit 67a6fa45ec
9 changed files with 6 additions and 163 deletions

View file

@ -250,11 +250,6 @@ class HistoryDelegateTest : BaseSessionTest() {
}
@Test fun onHistoryStateChangeSavingState() {
// TODO: Bug 1884334
val geckoPrefs = sessionRule.getPrefs(
"fission.disableSessionHistoryInParent",
)
assumeThat(geckoPrefs[0] as Boolean, equalTo(true))
// TODO: Bug 1837551
assumeThat(sessionRule.env.isFission, equalTo(false))

View file

@ -3163,11 +3163,6 @@ class NavigationDelegateTest : BaseSessionTest() {
}
@Test fun goBackFromHistory() {
// TODO: Bug 1884334
val geckoPrefs = sessionRule.getPrefs(
"fission.disableSessionHistoryInParent",
)
assumeThat(geckoPrefs[0] as Boolean, equalTo(true))
// TODO: Bug 1837551
assumeThat(sessionRule.env.isFission, equalTo(false))

View file

@ -448,11 +448,6 @@ class ProgressDelegateTest : BaseSessionTest() {
@WithDisplay(width = 400, height = 400)
@Test
fun saveAndRestoreStateNewSession() {
// TODO: Bug 1884334
val geckoPrefs = sessionRule.getPrefs(
"fission.disableSessionHistoryInParent",
)
assumeThat(geckoPrefs[0] as Boolean, equalTo(true))
// TODO: Bug 1837551
assumeThat(sessionRule.env.isFission, equalTo(false))
val helloUri = createTestUrl(HELLO_HTML_PATH)
@ -579,11 +574,6 @@ class ProgressDelegateTest : BaseSessionTest() {
@NullDelegate(GeckoSession.HistoryDelegate::class)
@Test
fun noHistoryDelegateOnSessionStateChange() {
// TODO: Bug 1884334
val geckoPrefs = sessionRule.getPrefs(
"fission.disableSessionHistoryInParent",
)
assumeThat(geckoPrefs[0] as Boolean, equalTo(true))
// TODO: Bug 1837551
assumeThat(sessionRule.env.isFission, equalTo(false))
mainSession.loadTestPath(HELLO_HTML_PATH)

View file

@ -7,7 +7,6 @@ package org.mozilla.geckoview.test
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers
import org.hamcrest.Matchers.greaterThan
import org.hamcrest.core.IsEqual.equalTo
import org.hamcrest.core.StringEndsWith.endsWith
@ -2170,11 +2169,6 @@ class WebExtensionTest : BaseSessionTest() {
// - verifies that the messages are received when restoring the tab in a fresh session
@Test
fun testRestoringExtensionPagePreservesMessages() {
// TODO: Bug 1884334
val geckoPrefs = sessionRule.getPrefs(
"fission.disableSessionHistoryInParent",
)
assumeThat(geckoPrefs[0] as Boolean, Matchers.equalTo(true))
// TODO: Bug 1837551
assumeThat(sessionRule.env.isFission, equalTo(false))

View file

@ -1598,36 +1598,6 @@ public class GeckoSession {
}
});
}
@WrapForJNI(calledFrom = "gecko")
private void onUpdateSessionStore(final GeckoBundle aBundle) {
ThreadUtils.runOnUiThread(
() -> {
final GeckoSession session = mOwner.get();
if (session == null) {
return;
}
GeckoBundle scroll = aBundle.getBundle("scroll");
if (scroll == null) {
scroll = new GeckoBundle();
aBundle.putBundle("scroll", scroll);
}
// Here we unfortunately need to do some re-mapping since `zoom` is passed in a separate
// bunds and we wish to keep the bundle format.
scroll.putBundle("zoom", aBundle.getBundle("zoom"));
final SessionState stateCache = session.mStateCache;
stateCache.updateSessionState(aBundle);
final SessionState state = new SessionState(stateCache);
if (!state.isEmpty()) {
final ProgressDelegate progressDelegate = session.getProgressDelegate();
if (progressDelegate != null) {
progressDelegate.onSessionStateChange(session, state);
} else {
}
}
});
}
}
private class Listener implements BundleEventListener {

View file

@ -25,12 +25,6 @@
#include "nsImportModule.h"
#include "nsIXPConnect.h"
#ifdef ANDROID
# include "mozilla/widget/nsWindow.h"
# include "mozilla/jni/GeckoBundleUtils.h"
# include "JavaBuiltins.h"
#endif /* ANDROID */
using namespace mozilla;
using namespace mozilla::dom;
@ -39,75 +33,6 @@ SessionStoreParent::SessionStoreParent(
BrowserSessionStore* aSessionStore)
: mBrowsingContext(aBrowsingContext), mSessionStore(aSessionStore) {}
#ifdef ANDROID
static void DoSessionStoreUpdate(CanonicalBrowsingContext* aBrowsingContext,
const Maybe<nsCString>& aDocShellCaps,
const Maybe<bool>& aPrivatedMode,
SessionStoreFormData* aFormData,
SessionStoreScrollData* aScroll,
const MaybeSessionStoreZoom& aZoom,
bool aNeedCollectSHistory, uint32_t aEpoch) {
RefPtr<BrowserSessionStore> sessionStore =
BrowserSessionStore::GetOrCreate(aBrowsingContext->Top());
nsCOMPtr<nsIWidget> widget =
aBrowsingContext->GetParentProcessWidgetContaining();
if (RefPtr<nsWindow> window = nsWindow::From(widget)) {
AutoJSAPI jsapi;
if (!jsapi.Init(xpc::PrivilegedJunkScope())) {
return;
}
jni::Object::LocalRef formDataBundle(jni::GetGeckoThreadEnv());
jni::Object::LocalRef scrollBundle(jni::GetGeckoThreadEnv());
if (aFormData) {
JS::Rooted<JSObject*> object(jsapi.cx());
ErrorResult rv;
aFormData->ToJSON(jsapi.cx(), &object);
JS::Rooted<JS::Value> value(jsapi.cx(), JS::ObjectValue(*object));
if (NS_FAILED(jni::BoxData(jsapi.cx(), value, formDataBundle, true))) {
JS_ClearPendingException(jsapi.cx());
return;
}
}
if (aScroll) {
JS::Rooted<JSObject*> object(jsapi.cx());
ErrorResult rv;
aScroll->ToJSON(jsapi.cx(), &object);
JS::Rooted<JS::Value> value(jsapi.cx(), JS::ObjectValue(*object));
if (NS_FAILED(jni::BoxData(jsapi.cx(), value, scrollBundle, true))) {
JS_ClearPendingException(jsapi.cx());
return;
}
}
GECKOBUNDLE_START(update);
GECKOBUNDLE_PUT(update, "formdata", formDataBundle);
GECKOBUNDLE_PUT(update, "scroll", scrollBundle);
if (aZoom) {
GECKOBUNDLE_START(zoomBundle);
GECKOBUNDLE_PUT(zoomBundle, "resolution",
java::sdk::Double::New(std::get<0>(*aZoom)));
GECKOBUNDLE_START(displaySizeBundle);
GECKOBUNDLE_PUT(displaySizeBundle, "width",
java::sdk::Integer::ValueOf(std::get<1>(*aZoom)));
GECKOBUNDLE_PUT(displaySizeBundle, "height",
java::sdk::Integer::ValueOf(std::get<2>(*aZoom)));
GECKOBUNDLE_FINISH(displaySizeBundle);
GECKOBUNDLE_PUT(zoomBundle, "displaySize", displaySizeBundle);
GECKOBUNDLE_FINISH(zoomBundle);
GECKOBUNDLE_PUT(update, "zoom", zoomBundle);
}
GECKOBUNDLE_FINISH(update);
window->OnUpdateSessionStore(update);
}
}
#else
static void DoSessionStoreUpdate(CanonicalBrowsingContext* aBrowsingContext,
const Maybe<nsCString>& aDocShellCaps,
const Maybe<bool>& aPrivatedMode,
@ -174,7 +99,6 @@ static void DoSessionStoreUpdate(CanonicalBrowsingContext* aBrowsingContext,
Unused << sessionStoreFuncs->UpdateSessionStore(
nullptr, aBrowsingContext, key, aEpoch, aNeedCollectSHistory, update);
}
#endif
void SessionStoreParent::FlushAllSessionStoreChildren(
const std::function<void()>& aDone) {

View file

@ -89,13 +89,11 @@ class GeckoViewSupport final
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;
bool aHasUserGesture,
bool aIsTopLevel) const -> java::GeckoResult::LocalRef;
void OnShowDynamicToolbar() const;
void OnUpdateSessionStore(mozilla::jni::Object::Param aBundle);
void PassExternalResponse(java::WebResponse::Param aResponse);
void AttachMediaSessionController(

View file

@ -1894,12 +1894,10 @@ void GeckoViewSupport::AttachAccessibility(
sessionAccessibility);
}
auto GeckoViewSupport::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 {
auto GeckoViewSupport::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 {
GeckoSession::Window::LocalRef window(mGeckoViewWindow);
if (!window) {
return nullptr;
@ -2317,15 +2315,6 @@ RefPtr<MozPromise<bool, bool, false>> nsWindow::OnLoadRequest(
: nullptr;
}
void nsWindow::OnUpdateSessionStore(mozilla::jni::Object::Param aBundle) {
auto geckoViewSupport(mGeckoViewSupport.Access());
if (!geckoViewSupport) {
return;
}
geckoViewSupport->OnUpdateSessionStore(aBundle);
}
float nsWindow::GetDPI() {
float dpi = 160.0f;
@ -2657,16 +2646,6 @@ void nsWindow::ShowDynamicToolbar() {
acc->OnShowDynamicToolbar();
}
void GeckoViewSupport::OnUpdateSessionStore(
mozilla::jni::Object::Param aBundle) {
GeckoSession::Window::LocalRef window(mGeckoViewWindow);
if (!window) {
return;
}
window->OnUpdateSessionStore(aBundle);
}
static EventMessage convertDragEventActionToGeckoEvent(int32_t aAction) {
switch (aAction) {
case java::sdk::DragEvent::ACTION_DRAG_ENTERED:

View file

@ -70,8 +70,6 @@ class nsWindow final : public nsBaseWidget {
nsIPrincipal* aTriggeringPrincipal, bool aHasUserGesture,
bool aIsTopLevel);
void OnUpdateSessionStore(mozilla::jni::Object::Param aBundle);
private:
// Unique ID given to each widget, used to map Surfaces to widgets
// in the CompositorSurfaceManager.