Skip to content

Commit 646383c

Browse files
PM-26896: Fix Autofill ancestry
1 parent 41dfc2b commit 646383c

4 files changed

Lines changed: 56 additions & 84 deletions

File tree

app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/parser/AutofillParserImpl.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.x8bit.bitwarden.data.autofill.util.buildUriOrNull
1313
import com.x8bit.bitwarden.data.autofill.util.getInlinePresentationSpecs
1414
import com.x8bit.bitwarden.data.autofill.util.getMaxInlineSuggestionsCount
1515
import com.x8bit.bitwarden.data.autofill.util.toAutofillView
16-
import com.x8bit.bitwarden.data.autofill.util.website
1716
import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
1817
import timber.log.Timber
1918

@@ -189,7 +188,7 @@ private fun AssistStructure.traverse(): List<ViewNodeTraversalData> =
189188
.mapNotNull { windowNode ->
190189
windowNode
191190
.rootViewNode
192-
?.traverse(parentWebsite = null)
191+
?.traverse()
193192
?.updateForMissingPasswordFields()
194193
?.updateForMissingUsernameFields()
195194
}
@@ -267,9 +266,7 @@ private fun ViewNodeTraversalData.copyAndMapAutofillViews(
267266
* Recursively traverse this [AssistStructure.ViewNode] and all of its descendants. Convert the
268267
* data into [ViewNodeTraversalData].
269268
*/
270-
private fun AssistStructure.ViewNode.traverse(
271-
parentWebsite: String?,
272-
): ViewNodeTraversalData {
269+
private fun AssistStructure.ViewNode.traverse(): ViewNodeTraversalData {
273270
// Set up mutable lists for collecting valid AutofillViews and ignorable view ids.
274271
val mutableAutofillViewList: MutableList<AutofillView> = mutableListOf()
275272
val mutableIgnoreAutofillIdList: MutableList<AutofillId> = mutableListOf()
@@ -285,15 +282,15 @@ private fun AssistStructure.ViewNode.traverse(
285282

286283
// Try converting this `ViewNode` into an `AutofillView`. If a valid instance is returned, add
287284
// it to the list. Otherwise, ignore the `AutofillId` associated with this `ViewNode`.
288-
toAutofillView(parentWebsite = parentWebsite)
285+
toAutofillView()
289286
?.run(mutableAutofillViewList::add)
290287
?: autofillId?.run(mutableIgnoreAutofillIdList::add)
291288

292289
// Recursively traverse all of this view node's children.
293290
for (i in 0 until childCount) {
294291
// Extract the traversal data from each child view node and add it to the lists.
295292
getChildAt(i)
296-
.traverse(parentWebsite = website)
293+
.traverse()
297294
.let { viewNodeTraversalData ->
298295
viewNodeTraversalData.autofillViews.forEach(mutableAutofillViewList::add)
299296
viewNodeTraversalData.ignoreAutofillIds.forEach(mutableIgnoreAutofillIdList::add)

app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/ViewNodeExtensions.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ private val AssistStructure.ViewNode.isInputField: Boolean
4949
* doesn't contain a valid autofillId, it isn't an a view setup for autofill, so we return null. If
5050
* it doesn't have a supported hint and isn't an input field, we also return null.
5151
*/
52-
fun AssistStructure.ViewNode.toAutofillView(
53-
parentWebsite: String?,
54-
): AutofillView? {
52+
fun AssistStructure.ViewNode.toAutofillView(): AutofillView? {
5553
val nonNullAutofillId = this.autofillId ?: return null
5654
if (this.supportedAutofillHint == null && !this.isInputField) return null
5755
val autofillOptions = this
@@ -65,7 +63,7 @@ fun AssistStructure.ViewNode.toAutofillView(
6563
isFocused = this.isFocused,
6664
textValue = this.autofillValue?.extractTextValue(),
6765
hasPasswordTerms = this.hasPasswordTerms(),
68-
website = this.website ?: parentWebsite,
66+
website = this.website,
6967
)
7068
return buildAutofillView(
7169
autofillOptions = autofillOptions,

app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/parser/AutofillParserTests.kt

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ class AutofillParserTests {
259259
every { this@mockk.childCount } returns 0
260260
every { this@mockk.idPackage } returns null
261261
every { this@mockk.isFocused } returns false
262-
every { this@mockk.toAutofillView(parentWebsite = any()) } returns null
262+
every { this@mockk.toAutofillView() } returns null
263263
every { this@mockk.website } returns null
264264
}
265265
// `invalidChildViewNode` simulates the OS assigning a node's idPackage to "android", which
@@ -272,7 +272,7 @@ class AutofillParserTests {
272272
every { this@mockk.childCount } returns 0
273273
every { this@mockk.idPackage } returns ID_PACKAGE_ANDROID
274274
every { this@mockk.isFocused } returns false
275-
every { this@mockk.toAutofillView(parentWebsite = any()) } returns null
275+
every { this@mockk.toAutofillView() } returns null
276276
every { this@mockk.website } returns null
277277
}
278278
val parentAutofillHint = View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR
@@ -293,7 +293,7 @@ class AutofillParserTests {
293293
every { this@mockk.autofillHints } returns arrayOf(parentAutofillHint)
294294
every { this@mockk.autofillId } returns parentAutofillId
295295
every { this@mockk.idPackage } returns null
296-
every { this@mockk.toAutofillView(parentWebsite = any()) } returns parentAutofillView
296+
every { this@mockk.toAutofillView() } returns parentAutofillView
297297
every { this@mockk.childCount } returns 2
298298
every { this@mockk.getChildAt(0) } returns childViewNode
299299
every { this@mockk.getChildAt(1) } returns invalidChildViewNode
@@ -379,8 +379,8 @@ class AutofillParserTests {
379379
partition = autofillPartition,
380380
uri = URI,
381381
)
382-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
383-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
382+
every { cardViewNode.toAutofillView() } returns cardAutofillView
383+
every { loginViewNode.toAutofillView() } returns loginAutofillView
384384

385385
// Test
386386
val actual = parser.parse(
@@ -442,8 +442,8 @@ class AutofillParserTests {
442442
partition = autofillPartition,
443443
uri = URI,
444444
)
445-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
446-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
445+
every { cardViewNode.toAutofillView() } returns cardAutofillView
446+
every { loginViewNode.toAutofillView() } returns loginAutofillView
447447

448448
// Test
449449
val actual = parser.parse(
@@ -498,7 +498,7 @@ class AutofillParserTests {
498498
partition = autofillPartition,
499499
uri = URI,
500500
)
501-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns unusedAutofillView
501+
every { loginViewNode.toAutofillView() } returns unusedAutofillView
502502

503503
// Test
504504
val actual = parser.parse(
@@ -601,13 +601,9 @@ class AutofillParserTests {
601601
partition = autofillPartition,
602602
uri = URI,
603603
)
604-
every { rootViewNode.toAutofillView(parentWebsite = any()) } returns null
605-
every {
606-
hiddenUserNameViewNode.toAutofillView(parentWebsite = any())
607-
} returns unusedAutofillView
608-
every {
609-
passwordViewNode.toAutofillView(parentWebsite = any())
610-
} returns loginPasswordAutofillView
604+
every { rootViewNode.toAutofillView() } returns null
605+
every { hiddenUserNameViewNode.toAutofillView() } returns unusedAutofillView
606+
every { passwordViewNode.toAutofillView() } returns loginPasswordAutofillView
611607

612608
// Test
613609
val actual = parser.parse(
@@ -669,8 +665,8 @@ class AutofillParserTests {
669665
partition = autofillPartition,
670666
uri = URI,
671667
)
672-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
673-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
668+
every { cardViewNode.toAutofillView() } returns cardAutofillView
669+
every { loginViewNode.toAutofillView() } returns loginAutofillView
674670

675671
// Test
676672
val actual = parser.parse(
@@ -733,8 +729,8 @@ class AutofillParserTests {
733729
partition = autofillPartition,
734730
uri = URI,
735731
)
736-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
737-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
732+
every { cardViewNode.toAutofillView() } returns cardAutofillView
733+
every { loginViewNode.toAutofillView() } returns loginAutofillView
738734

739735
// Test
740736
val actual = parser.parse(
@@ -797,8 +793,8 @@ class AutofillParserTests {
797793
partition = autofillPartition,
798794
uri = URI,
799795
)
800-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
801-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
796+
every { cardViewNode.toAutofillView() } returns cardAutofillView
797+
every { loginViewNode.toAutofillView() } returns loginAutofillView
802798

803799
// Test
804800
val actual = parser.parse(
@@ -861,8 +857,8 @@ class AutofillParserTests {
861857
partition = autofillPartition,
862858
uri = URI,
863859
)
864-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
865-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
860+
every { cardViewNode.toAutofillView() } returns cardAutofillView
861+
every { loginViewNode.toAutofillView() } returns loginAutofillView
866862

867863
// Test
868864
val actual = parser.parse(
@@ -917,8 +913,8 @@ class AutofillParserTests {
917913
"blockListedUri.com",
918914
"blockListedAgainUri.com",
919915
)
920-
every { cardViewNode.toAutofillView(parentWebsite = any()) } returns cardAutofillView
921-
every { loginViewNode.toAutofillView(parentWebsite = any()) } returns loginAutofillView
916+
every { cardViewNode.toAutofillView() } returns cardAutofillView
917+
every { loginViewNode.toAutofillView() } returns loginAutofillView
922918
every { settingsRepository.blockedAutofillUris } returns remoteBlockList
923919

924920
// A function for asserting that a block listed URI results in an unfillable request.

0 commit comments

Comments
 (0)