#filter substitution package @ANDROID_PACKAGE_NAME@.tests; import @ANDROID_PACKAGE_NAME@.*; import android.util.DisplayMetrics; /* Test the context menu on web content: Long click on a link, * verify that the context menu is shown and verify that some * of the menu actions work. */ public class testWebContentContextMenu extends PixelTest { @Override protected int getTestType() { return TEST_MOCHITEST; } public void testWebContentContextMenu() { blockForGeckoReady(); String urls [] = { "/robocop/robocop_big_link.html", "/robocop/robocop_big_mailto.html", "/robocop/robocop_picture_link.html"}; String linkMenuItems [] = { "Open Link in New Tab", "Open Link in Private Tab", "Copy Link", "Share Link", "Bookmark Link"}; String mailtoMenuItems [] = { "Open With an App", "Copy Email Address", "Share Email Address"}; String photoMenuItems [] = { "Copy Image Location", "Share Image", "Set as Wallpaper", "Save Image"}; verfyLinkContextMenu(linkMenuItems, urls); verfyMailtoContextMenu(mailtoMenuItems, urls); verfyPhotoContextMenu(photoMenuItems, urls); } public void openContextMenu(int i, String urls []) { DisplayMetrics dm = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); // The link has a 60px height, so let's try to hit the middle float top = mDriver.getGeckoTop() + 30 * dm.density; float left = mDriver.getGeckoLeft() + mDriver.getGeckoWidth() / 2; String url = getAbsoluteUrl(urls [i]); getInstrumentation().waitForIdleSync(); loadAndPaint(url); mAsserter.dumpLog("long-clicking at "+left+", "+top); mSolo.clickLongOnScreen(left, top); } public void accessSection(int i, String opt, String urls []) { openContextMenu(i, urls); mAsserter.ok(mSolo.waitForText(opt), "Waiting for " + opt + " option", "The " + opt + " option is present"); mSolo.clickOnText(opt); } public void verfyLinkContextMenu(String items [], String urls []) { for (String opt:items) { if (opt.equals("Open Link in New Tab")) { openContextMenu(0, urls); mAsserter.ok(mSolo.waitForText(opt), "Waiting for " + opt + " option", "The " + opt + " option is present"); Actions.EventExpecter tabEventExpecter = mActions.expectGeckoEvent("Tab:Added"); Actions.EventExpecter contentEventExpecter = mActions.expectGeckoEvent("DOMContentLoaded"); mSolo.clickOnText(opt); // Wait for the new tab and page to load tabEventExpecter.blockForEvent(); contentEventExpecter.blockForEvent(); tabEventExpecter.unregisterListener(); contentEventExpecter.unregisterListener(); // See tab count Element tabCount = mDriver.findElement(getActivity(), "tabs_count"); String tabCountText = null; if (tabCount != null) { tabCountText = tabCount.getText(); } mAsserter.is(tabCountText, "2", "Number of tabs has increased"); } else { if (opt.equals("Open Link in Private Tab")) { accessSection(2, opt, urls); mAsserter.ok(mSolo.waitForText("New private tab opened"), "Waiting for private tab to open", "The private tab is opened"); // Verifying if the private data is not listed in Awesomescreen clickOnAwesomeBar(); mSolo.clickOnText("History"); mAsserter.ok(mSolo.waitForText("Browser Blank Page 01"), "Looking in History for the page loaded in the normal tab", "Fount it"); mAsserter.ok(mSolo.waitForText("Browser Blank Page 02") == false, "Looking in History for the page loaded in the private tab", "Page is not present in History"); } else { if (opt.equals("Copy Link")) { accessSection(0, opt, urls); // Verifying if the link was copied mSolo.clickLongOnText("Big Link"); mAsserter.ok(mSolo.waitForText("^Paste$"), "Verify if the 'Paste' option is present", "The 'Paste' option is present"); mSolo.clickOnText("^Paste$"); mAsserter.ok(mSolo.waitForText("robocop_blank_01.html"), "Verify link", "The link was properly copied"); } else { if (opt.equals("Share Link")) { accessSection(0, opt, urls); // Verifying if the Share Link option menu is opened mAsserter.ok(mSolo.waitForText("Share via"), "Waiting for the Share Link option menu to open", "The Share Link option menu is opened"); mActions.sendSpecialKey(Actions.SpecialKey.BACK);// Close the Share Link option menu mSolo.waitForText("Big Link"); } else { if (opt.equals("Bookmark Link")) { Navigation nav = new Navigation(mDevice); accessSection(0, opt, urls); mAsserter.is(mSolo.waitForText("Bookmark added"), true, "Bookmark added verified"); // This waitForIdleSync improves reliability of the following loadUrl. // TODO: understand why! getInstrumentation().waitForIdleSync(); // We know that the link test page points to robocop_blank_01.html, so lets // load it and see if the page is bookmarked String url = getAbsoluteUrl("/robocop/robocop_blank_01.html"); loadAndPaint(url); // Pause briefly, to ensure that the bookmark addition, above, updates database tables and // completes before checking that the bookmark exists. // TODO: Find a better way to wait for completion of bookmark operations. try { Thread.sleep(2000); } catch(Exception e) {} // TODO: This doesn't work for some reason. We got a 'Bookmark added' and // will check for 'Bookmark removed' mAsserter.todo_is(mSolo.isTextChecked("Bookmark"), true, "Page is bookmarked"); nav.bookmark(); mAsserter.is(mSolo.waitForText("Bookmark removed"), true, "Bookmark removal verified"); } } } } } } } public void verfyMailtoContextMenu(String items [], String urls []) { for (String opt:items) { if (opt.equals("Copy Email Address")) { openContextMenu(1, urls); mAsserter.ok(mSolo.waitForText(opt), "Waiting for " + opt + " option", "The " + opt + " option is present"); mSolo.clickOnText(opt); // Verifying if the email address was copied mSolo.clickLongOnText("Big Mailto"); mAsserter.ok(mSolo.waitForText("^Paste$"), "Verify if the 'Paste' option is present", "The 'Paste' option is present"); mSolo.clickOnText("^Paste$"); mAsserter.ok(mSolo.waitForText("foo.bar@example.com"), "Verify email address", "The email address was properly copied"); } else { if (opt.equals("Share Email Address")) { accessSection(1, opt, urls); // Verifying if the Share email address option menu is opened mAsserter.ok(mSolo.waitForText("Share via"), "Waiting for the Share email address option menu to open", "The Share email address option menu is opened"); } } } mActions.sendSpecialKey(Actions.SpecialKey.BACK); // Close the Share email address option menu mSolo.waitForText("Big Mailto"); } // Load a picture test page and test for allowed menu actions public void verfyPhotoContextMenu(String items [], String urls []) { for (String opt:items) { if (opt.equals("Copy Image Location")) { // This waitForIdleSync improves reliability of the following loadUrl. // TODO: understand why! getInstrumentation().waitForIdleSync(); accessSection(2, opt, urls); // Verifying if the photo's link was copied mSolo.clickLongOnText("Picture Link"); mAsserter.ok(mSolo.waitForText("^Paste$"), "Verify if the 'Paste' option is present", "The 'Paste' option is present"); mSolo.clickOnText("^Paste$"); mAsserter.ok(mSolo.waitForText("Firefox.jpg"), "Verify link", "The photo's link was properly copied"); } else { if (opt.equals("Share Image")) { accessSection(2, opt, urls); // Verifying if the Share Image option menu is opened mAsserter.ok(mSolo.waitForText("Share via"), "Waiting for the Share Image option menu to open", "The Share Image option menu is opened"); mActions.sendSpecialKey(Actions.SpecialKey.BACK); // Close the Share Image option menu mSolo.waitForText("Picture Link"); } else { if (opt.equals("Set as Wallpaper")) { openContextMenu(2, urls); mAsserter.ok(mSolo.waitForText(opt), "Waiting for " + opt + " option", "The " + opt + " option is present"); } else { if (opt.equals("Save Image")) { mSolo.clickOnText(opt); mAsserter.ok(mSolo.waitForText("Download started"), "Verify that the download started", "The download started"); mSolo.waitForText("Picture Link"); } } } } } } }