Skip to content

Commit 375083e

Browse files
authored
Fix deserialization error on Existing Connection Option click in webview (#4852)
* Fix desrialization error on Existing Connection Option click in webview * address feedback * Added tests
1 parent b64a7c0 commit 375083e

File tree

7 files changed

+70
-6
lines changed

7 files changed

+70
-6
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,12 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos
196196
}
197197

198198
is BrowserMessage.SendUiClickTelemetry -> {
199-
UiTelemetry.click(project, message.signInOptionClicked)
199+
val signInOption = message.signInOptionClicked
200+
if (signInOption.isNullOrEmpty()) {
201+
LOG.warn("Unknown sign in option")
202+
} else {
203+
UiTelemetry.click(project, signInOption)
204+
}
200205
}
201206
}
202207
}

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@ sealed interface BrowserMessage {
5757

5858
object Reauth : BrowserMessage
5959

60-
data class SendUiClickTelemetry(val signInOptionClicked: String) : BrowserMessage
60+
data class SendUiClickTelemetry(val signInOptionClicked: String?) : BrowserMessage
6161
}

plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.assertj.core.api.Assertions.assertThatThrownBy
1515
import org.assertj.core.api.ObjectAssert
1616
import org.junit.jupiter.api.BeforeEach
1717
import org.junit.jupiter.api.Test
18+
import org.junit.jupiter.api.assertDoesNotThrow
1819
import org.junit.jupiter.api.extension.RegisterExtension
1920
import org.mockito.kotlin.mock
2021
import software.aws.toolkits.jetbrains.core.webview.BrowserMessage
@@ -148,6 +149,18 @@ class BrowserMessageTest {
148149
}
149150
"""
150151
)
152+
153+
assertDeserializedInstanceOf<BrowserMessage.SendUiClickTelemetry>(
154+
"""
155+
{
156+
"command": "sendUiClickTelemetry"
157+
}
158+
"""
159+
).isEqualTo(
160+
BrowserMessage.SendUiClickTelemetry(
161+
signInOptionClicked = null
162+
)
163+
)
151164
}
152165

153166
@Test
@@ -273,4 +286,29 @@ class BrowserMessageTest {
273286
"""
274287
)
275288
}
289+
290+
@Test
291+
fun `Nullable fields in sendUiClickTelemetry should not throw exception`() {
292+
assertDoesNotThrow {
293+
objectMapper.readValue<BrowserMessage>(
294+
"""
295+
{
296+
"command": "sendUiClickTelemetry",
297+
"signInOptionClicked": null
298+
}
299+
"""
300+
)
301+
}
302+
303+
assertDoesNotThrow {
304+
objectMapper.readValue<BrowserMessage>(
305+
"""
306+
{
307+
"command": "sendUiClickTelemetry"
308+
309+
}
310+
"""
311+
)
312+
}
313+
}
276314
}

plugins/core/webview/src/q-ui/components/login.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,14 @@ const authUiClickOptionMap = {
3434
[LoginIdentifier.ENTERPRISE_SSO]: 'auth_idcOption',
3535
[LoginIdentifier.IAM_CREDENTIAL]: 'auth_credentialsOption',
3636
[LoginIdentifier.EXISTING_LOGINS]: 'auth_existingAuthOption',
37+
[LoginIdentifier.NONE]: "Unknown"
3738
}
3839
3940
function getUiClickEvent(loginIdentifier: LoginIdentifier) {
40-
return (authUiClickOptionMap as any)[loginIdentifier]
41+
if(!Object.keys(authUiClickOptionMap).includes(loginIdentifier)) {
42+
return "Unknown"
43+
}
44+
return (authUiClickOptionMap)[loginIdentifier]
4145
}
4246
4347
export default defineComponent({

plugins/core/webview/src/q-ui/components/qOptions.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,13 @@ export default defineComponent({
9090
this.selectedLoginOption = itemId
9191
},
9292
emitUiClickMetric(itemId: string) {
93-
this.$emit('emitUiClickTelemetry', itemId)
93+
const loginIdentifiers = Object.values(LoginIdentifier).map(value => value.toString());
94+
if(loginIdentifiers.includes(itemId) ) {
95+
this.$emit('emitUiClickTelemetry', itemId)
96+
} else {
97+
this.$emit('emitUiClickTelemetry', LoginIdentifier.EXISTING_LOGINS)
98+
}
99+
94100
},
95101
handleBackButtonClick() {
96102
this.$emit('backToMenu')

plugins/core/webview/src/q-ui/components/toolkitOptions.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,12 @@ export default defineComponent({
102102
this.selectedLoginOption = itemId
103103
},
104104
emitUiClickMetric(itemId: string) {
105-
this.$emit('emitUiClickTelemetry', itemId)
105+
const loginIdentifiers = Object.values(LoginIdentifier).map(value => value.toString());
106+
if(loginIdentifiers.includes(itemId) ) {
107+
this.$emit('emitUiClickTelemetry', itemId)
108+
} else {
109+
this.$emit('emitUiClickTelemetry', LoginIdentifier.EXISTING_LOGINS)
110+
}
106111
},
107112
handleBackButtonClick() {
108113
this.$emit('backToMenu')

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/webview/ToolkitLoginWebview.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,12 @@ class ToolkitWebviewBrowser(val project: Project, private val parentDisposable:
237237
}
238238

239239
is BrowserMessage.SendUiClickTelemetry -> {
240-
UiTelemetry.click(project, message.signInOptionClicked)
240+
val signInOption = message.signInOptionClicked
241+
if (signInOption.isNullOrEmpty()) {
242+
LOG.warn("Unknown sign in option")
243+
} else {
244+
UiTelemetry.click(project, signInOption)
245+
}
241246
}
242247
}
243248
}
@@ -336,6 +341,7 @@ class ToolkitWebviewBrowser(val project: Project, private val parentDisposable:
336341
fun component(): JComponent? = jcefBrowser.component
337342

338343
companion object {
344+
private val LOG = getLogger<ToolkitWebviewBrowser>()
339345
private const val WEB_SCRIPT_URI = "http://webview/js/toolkitGetStart.js"
340346
private const val DOMAIN = "webview"
341347
}

0 commit comments

Comments
 (0)