Index: chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectFileDialogTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectFileDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectFileDialogTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3d01024c823e7b23953689009ac28599ed2d007a |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectFileDialogTest.java |
@@ -0,0 +1,128 @@ |
+// 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; |
+ } |
+} |