summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorglotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-21 09:39:54 +0000
committerglotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-21 09:39:54 +0000
commit9dc43cd47ddbda46518f6a94d9286fb79fd06755 (patch)
treeb4e539877dfa20dc7836695627b10ac81a2089d9 /chrome
parent5aa306363795ac82639aa25e3dfc5f181e3a1993 (diff)
downloadchromium_src-9dc43cd47ddbda46518f6a94d9286fb79fd06755.zip
chromium_src-9dc43cd47ddbda46518f6a94d9286fb79fd06755.tar.gz
chromium_src-9dc43cd47ddbda46518f6a94d9286fb79fd06755.tar.bz2
Implementation details of 1596023 (UI Language switch implemented).
DEPENDS_ON=1648004 (http://codereview.chromium.org/1648004/show) DEPENDS_ON=1596023 (http://codereview.chromium.org/1596023/show) DEPENDS_ON=1568033 (http://codereview.chromium.org/1568033/show) BUG=none TEST=none Review URL: http://codereview.chromium.org/1551029 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45172 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/chromeos/login/background_view.cc16
-rw-r--r--chrome/browser/chromeos/login/background_view.h7
-rw-r--r--chrome/browser/chromeos/login/language_switch_model.cc60
-rw-r--r--chrome/browser/chromeos/login/language_switch_model.h19
-rw-r--r--chrome/browser/chromeos/login/login_manager_view.cc10
-rw-r--r--chrome/browser/chromeos/login/login_manager_view.h1
-rw-r--r--chrome/browser/chromeos/login/mock_screen_observer.h2
-rw-r--r--chrome/browser/chromeos/login/network_screen.cc4
-rw-r--r--chrome/browser/chromeos/login/screen_observer.h8
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.cc33
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.h2
-rw-r--r--chrome/browser/chromeos/login/wizard_controller_browsertest.cc26
12 files changed, 72 insertions, 116 deletions
diff --git a/chrome/browser/chromeos/login/background_view.cc b/chrome/browser/chromeos/login/background_view.cc
index d5d9c3a..2c2afe8 100644
--- a/chrome/browser/chromeos/login/background_view.cc
+++ b/chrome/browser/chromeos/login/background_view.cc
@@ -30,17 +30,6 @@ BackgroundView::BackgroundView() : status_area_(NULL), did_paint_(false) {
InitStatusArea();
}
-void BackgroundView::Init() {
- InitStatusArea();
- Layout();
- status_area_->SchedulePaint();
-}
-
-void BackgroundView::Teardown() {
- RemoveAllChildViews(true);
- status_area_ = NULL;
-}
-
static void ResetXCursor() {
// TODO(sky): nuke this once new window manager is in place.
// This gets rid of the ugly X default cursor.
@@ -120,6 +109,11 @@ bool BackgroundView::IsButtonVisible(const views::View* button_view) const {
return true;
}
+void BackgroundView::LocaleChanged() {
+ Layout();
+ SchedulePaint();
+}
+
void BackgroundView::InitStatusArea() {
DCHECK(status_area_ == NULL);
status_area_ = new StatusAreaView(this);
diff --git a/chrome/browser/chromeos/login/background_view.h b/chrome/browser/chromeos/login/background_view.h
index 27dacd7..ca2d340 100644
--- a/chrome/browser/chromeos/login/background_view.h
+++ b/chrome/browser/chromeos/login/background_view.h
@@ -24,21 +24,18 @@ class BackgroundView : public views::View, public StatusAreaHost {
public:
BackgroundView();
- // Initializes child views of background view.
- void Init();
- // Deletes child views of background view.
- void Teardown();
-
// Creates a window containing an instance of WizardContentsView as the root
// view. The caller is responsible for showing (and closing) the returned
// widget. The BackgroundView is set in |view|.
static views::Widget* CreateWindowContainingView(const gfx::Rect& bounds,
BackgroundView** view);
+ protected:
// Overridden from views::View:
virtual void Paint(gfx::Canvas* canvas);
virtual void Layout();
virtual void ChildPreferredSizeChanged(View* child);
+ virtual void LocaleChanged();
// Overridden from StatusAreaHost:
virtual Profile* GetProfile() const { return NULL; }
diff --git a/chrome/browser/chromeos/login/language_switch_model.cc b/chrome/browser/chromeos/login/language_switch_model.cc
index 2033346..4a2c29c 100644
--- a/chrome/browser/chromeos/login/language_switch_model.cc
+++ b/chrome/browser/chromeos/login/language_switch_model.cc
@@ -5,43 +5,51 @@
#include "chrome/browser/chromeos/login/language_switch_model.h"
#include "app/l10n_util.h"
+#include "app/resource_bundle.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/screen_observer.h"
#include "chrome/browser/pref_service.h"
#include "chrome/common/pref_names.h"
#include "grit/generated_resources.h"
+#include "views/widget/widget_gtk.h"
namespace {
+
const int kLanguageMainMenuSize = 5;
+// TODO(glotov): need to specify the list as a part of the image customization.
+const char kLanguagesTopped[] = "es,it,de,fr,en-US";
+
} // namespace
namespace chromeos {
-LanguageSwitchModel::LanguageSwitchModel(ScreenObserver* observer,
- ScreenObserver::ExitCodes new_state)
+LanguageSwitchModel::LanguageSwitchModel()
: ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_(this)),
- ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_submenu_(this)),
- menu_(NULL),
- observer_(observer),
- new_state_(new_state) {
- // TODO(glotov): need to specify the following list as a part of the
- // image customization.
- language_list_.CopySpecifiedLanguagesUp("es,it,de,fr,en-US");
+ ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_submenu_(this)) {
}
void LanguageSwitchModel::InitLanguageMenu() {
+ // Update LanguageList to contain entries in current locale.
+ language_list_.reset(new LanguageList);
+ language_list_->CopySpecifiedLanguagesUp(kLanguagesTopped);
+
+ // Clear older menu items.
+ menu_model_.Clear();
+ menu_model_submenu_.Clear();
+
+ // Fill menu items with updated items.
for (int line = 0; line != kLanguageMainMenuSize; line++) {
menu_model_.AddItem(
- line, WideToUTF16(language_list_.GetLanguageNameAt(line)));
+ line, WideToUTF16(language_list_->GetLanguageNameAt(line)));
}
menu_model_.AddSeparator();
menu_model_.AddSubMenu(WideToUTF16(l10n_util::GetString(IDS_LANGUAGES_MORE)),
&menu_model_submenu_);
for (int line = kLanguageMainMenuSize;
- line != language_list_.get_languages_count(); line++) {
+ line != language_list_->get_languages_count(); line++) {
menu_model_submenu_.AddItem(
- line, WideToUTF16(language_list_.GetLanguageNameAt(line)));
+ line, WideToUTF16(language_list_->GetLanguageNameAt(line)));
}
// Initialize menu here so it appears fast when called.
@@ -51,8 +59,8 @@ void LanguageSwitchModel::InitLanguageMenu() {
std::wstring LanguageSwitchModel::GetCurrentLocaleName() const {
DCHECK(g_browser_process);
const std::string locale = g_browser_process->GetApplicationLocale();
- return language_list_.GetLanguageNameAt(
- language_list_.GetIndexFromLocale(locale));
+ return language_list_->GetLanguageNameAt(
+ language_list_->GetIndexFromLocale(locale));
};
////////////////////////////////////////////////////////////////////////////////
@@ -80,14 +88,30 @@ bool LanguageSwitchModel::GetAcceleratorForCommandId(
}
void LanguageSwitchModel::ExecuteCommand(int command_id) {
- const std::string locale = language_list_.GetLocaleFromIndex(command_id);
+ const std::string locale = language_list_->GetLocaleFromIndex(command_id);
+ SwitchLanguage(locale);
+ InitLanguageMenu();
+
+ // Update all view hierarchies that the locale has changed.
+ views::Widget::NotifyLocaleChanged();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Private implementation.
+
+// static
+void LanguageSwitchModel::SwitchLanguage(const std::string& locale) {
+ // Save new locale.
DCHECK(g_browser_process);
PrefService* prefs = g_browser_process->local_state();
prefs->SetString(prefs::kApplicationLocale, UTF8ToWide(locale));
prefs->SavePersistentPrefs();
- observer_->OnSwitchLanguage(locale, new_state_);
- // Don't do anything here because |this| has just been deleted in order
- // to force releasing all locale-specific data.
+
+ // Switch the locale.
+ ResourceBundle::ReloadSharedInstance(UTF8ToWide(locale));
+
+ // The following line does not seem to affect locale anyhow. Maybe in future..
+ g_browser_process->SetApplicationLocale(locale);
}
} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/language_switch_model.h b/chrome/browser/chromeos/login/language_switch_model.h
index 1d46bec..09155c5 100644
--- a/chrome/browser/chromeos/login/language_switch_model.h
+++ b/chrome/browser/chromeos/login/language_switch_model.h
@@ -8,11 +8,14 @@
#include <string>
#include "app/menus/simple_menu_model.h"
-#include "chrome/browser/chromeos/login/screen_observer.h"
+#include "base/scoped_ptr.h"
#include "chrome/browser/language_combobox_model.h"
#include "views/controls/menu/menu_2.h"
#include "views/controls/menu/view_menu_delegate.h"
#include "views/view.h"
+#include "testing/gtest/include/gtest/gtest_prod.h"
+
+class WizardControllerTest_SwitchLanguage_Test;
namespace chromeos {
@@ -21,8 +24,7 @@ class ScreenObserver;
class LanguageSwitchModel : public views::ViewMenuDelegate,
public menus::SimpleMenuModel::Delegate {
public:
- LanguageSwitchModel(ScreenObserver* observer,
- ScreenObserver::ExitCodes new_state);
+ LanguageSwitchModel();
// Initializes language selection menu contents.
void InitLanguageMenu();
@@ -41,19 +43,18 @@ class LanguageSwitchModel : public views::ViewMenuDelegate,
menus::Accelerator* accelerator);
virtual void ExecuteCommand(int command_id);
+ // Switches the current locale, saves the new locale in preferences.
+ static void SwitchLanguage(const std::string& locale);
+
// Dialog controls that we own ourselves.
menus::SimpleMenuModel menu_model_;
menus::SimpleMenuModel menu_model_submenu_;
scoped_ptr<views::Menu2> menu_;
- // Notifications receiver.
- ScreenObserver* observer_;
-
// Language locale name storage.
- LanguageList language_list_;
-
- ScreenObserver::ExitCodes new_state_;
+ scoped_ptr<LanguageList> language_list_;
+ FRIEND_TEST(::WizardControllerTest, SwitchLanguage);
DISALLOW_COPY_AND_ASSIGN(LanguageSwitchModel);
};
diff --git a/chrome/browser/chromeos/login/login_manager_view.cc b/chrome/browser/chromeos/login/login_manager_view.cc
index 67fbf99..eb365e7 100644
--- a/chrome/browser/chromeos/login/login_manager_view.cc
+++ b/chrome/browser/chromeos/login/login_manager_view.cc
@@ -83,9 +83,7 @@ LoginManagerView::LoginManagerView(ScreenObserver* observer)
observer_(observer),
error_id_(-1),
ALLOW_THIS_IN_INITIALIZER_LIST(focus_grabber_factory_(this)),
- focus_delayed_(false),
- language_switch_model_(observer,
- ScreenObserver::LANGUAGE_CHANGED_ON_LOGIN) {
+ focus_delayed_(false) {
// Create login observer to record time of login when successful.
LogLoginSuccessObserver::Get();
if (kStubOutLogin)
@@ -205,6 +203,12 @@ void LoginManagerView::UpdateLocalizedStrings() {
languages_menubutton_->SetText(language_switch_model_.GetCurrentLocaleName());
}
+void LoginManagerView::LocaleChanged() {
+ UpdateLocalizedStrings();
+ Layout();
+ SchedulePaint();
+}
+
void LoginManagerView::RequestFocus() {
MessageLoop::current()->PostTask(FROM_HERE,
focus_grabber_factory_.NewRunnableMethod(
diff --git a/chrome/browser/chromeos/login/login_manager_view.h b/chrome/browser/chromeos/login/login_manager_view.h
index 812699c..540262a 100644
--- a/chrome/browser/chromeos/login/login_manager_view.h
+++ b/chrome/browser/chromeos/login/login_manager_view.h
@@ -98,6 +98,7 @@ class LoginManagerView : public views::View,
virtual void NativeViewHierarchyChanged(bool attached,
gfx::NativeView native_view,
views::RootView* root_view);
+ virtual void LocaleChanged();
private:
// Given a |username| and |password|, this method attempts to authenticate to
diff --git a/chrome/browser/chromeos/login/mock_screen_observer.h b/chrome/browser/chromeos/login/mock_screen_observer.h
index a092ad1..1df4106 100644
--- a/chrome/browser/chromeos/login/mock_screen_observer.h
+++ b/chrome/browser/chromeos/login/mock_screen_observer.h
@@ -19,8 +19,6 @@ class MockScreenObserver : public ScreenObserver {
MockScreenObserver() {}
virtual ~MockScreenObserver() {}
MOCK_METHOD1(OnExit, void(ExitCodes));
- MOCK_METHOD2(OnSwitchLanguage, void(const std::string&,
- ScreenObserver::ExitCodes));
MOCK_METHOD2(OnSetUserNamePassword,
void(const std::string&, const std::string&));
};
diff --git a/chrome/browser/chromeos/login/network_screen.cc b/chrome/browser/chromeos/login/network_screen.cc
index 5ebc2d1c..7468e70 100644
--- a/chrome/browser/chromeos/login/network_screen.cc
+++ b/chrome/browser/chromeos/login/network_screen.cc
@@ -24,9 +24,7 @@ NetworkScreen::NetworkScreen(WizardScreenDelegate* delegate, bool is_out_of_box)
: ViewScreen<NetworkSelectionView>(delegate),
is_network_subscribed_(false),
is_out_of_box_(is_out_of_box),
- ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
- language_switch_model_(delegate->GetObserver(this),
- ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK) {
+ ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)) {
}
NetworkScreen::~NetworkScreen() {
diff --git a/chrome/browser/chromeos/login/screen_observer.h b/chrome/browser/chromeos/login/screen_observer.h
index 4bd34fb..8c1f6e3 100644
--- a/chrome/browser/chromeos/login/screen_observer.h
+++ b/chrome/browser/chromeos/login/screen_observer.h
@@ -26,8 +26,6 @@ class ScreenObserver {
ACCOUNT_CREATE_BACK,
ACCOUNT_CREATED,
CONNECTION_FAILED,
- LANGUAGE_CHANGED_ON_LOGIN,
- LANGUAGE_CHANGED_ON_NETWORK,
UPDATE_INSTALLED,
UPDATE_NOUPDATE,
UPDATE_NETWORK_ERROR,
@@ -38,12 +36,6 @@ class ScreenObserver {
// Method called by a screen when user's done with it.
virtual void OnExit(ExitCodes exit_code) = 0;
- // Switch to the new language. |lang| specifies new language locale code.
- // Caution: this callback resets (deletes and re-creates) all views
- // (including *this), so do not access it after you call this!
- virtual void OnSwitchLanguage(const std::string& lang,
- ScreenObserver::ExitCodes new_state) = 0;
-
// Notify about new user names and password. It is used to autologin
// just created user without asking the same info once again.
virtual void OnSetUserNamePassword(const std::string& username,
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 810e60f1..7748e5c 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -11,11 +11,9 @@
#include <string>
#include <vector>
-#include "app/resource_bundle.h"
#include "app/l10n_util.h"
#include "base/command_line.h"
#include "base/logging.h" // For NOTREACHED.
-#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/login_library.h"
#include "chrome/browser/chromeos/login/account_screen.h"
@@ -316,31 +314,6 @@ void WizardController::OnUpdateNetworkError() {
///////////////////////////////////////////////////////////////////////////////
// WizardController, private:
-void WizardController::OnSwitchLanguage(const std::string& lang,
- ScreenObserver::ExitCodes new_state) {
- // Delete all views that may reference locale-specific data.
- SetCurrentScreen(NULL);
- network_screen_.reset();
- login_screen_.reset();
- account_screen_.reset();
- update_screen_.reset();
- contents_->RemoveAllChildViews(true);
- // Can't delete background view since we don't know how to recreate it.
- if (background_view_)
- background_view_->Teardown();
-
- // Switch the locale.
- ResourceBundle::CleanupSharedInstance();
- ResourceBundle::InitSharedInstance(UTF8ToWide(lang));
-
- // The following line does not seem to affect locale anyhow. Maybe in future..
- g_browser_process->SetApplicationLocale(lang);
-
- // Recreate view hierarchy and return to the wizard screen.
- if (background_view_)
- background_view_->Init();
- OnExit(new_state);
-}
void WizardController::OnSetUserNamePassword(const std::string& username,
const std::string& password) {
@@ -392,12 +365,6 @@ void WizardController::OnExit(ExitCodes exit_code) {
case CONNECTION_FAILED:
OnConnectionFailed();
break;
- case LANGUAGE_CHANGED_ON_NETWORK:
- SetCurrentScreen(GetNetworkScreen());
- break;
- case LANGUAGE_CHANGED_ON_LOGIN:
- SetCurrentScreen(GetLoginScreen());
- break;
case UPDATE_INSTALLED:
case UPDATE_NOUPDATE:
OnUpdateCompleted();
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index ecf8d01..d40e453 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -102,8 +102,6 @@ class WizardController : public chromeos::ScreenObserver,
// Overridden from chromeos::ScreenObserver:
virtual void OnExit(ExitCodes exit_code);
- virtual void OnSwitchLanguage(const std::string& lang,
- ScreenObserver::ExitCodes new_state);
virtual void OnSetUserNamePassword(const std::string& username,
const std::string& password);
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index ec3f266..01e530c 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -5,10 +5,10 @@
#include "app/l10n_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/account_screen.h"
+#include "chrome/browser/chromeos/login/language_switch_model.h"
#include "chrome/browser/chromeos/login/mock_update_screen.h"
#include "chrome/browser/chromeos/login/network_screen.h"
#include "chrome/browser/chromeos/login/network_selection_view.h"
-#include "chrome/browser/chromeos/login/update_screen.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h"
#include "chrome/common/chrome_switches.h"
@@ -77,8 +77,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
EXPECT_FALSE(current_screen->UILayoutIsRightToLeft());
const std::wstring en_str = l10n_util::GetString(IDS_NETWORK_SELECTION_TITLE);
- wizard->OnSwitchLanguage(
- "fr", chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK);
+ chromeos::LanguageSwitchModel::SwitchLanguage("fr");
EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage());
EXPECT_FALSE(current_screen->UILayoutIsRightToLeft());
@@ -86,8 +85,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerTest, SwitchLanguage) {
EXPECT_NE(en_str, fr_str);
- wizard->OnSwitchLanguage(
- "ar", chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK);
+ chromeos::LanguageSwitchModel::SwitchLanguage("ar");
EXPECT_EQ("ar", g_browser_process->GetApplicationLocale());
EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage());
EXPECT_TRUE(current_screen->UILayoutIsRightToLeft());
@@ -152,22 +150,6 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
}
-IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowLanguageOnNetwork) {
- EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
- EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
- EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
- controller()->OnExit(chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_NETWORK);
- EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
-}
-
-IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowLanguageOnLogin) {
- EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
- EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
- EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
- controller()->OnExit(chromeos::ScreenObserver::LANGUAGE_CHANGED_ON_LOGIN);
- EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
-}
-
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
EXPECT_CALL(*mock_update_screen_, StartUpdate()).Times(1);
@@ -192,5 +174,5 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorNetwork) {
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
}
-COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 13,
+COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 11,
add_tests_for_new_control_flow_you_just_introduced);