| // Copyright 2013 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.content.browser; |
| |
| import android.content.ClipData; |
| import android.content.ClipboardManager; |
| import android.content.Context; |
| import android.support.test.filters.LargeTest; |
| import android.text.TextUtils; |
| |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.test.BaseJUnit4ClassRunner; |
| import org.chromium.base.test.util.Feature; |
| import org.chromium.base.test.util.UrlUtils; |
| import org.chromium.content.browser.test.util.Criteria; |
| import org.chromium.content.browser.test.util.CriteriaHelper; |
| import org.chromium.content_public.browser.WebContents; |
| import org.chromium.content_shell_apk.ContentShellActivityTestRule; |
| import org.chromium.content_shell_apk.ContentShellActivityTestRule.RerunWithUpdatedContainerView; |
| |
| import java.util.concurrent.Callable; |
| |
| /** |
| * Tests rich text clipboard functionality. |
| */ |
| @RunWith(BaseJUnit4ClassRunner.class) |
| public class ClipboardTest { |
| @Rule |
| public ContentShellActivityTestRule mActivityTestRule = new ContentShellActivityTestRule(); |
| |
| private static final String TEST_PAGE_DATA_URL = UrlUtils.encodeHtmlDataUri( |
| "<html><body>Hello, <a href=\"http://www.example.com/\">world</a>, how <b> " |
| + "Chromium</b> doing today?</body></html>"); |
| |
| private static final String EXPECTED_TEXT_RESULT = "Hello, world, how Chromium doing today?"; |
| |
| // String to search for in the HTML representation on the clipboard. |
| private static final String EXPECTED_HTML_NEEDLE = "http://www.example.com/"; |
| |
| @Before |
| public void setUp() throws Exception { |
| mActivityTestRule.launchContentShellWithUrl(TEST_PAGE_DATA_URL); |
| mActivityTestRule.waitForActiveShellToBeDoneLoading(); |
| } |
| |
| /** |
| * Tests that copying document fragments will put at least a plain-text representation |
| * of the contents on the clipboard. For Android JellyBean and higher, we also expect |
| * the HTML representation of the fragment to be available. |
| */ |
| @Test |
| @LargeTest |
| @Feature({"Clipboard", "TextInput"}) |
| @RerunWithUpdatedContainerView |
| public void testCopyDocumentFragment() throws Throwable { |
| ClipboardManager clipboardManager = |
| ThreadUtils.runOnUiThreadBlockingNoException(new Callable<ClipboardManager>() { |
| @Override |
| public ClipboardManager call() { |
| return (ClipboardManager) mActivityTestRule.getActivity().getSystemService( |
| Context.CLIPBOARD_SERVICE); |
| } |
| }); |
| |
| Assert.assertNotNull(clipboardManager); |
| |
| // Clear the clipboard to make sure we start with a clean state. |
| clipboardManager.setPrimaryClip(ClipData.newPlainText(null, "")); |
| Assert.assertFalse(hasPrimaryClip(clipboardManager)); |
| |
| final WebContents webContents = mActivityTestRule.getContentViewCore().getWebContents(); |
| selectAll(webContents); |
| copy(webContents); |
| |
| // Waits until data has been made available on the Android clipboard. |
| CriteriaHelper.pollUiThread(new Criteria() { |
| @Override |
| public boolean isSatisfied() { |
| return hasPrimaryClip(clipboardManager); |
| } |
| }); |
| |
| // Verify that the data on the clipboard is what we expect it to be. For Android JB MR2 |
| // and higher we expect HTML content, for other versions the plain-text representation. |
| ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| @Override |
| public void run() { |
| final ClipData clip = clipboardManager.getPrimaryClip(); |
| Assert.assertEquals(EXPECTED_TEXT_RESULT, |
| clip.getItemAt(0).coerceToText(mActivityTestRule.getActivity())); |
| |
| String htmlText = clip.getItemAt(0).getHtmlText(); |
| Assert.assertNotNull(htmlText); |
| Assert.assertTrue(htmlText.contains(EXPECTED_HTML_NEEDLE)); |
| } |
| }); |
| } |
| |
| private void copy(final WebContents webContents) { |
| ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| @Override |
| public void run() { |
| webContents.copy(); |
| } |
| }); |
| } |
| |
| private void selectAll(final WebContents webContents) { |
| ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| @Override |
| public void run() { |
| webContents.selectAll(); |
| } |
| }); |
| } |
| |
| // Returns whether there is a primary clip with content on the current clipboard. |
| private Boolean hasPrimaryClip(ClipboardManager clipboardManager) { |
| final ClipData clip = clipboardManager.getPrimaryClip(); |
| if (clip != null && clip.getItemCount() > 0) { |
| return !TextUtils.isEmpty(clip.getItemAt(0).getText()); |
| } |
| |
| return false; |
| } |
| } |