Index: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
index bffe09046b87801fffd26fd049d4890ee520e562..ae353c0e2cf68353cfe9a94a62c9b88d6fb5662c 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java |
@@ -14,6 +14,7 @@ import org.chromium.base.Log; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.metrics.RecordHistogram; |
import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.ChromeActivity; |
import org.chromium.chrome.browser.autofill.PersonalDataManager; |
import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; |
import org.chromium.chrome.browser.favicon.FaviconHelper; |
@@ -25,6 +26,13 @@ import org.chromium.chrome.browser.payments.ui.PaymentRequestUI; |
import org.chromium.chrome.browser.payments.ui.SectionInformation; |
import org.chromium.chrome.browser.payments.ui.ShoppingCart; |
import org.chromium.chrome.browser.profiles.Profile; |
+import org.chromium.chrome.browser.tab.Tab; |
+import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; |
+import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; |
+import org.chromium.chrome.browser.tabmodel.TabModelObserver; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; |
import org.chromium.components.safejson.JsonSanitizer; |
import org.chromium.components.url_formatter.UrlFormatter; |
import org.chromium.content_public.browser.WebContents; |
@@ -109,8 +117,24 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
private static PaymentRequestServiceObserverForTest sObserverForTest; |
+ /** Monitors changes in the TabModelSelector. */ |
+ private final TabModelSelectorObserver mSelectorObserver = new EmptyTabModelSelectorObserver() { |
+ @Override |
+ public void onTabModelSelected(TabModel newModel, TabModel oldModel) { |
+ onDismiss(); |
+ } |
+ }; |
+ |
+ /** Monitors changes in the current TabModel. */ |
+ private final TabModelObserver mTabModelObserver = new EmptyTabModelObserver() { |
+ @Override |
+ public void didSelectTab(Tab tab, TabSelectionType type, int lastId) { |
+ if (tab == null || tab.getId() != lastId) onDismiss(); |
+ } |
+ }; |
+ |
private final Handler mHandler = new Handler(); |
- private final Activity mContext; |
+ private final ChromeActivity mContext; |
private final PaymentRequestDismissObserver mDismissObserver; |
private final String mMerchantName; |
private final String mOrigin; |
@@ -178,7 +202,9 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
assert webContents != null; |
assert dismissObserver != null; |
- mContext = context; |
+ assert context instanceof ChromeActivity; |
+ mContext = (ChromeActivity) context; |
+ |
mDismissObserver = dismissObserver; |
mMerchantName = webContents.getTitle(); |
// The feature is available only in secure context, so it's OK to not show HTTPS. |
@@ -346,6 +372,11 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
mIsShowing = true; |
if (disconnectIfNoPaymentMethodsSupported()) return; |
+ // Catch any time the user switches tabs. Because the dialog is modal, a user shouldn't be |
+ // allowed to switch tabs, which can happen if the user receives an external Intent. |
+ mContext.getTabModelSelector().addObserver(mSelectorObserver); |
+ mContext.getCurrentTabModel().addObserver(mTabModelObserver); |
+ |
mUI.show(); |
recordSuccessFunnelHistograms("Shown"); |
} |
@@ -1069,6 +1100,9 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
} |
mPaymentMethodsSection = null; |
} |
+ |
+ mContext.getTabModelSelector().removeObserver(mSelectorObserver); |
+ mContext.getCurrentTabModel().removeObserver(mTabModelObserver); |
} |
private void closeClient() { |