Commit 311544d1 authored by aurimas@chromium.org's avatar aurimas@chromium.org

Adding a test for SelectFileDialog.

BUG=None
NOTRY=true

Review URL: https://codereview.chromium.org/185563010

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255705 0039d316-1c4b-4281-b951-d872f2087c98
parent f9e8f45a
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.input;
import android.app.Activity;
import android.content.Intent;
import android.provider.MediaStore;
import android.test.suitebuilder.annotation.MediumTest;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.shell.ChromeShellActivity;
import org.chromium.chrome.shell.ChromeShellActivity.WindowAndroidFactoryForTest;
import org.chromium.chrome.shell.ChromeShellTestBase;
import org.chromium.content.browser.ContentView;
import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.DOMUtils;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content.browser.test.util.UiUtils;
import org.chromium.ui.base.ActivityWindowAndroid;
/**
* Integration test for select file dialog used for <input type="file" />
*/
public class SelectFileDialogTest extends ChromeShellTestBase {
private static final String DATA_URL = UrlUtils.encodeHtmlDataUri(
"<html><head><meta name=\"viewport\"" +
"content=\"width=device-width, initial-scale=2.0, maximum-scale=2.0\" /></head>" +
"<body><form action=\"about:blank\">" +
"<input id=\"input_file\" type=\"file\" /><br/>" +
"<input id=\"input_image\" type=\"file\" accept=\"image/*\" capture /><br/>" +
"<input id=\"input_audio\" type=\"file\" accept=\"audio/*\" capture />" +
"</form>" +
"</body></html>");
private ContentView mContentView;
private TestCallbackHelperContainer mCallbackContainer;
private ActivityWindowAndroidForTest mActivityWindowAndroidForTest;
private static class ActivityWindowAndroidForTest extends ActivityWindowAndroid {
public Intent lastIntent;
public IntentCallback lastCallback;
/**
* @param activity
*/
public ActivityWindowAndroidForTest(Activity activity) {
super(activity);
}
@Override
public int showCancelableIntent(Intent intent, IntentCallback callback, int errorId) {
lastIntent = intent;
lastCallback = callback;
return 1;
}
}
private class IntentSentCriteria implements Criteria {
@Override
public boolean isSatisfied() {
return mActivityWindowAndroidForTest.lastIntent != null;
}
}
@Override
public void setUp() throws Exception {
super.setUp();
ChromeShellActivity.setActivityWindowAndroidFactory(new WindowAndroidFactoryForTest() {
@Override
public ActivityWindowAndroid getActivityWindowAndroid(Activity activity) {
mActivityWindowAndroidForTest = new ActivityWindowAndroidForTest(activity);
return mActivityWindowAndroidForTest;
}
});
launchChromeShellWithUrl(DATA_URL);
assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading());
mContentView = getActivity().getActiveContentView();
mCallbackContainer = new TestCallbackHelperContainer(mContentView);
// TODO(aurimas) remove this wait once crbug.com/179511 is fixed.
assertWaitForPageScaleFactorMatch(2);
assertTrue(
DOMUtils.waitForNonZeroNodeBounds(mContentView, mCallbackContainer, "input_file"));
}
/**
* Tests that clicks on <input type="file" /> trigger intent calls to ActivityWindowAndroid.
*/
@MediumTest
@Feature({"TextInput", "Main"})
public void testSelectFileAndCancelRequest() throws Throwable {
DOMUtils.clickNode(this, mContentView, mCallbackContainer, "input_file");
assertTrue("SelectFileDialog never sent an intent.",
CriteriaHelper.pollForCriteria(new IntentSentCriteria()));
assertEquals(Intent.ACTION_CHOOSER, mActivityWindowAndroidForTest.lastIntent.getAction());
resetActivityWindowAndroidForTest();
DOMUtils.clickNode(this, mContentView, mCallbackContainer, "input_image");
assertTrue("SelectFileDialog never sent an intent.",
CriteriaHelper.pollForCriteria(new IntentSentCriteria()));
assertEquals(MediaStore.ACTION_IMAGE_CAPTURE,
mActivityWindowAndroidForTest.lastIntent.getAction());
resetActivityWindowAndroidForTest();
DOMUtils.clickNode(this, mContentView, mCallbackContainer, "input_audio");
assertTrue("SelectFileDialog never sent an intent.",
CriteriaHelper.pollForCriteria(new IntentSentCriteria()));
assertEquals(MediaStore.Audio.Media.RECORD_SOUND_ACTION,
mActivityWindowAndroidForTest.lastIntent.getAction());
resetActivityWindowAndroidForTest();
}
private void resetActivityWindowAndroidForTest() {
UiUtils.runOnUiThread(getActivity(), new Runnable() {
@Override
public void run() {
mActivityWindowAndroidForTest.lastCallback.onIntentCompleted(
mActivityWindowAndroidForTest, Activity.RESULT_CANCELED, null, null);
}
});
mActivityWindowAndroidForTest.lastCallback = null;
mActivityWindowAndroidForTest.lastIntent = null;
}
}
...@@ -45,6 +45,23 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe ...@@ -45,6 +45,23 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe
private static final String TAG = "ChromeShellActivity"; private static final String TAG = "ChromeShellActivity";
private static final String CHROME_DISTILLER_SCHEME = "chrome-distiller"; private static final String CHROME_DISTILLER_SCHEME = "chrome-distiller";
/**
* Factory used to set up a mock ActivityWindowAndroid for testing.
*/
public interface WindowAndroidFactoryForTest {
/**
* @return ActivityWindowAndroid for the given activity.
*/
public ActivityWindowAndroid getActivityWindowAndroid(Activity activity);
}
private static WindowAndroidFactoryForTest sWindowAndroidFactory =
new WindowAndroidFactoryForTest() {
@Override
public ActivityWindowAndroid getActivityWindowAndroid(Activity activity) {
return new ActivityWindowAndroid(activity);
}
};
private WindowAndroid mWindow; private WindowAndroid mWindow;
private TabManager mTabManager; private TabManager mTabManager;
private DevToolsServer mDevToolsServer; private DevToolsServer mDevToolsServer;
...@@ -80,8 +97,7 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe ...@@ -80,8 +97,7 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe
}; };
try { try {
BrowserStartupController.get(this).startBrowserProcessesAsync(callback); BrowserStartupController.get(this).startBrowserProcessesAsync(callback);
} } catch (ProcessInitException e) {
catch (ProcessInitException e) {
Log.e(TAG, "Unable to load native library.", e); Log.e(TAG, "Unable to load native library.", e);
System.exit(-1); System.exit(-1);
} }
...@@ -91,7 +107,7 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe ...@@ -91,7 +107,7 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe
setContentView(R.layout.testshell_activity); setContentView(R.layout.testshell_activity);
mTabManager = (TabManager) findViewById(R.id.tab_manager); mTabManager = (TabManager) findViewById(R.id.tab_manager);
mWindow = new ActivityWindowAndroid(this); mWindow = sWindowAndroidFactory.getActivityWindowAndroid(this);
mWindow.restoreInstanceState(savedInstanceState); mWindow.restoreInstanceState(savedInstanceState);
mTabManager.initialize(mWindow, new ActivityContentVideoViewClient(this)); mTabManager.initialize(mWindow, new ActivityContentVideoViewClient(this));
...@@ -315,4 +331,9 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe ...@@ -315,4 +331,9 @@ public class ChromeShellActivity extends Activity implements AppMenuPropertiesDe
a.recycle(); a.recycle();
return itemRowHeight; return itemRowHeight;
} }
@VisibleForTesting
public static void setActivityWindowAndroidFactory(WindowAndroidFactoryForTest factory) {
sWindowAndroidFactory = factory;
}
} }
...@@ -149,9 +149,7 @@ class SelectFileDialog implements WindowAndroid.IntentCallback{ ...@@ -149,9 +149,7 @@ class SelectFileDialog implements WindowAndroid.IntentCallback{
// see crbug.com/345393 // see crbug.com/345393
return ""; return "";
} finally { } finally {
if (cursor != null ) { if (cursor != null) cursor.close();
cursor.close();
}
} }
return ""; return "";
} }
......
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