From 207628a0c7517a19bf36e51d8889d862c695b23a Mon Sep 17 00:00:00 2001 From: Vikash Dubey <11042814+vikdubey@users.noreply.github.com> Date: Fri, 4 Apr 2025 18:13:57 +0530 Subject: [PATCH 1/8] Make maybeEnum more robust in google_identity_services_web shared file. --- .../lib/src/js_interop/shared.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/google_identity_services_web/lib/src/js_interop/shared.dart b/packages/google_identity_services_web/lib/src/js_interop/shared.dart index a5645038326..feb0b86bea1 100644 --- a/packages/google_identity_services_web/lib/src/js_interop/shared.dart +++ b/packages/google_identity_services_web/lib/src/js_interop/shared.dart @@ -7,7 +7,12 @@ T? maybeEnum(String? needle, List haystack) { if (needle == null) { return null; } - return haystack.byName(needle); + for (T enumValue in haystack) { + if (enumValue.name == needle) { + return enumValue; + } + } + return null; } /// The type of several functions from the library, that don't receive From 139156b57884b2aa82fc9d6507b1aa46157ca851 Mon Sep 17 00:00:00 2001 From: Vikash Dubey <11042814+vikdubey@users.noreply.github.com> Date: Sat, 5 Apr 2025 16:11:04 +0530 Subject: [PATCH 2/8] Use `final` for variable name to follow prefer_final_in_for_each rule. --- .../lib/src/js_interop/shared.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/google_identity_services_web/lib/src/js_interop/shared.dart b/packages/google_identity_services_web/lib/src/js_interop/shared.dart index feb0b86bea1..532246e9f16 100644 --- a/packages/google_identity_services_web/lib/src/js_interop/shared.dart +++ b/packages/google_identity_services_web/lib/src/js_interop/shared.dart @@ -7,9 +7,9 @@ T? maybeEnum(String? needle, List haystack) { if (needle == null) { return null; } - for (T enumValue in haystack) { - if (enumValue.name == needle) { - return enumValue; + for (final T value in haystack) { + if (value.name == needle) { + return value; } } return null; From fc58dd52066dbefd53faea3d9f0feaa06a72400c Mon Sep 17 00:00:00 2001 From: Vikash Dubey Date: Wed, 9 Apr 2025 18:43:09 +0530 Subject: [PATCH 3/8] Update changelog and pubsec. Also fix test readme file. --- packages/google_identity_services_web/CHANGELOG.md | 4 ++++ packages/google_identity_services_web/pubspec.yaml | 2 +- packages/google_identity_services_web/test/README.md | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/google_identity_services_web/CHANGELOG.md b/packages/google_identity_services_web/CHANGELOG.md index 74323f88c30..ba439d41d12 100644 --- a/packages/google_identity_services_web/CHANGELOG.md +++ b/packages/google_identity_services_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.4 + +* Fixes potential exceptions while fetching `Moment*Reason` for invalid value. + ## 0.3.3 * Moves all the JavaScript types to extend `JSObject`. diff --git a/packages/google_identity_services_web/pubspec.yaml b/packages/google_identity_services_web/pubspec.yaml index cedb0e5b194..e8f121d0660 100644 --- a/packages/google_identity_services_web/pubspec.yaml +++ b/packages/google_identity_services_web/pubspec.yaml @@ -2,7 +2,7 @@ name: google_identity_services_web description: A Dart JS-interop layer for Google Identity Services. Google's new sign-in SDK for Web that supports multiple types of credentials. repository: https://github.com/flutter/packages/tree/main/packages/google_identity_services_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_identiy_services_web%22 -version: 0.3.3 +version: 0.3.4 environment: sdk: ^3.4.0 diff --git a/packages/google_identity_services_web/test/README.md b/packages/google_identity_services_web/test/README.md index 38faf114033..5166f0e2459 100644 --- a/packages/google_identity_services_web/test/README.md +++ b/packages/google_identity_services_web/test/README.md @@ -1,6 +1,6 @@ # Tests -Use `dart run tool/run_tests.dart` to run tests in this package. +Use `dart test -p chrome .dart` to run tests in this package. ## Failed to run Chrome: No such file or directory From 01ae2975fc769c2d5d1cbb0f91cc135f9d52b528 Mon Sep 17 00:00:00 2001 From: Vikash Dubey Date: Thu, 10 Apr 2025 19:40:36 +0530 Subject: [PATCH 4/8] Add tests for the maybeEnum change. Also, refactor existing mock-gis.js file to pass moment notification from test directly. --- .../integration_test/js_interop_id_test.dart | 23 +++++++++++++++++-- .../example/integration_test/utils.dart | 14 ++++++++++- .../example/web/mock-gis.js | 15 ++++++------ 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart b/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart index 6c5da4bcd14..cc27ba80b79 100644 --- a/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart +++ b/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart @@ -83,8 +83,11 @@ void main() async { }); group('prompt', () { - testWidgets('supports a moment notification callback', (_) async { + testWidgets( + 'supports a moment notification callback with correct type and reason', + (_) async { id.initialize(IdConfiguration(client_id: 'testing_1-2-3')); + utils.setMockMomentNotification("skipped", "user_cancel"); final StreamController controller = StreamController(); @@ -93,11 +96,27 @@ void main() async { final PromptMomentNotification moment = await controller.stream.first; - // These defaults are set in mock-gis.js expect(moment.getMomentType(), MomentType.skipped); expect(moment.getSkippedReason(), MomentSkippedReason.user_cancel); }); + testWidgets( + 'supports a moment notification callback while handling invalid reason ' + 'value gracefully', (_) async { + id.initialize(IdConfiguration(client_id: 'testing_1-2-3')); + utils.setMockMomentNotification("skipped", "random_invalid_reason"); + + final StreamController controller = + StreamController(); + + id.prompt(controller.add); + + final PromptMomentNotification moment = await controller.stream.first; + + expect(moment.getMomentType(), MomentType.skipped); + expect(moment.getSkippedReason(), isNull); + }); + testWidgets('calls config callback with credential response', (_) async { const String expected = 'should_be_a_proper_jwt_token'; utils.setMockCredentialResponse(expected); diff --git a/packages/google_identity_services_web/example/integration_test/utils.dart b/packages/google_identity_services_web/example/integration_test/utils.dart index a75d2d9e9ee..a27cce2f405 100644 --- a/packages/google_identity_services_web/example/integration_test/utils.dart +++ b/packages/google_identity_services_web/example/integration_test/utils.dart @@ -90,12 +90,18 @@ void setMockTokenResponse(TokenClient client, [String? authToken]) { client.setMockTokenResponse(authToken?.toJS); } -/// Allows calling a `setMockCredentialResponse` method (set by mock-gis.js) +/// Allows calling `setMockCredentialResponse` and `setMockMomentNotification` +/// methods (set by mock-gis.js). extension on GoogleAccountsId { external void setMockCredentialResponse( JSString credential, JSString select_by, //ignore: non_constant_identifier_names ); + + external void setMockMomentNotification( + JSString momentType, + JSString reason, + ); } /// Sets a mock credential response in `google.accounts.id`. @@ -103,6 +109,12 @@ void setMockCredentialResponse([String value = 'default_value']) { _getGoogleAccountsId().setMockCredentialResponse(value.toJS, 'auto'.toJS); } +/// Sets a mock moment notification in `google.accounts.id`. +void setMockMomentNotification(String momentType, String reason) { + _getGoogleAccountsId() + .setMockMomentNotification(momentType.toJS, reason.toJS); +} + GoogleAccountsId _getGoogleAccountsId() { return _getDeepProperty( web.window as JSObject, 'google.accounts.id'); diff --git a/packages/google_identity_services_web/example/web/mock-gis.js b/packages/google_identity_services_web/example/web/mock-gis.js index 5921c5eb89f..e99ac6347ee 100644 --- a/packages/google_identity_services_web/example/web/mock-gis.js +++ b/packages/google_identity_services_web/example/web/mock-gis.js @@ -22,9 +22,6 @@ class PromptMomentNotification { isNotDisplayed() { return this.isDisplayMoment() && this.reason; } } -const CREDENTIAL_RETURNED = new PromptMomentNotification("dismissed", "credential_returned"); -const USER_CANCEL = new PromptMomentNotification("skipped", "user_cancel"); - function callAsync(func, timeout = 100) { window.setTimeout(func, timeout) } @@ -47,11 +44,11 @@ class Id { if (callback) { callback(this.mockCredentialResponse); } - if (momentListener) { - momentListener(CREDENTIAL_RETURNED); + } + if (momentListener) { + if (this.mockMomentNotification) { + momentListener(this.mockMomentNotification); } - } else if (momentListener) { - momentListener(USER_CANCEL); } }); } @@ -61,11 +58,15 @@ class Id { select_by: select_by, }; } + setMockMomentNotification(momentType, reason) { + this.mockMomentNotification = new PromptMomentNotification(momentType, reason); + } disableAutoSelect() {} storeCredential() {} cancel() {} revoke(hint, callback) { this.mockCredentialResponse = null; + this.mockMomentNotification = null; if (!callback) { return; } From 7d1a3fc32a279c44785d1eb30e4add2412ad56fa Mon Sep 17 00:00:00 2001 From: Vikash Dubey Date: Thu, 10 Apr 2025 19:47:54 +0530 Subject: [PATCH 5/8] Update documentation for maybeEnum. --- .../google_identity_services_web/lib/src/js_interop/shared.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/google_identity_services_web/lib/src/js_interop/shared.dart b/packages/google_identity_services_web/lib/src/js_interop/shared.dart index 532246e9f16..ea762b457fb 100644 --- a/packages/google_identity_services_web/lib/src/js_interop/shared.dart +++ b/packages/google_identity_services_web/lib/src/js_interop/shared.dart @@ -3,6 +3,8 @@ // found in the LICENSE file. /// Attempts to retrieve an enum value from [haystack] if [needle] is not null. +/// +/// Returns `null` if no enum value in [haystack] matches [needle]. T? maybeEnum(String? needle, List haystack) { if (needle == null) { return null; From 7c9c11520ef0165b62205ce51c3299adaf9116f4 Mon Sep 17 00:00:00 2001 From: Vikash Dubey Date: Thu, 10 Apr 2025 19:56:09 +0530 Subject: [PATCH 6/8] Update changelog to rephrase changes in this PR. --- packages/google_identity_services_web/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google_identity_services_web/CHANGELOG.md b/packages/google_identity_services_web/CHANGELOG.md index ba439d41d12..a901c9ef34b 100644 --- a/packages/google_identity_services_web/CHANGELOG.md +++ b/packages/google_identity_services_web/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.3.4 -* Fixes potential exceptions while fetching `Moment*Reason` for invalid value. +* Handles potential exceptions gracefully while fetching `Moment*Reason` for invalid value. ## 0.3.3 From 3eeda7d4d71a0b9165709b85fddd002b33fc00f9 Mon Sep 17 00:00:00 2001 From: Vikash Dubey Date: Fri, 11 Apr 2025 12:09:09 +0530 Subject: [PATCH 7/8] Resolve prefer_single_quotes check. --- .../example/integration_test/js_interop_id_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart b/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart index cc27ba80b79..c49ed40cf3c 100644 --- a/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart +++ b/packages/google_identity_services_web/example/integration_test/js_interop_id_test.dart @@ -87,7 +87,7 @@ void main() async { 'supports a moment notification callback with correct type and reason', (_) async { id.initialize(IdConfiguration(client_id: 'testing_1-2-3')); - utils.setMockMomentNotification("skipped", "user_cancel"); + utils.setMockMomentNotification('skipped', 'user_cancel'); final StreamController controller = StreamController(); @@ -104,7 +104,7 @@ void main() async { 'supports a moment notification callback while handling invalid reason ' 'value gracefully', (_) async { id.initialize(IdConfiguration(client_id: 'testing_1-2-3')); - utils.setMockMomentNotification("skipped", "random_invalid_reason"); + utils.setMockMomentNotification('skipped', 'random_invalid_reason'); final StreamController controller = StreamController(); From eaf7c056800b040b5a9c40cc8e6763e3ec75a084 Mon Sep 17 00:00:00 2001 From: Vikash Dubey Date: Thu, 17 Apr 2025 11:33:09 +0530 Subject: [PATCH 8/8] Resolve comments - update readme and version. --- packages/google_identity_services_web/CHANGELOG.md | 2 +- packages/google_identity_services_web/README.md | 7 ------- packages/google_identity_services_web/pubspec.yaml | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/google_identity_services_web/CHANGELOG.md b/packages/google_identity_services_web/CHANGELOG.md index a901c9ef34b..1f8f8b4c2c7 100644 --- a/packages/google_identity_services_web/CHANGELOG.md +++ b/packages/google_identity_services_web/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.3.4 +## 0.3.3+1 * Handles potential exceptions gracefully while fetching `Moment*Reason` for invalid value. diff --git a/packages/google_identity_services_web/README.md b/packages/google_identity_services_web/README.md index 733644af5ba..f82eeb9b372 100644 --- a/packages/google_identity_services_web/README.md +++ b/packages/google_identity_services_web/README.md @@ -93,10 +93,3 @@ Refer to the official documentation site for the latest browser compatibility information of the underlying JS SDK: * **Sign In With Google > [Supported browsers and platforms](https://developers.google.com/identity/gsi/web/guides/supported-browsers)** - -## Testing - -This web-only package uses `dart:test` to test its features. They can be run -with `dart test -p chrome`. - -_(Look at `test/README.md` and `tool/run_tests.dart` for more info.)_ diff --git a/packages/google_identity_services_web/pubspec.yaml b/packages/google_identity_services_web/pubspec.yaml index e8f121d0660..4433fc6c6e0 100644 --- a/packages/google_identity_services_web/pubspec.yaml +++ b/packages/google_identity_services_web/pubspec.yaml @@ -2,7 +2,7 @@ name: google_identity_services_web description: A Dart JS-interop layer for Google Identity Services. Google's new sign-in SDK for Web that supports multiple types of credentials. repository: https://github.com/flutter/packages/tree/main/packages/google_identity_services_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_identiy_services_web%22 -version: 0.3.4 +version: 0.3.3+1 environment: sdk: ^3.4.0