summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordilmah@chromium.org <dilmah@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-13 14:02:56 +0000
committerdilmah@chromium.org <dilmah@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-13 14:02:56 +0000
commit61d68ef1198bf59e4e317f3f61e780564f99be3e (patch)
tree97754dd71f7b9acc12118951f8f29e5ee38a231f
parent824fee159375f3118333f0a3f21ed9e84a11a423 (diff)
downloadchromium_src-61d68ef1198bf59e4e317f3f61e780564f99be3e.zip
chromium_src-61d68ef1198bf59e4e317f3f61e780564f99be3e.tar.gz
chromium_src-61d68ef1198bf59e4e317f3f61e780564f99be3e.tar.bz2
For ChromeOS: when starting session:
if locale was changed (as a result of sync or because user preference differs from login locale): show notification. BUG=chromium-os:9164 TEST=Manual Review URL: http://codereview.chromium.org/5976005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71320 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/generated_resources.grd10
-rw-r--r--chrome/browser/chromeos/dom_ui/language_options_handler.cc15
-rw-r--r--chrome/browser/chromeos/locale_change_guard.cc134
-rw-r--r--chrome/browser/chromeos/locale_change_guard.h61
-rw-r--r--chrome/browser/chromeos/login/login_utils.cc63
-rw-r--r--chrome/browser/chromeos/notifications/system_notification.cc30
-rw-r--r--chrome/browser/chromeos/notifications/system_notification.h13
-rw-r--r--chrome/browser/notifications/notification_ui_manager.h4
-rw-r--r--chrome/browser/profiles/profile.cc8
-rw-r--r--chrome/browser/profiles/profile.h10
-rw-r--r--chrome/browser/profiles/profile_impl.cc24
-rw-r--r--chrome/browser/profiles/profile_impl.h4
-rw-r--r--chrome/browser/tab_contents/infobar_delegate.h10
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc14
-rw-r--r--chrome/chrome_browser.gypi26
-rw-r--r--chrome/common/pref_names.cc11
-rw-r--r--chrome/common/pref_names.h4
-rw-r--r--chrome/test/testing_profile.h2
-rw-r--r--chrome/tools/chromeactions.txt4
19 files changed, 378 insertions, 69 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 5f4cdd7..a6dc68a 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -4338,6 +4338,16 @@ Keep your key file in a safe place. You will need it to create new versions of y
You are using an unsupported command-line flag: <ph name="BAD_FLAG">$1<ex>--no-sandbox</ex></ph>. Stability and security will suffer.
</message>
+ <!-- Locale Change Notification-->
+ <if expr="pp_ifdef('chromeos')">
+ <message name="IDS_LOCALE_CHANGE_MESSAGE" desc="Message shown when locale was changed based on profile content.">
+ Interface language was changed: "<ph name="FROM_LOCALE">$1</ph>" => "<ph name="TO_LOCALE">$2</ph>" based on your preference.
+ </message>
+ <message name="IDS_LOCALE_CHANGE_REVERT_MESSAGE" desc="Link to revert a change.">
+ If you are unhappy about it: click here to close browser, sign out and revert.
+ </message>
+ </if>
+
<if expr="pp_ifdef('chromeos')">
<!-- about:system strings -->
<message name="IDS_ABOUT_SYS_TITLE" desc="about:system page title">
diff --git a/chrome/browser/chromeos/dom_ui/language_options_handler.cc b/chrome/browser/chromeos/dom_ui/language_options_handler.cc
index b4c1b19..da2e692 100644
--- a/chrome/browser/chromeos/dom_ui/language_options_handler.cc
+++ b/chrome/browser/chromeos/dom_ui/language_options_handler.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -289,18 +289,7 @@ void LanguageOptionsHandler::UiLanguageChangeCallback(
const std::string action = StringPrintf(
"LanguageOptions_UiLanguageChange_%s", language_code.c_str());
UserMetrics::RecordComputedAction(action);
-
- // We maintain kApplicationLocale property in both a global storage
- // and user's profile. Global property determines locale of login screen,
- // while user's profile determines his personal locale preference.
- PrefService* prefs[] = {
- g_browser_process->local_state(),
- dom_ui_->GetProfile()->GetPrefs()
- };
- for (size_t i = 0; i < arraysize(prefs); ++i) {
- prefs[i]->SetString(prefs::kApplicationLocale, language_code);
- prefs[i]->SavePersistentPrefs();
- }
+ dom_ui_->GetProfile()->ChangeApplicationLocale(language_code, false);
dom_ui_->CallJavascriptFunction(
L"options.LanguageOptions.uiLanguageSaved");
}
diff --git a/chrome/browser/chromeos/locale_change_guard.cc b/chrome/browser/chromeos/locale_change_guard.cc
new file mode 100644
index 0000000..f875cdf
--- /dev/null
+++ b/chrome/browser/chromeos/locale_change_guard.cc
@@ -0,0 +1,134 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/locale_change_guard.h"
+
+#include "app/l10n_util.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/metrics/user_metrics.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/pref_names.h"
+#include "grit/app_resources.h"
+#include "grit/generated_resources.h"
+
+namespace {
+
+base::LazyInstance<chromeos::LocaleChangeGuard> g_locale_change_guard(
+ base::LINKER_INITIALIZED);
+
+} // namespace
+
+namespace chromeos {
+
+LocaleChangeGuard::LocaleChangeGuard()
+ : profile_id_(Profile::InvalidProfileId),
+ tab_contents_(NULL),
+ note_(NULL),
+ reverted_(false) {
+}
+
+void LocaleChangeGuard::RevertLocaleChange(const ListValue* list) {
+ reverted_ = true;
+ UserMetrics::RecordAction(UserMetricsAction("LanguageChange_Revert"));
+ tab_contents_->profile()->ChangeApplicationLocale(from_locale_, true);
+ PrefService* prefs = tab_contents_->profile()->GetPrefs();
+ if (prefs) {
+ prefs->SetString(prefs::kApplicationLocaleBackup, from_locale_);
+ prefs->ClearPref(prefs::kApplicationLocaleAccepted);
+ prefs->ScheduleSavePersistentPrefs();
+ }
+ Browser* browser = Browser::GetBrowserForController(
+ &tab_contents_->controller(), NULL);
+ if (browser)
+ browser->ExecuteCommand(IDC_EXIT);
+}
+
+void LocaleChangeGuard::CheckLocaleChange(TabContents* tab_contents) {
+ // We want notification to be shown no more than once per session.
+ if (note_ != NULL)
+ return;
+ // We check profile Id because:
+ // (1) we want to exit fast in common case when nothing should be done.
+ // (2) on ChromeOS this guard may be invoked for a dummy profile first time.
+ ProfileId cur_profile_id = tab_contents->profile()->GetRuntimeId();
+ if (cur_profile_id == profile_id_)
+ return;
+ profile_id_ = cur_profile_id;
+ std::string cur_locale = g_browser_process->GetApplicationLocale();
+ if (cur_locale.empty())
+ return;
+ PrefService* prefs = tab_contents->profile()->GetPrefs();
+ if (prefs == NULL)
+ return;
+ to_locale_ = prefs->GetString(prefs::kApplicationLocaleOverride);
+ if (!to_locale_.empty()) {
+ DCHECK(to_locale_ == cur_locale);
+ return;
+ }
+ to_locale_ = prefs->GetString(prefs::kApplicationLocale);
+ if (to_locale_ != cur_locale)
+ return;
+ from_locale_ = prefs->GetString(prefs::kApplicationLocaleBackup);
+ if (from_locale_.empty() || from_locale_ == to_locale_)
+ return;
+ note_.reset(new chromeos::SystemNotification(
+ tab_contents->profile(),
+ new Delegate(this),
+ IDR_DEFAULT_FAVICON,
+ l10n_util::GetStringUTF16(
+ IDS_OPTIONS_SETTINGS_SECTION_TITLE_LANGUAGE)));
+ tab_contents_ = tab_contents;
+ note_->Show(
+ l10n_util::GetStringFUTF16(
+ IDS_LOCALE_CHANGE_MESSAGE,
+ l10n_util::GetDisplayNameForLocale(from_locale_, to_locale_, true),
+ l10n_util::GetDisplayNameForLocale(to_locale_, to_locale_, true)),
+ l10n_util::GetStringUTF16(IDS_LOCALE_CHANGE_REVERT_MESSAGE),
+ NewCallback(this, &LocaleChangeGuard::RevertLocaleChange),
+ true, // urgent
+ false); // non-sticky
+}
+
+void LocaleChangeGuard::AcceptLocaleChange() {
+ // Check whether locale has been reverted or changed.
+ // If not: mark current locale as accepted.
+ if (tab_contents_ == NULL)
+ return;
+ if (reverted_)
+ return;
+ PrefService* prefs = tab_contents_->profile()->GetPrefs();
+ if (prefs == NULL)
+ return;
+ std::string override_locale =
+ prefs->GetString(prefs::kApplicationLocaleOverride);
+ if (!override_locale.empty())
+ return;
+ if (prefs->GetString(prefs::kApplicationLocale) != to_locale_)
+ return;
+ UserMetrics::RecordAction(UserMetricsAction("LanguageChange_Accept"));
+ prefs->SetString(prefs::kApplicationLocaleBackup, to_locale_);
+ prefs->SetString(prefs::kApplicationLocaleAccepted, to_locale_);
+ prefs->ScheduleSavePersistentPrefs();
+}
+
+// static
+void LocaleChangeGuard::Check(TabContents* tab_contents) {
+ g_locale_change_guard.Get().CheckLocaleChange(tab_contents);
+}
+
+void LocaleChangeGuard::Delegate::Close(bool by_user) {
+ if (by_user)
+ master_->AcceptLocaleChange();
+}
+
+std::string LocaleChangeGuard::Delegate::id() const {
+ // Arbitrary unique Id.
+ return "8c386938-1e3f-11e0-ac7b-18a90520e2e5";
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/locale_change_guard.h b/chrome/browser/chromeos/locale_change_guard.h
new file mode 100644
index 0000000..ed6fa43
--- /dev/null
+++ b/chrome/browser/chromeos/locale_change_guard.h
@@ -0,0 +1,61 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_LOCALE_CHANGE_GUARD_H_
+#define CHROME_BROWSER_CHROMEOS_LOCALE_CHANGE_GUARD_H_
+#pragma once
+
+#include "base/lazy_instance.h"
+#include "base/scoped_ptr.h"
+#include "chrome/browser/chromeos/notifications/system_notification.h"
+#include "chrome/browser/notifications/notification_delegate.h"
+#include "chrome/browser/profiles/profile.h"
+
+class ListValue;
+class TabContents;
+
+namespace chromeos {
+
+class LocaleChangeGuard {
+ public:
+ // When called first time for user profile: performs check whether
+ // locale has been changed automatically recently (based on synchronized user
+ // preference). If so: shows notification that allows user to revert change.
+ // On subsequent calls: does nothing (hopefully fast).
+ static void Check(TabContents* tab_contents);
+
+ private:
+ class Delegate : public NotificationDelegate {
+ public:
+ explicit Delegate(chromeos::LocaleChangeGuard* master) : master_(master) {}
+ void Close(bool by_user);
+ void Display() {}
+ void Error() {}
+ void Click() {}
+ std::string id() const;
+
+ private:
+ chromeos::LocaleChangeGuard* master_;
+
+ DISALLOW_COPY_AND_ASSIGN(Delegate);
+ };
+
+ LocaleChangeGuard();
+ void CheckLocaleChange(TabContents* tab_contents);
+ void RevertLocaleChange(const ListValue* list);
+ void AcceptLocaleChange();
+
+ std::string from_locale_;
+ std::string to_locale_;
+ ProfileId profile_id_;
+ TabContents* tab_contents_;
+ scoped_ptr<chromeos::SystemNotification> note_;
+ bool reverted_;
+
+ friend struct base::DefaultLazyInstanceTraits<LocaleChangeGuard>;
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_LOCALE_CHANGE_GUARD_H_
diff --git a/chrome/browser/chromeos/login/login_utils.cc b/chrome/browser/chromeos/login/login_utils.cc
index 708f2e4..7eb48ba 100644
--- a/chrome/browser/chromeos/login/login_utils.cc
+++ b/chrome/browser/chromeos/login/login_utils.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -329,26 +329,53 @@ void LoginUtilsImpl::FetchTokens(
}
}
-void LoginUtilsImpl::RespectLocalePreference(PrefService* pref) {
- std::string pref_locale = pref->GetString(prefs::kApplicationLocale);
- if (pref_locale.empty()) {
- // Profile synchronization takes time and is not completed at that moment
- // at first login. So we initialize locale preference in steps:
- // (1) first save it to temporary backup;
- // (2) on next login we assume that synchronization is already completed
- // and we may finalize initialization.
- std::string pref_locale_backup =
- pref->GetString(prefs::kApplicationLocaleBackup);
- if (pref_locale_backup.empty()) {
- pref->SetString(prefs::kApplicationLocaleBackup,
- g_browser_process->GetApplicationLocale());
- return;
+void LoginUtilsImpl::RespectLocalePreference(PrefService* prefs) {
+ DCHECK(prefs != NULL);
+ std::string pref_locale_override =
+ prefs->GetString(prefs::kApplicationLocaleOverride);
+ if (!pref_locale_override.empty()) {
+ LanguageSwitchMenu::SwitchLanguage(pref_locale_override);
+ return;
+ }
+
+ if (g_browser_process == NULL)
+ return;
+ std::string cur_locale = g_browser_process->GetApplicationLocale();
+
+ std::string pref_locale = prefs->GetString(prefs::kApplicationLocale);
+ if (!pref_locale.empty()) {
+ if (prefs->GetString(prefs::kApplicationLocaleAccepted) == pref_locale) {
+ // If locale is accepted then we do not want to show LocaleChange
+ // notification. This notification is triggered by different values of
+ // kApplicationLocaleBackup and kApplicationLocale preferences,
+ // so make them identical.
+ prefs->SetString(prefs::kApplicationLocaleBackup, pref_locale);
} else {
- pref_locale.swap(pref_locale_backup);
- pref->SetString(prefs::kApplicationLocale, pref_locale);
+ std::string pref_locale_backup =
+ prefs->GetString(prefs::kApplicationLocaleBackup);
+ if (pref_locale_backup != cur_locale) {
+ if (pref_locale_backup == pref_locale || pref_locale_backup.empty()) {
+ prefs->SetString(prefs::kApplicationLocaleBackup, cur_locale);
+ }
+ }
}
+ LanguageSwitchMenu::SwitchLanguage(pref_locale);
+ return;
+ }
+ // Profile synchronization takes time and is not completed at that moment
+ // at first login. So we initialize locale preference in steps:
+ // (1) first save it to temporary backup;
+ // (2) on next login we assume that synchronization is already completed
+ // and we may finalize initialization.
+ std::string pref_locale_backup =
+ prefs->GetString(prefs::kApplicationLocaleBackup);
+ prefs->SetString(prefs::kApplicationLocaleBackup, cur_locale);
+ prefs->ScheduleSavePersistentPrefs();
+ if (!pref_locale_backup.empty()) {
+ prefs->SetString(prefs::kApplicationLocale, pref_locale_backup);
+ prefs->ScheduleSavePersistentPrefs();
+ LanguageSwitchMenu::SwitchLanguage(pref_locale_backup);
}
- LanguageSwitchMenu::SwitchLanguage(pref_locale);
}
void LoginUtilsImpl::CompleteOffTheRecordLogin(const GURL& start_url) {
diff --git a/chrome/browser/chromeos/notifications/system_notification.cc b/chrome/browser/chromeos/notifications/system_notification.cc
index 0d85687..42c46d1 100644
--- a/chrome/browser/chromeos/notifications/system_notification.cc
+++ b/chrome/browser/chromeos/notifications/system_notification.cc
@@ -13,21 +13,39 @@
namespace chromeos {
+void SystemNotification::Init(int icon_resource_id) {
+ collection_ = static_cast<BalloonCollectionImpl*>(
+ g_browser_process->notification_ui_manager()->balloon_collection());
+ std::string url = dom_ui_util::GetImageDataUrlFromResource(icon_resource_id);
+ DCHECK(!url.empty());
+ GURL tmp_gurl(url);
+ icon_.Swap(&tmp_gurl);
+}
+
+SystemNotification::SystemNotification(Profile* profile,
+ NotificationDelegate* delegate,
+ int icon_resource_id,
+ const string16& title)
+ : profile_(profile),
+ collection_(NULL),
+ delegate_(delegate),
+ title_(title),
+ visible_(false),
+ urgent_(false) {
+ Init(icon_resource_id);
+}
+
SystemNotification::SystemNotification(Profile* profile,
const std::string& id,
int icon_resource_id,
const string16& title)
: profile_(profile),
- collection_(static_cast<BalloonCollectionImpl*>(
- g_browser_process->notification_ui_manager()->balloon_collection())),
+ collection_(NULL),
delegate_(new Delegate(id)),
title_(title),
visible_(false),
urgent_(false) {
- std::string url = dom_ui_util::GetImageDataUrlFromResource(icon_resource_id);
- DCHECK(!url.empty());
- GURL tmp_gurl(url);
- icon_.Swap(&tmp_gurl);
+ Init(icon_resource_id);
}
SystemNotification::~SystemNotification() {
diff --git a/chrome/browser/chromeos/notifications/system_notification.h b/chrome/browser/chromeos/notifications/system_notification.h
index 81976b7..5573f2b 100644
--- a/chrome/browser/chromeos/notifications/system_notification.h
+++ b/chrome/browser/chromeos/notifications/system_notification.h
@@ -27,7 +27,14 @@ class SystemNotification {
// The profile is the current user profile. The id is any string used
// to uniquely identify this notification. The title is the title of
// the message to be displayed. On creation, the message is hidden.
- SystemNotification(Profile* profile, const std::string& id,
+ SystemNotification(Profile* profile,
+ const std::string& id,
+ int icon_resource_id,
+ const string16& title);
+
+ // Allows to provide custom NotificationDelegate.
+ SystemNotification(Profile* profile,
+ NotificationDelegate* delegate,
int icon_resource_id,
const string16& title);
@@ -71,9 +78,11 @@ class SystemNotification {
DISALLOW_COPY_AND_ASSIGN(Delegate);
};
+ void Init(int icon_resource_id);
+
Profile* profile_;
BalloonCollectionImpl* collection_;
- scoped_refptr<Delegate> delegate_;
+ scoped_refptr<NotificationDelegate> delegate_;
GURL icon_;
string16 title_;
bool visible_;
diff --git a/chrome/browser/notifications/notification_ui_manager.h b/chrome/browser/notifications/notification_ui_manager.h
index 3a0125c..1b9475d 100644
--- a/chrome/browser/notifications/notification_ui_manager.h
+++ b/chrome/browser/notifications/notification_ui_manager.h
@@ -73,12 +73,12 @@ class NotificationUIManager
// be placed on the screen.
void SetPositionPreference(BalloonCollection::PositionPreference preference);
- // NotificationObserver interface (the event signaling kind of notifications)
+ private:
+ // NotificationObserver override.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
- private:
// Attempts to display notifications from the show_queue if the user
// is active.
void CheckAndShowNotifications();
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index 6705e3b..658face 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -112,6 +112,8 @@ void Profile::RegisterUserPrefs(PrefService* prefs) {
// in user's profile for other platforms as well.
prefs->RegisterStringPref(prefs::kApplicationLocale, "");
prefs->RegisterStringPref(prefs::kApplicationLocaleBackup, "");
+ prefs->RegisterStringPref(prefs::kApplicationLocaleOverride, "");
+ prefs->RegisterStringPref(prefs::kApplicationLocaleAccepted, "");
#endif
}
@@ -603,6 +605,12 @@ class OffTheRecordProfileImpl : public Profile,
return NULL;
}
+#if defined(OS_CHROMEOS)
+ virtual void ChangeApplicationLocale(
+ const std::string& locale, bool keep_local) {
+ }
+#endif // defined(OS_CHROMEOS)
+
virtual PrefProxyConfigTracker* GetProxyConfigTracker() {
return profile_->GetProxyConfigTracker();
}
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h
index 9df977c..db2f266 100644
--- a/chrome/browser/profiles/profile.h
+++ b/chrome/browser/profiles/profile.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -226,8 +226,7 @@ class Profile {
// Retrieves a pointer to the TransportSecurityState associated with
// this profile. The TransportSecurityState is lazily created the
// first time that this method is called.
- virtual net::TransportSecurityState*
- GetTransportSecurityState() = 0;
+ virtual net::TransportSecurityState* GetTransportSecurityState() = 0;
// Retrieves a pointer to the FaviconService associated with this
// profile. The FaviconService is lazily created the first time
@@ -487,6 +486,11 @@ class Profile {
virtual policy::ProfilePolicyContext* GetPolicyContext() = 0;
#if defined(OS_CHROMEOS)
+ // Changes application locale.
+ // "Keep local" means that changes should not be propagated to other devices.
+ virtual void ChangeApplicationLocale(
+ const std::string& locale, bool keep_local) = 0;
+
// Returns ChromeOS's ProxyConfigServiceImpl, creating if not yet created.
virtual chromeos::ProxyConfigServiceImpl*
GetChromeOSProxyConfigServiceImpl() = 0;
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index d4f24d8..4a60cd1 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -1340,6 +1340,30 @@ PromoCounter* ProfileImpl::GetInstantPromoCounter() {
}
#if defined(OS_CHROMEOS)
+void ProfileImpl::ChangeApplicationLocale(
+ const std::string& locale, bool keep_local) {
+ if (locale.empty()) {
+ NOTREACHED();
+ return;
+ }
+ if (keep_local) {
+ GetPrefs()->SetString(prefs::kApplicationLocaleOverride, locale);
+ } else {
+ GetPrefs()->SetString(prefs::kApplicationLocale, locale);
+ GetPrefs()->SetString(prefs::kApplicationLocaleOverride, "");
+ }
+ GetPrefs()->SetString(prefs::kApplicationLocaleBackup, locale);
+ GetPrefs()->ClearPref(prefs::kApplicationLocaleAccepted);
+ // We maintain kApplicationLocale property in both a global storage
+ // and user's profile. Global property determines locale of login screen,
+ // while user's profile determines his personal locale preference.
+ g_browser_process->local_state()->SetString(
+ prefs::kApplicationLocale, locale);
+
+ GetPrefs()->SavePersistentPrefs();
+ g_browser_process->local_state()->SavePersistentPrefs();
+}
+
chromeos::ProxyConfigServiceImpl*
ProfileImpl::GetChromeOSProxyConfigServiceImpl() {
if (!chromeos_proxy_config_service_impl_) {
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h
index bc5f790..3f9e53c 100644
--- a/chrome/browser/profiles/profile_impl.h
+++ b/chrome/browser/profiles/profile_impl.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -129,6 +129,8 @@ class ProfileImpl : public Profile,
virtual policy::ProfilePolicyContext* GetPolicyContext();
#if defined(OS_CHROMEOS)
+ virtual void ChangeApplicationLocale(
+ const std::string& locale, bool keep_local);
virtual chromeos::ProxyConfigServiceImpl* GetChromeOSProxyConfigServiceImpl();
virtual void SetupChromeOSEnterpriseExtensionObserver();
#endif // defined(OS_CHROMEOS)
diff --git a/chrome/browser/tab_contents/infobar_delegate.h b/chrome/browser/tab_contents/infobar_delegate.h
index af9b9c9..c48d82b 100644
--- a/chrome/browser/tab_contents/infobar_delegate.h
+++ b/chrome/browser/tab_contents/infobar_delegate.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -190,11 +190,11 @@ class LinkInfoBarDelegate : public InfoBarDelegate {
class ConfirmInfoBarDelegate : public AlertInfoBarDelegate {
public:
enum InfoBarButton {
- BUTTON_NONE = 0,
- BUTTON_OK = 1,
- BUTTON_CANCEL = 2,
+ BUTTON_NONE = 0,
+ BUTTON_OK = 1 << 0,
+ BUTTON_CANCEL = 1 << 1,
// Specifies that the OK button should be rendered like a default button.
- BUTTON_OK_DEFAULT = 4
+ BUTTON_OK_DEFAULT = 1 << 2
};
// Return the buttons to be shown for this InfoBar.
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 32bd04c..4701265 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -111,6 +111,10 @@
#include "app/surface/io_surface_support_mac.h"
#endif // defined(OS_MACOSX)
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/locale_change_guard.h"
+#endif // defined(OS_CHROMEOS)
+
// Cross-Site Navigations
//
// If a TabContents is told to navigate to a different web site (as determined
@@ -843,6 +847,9 @@ void TabContents::DidBecomeSelected() {
WebCacheManager::GetInstance()->ObserveActivity(GetRenderProcessHost()->id());
last_selected_time_ = base::TimeTicks::Now();
+#if defined(OS_CHROMEOS)
+ chromeos::LocaleChangeGuard::Check(this);
+#endif
}
void TabContents::FadeForInstant(bool animate) {
@@ -1996,9 +2003,8 @@ void TabContents::CloseConstrainedWindows() {
// Clear out any constrained windows since we are leaving this page entirely.
// We use indices instead of iterators in case CloseWindow does something
// that may invalidate an iterator.
- int size = static_cast<int>(child_windows_.size());
- for (int i = size - 1; i >= 0; --i) {
- ConstrainedWindow* window = child_windows_[i];
+ for (size_t i = 0; i < child_windows_.size(); ++i) {
+ ConstrainedWindow* window = child_windows_[child_windows_.size() - 1 - i];
if (window) {
window->CloseConstrainedWindow();
BlockTabContent(false);
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 5917cbc..c65ba62 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -389,18 +389,6 @@
'browser/chrome_plugin_browsing_context.h',
'browser/chrome_plugin_host.cc',
'browser/chrome_plugin_host.h',
- 'browser/chromeos/notifications/balloon_collection_impl.cc',
- 'browser/chromeos/notifications/balloon_collection_impl.h',
- 'browser/chromeos/notifications/balloon_view.cc',
- 'browser/chromeos/notifications/balloon_view.h',
- 'browser/chromeos/notifications/balloon_view_host.cc',
- 'browser/chromeos/notifications/balloon_view_host.h',
- 'browser/chromeos/notifications/notification_panel.cc',
- 'browser/chromeos/notifications/notification_panel.h',
- 'browser/chromeos/notifications/system_notification.cc',
- 'browser/chromeos/notifications/system_notification.h',
- 'browser/chromeos/notifications/system_notification_factory.cc',
- 'browser/chromeos/notifications/system_notification_factory.h',
'browser/chromeos/audio_handler.cc',
'browser/chromeos/audio_handler.h',
'browser/chromeos/audio_mixer.h',
@@ -545,6 +533,8 @@
'browser/chromeos/input_method/input_method_util.h',
'browser/chromeos/language_preferences.cc',
'browser/chromeos/language_preferences.h',
+ 'browser/chromeos/locale_change_guard.h',
+ 'browser/chromeos/locale_change_guard.cc',
'browser/chromeos/login/account_creation_view.cc',
'browser/chromeos/login/account_creation_view.h',
'browser/chromeos/login/account_screen.cc',
@@ -697,6 +687,18 @@
'browser/chromeos/network_state_notifier.h',
'browser/chromeos/network_message_observer.cc',
'browser/chromeos/network_message_observer.h',
+ 'browser/chromeos/notifications/balloon_collection_impl.cc',
+ 'browser/chromeos/notifications/balloon_collection_impl.h',
+ 'browser/chromeos/notifications/balloon_view.cc',
+ 'browser/chromeos/notifications/balloon_view.h',
+ 'browser/chromeos/notifications/balloon_view_host.cc',
+ 'browser/chromeos/notifications/balloon_view_host.h',
+ 'browser/chromeos/notifications/notification_panel.cc',
+ 'browser/chromeos/notifications/notification_panel.h',
+ 'browser/chromeos/notifications/system_notification.cc',
+ 'browser/chromeos/notifications/system_notification.h',
+ 'browser/chromeos/notifications/system_notification_factory.cc',
+ 'browser/chromeos/notifications/system_notification_factory.h',
'browser/chromeos/offline/offline_load_page.cc',
'browser/chromeos/offline/offline_load_page.h',
'browser/chromeos/offline/offline_load_service.cc',
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index f81ffde..38126e0 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -46,9 +46,16 @@ const char kURLsToRestoreOnStartup[] = "session.urls_to_restore_on_startup";
// while user's profile determines his personal locale preference.
const char kApplicationLocale[] = "intl.app_locale";
#if defined(OS_CHROMEOS)
-// Non-syncable item. Used for two-step initialization of locale in ChromeOS
+// Non-syncable item. Used to detect locale change.
+// Used for two-step initialization of locale in ChromeOS
// because synchronization of kApplicationLocale is not instant.
const char kApplicationLocaleBackup[] = "intl.app_locale_backup";
+// Non-syncable item.
+// Used to locally override synchronized kApplicationLocale preference.
+const char kApplicationLocaleOverride[] = "intl.app_locale_override";
+// Locale accepted by user. Non-syncable.
+// Used to determine whether we need to show Locale Change notification.
+const char kApplicationLocaleAccepted[] = "intl.app_locale_accepted";
#endif
// The default character encoding to assume for a web page in the
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 09ee43e..1963bf6 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -27,6 +27,8 @@ extern const char kURLsToRestoreOnStartup[];
extern const char kApplicationLocale[];
#if defined(OS_CHROMEOS)
extern const char kApplicationLocaleBackup[];
+extern const char kApplicationLocaleOverride[];
+extern const char kApplicationLocaleAccepted[];
#endif
extern const char kDefaultCharset[];
diff --git a/chrome/test/testing_profile.h b/chrome/test/testing_profile.h
index 847093e..181e375 100644
--- a/chrome/test/testing_profile.h
+++ b/chrome/test/testing_profile.h
@@ -298,6 +298,8 @@ class TestingProfile : public Profile {
}
virtual void SetupChromeOSEnterpriseExtensionObserver() {
}
+ virtual void ChangeApplicationLocale(const std::string&, bool) {
+ }
#endif // defined(OS_CHROMEOS)
virtual PrefProxyConfigTracker* GetProxyConfigTracker();
diff --git a/chrome/tools/chromeactions.txt b/chrome/tools/chromeactions.txt
index c0a80df..c91b877 100644
--- a/chrome/tools/chromeactions.txt
+++ b/chrome/tools/chromeactions.txt
@@ -13,6 +13,7 @@
0x307b8a127f85947e AboutFlags_expose-for-tabs
0x2c97f94b6aca4a22 AboutFlags_extension-apis
0x66a2e456dfe783d3 AboutFlags_gpu-canvas-2d
+0x6cb0582a680ffec6 AboutFlags_instant-autocomplete-immediately
0x67b7031bb00a6917 AboutFlags_instant-type
0x681dbf08b11af420 AboutFlags_match-preview
0x0156f26c1be32122 AboutFlags_my-special-feature
@@ -174,6 +175,7 @@
0xd477cbce1681d404 CloseTab_Mouse
0x4b31de70a21d7903 CloseWebApp
0xdf8926d323575ff8 CloseWindow
+0xa0ebbbdb0eca8d89 ConflictBadge
0x5fb63579fc981698 Copy
0xb3d0f42456c6eaf6 CopyURLToClipBoard
0x2aeb39c03cc86464 CreateLink
@@ -379,6 +381,8 @@
0x204aad0f4a1f0f22 KeywordEditor_AddKeywordJS
0x37ac83353fd9be1f KeywordEditor_ModifiedKeyword
0x2d038477eb20483b KeywordEditor_RemoveKeyword
+0xab20f097361154dc LanguageChange_Accept
+0x98ee7b2a2893443f LanguageChange_Revert
0xcce20fb4bce11250 LanguageConfigView_Open
0x6c9d4656451fe020 LanguageMenuButton_InputMethodChanged
0x9895b811fa1a2f7e LanguageMenuButton_Open