#filter substitution package @ANDROID_PACKAGE_NAME@.tests; import @ANDROID_PACKAGE_NAME@.*; import android.app.Activity; import android.content.ContentUris; import android.view.ViewGroup; import android.view.View; import android.widget.ListView; import android.widget.ExpandableListView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ImageView; import android.widget.TabHost; import android.text.TextUtils; import android.content.ContentValues; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import java.util.Arrays; import java.util.ArrayList; import java.io.File; /* Tests opening the bookmarks tab, that items look correct, clicking on an item and long tapping on an item */ public class testBookmarksTab extends BaseTest { private String[] defaultBookmarksUrls = new String[] { "about:firefox", "about:home", "http://support.mozilla.org/en-US/mobile", "https://addons.mozilla.org/en-US/android/" }; private View mFirstChild; @Override protected int getTestType() { return TEST_MOCHITEST; } public void testBookmarksTab() { blockForGeckoReady(); String url = "http://www.example.com"; // add one page to desktop folders so that we can see them addBookmark("BOOKMARK_TITLE", url); testList(url); testContextMenu(url); } private ListView list; private void testList(String url) { View child; list = getBookmarksList(); mSolo.waitForText("Desktop Bookmarks"); mAsserter.isnot(list, null, "checking that bookmarks list exists"); int count = list.getChildCount(); mAsserter.is(count, 5, "bookmarks list has 5 children (defaults + a folder)"); for (int i = count - 1; i >= 0; i--) { child = list.getChildAt(i); compareRow(child, i == 0 ? 1 : 2, 1); } child = list.getChildAt(0); mSolo.clickOnView(child); mSolo.waitForText("Bookmarks Toolbar"); mAsserter.is(list.getChildCount(), 4, "desktop folder has correct number of children"); count = list.getChildCount(); for (int i = count - 1; i >= 0; i--) { child = list.getChildAt(i); compareRow(child, 1, i == 0 ? 0 : 1); } child = list.getChildAt(1); mSolo.clickOnView(child); mSolo.waitForText("BOOKMARK_TITLE"); mAsserter.is(list.getChildCount(), 2, "toolbar folder has correct number of children"); count = list.getChildCount(); for (int i = count - 1; i >= 0; i--) { child = list.getChildAt(i); compareRow(child, i == 0 ? 1:2, i == 0 ? 0:1); } // Test backing out of the folder using the back button mActions.sendSpecialKey(Actions.SpecialKey.BACK); mAsserter.ok(mSolo.waitForText("Bookmarks Toolbar"), "Back moved up one level", ""); mActions.sendSpecialKey(Actions.SpecialKey.BACK); mAsserter.ok(mSolo.waitForText("about:home"), "Back moved up one level", ""); mActions.sendSpecialKey(Actions.SpecialKey.BACK); } private void testContextMenu(String url) { list = getBookmarksList(); mSolo.waitForText(url); // wait for the bookmarks list to be populated mFirstChild = null; boolean success = waitForTest(new BooleanTest() { public boolean test() { mFirstChild = list.getChildAt(1); if (mFirstChild == null) { return false; } if (mFirstChild instanceof android.view.ViewGroup) { ViewGroup group = (ViewGroup)mFirstChild; if (group.getChildCount() < 1) { return false; } for (int i = 0; i < group.getChildCount(); i++) { View grandChild = group.getChildAt(i); if (grandChild instanceof android.widget.TextView) { mAsserter.ok(true, "found TextView:", ((android.widget.TextView)grandChild).getText().toString()); } } } else { mAsserter.dumpLog("first child not a ViewGroup: "+mFirstChild); return false; } return true; } }, MAX_WAIT_MS); if (success == true && mFirstChild != null) { mAsserter.dumpLog("clickLongOnView: "+mFirstChild); // long tap on a bookmark should show a context menu with an edit option mSolo.clickLongOnView(mFirstChild); // TODO: Test clicking these does the right thing mAsserter.ok(mSolo.waitForText("Open in New Tab"), "Context menu has New Tab option", "Open in New Tab"); mAsserter.ok(mSolo.searchText("Share", true), "Context menu has Share option", "Share"); mAsserter.ok(mSolo.searchText("Edit", true), "Context menu has Edit option", "Edit"); mAsserter.ok(mSolo.searchText("Remove", true), "Context menu has Remove option", "Remove"); mAsserter.ok(mSolo.searchText("Add to Home Screen", true), "Context menu has Add to Home Screen option", "Add to Home Screen"); // press back to exit the context menu mActions.sendSpecialKey(Actions.SpecialKey.BACK); // test long tap on a folder, this should fail but will still open the folder View child = list.getChildAt(0); mSolo.clickLongOnView(child); mAsserter.is(mSolo.waitForText("Open in New Tab"), false, "Folders have no context menu"); // pressing back should exit the folder mActions.sendSpecialKey(Actions.SpecialKey.BACK); } else { mAsserter.ok(false, "waiting for bookmark item", "bookmark item available"); } // back again to exit the awesomebar mActions.sendSpecialKey(Actions.SpecialKey.BACK); } private void compareRow(View child, int numTextViews, int numImageViews) { ArrayList views = mSolo.getViews(child); ArrayList imageViews = new ArrayList(); ArrayList textViews = new ArrayList(); for (int j = 0; j < views.size(); j++) { View v = views.get(j); if (v instanceof TextView) { TextView t = (TextView)v; textViews.add(t); String string = t.getText().toString(); mAsserter.ok(!TextUtils.isEmpty(string), "TextView is filled in", string); } else if (v instanceof ImageView) { imageViews.add((ImageView)v); } } int visible = 0; for (int j = 0; j < imageViews.size(); j++) { ImageView img = imageViews.get(j); visible += (img.getVisibility() == View.VISIBLE) ? 1 : 0; } mAsserter.is(visible, numImageViews, "Correct number of ImageViews visible"); visible = 0; for (int j = 0; j < textViews.size(); j++) { TextView text = textViews.get(j); visible += (text.getVisibility() == View.VISIBLE) ? 1 : 0; } mAsserter.is(textViews.size(), numTextViews, "Correct number of TextViews visible"); } private ListView getBookmarksList() { Activity awesomeBarActivity = clickOnAwesomeBar(); mSolo.clickOnText("Bookmarks"); final ArrayList views = mSolo.getCurrentListViews(); list = null; boolean success = waitForTest(new BooleanTest() { public boolean test() { for (ListView view : views) { if (view.getTag().equals("bookmarks")) { list = view; return true; } } return false; } }, MAX_WAIT_MS); return list; } private long addBookmark(String title, String url) { ContentResolver resolver = getActivity().getContentResolver(); Uri bookmarksUri = Uri.parse("content://@ANDROID_PACKAGE_NAME@.db.browser/bookmarks"); bookmarksUri = bookmarksUri.buildUpon().appendQueryParameter("profile", "default").build(); long folderId = -1; Cursor c = null; try { c = resolver.query(bookmarksUri, new String[] { "_id" }, "guid = ?", new String[] { "toolbar" }, null); if (c.moveToFirst()) folderId = c.getLong(c.getColumnIndexOrThrow("_id")); } finally { if (c != null) c.close(); } ContentValues values = new ContentValues(); values.put("title", title); values.put("url", url); values.put("type", 1); values.put("parent", folderId); values.put("guid", url); values.put("position", 10); long now = System.currentTimeMillis(); values.put("created", now); values.put("modified", now); Uri uri = resolver.insert(bookmarksUri, values); mAsserter.ok(true, "Inserted at: ", uri.toString()); return ContentUris.parseId(uri); } public void tearDown() throws Exception { ContentResolver resolver = getActivity().getContentResolver(); Uri uri = Uri.parse("content://@ANDROID_PACKAGE_NAME@.db.browser/bookmarks"); uri = uri.buildUpon().appendQueryParameter("profile", "default") .appendQueryParameter("sync", "true").build(); resolver.delete(uri, "title = ?", new String[] { "BOOKMARK_TITLE" }); super.tearDown(); } }