Commit 425c5cf7 authored by Dominick Ng's avatar Dominick Ng Committed by Commit Bot

Add tests for modal app install banners on Android.

BUG=811578

Change-Id: I89e36faf196520ecc05dea024204792f54caea1b
Reviewed-on: https://chromium-review.googlesource.com/939063Reviewed-by: default avatarBen Wells <benwells@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Dominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#542415}
parent 412a0d5d
......@@ -207,6 +207,7 @@ public abstract class ChromeFeatureList {
public static final String DOWNLOAD_HOME_SHOW_STORAGE_INFO = "DownloadHomeShowStorageInfo";
public static final String DOWNLOADS_FOREGROUND = "DownloadsForeground";
public static final String DOWNLOADS_LOCATION_CHANGE = "DownloadsLocationChange";
public static final String EXPERIMENTAL_APP_BANNERS = "ExperimentalAppBanners";
// When enabled, fullscreen WebContents will be moved to a new Activity. Coming soon...
public static final String FULLSCREEN_ACTIVITY = "FullscreenActivity";
public static final String GRANT_NOTIFICATIONS_TO_DSE = "GrantNotificationsToDSE";
......
......@@ -13,6 +13,7 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.webapps.AddToHomescreenDialog;
import org.chromium.content_public.browser.WebContents;
/**
......@@ -148,6 +149,11 @@ public class AppBannerManager {
return R.string.menu_add_to_homescreen;
}
@VisibleForTesting
public AddToHomescreenDialog getAddToHomescreenDialogForTesting() {
return nativeGetAddToHomescreenDialogForTesting(mNativePointer);
}
/** Overrides whether the system supports add to home screen. Used in testing. */
@VisibleForTesting
public static void setIsSupported(boolean state) {
......@@ -202,6 +208,8 @@ public class AppBannerManager {
AppData data, String title, String packageName, String imageUrl);
// Testing methods.
private native AddToHomescreenDialog nativeGetAddToHomescreenDialogForTesting(
long nativeAppBannerManagerAndroid);
private native boolean nativeIsRunningForTesting(long nativeAppBannerManagerAndroid);
private static native void nativeSetDaysAfterDismissAndIgnoreToTrigger(
int dismissDays, int ignoreDays);
......
......@@ -54,7 +54,8 @@ public class AppBannerUiDelegateAndroid
@Override
public void onDialogDismissed() {
destroy();
mDialog = null;
mInstallerDelegate = null;
}
@Override
......@@ -78,6 +79,11 @@ public class AppBannerUiDelegateAndroid
mInstallerDelegate = new InstallerDelegate(Looper.getMainLooper(), observer);
}
@CalledByNative
private AddToHomescreenDialog getDialogForTesting() {
return mDialog;
}
@CalledByNative
private void destroy() {
if (mInstallerDelegate != null) {
......
......@@ -45,6 +45,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
&features::kClipboardContentSetting,
&features::kDownloadsForeground,
&features::kDownloadsLocationChange,
&features::kExperimentalAppBanners,
&features::kImportantSitesInCbd,
&features::kMaterialDesignIncognitoNTP,
&features::kPermissionDelegation,
......
......@@ -26,7 +26,6 @@ using base::android::ConvertJavaStringToUTF8;
using base::android::ConvertJavaStringToUTF16;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
DEFINE_WEB_CONTENTS_USER_DATA_KEY(banners::AppBannerManagerAndroid);
......@@ -64,9 +63,17 @@ AppBannerManagerAndroid::~AppBannerManagerAndroid() {
java_banner_manager_.Reset();
}
const base::android::ScopedJavaGlobalRef<jobject>&
const base::android::ScopedJavaLocalRef<jobject>
AppBannerManagerAndroid::GetJavaBannerManager() const {
return java_banner_manager_;
return base::android::ScopedJavaLocalRef<jobject>(java_banner_manager_);
}
base::android::ScopedJavaLocalRef<jobject>
AppBannerManagerAndroid::GetAddToHomescreenDialogForTesting(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jobj) {
return ui_delegate_ ? ui_delegate_->GetAddToHomescreenDialogForTesting()
: nullptr;
}
bool AppBannerManagerAndroid::IsRunningForTesting(
......@@ -338,10 +345,12 @@ InstallableStatusCode AppBannerManagerAndroid::QueryNativeApp(
// Send the info to the Java side to get info about the app.
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jstring> jurl(
base::android::ScopedJavaLocalRef<jstring> jurl(
ConvertUTF8ToJavaString(env, validated_url_.spec()));
ScopedJavaLocalRef<jstring> jpackage(ConvertUTF8ToJavaString(env, id));
ScopedJavaLocalRef<jstring> jreferrer(ConvertUTF8ToJavaString(env, referrer));
base::android::ScopedJavaLocalRef<jstring> jpackage(
ConvertUTF8ToJavaString(env, id));
base::android::ScopedJavaLocalRef<jstring> jreferrer(
ConvertUTF8ToJavaString(env, referrer));
// This async call will run OnAppDetailsRetrieved() when completed.
UpdateState(State::FETCHING_NATIVE_DATA);
......@@ -379,15 +388,15 @@ jint JNI_AppBannerManager_GetHomescreenLanguageOption(
}
// static
ScopedJavaLocalRef<jobject>
base::android::ScopedJavaLocalRef<jobject>
JNI_AppBannerManager_GetJavaBannerManagerForWebContents(
JNIEnv* env,
const JavaParamRef<jclass>& clazz,
const JavaParamRef<jobject>& java_web_contents) {
AppBannerManagerAndroid* manager = AppBannerManagerAndroid::FromWebContents(
content::WebContents::FromJavaWebContents(java_web_contents));
return manager ? ScopedJavaLocalRef<jobject>(manager->GetJavaBannerManager())
: ScopedJavaLocalRef<jobject>();
return manager ? manager->GetJavaBannerManager()
: base::android::ScopedJavaLocalRef<jobject>();
}
// static
......
......@@ -47,8 +47,13 @@ class AppBannerManagerAndroid
~AppBannerManagerAndroid() override;
// Returns a reference to the Java-side AppBannerManager owned by this object.
const base::android::ScopedJavaGlobalRef<jobject>& GetJavaBannerManager()
const;
const base::android::ScopedJavaLocalRef<jobject> GetJavaBannerManager() const;
// Returns a reference to the Java-side AddToHomescreenDialog owned by
// |ui_delegate_|, or null if it does not exist.
base::android::ScopedJavaLocalRef<jobject> GetAddToHomescreenDialogForTesting(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jobj);
// Returns true if the banner pipeline is currently running.
bool IsRunningForTesting(JNIEnv* env,
......
......@@ -116,6 +116,12 @@ void AppBannerUiDelegateAndroid::AddToHomescreen(
InstallApp(weak_manager_->web_contents());
}
const base::android::ScopedJavaLocalRef<jobject>
AppBannerUiDelegateAndroid::GetAddToHomescreenDialogForTesting() const {
return Java_AppBannerUiDelegateAndroid_getDialogForTesting(
base::android::AttachCurrentThread(), java_delegate_);
}
bool AppBannerUiDelegateAndroid::InstallApp(
content::WebContents* web_contents) {
has_user_interaction_ = true;
......
......@@ -76,6 +76,11 @@ class AppBannerUiDelegateAndroid {
void AddToHomescreen(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Returns a reference to the Java-side AddToHomescreenDialog owned by this
// object, or null if it does not exist.
const base::android::ScopedJavaLocalRef<jobject>
GetAddToHomescreenDialogForTesting() const;
// Installs the app referenced by the data in this object. Returns |true| if
// the installation UI should be dismissed.
bool InstallApp(content::WebContents* web_contents);
......
......@@ -3,15 +3,18 @@
// found in the LICENSE file.
const Action = {
VERIFY_APPINSTALLED: "verify_appinstalled",
VERIFY_PROMPT_APPINSTALLED: "verify_prompt_appinstalled",
VERIFY_BEFOREINSTALLPROMPT: "verify_beforeinstallprompt",
CALL_PROMPT_DELAYED: "call_prompt_delayed",
CALL_PROMPT_IN_HANDLER: "call_prompt_in_handler",
CALL_PROMPT_NO_USERCHOICE: "call_prompt_no_userchoice",
CANCEL_PROMPT_AND_NAVIGATE: "cancel_prompt_and_navigate",
CANCEL_PROMPT: "cancel_prompt",
STASH_EVENT: "stash_event",
VERIFY_APPINSTALLED: 'verify_appinstalled',
VERIFY_PROMPT_APPINSTALLED: 'verify_prompt_appinstalled',
VERIFY_BEFOREINSTALLPROMPT: 'verify_beforeinstallprompt',
CALL_PROMPT_DELAYED: 'call_prompt_delayed',
CALL_PROMPT_IN_HANDLER: 'call_prompt_in_handler',
CALL_PROMPT_NO_USERCHOICE: 'call_prompt_no_userchoice',
CALL_STASHED_PROMPT_ON_CLICK: 'call_stashed_prompt_on_click',
CALL_STASHED_PROMPT_ON_CLICK_VERIFY_APPINSTALLED:
'call_stashed_prompt_on_click_verify_appinstalled',
CANCEL_PROMPT_AND_NAVIGATE: 'cancel_prompt_and_navigate',
CANCEL_PROMPT: 'cancel_prompt',
STASH_EVENT: 'stash_event',
};
const LISTENER = "listener";
......@@ -53,7 +56,19 @@ function callStashedPrompt() {
if (stashedEvent === null) {
throw new Error('No event was previously stashed');
}
stashedEvent.prompt();
callPrompt(stashedEvent);
}
function addClickListener(action) {
switch (action) {
case Action.CALL_STASHED_PROMPT_ON_CLICK:
window.addEventListener('click', callStashedPrompt);
break;
case Action.CALL_STASHED_PROMPT_ON_CLICK_VERIFY_APPINSTALLED:
window.addEventListener('click', callStashedPrompt);
verifyEvents("appinstalled");
break;
}
}
function addPromptListener(action) {
......@@ -113,6 +128,11 @@ function initialize() {
case Action.VERIFY_BEFOREINSTALLPROMPT:
verifyEvents('beforeinstallprompt');
break;
case Action.CALL_STASHED_PROMPT_ON_CLICK:
case Action.CALL_STASHED_PROMPT_ON_CLICK_VERIFY_APPINSTALLED:
addPromptListener(Action.STASH_EVENT);
addClickListener(action);
break;
case Action.CALL_PROMPT_DELAYED:
case Action.CALL_PROMPT_IN_HANDLER:
case Action.CALL_PROMPT_NO_USERCHOICE:
......
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