diff options
-rw-r--r-- | chrome/app/generated_resources.grd | 10 | ||||
-rw-r--r-- | chrome/browser/protector/base_setting_change.cc | 7 | ||||
-rw-r--r-- | chrome/browser/protector/base_setting_change.h | 14 | ||||
-rw-r--r-- | chrome/browser/protector/histograms.cc | 9 | ||||
-rw-r--r-- | chrome/browser/protector/histograms.h | 10 | ||||
-rw-r--r-- | chrome/browser/protector/homepage_change.cc | 204 | ||||
-rw-r--r-- | chrome/browser/protector/homepage_change_unittest.cc | 63 | ||||
-rw-r--r-- | chrome/browser/protector/mock_setting_change.cc | 2 | ||||
-rw-r--r-- | chrome/browser/protector/mock_setting_change.h | 2 | ||||
-rw-r--r-- | chrome/browser/protector/protector_service.cc | 4 | ||||
-rw-r--r-- | chrome/browser/ui/browser_init.cc | 44 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/test/functional/protector.py | 99 |
14 files changed, 455 insertions, 16 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index e60fe72..befafd6 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -1295,10 +1295,16 @@ Psst! Incognito mode <ph name="SHORTCUT_KEY">$1<ex>(Ctrl+Shift+N)</ex></ph> may Arrr! Something tried to commandeer your home page! </message> <message name="IDS_KEEP_HOMEPAGE" desc="The title of the button that confirms staying with the previous home page setting."> - Keep using <ph name="PREV_HOMEPAGE">$1<ex>My Awesome Blog</ex></ph> + Keep using <ph name="PREV_HOMEPAGE">$1<ex>google.com</ex></ph> + </message> + <message name="IDS_KEEP_HOMEPAGE_NTP" desc="The title of the button that confirms staying with the previous home page setting, which is opening the New Tab page."> + Keep using New Tab page </message> <message name="IDS_CHANGE_HOMEPAGE" desc="The title of the button that accepts new home page setting."> - Change to <ph name="NEW_HOMEPAGE">$1<ex>My Awesome Blog</ex></ph> + Change to <ph name="NEW_HOMEPAGE">$1<ex>google.com</ex></ph> + </message> + <message name="IDS_CHANGE_HOMEPAGE_NTP" desc="The title of the button that accepts new home page setting, which is opening the New Tab page."> + Change to New Tab page </message> <message name="IDS_CHANGE_HOMEPAGE_NO_NAME" desc="The title of the button that accepts new home page setting when the home page title is too long."> Change home page diff --git a/chrome/browser/protector/base_setting_change.cc b/chrome/browser/protector/base_setting_change.cc index fbb09c9..aa6df39 100644 --- a/chrome/browser/protector/base_setting_change.cc +++ b/chrome/browser/protector/base_setting_change.cc @@ -9,10 +9,9 @@ namespace protector { -// static const size_t kDefaultSearchProviderChangeNamePriority = 100U; -// static const size_t kSessionStartupChangeNamePriority = 50U; +const size_t kHomepageChangeNamePriority = 10U; // static const size_t BaseSettingChange::kDefaultNamePriority = 0U; @@ -70,4 +69,8 @@ bool BaseSettingChange::CanBeMerged() const { return !GetNewSettingURL().is_empty(); } +bool BaseSettingChange::IsUserVisible() const { + return true; +} + } // namespace protector diff --git a/chrome/browser/protector/base_setting_change.h b/chrome/browser/protector/base_setting_change.h index 9aa6c84..14af703 100644 --- a/chrome/browser/protector/base_setting_change.h +++ b/chrome/browser/protector/base_setting_change.h @@ -108,6 +108,11 @@ class BaseSettingChange { // Returns true if this change can be merged with other changes. virtual bool CanBeMerged() const; + // Returns |false| if this change is not user-visible. It won't be presented + // to user on it's own then, but may be merged with other changes and applied + // or discarded. + virtual bool IsUserVisible() const; + protected: // Profile instance we've been associated with by an |Init| call. Profile* profile() { return profile_; } @@ -121,6 +126,7 @@ class BaseSettingChange { // Display name priorities of various change types: extern const size_t kDefaultSearchProviderChangeNamePriority; extern const size_t kSessionStartupChangeNamePriority; +extern const size_t kHomepageChangeNamePriority; // TODO(ivankr): CompositeSettingChange that incapsulates multiple // BaseSettingChange instances. @@ -142,6 +148,14 @@ BaseSettingChange* CreateSessionStartupChange( const SessionStartupPref& backup_startup_pref, const PinnedTabCodec::Tabs& backup_pinned_tabs); +BaseSettingChange* CreateHomepageChange( + const std::string& actual_homepage, + bool actual_homepage_is_ntp, + bool actual_show_homepage, + const std::string& backup_homepage, + bool backup_homepage_is_ntp, + bool backup_show_homepage); + // Allocates and initializes BaseSettingChange implementation for an unknown // preferences change with invalid backup. BaseSettingChange* CreatePrefsBackupInvalidChange(); diff --git a/chrome/browser/protector/histograms.cc b/chrome/browser/protector/histograms.cc index 0418d89..761cbec 100644 --- a/chrome/browser/protector/histograms.cc +++ b/chrome/browser/protector/histograms.cc @@ -42,6 +42,15 @@ const char kProtectorHistogramStartupSettingsDiscarded[] = const char kProtectorHistogramStartupSettingsTimeout[] = "Protector.StartupSettings.Timeout"; +const char kProtectorHistogramHomepageApplied[] = + "Protector.Homepage.Applied"; +const char kProtectorHistogramHomepageChanged[] = + "Protector.Homepage.Changed"; +const char kProtectorHistogramHomepageDiscarded[] = + "Protector.Homepage.Discarded"; +const char kProtectorHistogramHomepageTimeout[] = + "Protector.Homepage.Timeout"; + const int kProtectorMaxSearchProviderID = SEARCH_ENGINE_MAX; int GetSearchProviderHistogramID(const TemplateURL* t_url) { diff --git a/chrome/browser/protector/histograms.h b/chrome/browser/protector/histograms.h index 7ffc50c..e2cfede 100644 --- a/chrome/browser/protector/histograms.h +++ b/chrome/browser/protector/histograms.h @@ -61,6 +61,16 @@ extern const char kProtectorHistogramStartupSettingsDiscarded[]; // Histogram name to report when user ignores startup settings change. extern const char kProtectorHistogramStartupSettingsTimeout[]; +// Histogram name to report when user accepts new homepage. +extern const char kProtectorHistogramHomepageApplied[]; +// Histogram name to report the new homepage when the backup is valid and a +// change is detected. +extern const char kProtectorHistogramHomepageChanged[]; +// Histogram name to report when user keeps previous homepage. +extern const char kProtectorHistogramHomepageDiscarded[]; +// Histogram name to report when user ignores homepage change. +extern const char kProtectorHistogramHomepageTimeout[]; + // Maximum value of search provider index in histogram enums. extern const int kProtectorMaxSearchProviderID; diff --git a/chrome/browser/protector/homepage_change.cc b/chrome/browser/protector/homepage_change.cc new file mode 100644 index 0000000..1da8f9a --- /dev/null +++ b/chrome/browser/protector/homepage_change.cc @@ -0,0 +1,204 @@ +// Copyright (c) 2012 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 "base/basictypes.h" +#include "base/metrics/histogram.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/protector/base_prefs_change.h" +#include "chrome/browser/protector/histograms.h" +#include "chrome/common/pref_names.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" +#include "grit/theme_resources.h" +#include "ui/base/l10n/l10n_util.h" + +namespace protector { + +// Homepage change tracked by Protector. +class HomepageChange : public BasePrefsChange { + public: + // Enum for reporting UMA statistics. + enum HomepageType { + HOMEPAGE_NTP = 0, + HOMEPAGE_URL, + + // Must be the last value + HOMEPAGE_TYPE_COUNT + }; + + HomepageChange(const std::string& actual_homepage, + bool actual_homepage_is_ntp, + bool actual_show_homepage, + const std::string& backup_homepage, + bool backup_homepage_is_ntp, + bool backup_show_homepage); + + // BaseSettingChange overrides: + virtual bool Init(Profile* profile) OVERRIDE; + virtual void Apply(Browser* browser) OVERRIDE; + virtual void Discard(Browser* browser) OVERRIDE; + virtual void Timeout() OVERRIDE; + virtual int GetBadgeIconID() const OVERRIDE; + virtual int GetMenuItemIconID() const OVERRIDE; + virtual int GetBubbleIconID() const OVERRIDE; + virtual string16 GetBubbleTitle() const OVERRIDE; + virtual string16 GetBubbleMessage() const OVERRIDE; + virtual string16 GetApplyButtonText() const OVERRIDE; + virtual string16 GetDiscardButtonText() const OVERRIDE; + virtual DisplayName GetApplyDisplayName() const OVERRIDE; + virtual GURL GetNewSettingURL() const OVERRIDE; + virtual bool IsUserVisible() const OVERRIDE; + + private: + virtual ~HomepageChange(); + + const std::string new_homepage_; + const std::string backup_homepage_; + const bool new_homepage_is_ntp_; + const bool backup_homepage_is_ntp_; + const bool new_show_homepage_; + const bool backup_show_homepage_; + const HomepageType new_homepage_type_; + + DISALLOW_COPY_AND_ASSIGN(HomepageChange); +}; + +HomepageChange::HomepageChange( + const std::string& actual_homepage, + bool actual_homepage_is_ntp, + bool actual_show_homepage, + const std::string& backup_homepage, + bool backup_homepage_is_ntp, + bool backup_show_homepage) + : new_homepage_(actual_homepage), + backup_homepage_(backup_homepage), + new_homepage_is_ntp_(actual_homepage_is_ntp), + backup_homepage_is_ntp_(backup_homepage_is_ntp), + new_show_homepage_(actual_show_homepage), + backup_show_homepage_(backup_show_homepage), + new_homepage_type_(actual_homepage_is_ntp ? HOMEPAGE_NTP : HOMEPAGE_URL) { + UMA_HISTOGRAM_ENUMERATION( + kProtectorHistogramHomepageChanged, + new_homepage_type_, + HOMEPAGE_TYPE_COUNT); +} + +HomepageChange::~HomepageChange() { +} + +bool HomepageChange::Init(Profile* profile) { + if (!BasePrefsChange::Init(profile)) + return false; + PrefService* prefs = profile->GetPrefs(); + prefs->SetString(prefs::kHomePage, backup_homepage_); + prefs->SetBoolean(prefs::kHomePageIsNewTabPage, backup_homepage_is_ntp_); + prefs->SetBoolean(prefs::kShowHomeButton, backup_show_homepage_); + DismissOnPrefChange(prefs::kHomePage); + DismissOnPrefChange(prefs::kHomePageIsNewTabPage); + DismissOnPrefChange(prefs::kShowHomeButton); + return true; +} + +void HomepageChange::Apply(Browser* browser) { + if (IsUserVisible()) { + // Don't report statistics if this change was applied as part of a composite + // change and is not user-visible. + UMA_HISTOGRAM_ENUMERATION( + kProtectorHistogramHomepageApplied, + new_homepage_type_, + HOMEPAGE_TYPE_COUNT); + } + IgnorePrefChanges(); + PrefService* prefs = profile()->GetPrefs(); + prefs->SetString(prefs::kHomePage, new_homepage_); + prefs->SetBoolean(prefs::kHomePageIsNewTabPage, new_homepage_is_ntp_); + prefs->SetBoolean(prefs::kShowHomeButton, new_show_homepage_); +} + +void HomepageChange::Discard(Browser* browser) { + if (IsUserVisible()) { + UMA_HISTOGRAM_ENUMERATION( + kProtectorHistogramHomepageDiscarded, + new_homepage_type_, + HOMEPAGE_TYPE_COUNT); + } + IgnorePrefChanges(); + // Nothing to do here since backup has already been made active by Init(). +} + +void HomepageChange::Timeout() { + if (IsUserVisible()) { + UMA_HISTOGRAM_ENUMERATION( + kProtectorHistogramHomepageTimeout, + new_homepage_type_, + HOMEPAGE_TYPE_COUNT); + } +} + +int HomepageChange::GetBadgeIconID() const { + // Icons are the same for homepage and startup settings. + return IDR_HOMEPAGE_CHANGE_BADGE; +} + +int HomepageChange::GetMenuItemIconID() const { + return IDR_HOMEPAGE_CHANGE_MENU; +} + +int HomepageChange::GetBubbleIconID() const { + return IDR_HOMEPAGE_CHANGE_ALERT; +} + +string16 HomepageChange::GetBubbleTitle() const { + return l10n_util::GetStringUTF16(IDS_HOMEPAGE_CHANGE_TITLE); +} + +string16 HomepageChange::GetBubbleMessage() const { + return l10n_util::GetStringUTF16(IDS_HOMEPAGE_CHANGE_BUBBLE_MESSAGE); +} + +string16 HomepageChange::GetApplyButtonText() const { + return new_homepage_is_ntp_ ? + l10n_util::GetStringUTF16(IDS_CHANGE_HOMEPAGE_NTP) : + l10n_util::GetStringFUTF16(IDS_CHANGE_HOMEPAGE, + UTF8ToUTF16(GURL(new_homepage_).host())); +} + +string16 HomepageChange::GetDiscardButtonText() const { + return backup_homepage_is_ntp_ ? + l10n_util::GetStringUTF16(IDS_KEEP_HOMEPAGE_NTP) : + l10n_util::GetStringFUTF16(IDS_KEEP_HOMEPAGE, + UTF8ToUTF16(GURL(backup_homepage_).host())); +} + +BaseSettingChange::DisplayName HomepageChange::GetApplyDisplayName() const { + return new_homepage_is_ntp_ ? + DisplayName(kDefaultNamePriority, string16()) : + DisplayName(kHomepageChangeNamePriority, + UTF8ToUTF16(GURL(new_homepage_).host())); +} + +GURL HomepageChange::GetNewSettingURL() const { + return new_homepage_is_ntp_ ? GURL() : GURL(new_homepage_); +} + +bool HomepageChange::IsUserVisible() const { + // Should not be presented to user unless the homepage button was previously + // visible or has been made visible by this change. + return new_show_homepage_ || backup_show_homepage_; +} + +BaseSettingChange* CreateHomepageChange( + const std::string& actual_homepage, + bool actual_homepage_is_ntp, + bool actual_show_homepage, + const std::string& backup_homepage, + bool backup_homepage_is_ntp, + bool backup_show_homepage) { + return new HomepageChange( + actual_homepage, actual_homepage_is_ntp, actual_show_homepage, + backup_homepage, backup_homepage_is_ntp, backup_show_homepage); +} + +} // namespace protector diff --git a/chrome/browser/protector/homepage_change_unittest.cc b/chrome/browser/protector/homepage_change_unittest.cc new file mode 100644 index 0000000..cfea686 --- /dev/null +++ b/chrome/browser/protector/homepage_change_unittest.cc @@ -0,0 +1,63 @@ +// Copyright (c) 2012 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 "base/memory/scoped_ptr.h" +#include "base/utf_string_conversions.h" +#include "base/values.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/protector/base_setting_change.h" +#include "chrome/common/pref_names.h" +#include "chrome/test/base/testing_profile.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace protector { + +namespace { + +std::string kHomepage1 = "http://google.com/"; +std::string kHomepage2 = "http://example.com/"; + +} + +class HomepageChangeTest : public testing::Test { + virtual void SetUp() OVERRIDE { + prefs_ = profile_.GetPrefs(); + } + + protected: + TestingProfile profile_; + PrefService* prefs_; +}; + +TEST_F(HomepageChangeTest, InitAndApply) { + prefs_->SetString(prefs::kHomePage, kHomepage1); + + // Create a change and apply it. + scoped_ptr<BaseSettingChange> change( + CreateHomepageChange(kHomepage1, false, true, kHomepage2, false, true)); + ASSERT_TRUE(change->Init(&profile_)); + // Setting is initially reverted to backup. + EXPECT_EQ(kHomepage2, prefs_->GetString(prefs::kHomePage)); + + change->Apply(NULL); // |browser| is unused. + // New setting active now. + EXPECT_EQ(kHomepage1, prefs_->GetString(prefs::kHomePage)); +} + +TEST_F(HomepageChangeTest, InitAndDiscard) { + prefs_->SetString(prefs::kHomePage, kHomepage1); + + // Create a change and apply it. + scoped_ptr<BaseSettingChange> change( + CreateHomepageChange(kHomepage1, false, true, kHomepage2, false, true)); + ASSERT_TRUE(change->Init(&profile_)); + // Setting is initially reverted to backup. + EXPECT_EQ(kHomepage2, prefs_->GetString(prefs::kHomePage)); + + change->Discard(NULL); // |browser| is unused. + // Nothing changed by Discard. + EXPECT_EQ(kHomepage2, prefs_->GetString(prefs::kHomePage)); +} + +} // namespace protector diff --git a/chrome/browser/protector/mock_setting_change.cc b/chrome/browser/protector/mock_setting_change.cc index 34581e0..580a2a5 100644 --- a/chrome/browser/protector/mock_setting_change.cc +++ b/chrome/browser/protector/mock_setting_change.cc @@ -32,6 +32,8 @@ MockSettingChange::MockSettingChange() { ON_CALL(*this, GetNewSettingURL()).WillByDefault(Return(GURL())); ON_CALL(*this, CanBeMerged()).WillByDefault(Return(false)); + + ON_CALL(*this, IsUserVisible()).WillByDefault(Return(true)); } MockSettingChange::~MockSettingChange() { diff --git a/chrome/browser/protector/mock_setting_change.h b/chrome/browser/protector/mock_setting_change.h index 31170af..e5b2fe1 100644 --- a/chrome/browser/protector/mock_setting_change.h +++ b/chrome/browser/protector/mock_setting_change.h @@ -38,6 +38,8 @@ class MockSettingChange : public BaseSettingChange { MOCK_CONST_METHOD0(GetNewSettingURL, GURL()); MOCK_CONST_METHOD0(CanBeMerged, bool()); + + MOCK_CONST_METHOD0(IsUserVisible, bool()); }; } // namespace protector diff --git a/chrome/browser/protector/protector_service.cc b/chrome/browser/protector/protector_service.cc index edc24cc..b895e68 100644 --- a/chrome/browser/protector/protector_service.cc +++ b/chrome/browser/protector/protector_service.cc @@ -72,7 +72,7 @@ void ProtectorService::ShowChange(BaseSettingChange* change) { // Remove old GlobalError instance. Later in OnRemovedFromProfile() a new // GlobalError instance will be created for the composite change. item_to_merge_with->error->RemoveFromProfile(); - } else { + } else if (change->IsUserVisible()) { Item new_item; SettingsChangeGlobalError* error = new SettingsChangeGlobalError(change_ptr.get(), this); @@ -82,6 +82,8 @@ void ProtectorService::ShowChange(BaseSettingChange* change) { // Do not show the bubble immediately if another one is active. error->AddToProfile(profile_, !has_active_change_); has_active_change_ = true; + } else { + VLOG(1) << "Not showing a change because it's not user-visible."; } } diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc index 7f6bf7ba..55e1320 100644 --- a/chrome/browser/ui/browser_init.cc +++ b/chrome/browser/ui/browser_init.cc @@ -1584,9 +1584,7 @@ void BrowserInit::LaunchWithProfile::CheckPreferencesBackup(Profile* profile) { // Check if backup is valid. if (!prefs_watcher->is_backup_valid()) { - scoped_ptr<BaseSettingChange> change( - protector::CreatePrefsBackupInvalidChange()); - protector_service->ShowChange(change.release()); + protector_service->ShowChange(protector::CreatePrefsBackupInvalidChange()); // Further checks make no sense. return; } @@ -1599,13 +1597,39 @@ void BrowserInit::LaunchWithProfile::CheckPreferencesBackup(Profile* profile) { PinnedTabCodec::Tabs new_tabs = PinnedTabCodec::ReadPinnedTabs(profile); const base::Value* tabs_backup = prefs_watcher->GetBackupForPref(prefs::kPinnedTabs); - scoped_ptr<BaseSettingChange> change( - protector::CreateSessionStartupChange( - new_pref, - new_tabs, - SessionStartupPref::GetStartupPrefBackup(profile), - PinnedTabCodec::ReadPinnedTabs(tabs_backup))); - protector_service->ShowChange(change.release()); + protector_service->ShowChange(protector::CreateSessionStartupChange( + new_pref, + new_tabs, + SessionStartupPref::GetStartupPrefBackup(profile), + PinnedTabCodec::ReadPinnedTabs(tabs_backup))); + } + + // Check for homepage changes. + if (prefs_watcher->DidPrefChange(prefs::kHomePage) || + prefs_watcher->DidPrefChange(prefs::kHomePageIsNewTabPage) || + prefs_watcher->DidPrefChange(prefs::kShowHomeButton)) { + LOG(WARNING) << "Homepage has changed"; + PrefService* prefs = profile->GetPrefs(); + std::string backup_homepage; + bool backup_homepage_is_ntp; + bool backup_show_home_button; + if (!prefs_watcher->GetBackupForPref(prefs::kHomePage)-> + GetAsString(&backup_homepage) || + !prefs_watcher->GetBackupForPref(prefs::kHomePageIsNewTabPage)-> + GetAsBoolean(&backup_homepage_is_ntp) || + !prefs_watcher->GetBackupForPref(prefs::kShowHomeButton)-> + GetAsBoolean(&backup_show_home_button)) { + NOTREACHED(); + } + protector_service->ShowChange(protector::CreateHomepageChange( + // New: + prefs->GetString(prefs::kHomePage), + prefs->GetBoolean(prefs::kHomePageIsNewTabPage), + prefs->GetBoolean(prefs::kShowHomeButton), + // Backup: + backup_homepage, + backup_homepage_is_ntp, + backup_show_home_button)); } } diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 7597e69..6fd8444 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1765,6 +1765,8 @@ 'browser/protector/default_search_provider_change.cc', 'browser/protector/histograms.cc', 'browser/protector/histograms.h', + 'browser/protector/homepage_change.cc', + 'browser/protector/homepage_change.h', 'browser/protector/keys.cc', 'browser/protector/keys.h', 'browser/protector/prefs_backup_invalid_change.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 2f45064..2dfcca8 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1623,6 +1623,7 @@ 'browser/profiles/profile_info_util_unittest.cc', 'browser/profiles/profile_manager_unittest.cc', 'browser/protector/composite_settings_change_unittest.cc', + 'browser/protector/homepage_change_unittest.cc', 'browser/protector/prefs_backup_invalid_change_unittest.cc', 'browser/protector/protected_prefs_watcher_unittest.cc', 'browser/protector/session_startup_change_unittest.cc', diff --git a/chrome/test/functional/protector.py b/chrome/test/functional/protector.py index 5fca89f..c7f432d 100644 --- a/chrome/test/functional/protector.py +++ b/chrome/test/functional/protector.py @@ -180,6 +180,20 @@ class BaseProtectorTest(pyauto.PyUITest): prefs['pinned_tabs'].append({'url': tab}) self._WritePreferences(prefs) + def _ChangeHomepage(self, homepage, homepage_is_ntp, show_homepage_button): + """Changes homepage settings. + + Args: + homepage: new homepage URL (str), + homepage_is_ntp: whether homepage is NTP. + show_homepage_button: whether homepage button is visible. + """ + prefs = self._LoadPreferences() + prefs['homepage'] = homepage + prefs['homepage_is_newtabpage'] = homepage_is_ntp + prefs['browser']['show_home_button'] = show_homepage_button + self._WritePreferences(prefs) + def _AssertSingleTabOpen(self, url): """Asserts that a single tab with given url is open. @@ -399,7 +413,7 @@ class ProtectorSessionStartupTest(BaseProtectorTest): # No longer showing the change. self.assertFalse(self.GetProtectorState()['showing_change']) - def testDetectSessionStartupChangeAndApply(self): + def testDetectSessionStartupChangeAndDiscard(self): """Test for detecting and discarding a session startup pref change.""" # Set startup prefs to restoring last open tabs. self.SetPrefs(pyauto.kRestoreOnStartup, self._SESSION_STARTUP_LAST) @@ -528,6 +542,74 @@ class ProtectorSessionStartupTest(BaseProtectorTest): self.assertFalse(self.GetProtectorState()['showing_change']) +class ProtectorHomepageTest(BaseProtectorTest): + """Test suite for homepage changes with Protector enabled.""" + + def testDetectHomepageChangeWhenButtonNotShown(self): + """Test that homepage change is detected and reverted when homepage button + is set to not be shown. + """ + previous_homepage = 'http://example.com/' + self.SetPrefs(pyauto.kHomePage, previous_homepage) + self.SetPrefs(pyauto.kHomePageIsNewTabPage, False) + self.SetPrefs(pyauto.kShowHomeButton, False) + self.RestartBrowser( + clear_profile=False, + pre_launch_hook=lambda: self._ChangeHomepage( + 'http://example.info/', False, False)) + # Change has been automatically reverted, no bubble shown. + self.assertFalse(self.GetProtectorState()['showing_change']) + self.assertEquals(previous_homepage, + self.GetPrefsInfo().Prefs(pyauto.kHomePage)) + + def testDetectHomepageChangeAndApply(self): + """Test that homepage change is detected and can be applied.""" + previous_homepage = 'http://example.com/' + new_homepage = 'http://example.info/' + self.SetPrefs(pyauto.kHomePage, previous_homepage) + self.SetPrefs(pyauto.kHomePageIsNewTabPage, False) + self.SetPrefs(pyauto.kShowHomeButton, False) + self.RestartBrowser( + clear_profile=False, + pre_launch_hook=lambda: self._ChangeHomepage(new_homepage, False, True)) + # The change must be detected by Protector. + self.assertTrue(self.GetProtectorState()['showing_change']) + # Protector must restore old preference values. + self.assertEquals(previous_homepage, + self.GetPrefsInfo().Prefs(pyauto.kHomePage)) + self.assertEquals(False, self.GetPrefsInfo().Prefs(pyauto.kShowHomeButton)) + self.ApplyProtectorChange() + # Now new values are active. + self.assertEquals(new_homepage, self.GetPrefsInfo().Prefs(pyauto.kHomePage)) + self.assertEquals(True, self.GetPrefsInfo().Prefs(pyauto.kShowHomeButton)) + # No longer showing the change + self.assertFalse(self.GetProtectorState()['showing_change']) + + def testDetectHomepageChangeAndDiscard(self): + """Test that homepage change is detected and can be discarded.""" + previous_homepage = 'http://example.com/' + new_homepage = 'http://example.info/' + self.SetPrefs(pyauto.kHomePage, previous_homepage) + self.SetPrefs(pyauto.kHomePageIsNewTabPage, False) + self.SetPrefs(pyauto.kShowHomeButton, False) + self.RestartBrowser( + clear_profile=False, + pre_launch_hook=lambda: self._ChangeHomepage(new_homepage, False, True)) + # The change must be detected by Protector. + self.assertTrue(self.GetProtectorState()['showing_change']) + # Protector must restore old preference values. + self.assertEquals(previous_homepage, + self.GetPrefsInfo().Prefs(pyauto.kHomePage)) + self.assertEquals(False, self.GetPrefsInfo().Prefs(pyauto.kShowHomeButton)) + self.DiscardProtectorChange() + # Nothing changed + self.assertEquals(previous_homepage, + self.GetPrefsInfo().Prefs(pyauto.kHomePage)) + self.assertEquals(False, self.GetPrefsInfo().Prefs(pyauto.kShowHomeButton)) + # No longer showing the change + self.assertFalse(self.GetProtectorState()['showing_change']) + + class ProtectorDisabledTest(BaseProtectorTest): """Test suite for Protector in disabled state.""" @@ -606,6 +688,21 @@ class ProtectorDisabledTest(BaseProtectorTest): self.assertEqual(1, len(info['windows'][0]['tabs'])) # one tab self.assertEqual(new_url, info['windows'][0]['tabs'][0]['url']) + def testNoHomepageChangeReported(self): + """Test that homepage change is neither reported nor reverted.""" + new_homepage = 'http://example.info/' + self.SetPrefs(pyauto.kHomePage, 'http://example.com/') + self.SetPrefs(pyauto.kHomePageIsNewTabPage, False) + self.SetPrefs(pyauto.kShowHomeButton, False) + self.RestartBrowser( + clear_profile=False, + pre_launch_hook=lambda: self._ChangeHomepage(new_homepage, False, True)) + # Not showing the change. + self.assertFalse(self.GetProtectorState()['showing_change']) + # New values must be active. + self.assertEquals(new_homepage, self.GetPrefsInfo().Prefs(pyauto.kHomePage)) + self.assertEquals(True, self.GetPrefsInfo().Prefs(pyauto.kShowHomeButton)) + if __name__ == '__main__': pyauto_functional.Main() |