Commit 0101b70e authored by Rouslan Solomakhin's avatar Rouslan Solomakhin Committed by Commit Bot

[Payment Request][Android] Cancel payment in tab overview mode.

Before this patch, a payment app that was slow to respond to
`canmakepayment` event would leave a window of time when the user could
enter the tab overview mode in Android, which did not cancel the ongoing
payment, even though the merchant page was no longer in focus.

The tab overview mode displays a list of user tabs and is used for tab
switching. Chrome already listened to tab switch events, so selecting a
different tab does cancel the ongoing payment.

This patch cancels the ongoing payment when Chrome enters into the
overview mode.

After this patch, Chrome cancels the ongoing payment if the user enters
the tab overview mode, which can happen when the payment app is slow to
respond to `canmakepayment` event.

Bug: 817073
Change-Id: I852d8467bb4e349bcc9afb322d973a9bccca0910
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1506374Reviewed-by: default avatarDanyao Wang <danyao@chromium.org>
Commit-Queue: Rouslan Solomakhin <rouslan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#638287}
parent bfa0a0c5
...@@ -17,11 +17,15 @@ import org.chromium.base.VisibleForTesting; ...@@ -17,11 +17,15 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
import org.chromium.chrome.browser.autofill.PersonalDataManager.NormalizedAddressRequestDelegate; import org.chromium.chrome.browser.autofill.PersonalDataManager.NormalizedAddressRequestDelegate;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
import org.chromium.chrome.browser.favicon.FaviconHelper; import org.chromium.chrome.browser.favicon.FaviconHelper;
import org.chromium.chrome.browser.page_info.CertificateChainHelper; import org.chromium.chrome.browser.page_info.CertificateChainHelper;
import org.chromium.chrome.browser.payments.ui.ContactDetailsSection; import org.chromium.chrome.browser.payments.ui.ContactDetailsSection;
...@@ -214,6 +218,14 @@ public class PaymentRequestImpl ...@@ -214,6 +218,14 @@ public class PaymentRequestImpl
} }
}; };
/** Monitors changes in the tab overview. */
private final OverviewModeObserver mOverviewModeObserver = new EmptyOverviewModeObserver() {
@Override
public void onOverviewModeStartedShowing(boolean showToolbar) {
onDismiss();
}
};
private final Handler mHandler = new Handler(); private final Handler mHandler = new Handler();
private final RenderFrameHost mRenderFrameHost; private final RenderFrameHost mRenderFrameHost;
private final WebContents mWebContents; private final WebContents mWebContents;
...@@ -292,6 +304,7 @@ public class PaymentRequestImpl ...@@ -292,6 +304,7 @@ public class PaymentRequestImpl
private Map<String, CurrencyFormatter> mCurrencyFormatterMap; private Map<String, CurrencyFormatter> mCurrencyFormatterMap;
private TabModelSelector mObservedTabModelSelector; private TabModelSelector mObservedTabModelSelector;
private TabModel mObservedTabModel; private TabModel mObservedTabModel;
private OverviewModeBehavior mOverviewModeBehavior;
/** Aborts should only be recorded if the Payment Request was shown to the user. */ /** Aborts should only be recorded if the Payment Request was shown to the user. */
private boolean mShouldRecordAbortReason; private boolean mShouldRecordAbortReason;
...@@ -615,6 +628,19 @@ public class PaymentRequestImpl ...@@ -615,6 +628,19 @@ public class PaymentRequestImpl
mObservedTabModelSelector.addObserver(mSelectorObserver); mObservedTabModelSelector.addObserver(mSelectorObserver);
mObservedTabModel.addObserver(mTabModelObserver); mObservedTabModel.addObserver(mTabModelObserver);
// Catch any time the user enters the overview mode and dismiss the payment UI.
if (chromeActivity instanceof ChromeTabbedActivity) {
mOverviewModeBehavior =
((ChromeTabbedActivity) chromeActivity).getOverviewModeBehavior();
if (mOverviewModeBehavior.overviewVisible()) {
mJourneyLogger.setNotShown(NotShownReason.OTHER);
disconnectFromClientWithDebugMessage("In tab overview mode");
if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
return;
}
mOverviewModeBehavior.addOverviewModeObserver(mOverviewModeObserver);
}
mIsUserGestureShow = isUserGesture; mIsUserGestureShow = isUserGesture;
buildUI(chromeActivity); buildUI(chromeActivity);
if (!mShouldSkipShowingPaymentRequestUi) mUI.show(); if (!mShouldSkipShowingPaymentRequestUi) mUI.show();
...@@ -1999,6 +2025,11 @@ public class PaymentRequestImpl ...@@ -1999,6 +2025,11 @@ public class PaymentRequestImpl
mObservedTabModel = null; mObservedTabModel = null;
} }
if (mOverviewModeBehavior != null) {
mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver);
mOverviewModeBehavior = null;
}
SettingsAutofillAndPaymentsObserver.getInstance().unregisterObserver(this); SettingsAutofillAndPaymentsObserver.getInstance().unregisterObserver(this);
// Destroy native objects. // Destroy native objects.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment