Skip to content

Commit

Permalink
Fix PlatformDispatcher.locale to return something meaningful when the…
Browse files Browse the repository at this point in the history
…re are no locales.
  • Loading branch information
gspencergoog committed Nov 20, 2020
1 parent 020efea commit 6d95dda
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 4 deletions.
7 changes: 4 additions & 3 deletions lib/ui/platform_dispatcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -549,9 +549,10 @@ class PlatformDispatcher {
/// This is the first locale selected by the user and is the user's primary
/// locale (the locale the device UI is displayed in)
///
/// This is equivalent to `locales.first` and will provide an empty non-null
/// locale if the [locales] list has not been set or is empty.
Locale get locale => locales.first;
/// This is equivalent to `locales.first`, except that it will provide an
/// undefined (using the language tag "und") non-null locale if the [locales]
/// list has not been set or is empty.
Locale get locale => locales.isEmpty ? const Locale.fromSubtags() : locales.first;

/// The full system-reported supported locales of the device.
///
Expand Down
6 changes: 5 additions & 1 deletion lib/web_ui/lib/src/engine/platform_dispatcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,10 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
EngineSemanticsOwner.instance.updateSemantics(update);
}

/// This is equivalent to `locales.first`, except that it will provide an
/// undefined (using the language tag "und") non-null locale if the [locales]
/// list has not been set or is empty.
///
/// We use the first locale in the [locales] list instead of the browser's
/// built-in `navigator.language` because browsers do not agree on the
/// implementation.
Expand All @@ -554,7 +558,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
///
/// * https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages,
/// which explains browser quirks in the implementation notes.
ui.Locale get locale => locales.first;
ui.Locale get locale => locales.isEmpty ? const ui.Locale.fromSubtags() : locales.first;

/// The full system-reported supported locales of the device.
///
Expand Down
1 change: 1 addition & 0 deletions lib/web_ui/test/engine/window_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ void testMain() {
// that the list is populated again).
EnginePlatformDispatcher.instance.debugResetLocales();
expect(window.locales, isEmpty);
expect(window.locale, equals(const ui.Locale.fromSubtags()));
expect(localeChangedCount, 0);
html.window.dispatchEvent(html.Event('languagechange'));
expect(window.locales, isNotEmpty);
Expand Down
12 changes: 12 additions & 0 deletions testing/dart/window_hooks_integration_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -426,4 +426,16 @@ void main() {
expectEquals(window.padding.bottom, 0.0);
expectEquals(window.systemGestureInsets.bottom, 44.0);
});

test('PlatformDispatcher.locale returns unknown locale when locales is set to empty list', () {
Locale? locale;
runZoned(() {
window.onLocaleChanged = () {
locale = PlatformDispatcher.instance.locale;
};
});

_updateLocales(<String>[]);
expectEquals(locale, const Locale.fromSubtags());
});
}

0 comments on commit 6d95dda

Please sign in to comment.