| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.contextmenu; | 5 package org.chromium.chrome.browser.contextmenu; |
| 6 | 6 |
| 7 import android.content.ClipData; | 7 import android.content.ClipData; |
| 8 import android.content.ClipboardManager; | 8 import android.content.ClipboardManager; |
| 9 import android.content.Context; | 9 import android.content.Context; |
| 10 import android.os.Build; | 10 import android.os.Build; |
| 11 import android.test.FlakyTest; | 11 import android.test.FlakyTest; |
| 12 import android.test.suitebuilder.annotation.LargeTest; | 12 import android.test.suitebuilder.annotation.LargeTest; |
| 13 import android.view.ContextMenu; | 13 import android.view.ContextMenu; |
| 14 | 14 |
| 15 import junit.framework.Assert; | 15 import junit.framework.Assert; |
| 16 | 16 |
| 17 import org.chromium.base.test.util.Feature; | 17 import org.chromium.base.test.util.Feature; |
| 18 import org.chromium.chrome.R; | 18 import org.chromium.chrome.R; |
| 19 import org.chromium.chrome.browser.TabBase; | 19 import org.chromium.chrome.browser.Tab; |
| 20 import org.chromium.chrome.test.util.TabBaseTabUtils; | 20 import org.chromium.chrome.test.util.TabUtils; |
| 21 import org.chromium.chrome.test.util.TabBaseTabUtils.TestCallbackHelperContainer
ForTab; | 21 import org.chromium.chrome.test.util.TabUtils.TestCallbackHelperContainerForTab; |
| 22 import org.chromium.chrome.test.util.TestHttpServerClient; | 22 import org.chromium.chrome.test.util.TestHttpServerClient; |
| 23 import org.chromium.chrome.test.util.browser.contextmenu.ContextMenuUtils; | 23 import org.chromium.chrome.test.util.browser.contextmenu.ContextMenuUtils; |
| 24 import org.chromium.chrome.testshell.ChromiumTestShellTestBase; | 24 import org.chromium.chrome.testshell.ChromiumTestShellTestBase; |
| 25 import org.chromium.content.browser.test.util.Criteria; | 25 import org.chromium.content.browser.test.util.Criteria; |
| 26 import org.chromium.content.browser.test.util.CriteriaHelper; | 26 import org.chromium.content.browser.test.util.CriteriaHelper; |
| 27 import org.chromium.content.browser.test.util.KeyUtils; | 27 import org.chromium.content.browser.test.util.KeyUtils; |
| 28 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPage
FinishedHelper; | 28 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPage
FinishedHelper; |
| 29 import org.chromium.content.browser.test.util.TestTouchUtils; | 29 import org.chromium.content.browser.test.util.TestTouchUtils; |
| 30 | 30 |
| 31 import java.util.concurrent.TimeoutException; | 31 import java.util.concurrent.TimeoutException; |
| 32 import java.util.concurrent.atomic.AtomicReference; | 32 import java.util.concurrent.atomic.AtomicReference; |
| 33 | 33 |
| 34 public class ContextMenuTest extends ChromiumTestShellTestBase { | 34 public class ContextMenuTest extends ChromiumTestShellTestBase { |
| 35 @Override | 35 @Override |
| 36 public void setUp() throws Exception { | 36 public void setUp() throws Exception { |
| 37 super.setUp(); | 37 super.setUp(); |
| 38 launchChromiumTestShellWithUrl(TestHttpServerClient.getUrl( | 38 launchChromiumTestShellWithUrl(TestHttpServerClient.getUrl( |
| 39 "chrome/test/data/android/contextmenu/context_menu_test.html")); | 39 "chrome/test/data/android/contextmenu/context_menu_test.html")); |
| 40 assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading()); | 40 assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading()); |
| 41 assertWaitForPageScaleFactorMatch(0.5f); | 41 assertWaitForPageScaleFactorMatch(0.5f); |
| 42 } | 42 } |
| 43 | 43 |
| 44 // http://crbug.com/326769 | 44 // http://crbug.com/326769 |
| 45 @FlakyTest | 45 @FlakyTest |
| 46 // @LargeTest | 46 // @LargeTest |
| 47 @Feature({"Browser", "Main"}) | 47 @Feature({"Browser", "Main"}) |
| 48 public void testCopyLinkURL() throws InterruptedException, TimeoutException
{ | 48 public void testCopyLinkURL() throws InterruptedException, TimeoutException
{ |
| 49 TabBase tab = getActivity().getActiveTab(); | 49 Tab tab = getActivity().getActiveTab(); |
| 50 ContextMenuUtils.selectContextMenuItem(this, tab, | 50 ContextMenuUtils.selectContextMenuItem(this, tab, |
| 51 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "testLink", | 51 TabUtils.getTestCallbackHelperContainer(tab), "testLink", |
| 52 R.id.contextmenu_copy_link_address_text); | 52 R.id.contextmenu_copy_link_address_text); |
| 53 | 53 |
| 54 assertStringContains("test_link.html", getClipboardText()); | 54 assertStringContains("test_link.html", getClipboardText()); |
| 55 } | 55 } |
| 56 | 56 |
| 57 // http://crbug.com/326769 | 57 // http://crbug.com/326769 |
| 58 @FlakyTest | 58 @FlakyTest |
| 59 // @LargeTest | 59 // @LargeTest |
| 60 @Feature({"Browser"}) | 60 @Feature({"Browser"}) |
| 61 public void testCopyImageLinkCopiesLinkURL() throws InterruptedException, Ti
meoutException { | 61 public void testCopyImageLinkCopiesLinkURL() throws InterruptedException, Ti
meoutException { |
| 62 TabBase tab = getActivity().getActiveTab(); | 62 Tab tab = getActivity().getActiveTab(); |
| 63 ContextMenuUtils.selectContextMenuItem(this, tab, | 63 ContextMenuUtils.selectContextMenuItem(this, tab, |
| 64 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "testImageL
ink", | 64 TabUtils.getTestCallbackHelperContainer(tab), "testImageLink", |
| 65 R.id.contextmenu_copy_link_address_text); | 65 R.id.contextmenu_copy_link_address_text); |
| 66 | 66 |
| 67 assertStringContains("test_link.html", getClipboardText()); | 67 assertStringContains("test_link.html", getClipboardText()); |
| 68 } | 68 } |
| 69 | 69 |
| 70 // http://crbug.com/326769 | 70 // http://crbug.com/326769 |
| 71 @FlakyTest | 71 @FlakyTest |
| 72 // @LargeTest | 72 // @LargeTest |
| 73 @Feature({"Browser"}) | 73 @Feature({"Browser"}) |
| 74 public void testCopyLinkTextSimple() throws InterruptedException, TimeoutExc
eption { | 74 public void testCopyLinkTextSimple() throws InterruptedException, TimeoutExc
eption { |
| 75 TabBase tab = getActivity().getActiveTab(); | 75 Tab tab = getActivity().getActiveTab(); |
| 76 ContextMenuUtils.selectContextMenuItem(this, tab, | 76 ContextMenuUtils.selectContextMenuItem(this, tab, |
| 77 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "testLink", | 77 TabUtils.getTestCallbackHelperContainer(tab), "testLink", |
| 78 R.id.contextmenu_copy_link_text); | 78 R.id.contextmenu_copy_link_text); |
| 79 | 79 |
| 80 assertEquals("Clipboard text was not what was expected", "Test Link", | 80 assertEquals("Clipboard text was not what was expected", "Test Link", |
| 81 getClipboardText()); | 81 getClipboardText()); |
| 82 } | 82 } |
| 83 | 83 |
| 84 // http://crbug.com/326769 | 84 // http://crbug.com/326769 |
| 85 @FlakyTest | 85 @FlakyTest |
| 86 // @LargeTest | 86 // @LargeTest |
| 87 @Feature({"Browser"}) | 87 @Feature({"Browser"}) |
| 88 public void testCopyLinkTextComplex() throws InterruptedException, TimeoutEx
ception { | 88 public void testCopyLinkTextComplex() throws InterruptedException, TimeoutEx
ception { |
| 89 TabBase tab = getActivity().getActiveTab(); | 89 Tab tab = getActivity().getActiveTab(); |
| 90 ContextMenuUtils.selectContextMenuItem(this, tab, | 90 ContextMenuUtils.selectContextMenuItem(this, tab, |
| 91 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "copyLinkTe
xtComplex", | 91 TabUtils.getTestCallbackHelperContainer(tab), "copyLinkTextCompl
ex", |
| 92 R.id.contextmenu_copy_link_text); | 92 R.id.contextmenu_copy_link_text); |
| 93 | 93 |
| 94 assertEquals("Clipboard text was not what was expected", | 94 assertEquals("Clipboard text was not what was expected", |
| 95 "This is pretty extreme \n(newline). ", getClipboardText()); | 95 "This is pretty extreme \n(newline). ", getClipboardText()); |
| 96 } | 96 } |
| 97 | 97 |
| 98 // http://crbug.com/326769 | 98 // http://crbug.com/326769 |
| 99 @FlakyTest | 99 @FlakyTest |
| 100 // @LargeTest | 100 // @LargeTest |
| 101 @Feature({"Browser"}) | 101 @Feature({"Browser"}) |
| 102 public void testCopyImageToClipboard() throws InterruptedException, TimeoutE
xception { | 102 public void testCopyImageToClipboard() throws InterruptedException, TimeoutE
xception { |
| 103 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) return; | 103 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) return; |
| 104 | 104 |
| 105 TabBase tab = getActivity().getActiveTab(); | 105 Tab tab = getActivity().getActiveTab(); |
| 106 ContextMenuUtils.selectContextMenuItem(this, tab, | 106 ContextMenuUtils.selectContextMenuItem(this, tab, |
| 107 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "testImage"
, | 107 TabUtils.getTestCallbackHelperContainer(tab), "testImage", |
| 108 R.id.contextmenu_copy_image); | 108 R.id.contextmenu_copy_image); |
| 109 | 109 |
| 110 String expectedUrl = TestHttpServerClient.getUrl( | 110 String expectedUrl = TestHttpServerClient.getUrl( |
| 111 "chrome/test/data/android/contextmenu/test_image.png"); | 111 "chrome/test/data/android/contextmenu/test_image.png"); |
| 112 | 112 |
| 113 assertEquals("Clipboard text is not correct", expectedUrl, getClipboardT
ext()); | 113 assertEquals("Clipboard text is not correct", expectedUrl, getClipboardT
ext()); |
| 114 } | 114 } |
| 115 | 115 |
| 116 // http://crbug.com/326769 | 116 // http://crbug.com/326769 |
| 117 @FlakyTest | 117 @FlakyTest |
| 118 // @LargeTest | 118 // @LargeTest |
| 119 @Feature({"Browser"}) | 119 @Feature({"Browser"}) |
| 120 public void testLongPressOnImage() throws InterruptedException, TimeoutExcep
tion { | 120 public void testLongPressOnImage() throws InterruptedException, TimeoutExcep
tion { |
| 121 final TabBase tab = getActivity().getActiveTab(); | 121 final Tab tab = getActivity().getActiveTab(); |
| 122 | 122 |
| 123 TestCallbackHelperContainerForTab helper = | 123 TestCallbackHelperContainerForTab helper = |
| 124 TabBaseTabUtils.getTestCallbackHelperContainer(tab); | 124 TabUtils.getTestCallbackHelperContainer(tab); |
| 125 | 125 |
| 126 OnPageFinishedHelper callback = helper.getOnPageFinishedHelper(); | 126 OnPageFinishedHelper callback = helper.getOnPageFinishedHelper(); |
| 127 int callbackCount = callback.getCallCount(); | 127 int callbackCount = callback.getCallCount(); |
| 128 | 128 |
| 129 ContextMenuUtils.selectContextMenuItem(this, tab, helper, "testImage", | 129 ContextMenuUtils.selectContextMenuItem(this, tab, helper, "testImage", |
| 130 R.id.contextmenu_open_image); | 130 R.id.contextmenu_open_image); |
| 131 | 131 |
| 132 callback.waitForCallback(callbackCount); | 132 callback.waitForCallback(callbackCount); |
| 133 | 133 |
| 134 String expectedUrl = TestHttpServerClient.getUrl( | 134 String expectedUrl = TestHttpServerClient.getUrl( |
| 135 "chrome/test/data/android/contextmenu/test_image.png"); | 135 "chrome/test/data/android/contextmenu/test_image.png"); |
| 136 | 136 |
| 137 final AtomicReference<String> actualUrl = new AtomicReference<String>(); | 137 final AtomicReference<String> actualUrl = new AtomicReference<String>(); |
| 138 getInstrumentation().runOnMainSync(new Runnable() { | 138 getInstrumentation().runOnMainSync(new Runnable() { |
| 139 @Override | 139 @Override |
| 140 public void run() { | 140 public void run() { |
| 141 actualUrl.set(tab.getUrl()); | 141 actualUrl.set(tab.getUrl()); |
| 142 } | 142 } |
| 143 }); | 143 }); |
| 144 | 144 |
| 145 assertEquals("Failed to navigate to the image", expectedUrl, actualUrl.g
et()); | 145 assertEquals("Failed to navigate to the image", expectedUrl, actualUrl.g
et()); |
| 146 } | 146 } |
| 147 | 147 |
| 148 // http://crbug.com/326769 | 148 // http://crbug.com/326769 |
| 149 @FlakyTest | 149 @FlakyTest |
| 150 // @LargeTest | 150 // @LargeTest |
| 151 @Feature({"Browser"}) | 151 @Feature({"Browser"}) |
| 152 public void testLongPressOnImageLink() throws InterruptedException, TimeoutE
xception { | 152 public void testLongPressOnImageLink() throws InterruptedException, TimeoutE
xception { |
| 153 final TabBase tab = getActivity().getActiveTab(); | 153 final Tab tab = getActivity().getActiveTab(); |
| 154 | 154 |
| 155 TestCallbackHelperContainerForTab helper = | 155 TestCallbackHelperContainerForTab helper = |
| 156 TabBaseTabUtils.getTestCallbackHelperContainer(tab); | 156 TabUtils.getTestCallbackHelperContainer(tab); |
| 157 | 157 |
| 158 OnPageFinishedHelper callback = helper.getOnPageFinishedHelper(); | 158 OnPageFinishedHelper callback = helper.getOnPageFinishedHelper(); |
| 159 int callbackCount = callback.getCallCount(); | 159 int callbackCount = callback.getCallCount(); |
| 160 | 160 |
| 161 ContextMenuUtils.selectContextMenuItem(this, tab, helper, "testImage", | 161 ContextMenuUtils.selectContextMenuItem(this, tab, helper, "testImage", |
| 162 R.id.contextmenu_open_image); | 162 R.id.contextmenu_open_image); |
| 163 | 163 |
| 164 callback.waitForCallback(callbackCount); | 164 callback.waitForCallback(callbackCount); |
| 165 | 165 |
| 166 final AtomicReference<String> actualTitle = new AtomicReference<String>(
); | 166 final AtomicReference<String> actualTitle = new AtomicReference<String>(
); |
| 167 getInstrumentation().runOnMainSync(new Runnable() { | 167 getInstrumentation().runOnMainSync(new Runnable() { |
| 168 @Override | 168 @Override |
| 169 public void run() { | 169 public void run() { |
| 170 actualTitle.set(tab.getTitle()); | 170 actualTitle.set(tab.getTitle()); |
| 171 } | 171 } |
| 172 }); | 172 }); |
| 173 | 173 |
| 174 assertTrue("Navigated to the wrong page.", actualTitle.get().startsWith(
"test_image.png")); | 174 assertTrue("Navigated to the wrong page.", actualTitle.get().startsWith(
"test_image.png")); |
| 175 } | 175 } |
| 176 | 176 |
| 177 // http://crbug.com/326769 | 177 // http://crbug.com/326769 |
| 178 @FlakyTest | 178 @FlakyTest |
| 179 // @LargeTest | 179 // @LargeTest |
| 180 @Feature({"Browser"}) | 180 @Feature({"Browser"}) |
| 181 public void testDismissContextMenuOnBack() throws InterruptedException, Time
outException { | 181 public void testDismissContextMenuOnBack() throws InterruptedException, Time
outException { |
| 182 TabBase tab = getActivity().getActiveTab(); | 182 Tab tab = getActivity().getActiveTab(); |
| 183 ContextMenu menu = ContextMenuUtils.openContextMenu(this, tab, | 183 ContextMenu menu = ContextMenuUtils.openContextMenu(this, tab, |
| 184 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "testImage"
); | 184 TabUtils.getTestCallbackHelperContainer(tab), "testImage"); |
| 185 assertNotNull("Context menu was not properly created", menu); | 185 assertNotNull("Context menu was not properly created", menu); |
| 186 assertFalse("Context menu did not have window focus", getActivity().hasW
indowFocus()); | 186 assertFalse("Context menu did not have window focus", getActivity().hasW
indowFocus()); |
| 187 | 187 |
| 188 KeyUtils.pressBack(getInstrumentation()); | 188 KeyUtils.pressBack(getInstrumentation()); |
| 189 | 189 |
| 190 Assert.assertTrue("Activity did not regain focus.", | 190 Assert.assertTrue("Activity did not regain focus.", |
| 191 CriteriaHelper.pollForCriteria(new Criteria() { | 191 CriteriaHelper.pollForCriteria(new Criteria() { |
| 192 @Override | 192 @Override |
| 193 public boolean isSatisfied() { | 193 public boolean isSatisfied() { |
| 194 return getActivity().hasWindowFocus(); | 194 return getActivity().hasWindowFocus(); |
| 195 } | 195 } |
| 196 })); | 196 })); |
| 197 } | 197 } |
| 198 | 198 |
| 199 // http://crbug.com/326769 | 199 // http://crbug.com/326769 |
| 200 @FlakyTest | 200 @FlakyTest |
| 201 // @LargeTest | 201 // @LargeTest |
| 202 @Feature({"Browser"}) | 202 @Feature({"Browser"}) |
| 203 public void testDismissContextMenuOnClick() throws InterruptedException, Tim
eoutException { | 203 public void testDismissContextMenuOnClick() throws InterruptedException, Tim
eoutException { |
| 204 TabBase tab = getActivity().getActiveTab(); | 204 Tab tab = getActivity().getActiveTab(); |
| 205 ContextMenu menu = ContextMenuUtils.openContextMenu(this, tab, | 205 ContextMenu menu = ContextMenuUtils.openContextMenu(this, tab, |
| 206 TabBaseTabUtils.getTestCallbackHelperContainer(tab), "testImage"
); | 206 TabUtils.getTestCallbackHelperContainer(tab), "testImage"); |
| 207 assertNotNull("Context menu was not properly created", menu); | 207 assertNotNull("Context menu was not properly created", menu); |
| 208 assertFalse("Context menu did not have window focus", getActivity().hasW
indowFocus()); | 208 assertFalse("Context menu did not have window focus", getActivity().hasW
indowFocus()); |
| 209 | 209 |
| 210 TestTouchUtils.singleClickView(getInstrumentation(), tab.getPageInfo().g
etView(), 0, 0); | 210 TestTouchUtils.singleClickView(getInstrumentation(), tab.getPageInfo().g
etView(), 0, 0); |
| 211 | 211 |
| 212 Assert.assertTrue("Activity did not regain focus.", | 212 Assert.assertTrue("Activity did not regain focus.", |
| 213 CriteriaHelper.pollForCriteria(new Criteria() { | 213 CriteriaHelper.pollForCriteria(new Criteria() { |
| 214 @Override | 214 @Override |
| 215 public boolean isSatisfied() { | 215 public boolean isSatisfied() { |
| 216 return getActivity().hasWindowFocus(); | 216 return getActivity().hasWindowFocus(); |
| 217 } | 217 } |
| 218 })); | 218 })); |
| 219 } | 219 } |
| 220 | 220 |
| 221 private String getClipboardText() { | 221 private String getClipboardText() { |
| 222 ClipboardManager clipMgr = | 222 ClipboardManager clipMgr = |
| 223 (ClipboardManager) getActivity().getSystemService(Context.CLIPBO
ARD_SERVICE); | 223 (ClipboardManager) getActivity().getSystemService(Context.CLIPBO
ARD_SERVICE); |
| 224 ClipData clipData = clipMgr.getPrimaryClip(); | 224 ClipData clipData = clipMgr.getPrimaryClip(); |
| 225 assertNotNull("Primary clip is null", clipData); | 225 assertNotNull("Primary clip is null", clipData); |
| 226 assertTrue("Primary clip contains no items.", clipData.getItemCount() >
0); | 226 assertTrue("Primary clip contains no items.", clipData.getItemCount() >
0); |
| 227 return clipData.getItemAt(0).getText().toString(); | 227 return clipData.getItemAt(0).getText().toString(); |
| 228 } | 228 } |
| 229 | 229 |
| 230 private void assertStringContains(String subString, String superString) { | 230 private void assertStringContains(String subString, String superString) { |
| 231 assertTrue("String '" + superString + "' does not contain '" + subString
+ "'", | 231 assertTrue("String '" + superString + "' does not contain '" + subString
+ "'", |
| 232 superString.contains(subString)); | 232 superString.contains(subString)); |
| 233 } | 233 } |
| 234 } | 234 } |
| OLD | NEW |