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 f3c9bad8f9cb19..d4d1357def5228 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 @@ -265,8 +265,11 @@ public boolean navigateOnBack() { return true; } } - - BackPressManager.record(BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB); + 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); + } if (mTabController.dispatchBeforeUnloadIfNeeded()) { MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.CLOSE_TAB); return true; diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java index d08dc7ba7d57ca..43957f1ba24ae8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java @@ -29,15 +29,21 @@ import org.chromium.base.task.test.ShadowPostTask; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.HistogramWatcher; +import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.back_press.MinimizeAppAndCloseTabBackPressHandler; import org.chromium.chrome.browser.back_press.MinimizeAppAndCloseTabBackPressHandler.MinimizeAppAndCloseTabType; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishHandler; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishReason; import org.chromium.chrome.browser.customtabs.shadows.ShadowExternalNavigationDelegateImpl; import org.chromium.chrome.browser.flags.ActivityType; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.url.GURL; +import java.util.Map; + /** * Unit tests for {@link CustomTabActivityNavigationController}. * @@ -73,9 +79,40 @@ public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long dela @Test public void finishes_IfBackNavigationClosesTheOnlyTabWithNoUnloadEvents() { - HistogramWatcher histogramWatcher = HistogramWatcher.newSingleRecordWatcher( - MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), - MinimizeAppAndCloseTabType.MINIMIZE_APP); + CachedFeatureFlags.setFeaturesForTesting( + Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR, false)); + HistogramWatcher histogramWatcher = + HistogramWatcher.newBuilder() + .expectIntRecord( + MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), + MinimizeAppAndCloseTabType.MINIMIZE_APP) + .expectIntRecord(BackPressManager.getHistogramForTesting(), + BackPressManager.getHistogramValueForTesting( + BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB)) + .build(); + when(mTabController.onlyOneTabRemaining()).thenReturn(true); + when(mTabController.dispatchBeforeUnloadIfNeeded()).thenReturn(false); + Assert.assertTrue(mNavigationController.getHandleBackPressChangedSupplier().get()); + + mNavigationController.navigateOnBack(); + histogramWatcher.assertExpected(); + verify(mFinishHandler).onFinish(eq(FinishReason.USER_NAVIGATION)); + env.tabProvider.removeTab(); + Assert.assertNull(env.tabProvider.getTab()); + Assert.assertFalse(mNavigationController.getHandleBackPressChangedSupplier().get()); + } + + @Test + public void finishes_IfBackNavigationClosesTheOnlyTabWithNoUnloadEvents_BackPressRefactor() { + CachedFeatureFlags.setFeaturesForTesting( + Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR, true)); + HistogramWatcher histogramWatcher = + HistogramWatcher.newBuilder() + .expectIntRecord( + MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), + MinimizeAppAndCloseTabType.MINIMIZE_APP) + .expectNoRecords(BackPressManager.getHistogramForTesting()) + .build(); when(mTabController.onlyOneTabRemaining()).thenReturn(true); when(mTabController.dispatchBeforeUnloadIfNeeded()).thenReturn(false); Assert.assertTrue(mNavigationController.getHandleBackPressChangedSupplier().get()); @@ -90,9 +127,41 @@ public void finishes_IfBackNavigationClosesTheOnlyTabWithNoUnloadEvents() { @Test public void doesntFinish_IfBackNavigationReplacesTabWithPreviousOne() { - HistogramWatcher histogramWatcher = HistogramWatcher.newSingleRecordWatcher( - MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), - MinimizeAppAndCloseTabType.CLOSE_TAB); + CachedFeatureFlags.setFeaturesForTesting( + Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR, false)); + HistogramWatcher histogramWatcher = + HistogramWatcher.newBuilder() + .expectIntRecord( + MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), + MinimizeAppAndCloseTabType.CLOSE_TAB) + .expectIntRecord(BackPressManager.getHistogramForTesting(), + BackPressManager.getHistogramValueForTesting( + BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB)) + .build(); + doAnswer((Answer) invocation -> { + env.tabProvider.swapTab(env.prepareTab()); + return null; + }) + .when(mTabController) + .closeTab(); + Assert.assertTrue(mNavigationController.getHandleBackPressChangedSupplier().get()); + + mNavigationController.navigateOnBack(); + histogramWatcher.assertExpected(); + verify(mFinishHandler, never()).onFinish(anyInt()); + } + + @Test + public void doesntFinish_IfBackNavigationReplacesTabWithPreviousOne_BackPressRefactor() { + CachedFeatureFlags.setFeaturesForTesting( + Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR, true)); + HistogramWatcher histogramWatcher = + HistogramWatcher.newBuilder() + .expectIntRecord( + MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), + MinimizeAppAndCloseTabType.CLOSE_TAB) + .expectNoRecords(BackPressManager.getHistogramForTesting()) + .build(); doAnswer((Answer) invocation -> { env.tabProvider.swapTab(env.prepareTab()); return null; @@ -106,9 +175,37 @@ public void doesntFinish_IfBackNavigationReplacesTabWithPreviousOne() { @Test public void doesntFinish_IfBackNavigationHappensWithBeforeUnloadHandler() { - HistogramWatcher histogramWatcher = HistogramWatcher.newSingleRecordWatcher( - MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), - MinimizeAppAndCloseTabType.CLOSE_TAB); + CachedFeatureFlags.setFeaturesForTesting( + Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR, false)); + HistogramWatcher histogramWatcher = + HistogramWatcher.newBuilder() + .expectIntRecord( + MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), + MinimizeAppAndCloseTabType.CLOSE_TAB) + .expectIntRecord(BackPressManager.getHistogramForTesting(), + BackPressManager.getHistogramValueForTesting( + BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB)) + .build(); + + when(mTabController.dispatchBeforeUnloadIfNeeded()).thenReturn(true); + + mNavigationController.navigateOnBack(); + histogramWatcher.assertExpected(); + verify(mFinishHandler, never()).onFinish(anyInt()); + } + + @Test + public void doesntFinish_IfBackNavigationHappensWithBeforeUnloadHandler_BackPressRefactor() { + CachedFeatureFlags.setFeaturesForTesting( + Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR, true)); + HistogramWatcher histogramWatcher = + HistogramWatcher.newBuilder() + .expectIntRecord( + MinimizeAppAndCloseTabBackPressHandler.getHistogramNameForTesting(), + MinimizeAppAndCloseTabType.CLOSE_TAB) + .expectNoRecords(BackPressManager.getHistogramForTesting()) + .build(); + when(mTabController.dispatchBeforeUnloadIfNeeded()).thenReturn(true); mNavigationController.navigateOnBack();