Commit b78b4ae2 authored by Moe Ahmadi's avatar Moe Ahmadi Committed by Commit Bot

[IOS][Language] Language Settings - LanguageSettingsMediator unittests

- Adds unittests for the LanguageSettingsMediator.
- Uses a PrefObserverBridge instead of a BooleanObserver to observe
  prefs::kOfferTranslateEnabled as it's more straight forward to stop
  during the shutdown and more consistent with the other observed prefs.
- Adds a method to the data source to stop observing the model which is
  called during the test teardown as well as by the TableViewController
  when being shutdown.

Bug: 957688
Change-Id: I003df740b56d611717c85193e0d61b592f1f90d5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1642812Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Commit-Queue: Moe Ahmadi <mahmadi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#666153}
parent e6a5915d
...@@ -55,3 +55,27 @@ source_set("language_ui") { ...@@ -55,3 +55,27 @@ source_set("language_ui") {
"//ui/base", "//ui/base",
] ]
} }
source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ]
testonly = true
sources = [
"language_settings_mediator_unittest.mm",
]
deps = [
"//base/test:test_support",
"//components/language/core/browser",
"//components/pref_registry",
"//components/prefs",
"//components/sync_preferences",
"//components/sync_preferences:test_support",
"//components/translate/core/browser",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/prefs:browser_prefs",
"//ios/chrome/browser/translate",
"//ios/chrome/browser/ui/settings/language",
"//ios/chrome/browser/ui/settings/language:language_ui",
"//ios/chrome/browser/ui/settings/language/cells",
"//testing/gtest",
]
}
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
// Returns whether or not Translate is enabled. // Returns whether or not Translate is enabled.
- (BOOL)translateEnabled; - (BOOL)translateEnabled;
// Stops observing the model. This is required during the shutdown.
- (void)stopObservingModel;
// The consumer for this protocol. // The consumer for this protocol.
@property(nonatomic, weak) id<LanguageSettingsConsumer> consumer; @property(nonatomic, weak) id<LanguageSettingsConsumer> consumer;
......
...@@ -26,8 +26,6 @@ ...@@ -26,8 +26,6 @@
#import "ios/chrome/browser/ui/settings/language/cells/language_item.h" #import "ios/chrome/browser/ui/settings/language/cells/language_item.h"
#import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h" #import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h"
#import "ios/chrome/browser/ui/settings/language/language_settings_histograms.h" #import "ios/chrome/browser/ui/settings/language/language_settings_histograms.h"
#import "ios/chrome/browser/ui/settings/utils/observable_boolean.h"
#import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/l10n/l10n_util_mac.h"
...@@ -35,10 +33,13 @@ ...@@ -35,10 +33,13 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface LanguageSettingsMediator () <BooleanObserver, PrefObserverDelegate> { @interface LanguageSettingsMediator () <PrefObserverDelegate> {
// Registrar for pref change notifications. // Registrar for pref change notifications.
std::unique_ptr<PrefChangeRegistrar> _prefChangeRegistrar; std::unique_ptr<PrefChangeRegistrar> _prefChangeRegistrar;
// Pref observer to track changes to prefs::kOfferTranslateEnabled.
std::unique_ptr<PrefObserverBridge> _offerTranslatePrefObserverBridge;
// Pref observer to track changes to language::prefs::kAcceptLanguages. // Pref observer to track changes to language::prefs::kAcceptLanguages.
std::unique_ptr<PrefObserverBridge> _acceptLanguagesPrefObserverBridge; std::unique_ptr<PrefObserverBridge> _acceptLanguagesPrefObserverBridge;
...@@ -52,9 +53,6 @@ ...@@ -52,9 +53,6 @@
// The BrowserState passed to this instance. // The BrowserState passed to this instance.
@property(nonatomic, assign) ios::ChromeBrowserState* browserState; @property(nonatomic, assign) ios::ChromeBrowserState* browserState;
// An observable boolean backed by prefs::kOfferTranslateEnabled.
@property(nonatomic, strong) PrefBackedBoolean* translateEnabledPref;
@end @end
@implementation LanguageSettingsMediator @implementation LanguageSettingsMediator
...@@ -67,13 +65,12 @@ ...@@ -67,13 +65,12 @@
if (self) { if (self) {
_browserState = browserState; _browserState = browserState;
_translateEnabledPref = [[PrefBackedBoolean alloc]
initWithPrefService:browserState->GetPrefs()
prefName:prefs::kOfferTranslateEnabled];
[_translateEnabledPref setObserver:self];
_prefChangeRegistrar = std::make_unique<PrefChangeRegistrar>(); _prefChangeRegistrar = std::make_unique<PrefChangeRegistrar>();
_prefChangeRegistrar->Init(browserState->GetPrefs()); _prefChangeRegistrar->Init(browserState->GetPrefs());
_offerTranslatePrefObserverBridge =
std::make_unique<PrefObserverBridge>(self);
_offerTranslatePrefObserverBridge->ObserveChangesForPreference(
prefs::kOfferTranslateEnabled, _prefChangeRegistrar.get());
_acceptLanguagesPrefObserverBridge = _acceptLanguagesPrefObserverBridge =
std::make_unique<PrefObserverBridge>(self); std::make_unique<PrefObserverBridge>(self);
_acceptLanguagesPrefObserverBridge->ObserveChangesForPreference( _acceptLanguagesPrefObserverBridge->ObserveChangesForPreference(
...@@ -89,26 +86,27 @@ ...@@ -89,26 +86,27 @@
return self; return self;
} }
#pragma mark - BooleanObserver - (void)dealloc {
// In case this has not been explicitly called.
// Called when the value of prefs::kOfferTranslateEnabled changes. [self stopObservingModel];
- (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean {
DCHECK_EQ(self.translateEnabledPref, observableBoolean);
// Inform the consumer.
[self.consumer translateEnabled:observableBoolean.value];
} }
#pragma mark - PrefObserverDelegate #pragma mark - PrefObserverDelegate
// Called when the value of language::prefs::kAcceptLanguages or // Called when the value of prefs::kOfferTranslateEnabled,
// language::prefs::kAcceptLanguages or
// language::prefs::kFluentLanguages change. // language::prefs::kFluentLanguages change.
- (void)onPreferenceChanged:(const std::string&)preferenceName { - (void)onPreferenceChanged:(const std::string&)preferenceName {
DCHECK(preferenceName == language::prefs::kAcceptLanguages || DCHECK(preferenceName == prefs::kOfferTranslateEnabled ||
preferenceName == language::prefs::kAcceptLanguages ||
preferenceName == language::prefs::kFluentLanguages); preferenceName == language::prefs::kFluentLanguages);
// Inform the consumer // Inform the consumer.
[self.consumer languagePrefsChanged]; if (preferenceName == prefs::kOfferTranslateEnabled) {
[self.consumer translateEnabled:[self translateEnabled]];
} else {
[self.consumer languagePrefsChanged];
}
} }
#pragma mark - LanguageSettingsDataSource #pragma mark - LanguageSettingsDataSource
...@@ -205,13 +203,22 @@ ...@@ -205,13 +203,22 @@
} }
- (BOOL)translateEnabled { - (BOOL)translateEnabled {
return self.translateEnabledPref.value; return self.browserState->GetPrefs()->GetBoolean(
prefs::kOfferTranslateEnabled);
}
- (void)stopObservingModel {
_offerTranslatePrefObserverBridge.reset();
_acceptLanguagesPrefObserverBridge.reset();
_fluentLanguagesPrefObserverBridge.reset();
_prefChangeRegistrar.reset();
} }
#pragma mark - LanguageSettingsCommands #pragma mark - LanguageSettingsCommands
- (void)setTranslateEnabled:(BOOL)enabled { - (void)setTranslateEnabled:(BOOL)enabled {
[self.translateEnabledPref setValue:enabled]; self.browserState->GetPrefs()->SetBoolean(prefs::kOfferTranslateEnabled,
enabled);
UMA_HISTOGRAM_ENUMERATION( UMA_HISTOGRAM_ENUMERATION(
kLanguageSettingsActionsHistogram, kLanguageSettingsActionsHistogram,
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_LANGUAGE_SETTINGS_TABLE_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_LANGUAGE_SETTINGS_TABLE_VIEW_CONTROLLER_H_
#import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h" #import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h"
#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
#import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h"
@protocol LanguageSettingsDataSource; @protocol LanguageSettingsDataSource;
...@@ -14,7 +15,8 @@ ...@@ -14,7 +15,8 @@
// Controller for the UI that allows the user to change language settings such // Controller for the UI that allows the user to change language settings such
// as the ordered list of accept languages and their Translate preferences. // as the ordered list of accept languages and their Translate preferences.
@interface LanguageSettingsTableViewController @interface LanguageSettingsTableViewController
: SettingsRootTableViewController <LanguageSettingsConsumer> : SettingsRootTableViewController <LanguageSettingsConsumer,
SettingsControllerProtocol>
// The designated initializer. |dataSource| and |commandHandler| must not be // The designated initializer. |dataSource| and |commandHandler| must not be
// nil. |commandHandler| will not be retained. // nil. |commandHandler| will not be retained.
......
...@@ -159,6 +159,12 @@ typedef NS_ENUM(NSInteger, ItemType) { ...@@ -159,6 +159,12 @@ typedef NS_ENUM(NSInteger, ItemType) {
[self setTranslateSwitchItemEnabled:!self.isEditing]; [self setTranslateSwitchItemEnabled:!self.isEditing];
} }
#pragma mark - SettingsControllerProtocol
- (void)settingsWillBeDismissed {
[self.dataSource stopObservingModel];
}
#pragma mark - UITableViewDelegate #pragma mark - UITableViewDelegate
- (UITableViewCellEditingStyle)tableView:(UITableView*)tableView - (UITableViewCellEditingStyle)tableView:(UITableView*)tableView
......
...@@ -238,6 +238,7 @@ test("ios_chrome_unittests") { ...@@ -238,6 +238,7 @@ test("ios_chrome_unittests") {
"//ios/chrome/browser/ui/settings/autofill:unit_tests", "//ios/chrome/browser/ui/settings/autofill:unit_tests",
"//ios/chrome/browser/ui/settings/cells:unit_tests", "//ios/chrome/browser/ui/settings/cells:unit_tests",
"//ios/chrome/browser/ui/settings/clear_browsing_data:unit_tests", "//ios/chrome/browser/ui/settings/clear_browsing_data:unit_tests",
"//ios/chrome/browser/ui/settings/language:unit_tests",
"//ios/chrome/browser/ui/settings/password:unit_tests", "//ios/chrome/browser/ui/settings/password:unit_tests",
"//ios/chrome/browser/ui/settings/sync:unit_tests", "//ios/chrome/browser/ui/settings/sync:unit_tests",
"//ios/chrome/browser/ui/side_swipe:unit_tests", "//ios/chrome/browser/ui/side_swipe:unit_tests",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment