Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit b0863a2

Browse files
keianhzobluemarvin
authored andcommitted
Queue History events while the session is inactive (#2163)
* Queue History events while the session is inactive Revert new line * Better null checking and exception handling * Exception handling for real
1 parent 7fcabcb commit b0863a2

File tree

1 file changed

+83
-7
lines changed
  • app/src/common/shared/org/mozilla/vrbrowser/browser/engine

1 file changed

+83
-7
lines changed

app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import android.content.Context;
1010
import android.content.SharedPreferences;
1111
import android.graphics.Bitmap;
12-
import android.graphics.SurfaceTexture;
12+
import android.os.Handler;
1313
import android.preference.PreferenceManager;
1414
import android.util.Log;
1515
import android.view.Surface;
@@ -47,9 +47,11 @@
4747
import java.net.URI;
4848
import java.net.URISyntaxException;
4949
import java.util.LinkedList;
50+
import java.util.Objects;
5051
import java.util.concurrent.atomic.AtomicBoolean;
5152
import java.util.concurrent.atomic.AtomicInteger;
5253

54+
import static java.util.Objects.requireNonNull;
5355
import static org.mozilla.vrbrowser.utils.ServoUtils.createServoSession;
5456
import static org.mozilla.vrbrowser.utils.ServoUtils.isInstanceOfServoSession;
5557
import static org.mozilla.vrbrowser.utils.ServoUtils.isServoAvailable;
@@ -72,6 +74,7 @@ public class Session implements ContentBlocking.Delegate, GeckoSession.Navigatio
7274
private transient UserAgentOverride mUserAgentOverride;
7375

7476
private SessionState mState;
77+
private LinkedList<Runnable> mQueuedCalls = new LinkedList<>();
7578
private transient GeckoSession.PermissionDelegate mPermissionDelegate;
7679
private transient GeckoSession.PromptDelegate mPromptDelegate;
7780
private transient GeckoSession.HistoryDelegate mHistoryDelegate;
@@ -82,6 +85,7 @@ public class Session implements ContentBlocking.Delegate, GeckoSession.Navigatio
8285
private transient byte[] mPrivatePage;
8386
private boolean mIsActive;
8487

88+
8589
public interface BitmapChangedListener {
8690
void onBitmapChanged(Session aSession, Bitmap aBitmap);
8791
}
@@ -163,6 +167,7 @@ protected void shutdown() {
163167
}
164168
}
165169

170+
mQueuedCalls.clear();
166171
mNavigationListeners.clear();
167172
mProgressListeners.clear();
168173
mContentListeners.clear();
@@ -221,6 +226,13 @@ private void dumpState(VideoAvailabilityListener aListener) {
221226
aListener.onVideoAvailabilityChanged(mState.mMediaElements != null && mState.mMediaElements.size() > 0);
222227
}
223228

229+
private void flushQueuedEvents() {
230+
for (Runnable call: mQueuedCalls) {
231+
call.run();
232+
}
233+
mQueuedCalls.clear();
234+
}
235+
224236
public void setPermissionDelegate(GeckoSession.PermissionDelegate aDelegate) {
225237
mPermissionDelegate = aDelegate;
226238
}
@@ -567,9 +579,15 @@ public void goForward() {
567579
}
568580

569581
public void setActive(boolean aActive) {
582+
// Flush the events queued while the session was inactive
583+
if (mState.mSession != null && !mIsActive && aActive) {
584+
flushQueuedEvents();
585+
}
586+
570587
if (mState.mSession != null) {
571588
mState.mSession.setActive(aActive);
572589
}
590+
573591
mIsActive = aActive;
574592

575593
for (SessionChangeListener listener: mSessionChangeListeners) {
@@ -1212,16 +1230,51 @@ public void onMediaRemove(@NonNull GeckoSession aSession, @NonNull MediaElement
12121230

12131231
@Override
12141232
public void onHistoryStateChange(@NonNull GeckoSession aSession, @NonNull GeckoSession.HistoryDelegate.HistoryList historyList) {
1215-
if (mState.mSession == aSession && mHistoryDelegate != null) {
1216-
mHistoryDelegate.onHistoryStateChange(aSession, historyList);
1233+
if (mState.mSession == aSession) {
1234+
if (mHistoryDelegate != null) {
1235+
mHistoryDelegate.onHistoryStateChange(aSession, historyList);
1236+
1237+
} else {
1238+
mQueuedCalls.add(() -> {
1239+
new Handler(mContext.getMainLooper()).postDelayed(() -> {
1240+
if (mHistoryDelegate != null) {
1241+
mHistoryDelegate.onHistoryStateChange(aSession, historyList);
1242+
}
1243+
}, 100);
1244+
});
1245+
}
12171246
}
12181247
}
12191248

12201249
@Nullable
12211250
@Override
12221251
public GeckoResult<Boolean> onVisited(@NonNull GeckoSession aSession, @NonNull String url, @Nullable String lastVisitedURL, int flags) {
1223-
if (mState.mSession == aSession && mHistoryDelegate != null) {
1224-
return mHistoryDelegate.onVisited(aSession, url, lastVisitedURL, flags);
1252+
if (mState.mSession == aSession) {
1253+
if (mHistoryDelegate != null) {
1254+
return mHistoryDelegate.onVisited(aSession, url, lastVisitedURL, flags);
1255+
1256+
} else {
1257+
final GeckoResult<Boolean> response = new GeckoResult<>();
1258+
mQueuedCalls.add(() -> {
1259+
if (mHistoryDelegate != null) {
1260+
try {
1261+
requireNonNull(mHistoryDelegate.onVisited(aSession, url, lastVisitedURL, flags)).then(aBoolean -> {
1262+
response.complete(aBoolean);
1263+
return null;
1264+
1265+
}).exceptionally(throwable -> {
1266+
Log.d(LOGTAG, "Null GeckoResult from onVisited");
1267+
return null;
1268+
});
1269+
1270+
} catch (NullPointerException e) {
1271+
e.printStackTrace();
1272+
}
1273+
}
1274+
});
1275+
1276+
return response;
1277+
}
12251278
}
12261279

12271280
return GeckoResult.fromValue(false);
@@ -1230,8 +1283,31 @@ public GeckoResult<Boolean> onVisited(@NonNull GeckoSession aSession, @NonNull S
12301283
@UiThread
12311284
@Nullable
12321285
public GeckoResult<boolean[]> getVisited(@NonNull GeckoSession aSession, @NonNull String[] urls) {
1233-
if (mState.mSession == aSession && mHistoryDelegate != null) {
1234-
return mHistoryDelegate.getVisited(aSession, urls);
1286+
if (mState.mSession == aSession) {
1287+
if (mHistoryDelegate != null) {
1288+
return mHistoryDelegate.getVisited(aSession, urls);
1289+
1290+
} else {
1291+
final GeckoResult<boolean[]> response = new GeckoResult<>();
1292+
mQueuedCalls.add(() -> {
1293+
if (mHistoryDelegate != null) {
1294+
try {
1295+
requireNonNull(mHistoryDelegate.getVisited(aSession, urls)).then(aBoolean -> {
1296+
response.complete(aBoolean);
1297+
return null;
1298+
1299+
}).exceptionally(throwable -> {
1300+
Log.d(LOGTAG, "Null GeckoResult from getVisited");
1301+
return null;
1302+
});
1303+
1304+
} catch (NullPointerException e) {
1305+
e.printStackTrace();
1306+
}
1307+
}
1308+
});
1309+
return response;
1310+
}
12351311
}
12361312

12371313
return GeckoResult.fromValue(new boolean[]{});

0 commit comments

Comments
 (0)