From e1eae8f458dc3c27a840327b0b35904abb62bcde Mon Sep 17 00:00:00 2001 From: Xing Liu Date: Tue, 2 Feb 2021 18:02:16 +0000 Subject: [PATCH] Read later: Delete reading list in search state should not crash. Fix a crash when deleting a reading list from overflow menu in search state with empty query key word. Reading list and partner bookmark backend only call into bookmarkModelChanged instead of bookmarkNodeRemoved. closeSearchUI() will set bookmark recycler view list properly. Bug: 1163831 Change-Id: I622026c4f76b0dc560cda72439aff01fd415f7c0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2666375 Reviewed-by: David Trainor Commit-Queue: Xing Liu Cr-Commit-Position: refs/heads/master@{#849664} --- .../bookmarks/BookmarkItemsAdapter.java | 9 ++++-- .../browser/bookmarks/BookmarkTest.java | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java index 5081453754ab4e..67c89d2882ad69 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java @@ -95,9 +95,12 @@ public void bookmarkModelChanged() { clearHighlight(); mDelegate.notifyStateChange(BookmarkItemsAdapter.this); - if (mDelegate.getCurrentState() == BookmarkUIState.STATE_SEARCHING - && !TextUtils.equals(mSearchText, EMPTY_QUERY)) { - search(mSearchText); + if (mDelegate.getCurrentState() == BookmarkUIState.STATE_SEARCHING) { + if (!TextUtils.equals(mSearchText, EMPTY_QUERY)) { + search(mSearchText); + } else { + mDelegate.closeSearchUI(); + } } } }; diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java index ef7cdb66293b81..ddf26e34e39dcb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java @@ -1120,6 +1120,36 @@ public void testReadingListDeletion() throws Exception { CriteriaHelper.pollUiThread(() -> mBookmarkModel.getReadingListItem(mTestUrlA) == null); } + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.READ_LATER}) + public void testSearchReadingList_Deletion() throws Exception { + addReadingListBookmark(TEST_PAGE_TITLE_GOOGLE, mTestUrlA); + BookmarkPromoHeader.forcePromoStateForTests(PromoState.PROMO_NONE); + openBookmarkManager(); + CriteriaHelper.pollUiThread(() -> mBookmarkModel.getReadingListItem(mTestUrlA) != null); + + // Open the "Reading list" folder. + TestThreadUtils.runOnUiThreadBlocking( + () -> mManager.openFolder(mBookmarkModel.getRootFolderId())); + onView(withText("Reading list")).perform(click()); + RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); + + // Enter search UI, but don't enter any search key word. + BookmarkManager manager = getBookmarkManager(); + TestThreadUtils.runOnUiThreadBlocking(manager::openSearchUI); + Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, + manager.getCurrentState()); + RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); + + // Delete the reading list page in search state. + View readingListItem = mItemsContainer.findViewHolderForAdapterPosition(0).itemView; + View more = readingListItem.findViewById(R.id.more); + TestThreadUtils.runOnUiThreadBlocking(more::callOnClick); + onView(withText("Delete")).check(matches(isDisplayed())).perform(click()); + CriteriaHelper.pollUiThread(() -> mBookmarkModel.getReadingListItem(mTestUrlA) == null); + } + @Test @SmallTest @Features.EnableFeatures({ChromeFeatureList.READ_LATER})