From 823681c77194b0a87e64484b43d14d7d9c889ccf Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 15 Sep 2021 11:15:03 -0400 Subject: [PATCH] Close #10984: Persist search term in content state --- .../storage/serialize/BrowserStateReader.kt | 3 ++ .../storage/serialize/BrowserStateWriter.kt | 3 ++ .../browser/session/storage/serialize/Keys.kt | 1 + .../serialize/BrowserStateWriterReaderTest.kt | 53 +++++++++++++++++++ .../state/state/recover/RecoverableTab.kt | 5 ++ 5 files changed, 65 insertions(+) diff --git a/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateReader.kt b/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateReader.kt index 5e784e4866d..f71c291114a 100644 --- a/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateReader.kt +++ b/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateReader.kt @@ -167,6 +167,7 @@ private fun JsonReader.tabSession(): RecoverableTab { var parentId: String? = null var url: String? = null var title: String? = null + var searchTerm: String = "" var contextId: String? = null var lastAccess: Long? = null var createdAt: Long? = null @@ -194,6 +195,7 @@ private fun JsonReader.tabSession(): RecoverableTab { Keys.SESSION_CONTEXT_ID_KEY -> contextId = nextStringOrNull() Keys.SESSION_PARENT_UUID_KEY -> parentId = nextStringOrNull()?.takeIf { it.isNotEmpty() } Keys.SESSION_TITLE -> title = nextStringOrNull() ?: "" + Keys.SESSION_SEARCH_TERM -> searchTerm = nextStringOrNull() ?: "" Keys.SESSION_READER_MODE_KEY -> readerStateActive = nextBooleanOrNull() Keys.SESSION_READER_MODE_ACTIVE_URL_KEY -> readerActiveUrl = nextStringOrNull() Keys.SESSION_HISTORY_METADATA_URL -> historyMetadataUrl = nextStringOrNull() @@ -219,6 +221,7 @@ private fun JsonReader.tabSession(): RecoverableTab { parentId = parentId, url = requireNotNull(url), title = requireNotNull(title), + searchTerm = requireNotNull(searchTerm), contextId = contextId, state = null, // This will be deserialized and added separately readerState = ReaderState( diff --git a/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriter.kt b/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriter.kt index bb57132b58a..81b77ceb33a 100644 --- a/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriter.kt +++ b/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriter.kt @@ -83,6 +83,9 @@ private fun JsonWriter.tab( name(Keys.SESSION_TITLE) value(tab.content.title) + name(Keys.SESSION_SEARCH_TERM) + value(tab.content.searchTerms) + name(Keys.SESSION_CONTEXT_ID_KEY) value(tab.contextId) diff --git a/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/Keys.kt b/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/Keys.kt index 4fcfd37b971..27ca970841a 100644 --- a/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/Keys.kt +++ b/components/browser/session-storage/src/main/java/mozilla/components/browser/session/storage/serialize/Keys.kt @@ -21,6 +21,7 @@ internal object Keys { const val SESSION_READER_MODE_KEY = "readerMode" const val SESSION_READER_MODE_ACTIVE_URL_KEY = "readerModeArticleUrl" const val SESSION_TITLE = "title" + const val SESSION_SEARCH_TERM = "searchTerm" const val SESSION_LAST_ACCESS = "lastAccess" const val SESSION_CREATED_AT = "createdAt" const val SESSION_LAST_MEDIA_URL = "lastMediaUrl" diff --git a/components/browser/session-storage/src/test/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriterReaderTest.kt b/components/browser/session-storage/src/test/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriterReaderTest.kt index 6c5f423b93e..2cd34e0d286 100644 --- a/components/browser/session-storage/src/test/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriterReaderTest.kt +++ b/components/browser/session-storage/src/test/java/mozilla/components/browser/session/storage/serialize/BrowserStateWriterReaderTest.kt @@ -333,6 +333,59 @@ class BrowserStateWriterReaderTest { assertNotNull(restoredTab.createdAt) } + + @Test + fun `Read and write tab with search term`() { + val engineState = createFakeEngineState() + val engine = createFakeEngine(engineState) + + val tab = createTab( + url = "https://www.mozilla.org", + title = "Mozilla", + contextId = "work", + searchTerms = "test search" + ) + + val writer = BrowserStateWriter() + val reader = BrowserStateReader() + + val file = AtomicFile( + File.createTempFile(UUID.randomUUID().toString(), UUID.randomUUID().toString()) + ) + + assertTrue(writer.writeTab(tab, file)) + + val restoredTab = reader.readTab(engine, file) + assertNotNull(restoredTab!!) + + assertEquals("test search", restoredTab.searchTerm) + } + + @Test + fun `Read and write tab without search term`() { + val engineState = createFakeEngineState() + val engine = createFakeEngine(engineState) + + val tab = createTab( + url = "https://www.mozilla.org", + title = "Mozilla", + contextId = "work" + ) + + val writer = BrowserStateWriter() + val reader = BrowserStateReader() + + val file = AtomicFile( + File.createTempFile(UUID.randomUUID().toString(), UUID.randomUUID().toString()) + ) + + assertTrue(writer.writeTab(tab, file)) + + val restoredTab = reader.readTab(engine, file) + assertNotNull(restoredTab!!) + + assertEquals("", restoredTab.searchTerm) + } } private fun createFakeEngineState(): EngineSessionState { diff --git a/components/browser/state/src/main/java/mozilla/components/browser/state/state/recover/RecoverableTab.kt b/components/browser/state/src/main/java/mozilla/components/browser/state/state/recover/RecoverableTab.kt index d35a6a39e33..8623abf3dd3 100644 --- a/components/browser/state/src/main/java/mozilla/components/browser/state/state/recover/RecoverableTab.kt +++ b/components/browser/state/src/main/java/mozilla/components/browser/state/state/recover/RecoverableTab.kt @@ -24,6 +24,8 @@ import mozilla.components.concept.storage.HistoryMetadataKey * @property parentId The unique ID of the parent tab if this tab was opened from another tab (e.g. via * the context menu). * @property title The last title of this tab (or an empty String). + * @property searchTerms The last used search terms, or an empty string if no + * search was executed for this session. * @property contextId The context ID ("container") this tab used (or null). * @property state The [EngineSessionState] needed for restoring the previous state of this tab. * @property readerState The last [ReaderState] of the tab. @@ -40,6 +42,7 @@ data class RecoverableTab( val url: String, val parentId: String? = null, val title: String = "", + val searchTerm: String = "", val contextId: String? = null, val state: EngineSessionState? = null, val readerState: ReaderState = ReaderState(), @@ -60,6 +63,7 @@ fun TabSessionState.toRecoverableTab(index: Int = -1) = RecoverableTab( parentId = parentId, url = content.url, title = content.title, + searchTerm = content.searchTerms, contextId = contextId, state = engineState.engineSessionState, readerState = readerState, @@ -80,6 +84,7 @@ fun RecoverableTab.toTabSessionState() = createTab( url = url, parentId = parentId, title = title, + searchTerms = searchTerm, contextId = contextId, engineSessionState = state, readerState = readerState,