From 2baf83d75ea5d1233d3ddcf8e28aa4f4466c115c Mon Sep 17 00:00:00 2001
From: "finnur@google.com"
 <finnur@google.com@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Wed, 30 Jul 2008 05:58:17 +0000
Subject: [PATCH] Fix 1295677: REGRESSION: Import SETS startup page to imported
 home page.

We had only kHomePage pref before, which if blank/set to chrome-internal: meant that the New Tab page should be shown when Home is pressed. Now we add a pref called kHomePageIsNewTabPage for this purpose, which allows us to set the kHomePage value during import without actually using it as the HomePage (effectively importing home page becomes importing a default suggestion for when the users want a home page instead of the New Tab page).

BUG=1295677


git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107 0039d316-1c4b-4281-b951-d872f2087c98
---
 chrome/browser/browser.cc                     | 25 ++++++++++---
 chrome/browser/browser.h                      | 10 ++++--
 chrome/browser/browser_commands.cc            |  7 +---
 chrome/browser/browser_init.cc                |  1 +
 chrome/browser/importer.cc                    |  1 +
 .../views/options/advanced_page_view.cc       |  1 +
 .../views/options/general_page_view.cc        | 35 ++++++++++++-------
 .../browser/views/options/general_page_view.h | 13 +++++--
 chrome/common/pref_names.cc                   |  3 ++
 chrome/common/pref_names.h                    |  7 ++--
 10 files changed, 72 insertions(+), 31 deletions(-)

diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc
index 8c623b23340da..72f5afd23ff0a 100644
--- a/chrome/browser/browser.cc
+++ b/chrome/browser/browser.cc
@@ -41,6 +41,7 @@
 #include "chrome/browser/browser_shutdown.h"
 #include "chrome/browser/browser_url_handler.h"
 #include "chrome/browser/cert_store.h"
+#include "chrome/browser/dom_ui/new_tab_ui.h"
 #include "chrome/browser/frame_util.h"
 #include "chrome/browser/navigation_controller.h"
 #include "chrome/browser/navigation_entry.h"
