Fix CCT doesn't recover the tab history
Fix CCT doesn't correctly recover the tab history when the navigation
interception fails. After tab history is on, the tab history will be
navigated back before the CCT is closed.
Bug: 1475396
Change-Id: Ia4197e5c4acd6993296df8269990f14af1885b0d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4807237
Reviewed-by: Theresa Sullivan <twellington@chromium.org>
Commit-Queue: Lijin Shen <lazzzis@google.com>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1187569}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationController.java
index 60eba167d..6a3bd04 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationController.java
@@ -262,11 +262,13 @@
BackPressManager.record(BackPressHandler.Type.TAB_HISTORY);
return true;
}
- }
- if (!BackPressManager.isEnabled()) {
// If enabled, BackPressManager will record this internally. Otherwise, this should
// be recorded manually.
BackPressManager.record(BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB);
+ } else if (BackPressManager.correctTabNavigationOnFallback()) {
+ if (mTabProvider.getTab().canGoBack()) {
+ return false;
+ }
}
if (mTabController.dispatchBeforeUnloadIfNeeded()) {
MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.CLOSE_TAB);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
index 371f921..45f5b3c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -94,6 +94,7 @@
import org.chromium.base.IntentUtils;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
import org.chromium.base.test.util.ApplicationTestUtils;
@@ -2488,6 +2489,86 @@
@Test
@SmallTest
+ @EnableFeatures(ChromeFeatureList.BACK_GESTURE_REFACTOR)
+ public void testBackPressNavigationFailure_WithRecover() {
+ Context context = getInstrumentation().getTargetContext().getApplicationContext();
+ Intent intent = CustomTabsIntentTestUtils.createMinimalCustomTabIntent(context, mTestPage);
+ mCustomTabActivityTestRule.startCustomTabActivityWithIntent(intent);
+ final Tab tab = getActivity().getActivityTab();
+ BackPressManager.TAB_HISTORY_RECOVER.setForTesting(true);
+
+ TestThreadUtils.runOnUiThreadBlocking(
+ (Runnable) () -> tab.loadUrl(new LoadUrlParams(mTestPage2)));
+ ChromeTabUtils.waitForTabPageLoaded(tab, mTestPage2);
+
+ BackPressHandler navigationHandler =
+ getActivity()
+ .getBackPressManagerForTesting()
+ .getHandlersForTesting()[BackPressHandler.Type.TAB_HISTORY];
+ ObservableSupplierImpl<Boolean> handleBackPressChangedSupplier =
+ (ObservableSupplierImpl<Boolean>) (navigationHandler
+ .getHandleBackPressChangedSupplier());
+ HistogramWatcher histogramWatcher =
+ HistogramWatcher.newSingleRecordWatcher("Android.BackPress.Failure",
+ BackPressManager.getHistogramValueForTesting(
+ BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB));
+ TestThreadUtils.runOnUiThreadBlocking(() -> {
+ handleBackPressChangedSupplier.set(false);
+ try {
+ getActivity().getOnBackPressedDispatcher().onBackPressed();
+ } catch (AssertionError ignored) {
+ if (!ignored.getMessage().contains("-1")) throw ignored;
+ }
+ });
+
+ histogramWatcher.assertExpected("Failure should be recorded");
+ CriteriaHelper.pollInstrumentationThread(() -> {
+ Criteria.checkThat("Tab should be navigated when tab handler fails",
+ ChromeTabUtils.getUrlStringOnUiThread(getActivity().getActivityTab()),
+ is(mTestPage));
+ });
+ BackPressManager.TAB_HISTORY_RECOVER.setForTesting(false);
+ }
+
+ @Test
+ @SmallTest
+ @EnableFeatures(ChromeFeatureList.BACK_GESTURE_REFACTOR)
+ public void testBackPressNavigationFailure_WithoutRecover() {
+ Context context = getInstrumentation().getTargetContext().getApplicationContext();
+ Intent intent = CustomTabsIntentTestUtils.createMinimalCustomTabIntent(context, mTestPage);
+ mCustomTabActivityTestRule.startCustomTabActivityWithIntent(intent);
+ final Tab tab = getActivity().getActivityTab();
+ BackPressManager.TAB_HISTORY_RECOVER.setForTesting(false);
+
+ TestThreadUtils.runOnUiThreadBlocking(
+ (Runnable) () -> tab.loadUrl(new LoadUrlParams(mTestPage2)));
+ ChromeTabUtils.waitForTabPageLoaded(tab, mTestPage2);
+
+ BackPressHandler navigationHandler =
+ getActivity()
+ .getBackPressManagerForTesting()
+ .getHandlersForTesting()[BackPressHandler.Type.TAB_HISTORY];
+ ObservableSupplierImpl<Boolean> handleBackPressChangedSupplier =
+ (ObservableSupplierImpl<Boolean>) (navigationHandler
+ .getHandleBackPressChangedSupplier());
+ TestThreadUtils.runOnUiThreadBlocking(() -> {
+ handleBackPressChangedSupplier.set(false);
+ try {
+ getActivity().getOnBackPressedDispatcher().onBackPressed();
+ } catch (AssertionError ignored) {
+ if (!ignored.getMessage().contains("-1")) throw ignored;
+ }
+ });
+
+ CriteriaHelper.pollInstrumentationThread(() -> {
+ Criteria.checkThat("Tab should not be navigated when tab handler fails without recover",
+ ChromeTabUtils.getUrlStringOnUiThread(getActivity().getActivityTab()),
+ is(mTestPage2));
+ });
+ }
+
+ @Test
+ @SmallTest
@DisableFeatures(ChromeFeatureList.BACK_GESTURE_REFACTOR)
public void testBackPressDismissTabModalDialog() {
Context context = getInstrumentation().getTargetContext().getApplicationContext();