Commit 4b77a92a authored by rouslan's avatar rouslan Committed by Commit bot

Cache web contents in credit card scanner.

It's much safer to cache the WebContents instead of WindowAndroid to
deal with tab reparenting, for example. This patch changes the credit
card OCR scanner extension point to cache the WebContents instead of
WindowAndroid.

This patch also adds chrome://flags/#autofill-scan-theme-dialog to be
used by Chrome's implementation of the credit card scanner. This flag is
disabled by default and will be removed once the best theme for the scan
dialog is determined.

BUG=678642

Review-Url: https://codereview.chromium.org/2614883003
Cr-Commit-Position: refs/heads/master@{#442071}
parent 43339280
...@@ -53,6 +53,7 @@ public abstract class ChromeFeatureList { ...@@ -53,6 +53,7 @@ public abstract class ChromeFeatureList {
public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2"; public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2";
public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps"; public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps";
public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName"; public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName";
public static final String AUTOFILL_SCAN_THEME_DIALOG = "AutofillScanThemeDialog";
public static final String CCT_EXTERNAL_LINK_HANDLING = "CCTExternalLinkHandling"; public static final String CCT_EXTERNAL_LINK_HANDLING = "CCTExternalLinkHandling";
public static final String CCT_POST_MESSAGE_API = "CCTPostMessageAPI"; public static final String CCT_POST_MESSAGE_API = "CCTPostMessageAPI";
public static final String CHROME_HOME = "ChromeHome"; public static final String CHROME_HOME = "ChromeHome";
......
...@@ -7,7 +7,7 @@ package org.chromium.chrome.browser.autofill; ...@@ -7,7 +7,7 @@ package org.chromium.chrome.browser.autofill;
import android.content.Context; import android.content.Context;
import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.ui.base.WindowAndroid; import org.chromium.content_public.browser.WebContents;
/** /**
* Helper for detecting whether the device supports scanning credit cards and for scanning credit * Helper for detecting whether the device supports scanning credit cards and for scanning credit
...@@ -28,21 +28,21 @@ public class CreditCardScanner { ...@@ -28,21 +28,21 @@ public class CreditCardScanner {
@SuppressFBWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}) @SuppressFBWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"})
protected final Context mContext; protected final Context mContext;
/** The window that's requesting a scan. Used in subclass. */ /** The web contents that's requesting a scan. Used in subclass. */
@SuppressFBWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}) @SuppressFBWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"})
protected final WindowAndroid mWindow; protected final WebContents mWebContents;
/** Builds instances of credit card scanners. */ /** Builds instances of credit card scanners. */
public interface Factory { public interface Factory {
/** /**
* Builds an instance of credit card scanner. * Builds an instance of credit card scanner.
* *
* @param context Application context. * @param context Application context.
* @param window The window that's requesting a scan. * @param webContents The web contents that are requesting a scan.
* @param delegate The delegate to notify of scanning result. * @param delegate The delegate to notify of scanning result.
* @return An object that can scan a credit card. * @return An object that can scan a credit card.
*/ */
CreditCardScanner create(Context context, WindowAndroid window, Delegate delegate); CreditCardScanner create(Context context, WebContents webContents, Delegate delegate);
} }
/** The delegate for credit card scanning. */ /** The delegate for credit card scanning. */
...@@ -76,27 +76,27 @@ public class CreditCardScanner { ...@@ -76,27 +76,27 @@ public class CreditCardScanner {
/** /**
* Creates an instance of a credit card scanner. * Creates an instance of a credit card scanner.
* *
* @param context Application context. * @param context Application context.
* @param window The window that's requesting a scan. * @param webContents The web contents that are requesting a scan.
* @param delegate The delegate to notify of scanning result. * @param delegate The delegate to notify of scanning result.
* @return An object that can scan a credit card. * @return An object that can scan a credit card.
*/ */
public static CreditCardScanner create( public static CreditCardScanner create(
Context context, WindowAndroid window, Delegate delegate) { Context context, WebContents webContents, Delegate delegate) {
return sFactory != null ? sFactory.create(context, window, delegate) return sFactory != null ? sFactory.create(context, webContents, delegate)
: new CreditCardScanner(context, window, delegate); : new CreditCardScanner(context, webContents, delegate);
} }
/** /**
* Constructor for the credit card scanner. * Constructor for the credit card scanner.
* *
* @param context Application context. * @param context Application context.
* @param window The window that's requesting a scan. * @param webContents The web contents that are requesting a scan.
* @param delegate The delegate to notify of scanning result. * @param delegate The delegate to notify of scanning result.
*/ */
protected CreditCardScanner(Context context, WindowAndroid window, Delegate delegate) { protected CreditCardScanner(Context context, WebContents webContents, Delegate delegate) {
mContext = context; mContext = context;
mWindow = window; mWebContents = webContents;
mDelegate = delegate; mDelegate = delegate;
} }
......
...@@ -8,7 +8,7 @@ import android.content.Context; ...@@ -8,7 +8,7 @@ import android.content.Context;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.ui.base.WindowAndroid; import org.chromium.content_public.browser.WebContents;
/** Native bridge for credit card scanner. */ /** Native bridge for credit card scanner. */
@JNINamespace("autofill") @JNINamespace("autofill")
...@@ -18,13 +18,13 @@ public class CreditCardScannerBridge implements CreditCardScanner.Delegate { ...@@ -18,13 +18,13 @@ public class CreditCardScannerBridge implements CreditCardScanner.Delegate {
@CalledByNative @CalledByNative
private static CreditCardScannerBridge create( private static CreditCardScannerBridge create(
long nativeScanner, Context context, WindowAndroid window) { long nativeScanner, Context context, WebContents webContents) {
return new CreditCardScannerBridge(nativeScanner, context, window); return new CreditCardScannerBridge(nativeScanner, context, webContents);
} }
private CreditCardScannerBridge(long nativeScanner, Context context, WindowAndroid window) { private CreditCardScannerBridge(long nativeScanner, Context context, WebContents webContents) {
mNativeScanner = nativeScanner; mNativeScanner = nativeScanner;
mScanner = CreditCardScanner.create(context, window, this); mScanner = CreditCardScanner.create(context, webContents, this);
} }
@CalledByNative @CalledByNative
......
...@@ -21,9 +21,7 @@ import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorFieldValid ...@@ -21,9 +21,7 @@ import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorFieldValid
import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorValueIconGenerator; import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorValueIconGenerator;
import org.chromium.chrome.browser.payments.ui.EditorModel; import org.chromium.chrome.browser.payments.ui.EditorModel;
import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.DropdownKeyValue; import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.DropdownKeyValue;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -408,14 +406,8 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> ...@@ -408,14 +406,8 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument>
// Card scanner is expensive to query. // Card scanner is expensive to query.
if (mCardScanner == null) { if (mCardScanner == null) {
ContentViewCore contentView = ContentViewCore.fromWebContents(mWebContents); mCardScanner = CreditCardScanner.create(mContext, mWebContents, this);
if (contentView != null) { mCanScan = mCardScanner.canScan();
WindowAndroid window = contentView.getWindowAndroid();
if (window != null) {
mCardScanner = CreditCardScanner.create(mContext, window, this);
mCanScan = mCardScanner.canScan();
}
}
} }
// Card number is validated. // Card number is validated.
......
...@@ -15601,6 +15601,12 @@ read aloud to screenreader users to announce that a completion is available."> ...@@ -15601,6 +15601,12 @@ read aloud to screenreader users to announce that a completion is available.">
<message name="IDS_FLAGS_NO_CREDIT_CARD_ABORT_DESCRIPTION" desc="Description for the flag to enable the No Card Abort in Payment Request." translateable="false"> <message name="IDS_FLAGS_NO_CREDIT_CARD_ABORT_DESCRIPTION" desc="Description for the flag to enable the No Card Abort in Payment Request." translateable="false">
Whether or not the No Credit Card Abort is enabled. Whether or not the No Credit Card Abort is enabled.
</message> </message>
<message name="IDS_FLAGS_AUTOFILL_SCAN_THEME_DIALOG_NAME" desc="Title for the flag to enable dialog theme for OCR." translateable="false">
OCR dialog theme
</message>
<message name="IDS_FLAGS_AUTOFILL_SCAN_THEME_DIALOG_DESCRIPTION" desc="Description for the flag to enable dialog theme for OCR." translateable="false">
Use the dialog theme when scanning credit cards from autofill popup or web payments
</message>
</if> </if>
<!-- Consistent omnibox geolocation --> <!-- Consistent omnibox geolocation -->
......
...@@ -2054,6 +2054,10 @@ const FeatureEntry kFeatureEntries[] = { ...@@ -2054,6 +2054,10 @@ const FeatureEntry kFeatureEntries[] = {
{"no-credit-card-abort", IDS_FLAGS_NO_CREDIT_CARD_ABORT, {"no-credit-card-abort", IDS_FLAGS_NO_CREDIT_CARD_ABORT,
IDS_FLAGS_NO_CREDIT_CARD_ABORT_DESCRIPTION, kOsAndroid, IDS_FLAGS_NO_CREDIT_CARD_ABORT_DESCRIPTION, kOsAndroid,
FEATURE_VALUE_TYPE(chrome::android::kNoCreditCardAbort)}, FEATURE_VALUE_TYPE(chrome::android::kNoCreditCardAbort)},
{"autofill-scan-theme-dialog",
IDS_FLAGS_AUTOFILL_SCAN_THEME_DIALOG_NAME,
IDS_FLAGS_AUTOFILL_SCAN_THEME_DIALOG_DESCRIPTION, kOsAndroid,
FEATURE_VALUE_TYPE(chrome::android::kAutofillScanThemeDialog)},
#endif // OS_ANDROID #endif // OS_ANDROID
{"enable-feature-policy", IDS_FLAGS_FEATURE_POLICY_NAME, {"enable-feature-policy", IDS_FLAGS_FEATURE_POLICY_NAME,
IDS_FLAGS_FEATURE_POLICY_DESCRIPTION, kOsAll, IDS_FLAGS_FEATURE_POLICY_DESCRIPTION, kOsAll,
......
...@@ -41,6 +41,7 @@ const base::Feature* kFeaturesExposedToJava[] = { ...@@ -41,6 +41,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kAndroidPayIntegrationV1, &kAndroidPayIntegrationV1,
&kAndroidPayIntegrationV2, &kAndroidPayIntegrationV2,
&kAndroidPaymentApps, &kAndroidPaymentApps,
&kAutofillScanThemeDialog,
&kCCTExternalLinkHandling, &kCCTExternalLinkHandling,
&kCCTPostMessageAPI, &kCCTPostMessageAPI,
&kChromeHomeFeature, &kChromeHomeFeature,
...@@ -82,6 +83,9 @@ const base::Feature kAndroidPayIntegrationV2{"AndroidPayIntegrationV2", ...@@ -82,6 +83,9 @@ const base::Feature kAndroidPayIntegrationV2{"AndroidPayIntegrationV2",
const base::Feature kAndroidPaymentApps{"AndroidPaymentApps", const base::Feature kAndroidPaymentApps{"AndroidPaymentApps",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kAutofillScanThemeDialog{"AutofillScanThemeDialog",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kCCTExternalLinkHandling{"CCTExternalLinkHandling", const base::Feature kCCTExternalLinkHandling{"CCTExternalLinkHandling",
base::FEATURE_ENABLED_BY_DEFAULT}; base::FEATURE_ENABLED_BY_DEFAULT};
......
...@@ -16,6 +16,7 @@ namespace android { ...@@ -16,6 +16,7 @@ namespace android {
extern const base::Feature kAndroidPayIntegrationV1; extern const base::Feature kAndroidPayIntegrationV1;
extern const base::Feature kAndroidPayIntegrationV2; extern const base::Feature kAndroidPayIntegrationV2;
extern const base::Feature kAndroidPaymentApps; extern const base::Feature kAndroidPaymentApps;
extern const base::Feature kAutofillScanThemeDialog;
extern const base::Feature kCCTExternalLinkHandling; extern const base::Feature kCCTExternalLinkHandling;
extern const base::Feature kCCTPostMessageAPI; extern const base::Feature kCCTPostMessageAPI;
extern const base::Feature kChromeHomeFeature; extern const base::Feature kChromeHomeFeature;
......
...@@ -55,10 +55,7 @@ CreditCardScannerViewAndroid::CreditCardScannerViewAndroid( ...@@ -55,10 +55,7 @@ CreditCardScannerViewAndroid::CreditCardScannerViewAndroid(
base::android::AttachCurrentThread(), base::android::AttachCurrentThread(),
reinterpret_cast<intptr_t>(this), reinterpret_cast<intptr_t>(this),
base::android::GetApplicationContext(), base::android::GetApplicationContext(),
ViewAndroidHelper::FromWebContents(web_contents) web_contents->GetJavaWebContents())) {}
->GetViewAndroid()
->GetWindowAndroid()
->GetJavaObject())) {}
CreditCardScannerViewAndroid::~CreditCardScannerViewAndroid() {} CreditCardScannerViewAndroid::~CreditCardScannerViewAndroid() {}
......
...@@ -93968,6 +93968,7 @@ value. ...@@ -93968,6 +93968,7 @@ value.
<int value="-1212855900" label="enable-all-bookmarks-view"/> <int value="-1212855900" label="enable-all-bookmarks-view"/>
<int value="-1212273428" label="enable-experimental-app-list"/> <int value="-1212273428" label="enable-experimental-app-list"/>
<int value="-1212167260" label="disable-app-window-cycling"/> <int value="-1212167260" label="disable-app-window-cycling"/>
<int value="-1208501269" label="AutofillScanThemeDialog:enabled"/>
<int value="-1205790119" label="CredentialManagementAPI:enabled"/> <int value="-1205790119" label="CredentialManagementAPI:enabled"/>
<int value="-1203955801" label="enable-password-change-support:disabled"/> <int value="-1203955801" label="enable-password-change-support:disabled"/>
<int value="-1203742042" label="enable-gesture-selection"/> <int value="-1203742042" label="enable-gesture-selection"/>
...@@ -94446,6 +94447,7 @@ value. ...@@ -94446,6 +94447,7 @@ value.
<int value="1050048304" label="enable-font-cache-scaling"/> <int value="1050048304" label="enable-font-cache-scaling"/>
<int value="1050321458" label="new-profile-management"/> <int value="1050321458" label="new-profile-management"/>
<int value="1054910800" label="enable-timezone-tracking-option"/> <int value="1054910800" label="enable-timezone-tracking-option"/>
<int value="1057887829" label="AutofillScanThemeDialog:disabled"/>
<int value="1060319397" label="enable-data-reduction-proxy-carrier-test"/> <int value="1060319397" label="enable-data-reduction-proxy-carrier-test"/>
<int value="1062357243" label="remember-cert-error-decisions"/> <int value="1062357243" label="remember-cert-error-decisions"/>
<int value="1064288458" label="OfflineRecentPages:enabled"/> <int value="1064288458" label="OfflineRecentPages:enabled"/>
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