summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd10
-rw-r--r--chrome/browser/protector/base_setting_change.cc7
-rw-r--r--chrome/browser/protector/base_setting_change.h14
-rw-r--r--chrome/browser/protector/histograms.cc9
-rw-r--r--chrome/browser/protector/histograms.h10
-rw-r--r--chrome/browser/protector/homepage_change.cc204
-rw-r--r--chrome/browser/protector/homepage_change_unittest.cc63
-rw-r--r--chrome/browser/protector/mock_setting_change.cc2
-rw-r--r--chrome/browser/protector/mock_setting_change.h2
-rw-r--r--chrome/browser/protector/protector_service.cc4
-rw-r--r--chrome/browser/ui/browser_init.cc44
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/test/functional/protector.py99
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()