@@ -194,6 +195,7 @@ void Browser::RegisterPrefs(PrefService* prefs) {
 // static
 void Browser::RegisterUserPrefs(PrefService* prefs) {
   prefs->RegisterStringPref(prefs::kHomePage, L"chrome-internal:");
+  prefs->RegisterBooleanPref(prefs::kHomePageIsNewTabPage, true);
   prefs->RegisterIntegerPref(prefs::kCookieBehavior,
       CookiePolicy::ALLOW_ALL_COOKIES);
   prefs->RegisterBooleanPref(prefs::kShowHomeButton, false);
@@ -373,6 +375,20 @@ ChromeViews::View* Browser::GetToolbar() {
   return &toolbar_;
 }
 
+GURL Browser::GetHomePage() {
+  if (profile_->GetPrefs()->GetBoolean(prefs::kHomePageIsNewTabPage)) {
+    return NewTabUIURL();
+  } else {
+    GURL home_page = GURL(URLFixerUpper::FixupURL(
+        profile_->GetPrefs()->GetString(prefs::kHomePage),
+        std::wstring()));
+    if (!home_page.is_valid())
+      return NewTabUIURL();
+
+    return home_page;
+  }
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 
 void Browser::SyncWindowTitle() {
@@ -619,7 +635,8 @@ void Browser::OpenURLFromTab(TabContents* source,
   }
 
   if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost) {
-    // Give the focus to the newly navigated tab, if the source tab was front-most
+    // Give the focus to the newly navigated tab, if the source tab was
+    // front-most.
     new_contents->Focus();
   }
 }
@@ -790,7 +807,7 @@ void Browser::Observe(NotificationType type,
       }
     }
   } else if (type == NOTIFY_WEB_CONTENTS_DISCONNECTED) {
-    // Need to do this asynchronously as it will close the tab, which is 
+    // Need to do this asynchronously as it will close the tab, which is
     // currently on the call stack above us.
     MessageLoop::current()->PostTask(FROM_HERE,
         method_factory_.NewRunnableMethod(&Browser::ClearUnloadStateOnCrash,
@@ -1161,7 +1178,7 @@ TabContents* Browser::AddTabWithURL(
 
   GURL url_to_load = url;
   if (url_to_load.is_empty())
-    url_to_load = GURL(profile_->GetPrefs()->GetString(prefs::kHomePage));
+    url_to_load = GetHomePage();
   TabContents* contents =
       CreateTabContentsForURL(url_to_load, profile_, transition, false,
                               instance);
@@ -1550,7 +1567,7 @@ NavigationController* Browser::BuildRestoredNavigationController(
     // We should have a valid URL, if we don't fall back to the default.
     GURL url = navigations[selected_navigation].url;
     if (url.is_empty())
-      url = GURL(profile_->GetPrefs()->GetString(prefs::kHomePage));
+      url = GetHomePage();
 
     // Create a NavigationController. This constructor creates the appropriate
     // set of TabContents.
diff --git a/chrome/browser/browser.h b/chrome/browser/browser.h
index 9c22d7f3dabd3..fc849749fe58f 100644
--- a/chrome/browser/browser.h
+++ b/chrome/browser/browser.h
@@ -27,8 +27,8 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifndef CHROME_BROWSER_BROWSER_H__
-#define CHROME_BROWSER_BROWSER_H__
+#ifndef CHROME_BROWSER_BROWSER_H_
+#define CHROME_BROWSER_BROWSER_H_
 
 #include "chrome/app/chrome_dll_resource.h"
 #include "chrome/browser/browser_type.h"
@@ -404,6 +404,10 @@ class Browser : public TabStripModelDelegate,
   // Returns the root view for this browser.
   ChromeViews::RootView* GetRootView() const;
 
+  // Returns what the user's home page is, or the new tab page if the home page
+  // has not been set.
+  GURL GetHomePage();
+
   // Called when this window gains or loses window-manager-level activation.
   // is_active is whether or not the Window is now active.
   void WindowActivationChanged(bool is_active);
@@ -634,4 +638,4 @@ class Browser : public TabStripModelDelegate,
   DISALLOW_EVIL_CONSTRUCTORS(Browser);
 };
 
-#endif  // CHROME_BROWSER_BROWSER_H__
+#endif  // CHROME_BROWSER_BROWSER_H_
diff --git a/chrome/browser/browser_commands.cc b/chrome/browser/browser_commands.cc
index 686016d1a86f0..974a4f3e12921 100644
--- a/chrome/browser/browser_commands.cc
+++ b/chrome/browser/browser_commands.cc
@@ -847,12 +847,7 @@ void Browser::Reload() {
 }
 
 void Browser::Home() {
-  GURL homepage_url(URLFixerUpper::FixupURL(
-      profile_->GetPrefs()->GetString(prefs::kHomePage),
-      std::wstring()));
-  if (!homepage_url.is_valid())
-    homepage_url = NewTabUIURL();
-
+  GURL homepage_url = GetHomePage();
   GetSelectedTabContents()->controller()->LoadURL(
       homepage_url, PageTransition::AUTO_BOOKMARK);
 }
diff --git a/chrome/browser/browser_init.cc b/chrome/browser/browser_init.cc
index dc3440ab53537..f718100f738c8 100644
--- a/chrome/browser/browser_init.cc
+++ b/chrome/browser/browser_init.cc
@@ -77,6 +77,7 @@ void SetOverrideHomePage(const CommandLine& command_line, PrefService* prefs) {
         browser_directory,
         command_line.GetSwitchValue(switches::kHomePage));
     prefs->transient()->SetString(prefs::kHomePage, new_homepage);
+    prefs->transient()->SetBoolean(prefs::kHomePageIsNewTabPage, false);
   }
 }
 
diff --git a/chrome/browser/importer.cc b/chrome/browser/importer.cc
index f0b2b5181896c..e25c03a0ecb35 100644
--- a/chrome/browser/importer.cc
+++ b/chrome/browser/importer.cc
@@ -95,6 +95,7 @@ void ProfileWriter::AddHomepage(const GURL& home_page) {
   DCHECK(profile_);
 
   PrefService* prefs = profile_->GetPrefs();
+  // NOTE: We set the kHomePage value, but keep the NewTab page as the homepage.
   prefs->SetString(prefs::kHomePage, ASCIIToWide(home_page.spec()));
   prefs->ScheduleSavePersistentPrefs(g_browser_process->file_thread());
 }
diff --git a/chrome/browser/views/options/advanced_page_view.cc b/chrome/browser/views/options/advanced_page_view.cc
index 37c69367878b1..baf721dcef62c 100644
--- a/chrome/browser/views/options/advanced_page_view.cc
+++ b/chrome/browser/views/options/advanced_page_view.cc
@@ -136,6 +136,7 @@ void AdvancedPageView::ResetToDefaults() {
     prefs::kDownloadDefaultDirectory,
     prefs::kDownloadExtensionsToOpen,
     prefs::kHomePage,
+    prefs::kHomePageIsNewTabPage,
     prefs::kMixedContentFiltering,
     prefs::kPromptForDownload,
     prefs::kPasswordManagerEnabled,
diff --git a/chrome/browser/views/options/general_page_view.cc b/chrome/browser/views/options/general_page_view.cc
index 4544e67dcd960..cccc7dbfbca98 100644
--- a/chrome/browser/views/options/general_page_view.cc
+++ b/chrome/browser/views/options/general_page_view.cc
@@ -578,15 +578,12 @@ void GeneralPageView::ButtonPressed(ChromeViews::NativeButton* sender) {
   } else if (sender == homepage_use_newtab_radio_) {
     UserMetricsRecordAction(L"Options_Homepage_UseNewTab",
                             profile()->GetPrefs());
-    homepage_.SetValue(GetNewTabUIURLString());
+    SetHomepage(GetNewTabUIURLString());
     EnableHomepageURLField(false);
   } else if (sender == homepage_use_url_radio_) {
     UserMetricsRecordAction(L"Options_Homepage_UseURL",
                             profile()->GetPrefs());
-    std::wstring home_page_url = homepage_use_url_textfield_->GetText();
-    if (home_page_url.empty())
-      home_page_url = GetNewTabUIURLString();
-    homepage_.SetValue(home_page_url);
+    SetHomepage(homepage_use_url_textfield_->GetText());
     EnableHomepageURLField(true);
   } else if (sender == homepage_show_home_button_checkbox_) {
     bool show_button = homepage_show_home_button_checkbox_->IsSelected();
@@ -630,7 +627,7 @@ void GeneralPageView::ContentsChanged(ChromeViews::TextField* sender,
     std::wstring url_string = URLFixerUpper::FixupURL(
         homepage_use_url_textfield_->GetText(), std::wstring());
     if (GURL(url_string).is_valid())
-      homepage_.SetValue(url_string);
+      SetHomepage(url_string);
   }
 }
 
@@ -679,6 +676,8 @@ void GeneralPageView::InitControlLayout() {
   profile()->GetPrefs()->AddPrefObserver(prefs::kRestoreOnStartup, this);
   profile()->GetPrefs()->AddPrefObserver(prefs::kURLsToRestoreOnStartup, this);
 
+  new_tab_page_is_home_page_.Init(prefs::kHomePageIsNewTabPage,
+      profile()->GetPrefs(), this);
   homepage_.Init(prefs::kHomePage, profile()->GetPrefs(), this);
   show_home_button_.Init(prefs::kShowHomeButton, profile()->GetPrefs(), this);
 }
@@ -719,15 +718,18 @@ void GeneralPageView::NotifyPrefChanged(const std::wstring* pref_name) {
     startup_custom_pages_table_model_->SetURLs(startup_pref.urls);
   }
 
+  if (!pref_name || *pref_name == prefs::kHomePageIsNewTabPage) {    
+    if (new_tab_page_is_home_page_.GetValue())
+      homepage_use_newtab_radio_->SetIsSelected(true);
+    else
+      homepage_use_url_radio_->SetIsSelected(true);
+  }
+
   if (!pref_name || *pref_name == prefs::kHomePage) {
     bool enabled = homepage_.GetValue() != GetNewTabUIURLString();
-    if (enabled) {
-      homepage_use_url_radio_->SetIsSelected(true);
+    if (enabled)
       homepage_use_url_textfield_->SetText(homepage_.GetValue());
-    } else {
-      homepage_use_newtab_radio_->SetIsSelected(true);
-    }
-    EnableHomepageURLField(enabled);
+    EnableHomepageURLField(!new_tab_page_is_home_page_.GetValue());
   }
 
   if (!pref_name || *pref_name == prefs::kShowHomeButton) {
@@ -1072,6 +1074,15 @@ void GeneralPageView::AddBookmark(ShelfItemDialog* dialog,
   SaveStartupPref();
 }
 
+void GeneralPageView::SetHomepage(const std::wstring& homepage) {
+  if (homepage.empty() || homepage == GetNewTabUIURLString()) {
+    new_tab_page_is_home_page_.SetValue(true);
+  } else {
+    new_tab_page_is_home_page_.SetValue(false);
+    homepage_.SetValue(homepage);
+  }
+}
+
 void GeneralPageView::OnSelectionChanged() {
   startup_remove_custom_page_button_->SetEnabled(
       startup_custom_pages_table_->SelectedRowCount() > 0);
diff --git a/chrome/browser/views/options/general_page_view.h b/chrome/browser/views/options/general_page_view.h
index 597db440f4b8d..1ea1ae114f2c0 100644
--- a/chrome/browser/views/options/general_page_view.h
+++ b/chrome/browser/views/options/general_page_view.h
@@ -27,8 +27,8 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifndef CHROME_BROWSER_VIEWS_OPTIONS_GENERAL_PAGE_VIEW_H__
-#define CHROME_BROWSER_VIEWS_OPTIONS_GENERAL_PAGE_VIEW_H__
+#ifndef CHROME_BROWSER_VIEWS_OPTIONS_GENERAL_PAGE_VIEW_H_
+#define CHROME_BROWSER_VIEWS_OPTIONS_GENERAL_PAGE_VIEW_H_
 
 #include "chrome/browser/views/options/options_page_view.h"
 #include "chrome/browser/views/shelf_item_dialog.h"
@@ -126,6 +126,12 @@ class GeneralPageView : public OptionsPageView,
                            const std::wstring& title,
                            const GURL& url);
 
+  // Sets the home page preferences for kNewTabPageIsHomePage and kHomePage.
+  // If a blank string is passed in we revert to using NewTab page as the Home
+  // page. When setting the Home Page to NewTab page, we preserve the old value
+  // of kHomePage (we don't overwrite it).
+  void SetHomepage(const std::wstring& homepage);
+
   // Invoked when the selection of the table view changes. Updates the enabled
   // property of the remove button.
   virtual void OnSelectionChanged();
@@ -153,6 +159,7 @@ class GeneralPageView : public OptionsPageView,
   ChromeViews::RadioButton* homepage_use_url_radio_;
   ChromeViews::TextField* homepage_use_url_textfield_;
   ChromeViews::CheckBox* homepage_show_home_button_checkbox_;
+  BooleanPrefMember new_tab_page_is_home_page_;
   StringPrefMember homepage_;
   BooleanPrefMember show_home_button_;
 
@@ -175,4 +182,4 @@ class GeneralPageView : public OptionsPageView,
   DISALLOW_EVIL_CONSTRUCTORS(GeneralPageView);
 };
 
-#endif  // #ifndef CHROME_BROWSER_VIEWS_OPTIONS_GENERAL_PAGE_VIEW_H__
+#endif  // CHROME_BROWSER_VIEWS_OPTIONS_GENERAL_PAGE_VIEW_H_
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 77f68cdc3b2f7..ea7ec008db335 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -34,6 +34,9 @@ namespace prefs {
 // *************** PROFILE PREFS ***************
 // These are attached to the user profile
 
+// A boolean specifying whether the New Tab page is the home page or not.
+const wchar_t kHomePageIsNewTabPage[] = L"homepage_is_newtabpage";
+
 // This is the URL of the page to load when opening new tabs.
 const wchar_t kHomePage[] = L"homepage";
 
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index eb1f3fcd08fd0..610f2ed64747f 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -29,12 +29,13 @@
 
 // Constants for the names of various preferences, for easier changing.
 
-#ifndef CHROME_COMMON_PREF_NAMES_H__
-#define CHROME_COMMON_PREF_NAMES_H__
+#ifndef CHROME_COMMON_PREF_NAMES_H_
+#define CHROME_COMMON_PREF_NAMES_H_
 
 namespace prefs {
 
 // Profile prefs
+extern const wchar_t kHomePageIsNewTabPage[];
 extern const wchar_t kHomePage[];
 extern const wchar_t kProfileName[];
 extern const wchar_t kProfileNickname[];
@@ -164,4 +165,4 @@ extern const wchar_t kNumFoldersInOtherBookmarkFolder[];
 extern const wchar_t kNumKeywords[];
 }
 
-#endif  // CHROME_COMMON_PREF_NAMES_H__
+#endif  // CHROME_COMMON_PREF_NAMES_H_
-- 
GitLab