From 05e789d0a4728cf8cd2c153443d78992c624a945 Mon Sep 17 00:00:00 2001
From: "kuchhal@chromium.org"
 <kuchhal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Tue, 11 Aug 2009 21:40:55 +0000
Subject: Do not import homepage on First Run if a homepage is given in master
 preferences.

BUG=9048

Review URL: http://codereview.chromium.org/164291

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23085 0039d316-1c4b-4281-b951-d872f2087c98
---
 chrome/browser/browser_main.cc                   |  7 +++----
 chrome/browser/first_run.h                       |  9 +++++++--
 chrome/browser/first_run_gtk.cc                  |  3 ++-
 chrome/browser/first_run_mac.mm                  |  4 +++-
 chrome/browser/first_run_win.cc                  |  9 +++++++--
 chrome/browser/views/first_run_customize_view.cc |  5 +++--
 chrome/browser/views/first_run_customize_view.h  |  5 +++--
 chrome/browser/views/first_run_view.cc           |  7 ++++---
 chrome/browser/views/first_run_view.h            |  4 ++--
 chrome/browser/views/first_run_view_base.cc      | 12 ++++++++----
 chrome/browser/views/first_run_view_base.h       |  7 +++++--
 chrome/common/temp_scaffolding_stubs.cc          |  3 ++-
 chrome/common/temp_scaffolding_stubs.h           |  2 --
 13 files changed, 49 insertions(+), 28 deletions(-)

(limited to 'chrome')

diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc
index 906ee5b..560fc54 100644
--- a/chrome/browser/browser_main.cc
+++ b/chrome/browser/browser_main.cc
@@ -448,15 +448,14 @@ int BrowserMain(const MainFunctionParams& parameters) {
   BrowserInit browser_init;
 
   int rlz_ping_delay = 0;
+  bool homepage_defined = false;
   if (is_first_run) {
     // On first run, we  need to process the master preferences before the
     // browser's profile_manager object is created, but after ResourceBundle
     // is initialized.
     std::vector<std::wstring> first_run_tabs;
     first_run_ui_bypass = !FirstRun::ProcessMasterPreferences(user_data_dir,
-                                                              FilePath(),
-                                                              &first_run_tabs,
-                                                              &rlz_ping_delay);
+        FilePath(), &first_run_tabs, &rlz_ping_delay, &homepage_defined);
     // The master prefs might specify a set of urls to display.
     if (first_run_tabs.size())
       AddFirstRunNewTabs(&browser_init, first_run_tabs);
@@ -607,7 +606,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
   // preferences are registered, since some of the code that the importer
   // touches reads preferences.
   if (is_first_run && !first_run_ui_bypass) {
-    if (!OpenFirstRunDialog(profile, &process_singleton)) {
+    if (!OpenFirstRunDialog(profile, homepage_defined, &process_singleton)) {
       // The user cancelled the first run dialog box, we should exit Chrome.
       return ResultCodes::NORMAL_EXIT;
     }
diff --git a/chrome/browser/first_run.h b/chrome/browser/first_run.h
index 0914e9f..41aba0c 100644
--- a/chrome/browser/first_run.h
+++ b/chrome/browser/first_run.h
@@ -70,7 +70,8 @@ class FirstRun {
   static bool ProcessMasterPreferences(const FilePath& user_data_dir,
                                        const FilePath& master_prefs_path,
                                        std::vector<std::wstring>* new_tabs,
-                                       int* ping_delay);
+                                       int* ping_delay,
+                                       bool* homepage_defined);
 
   // Sets the kShouldShowFirstRunBubble local state pref so that the browser
   // shows the bubble once the main message loop gets going. Returns false if
@@ -148,8 +149,12 @@ class FirstRunBrowserProcess : public BrowserProcessImpl {
 // |profile| and perhaps some other tasks.
 // |process_singleton| is used to lock the handling of CopyData messages
 // while the First Run UI is visible.
+// |homepage_defined| true indicates that homepage is defined in master
+// preferences and should not be imported from another browser.
 // Returns true if the user clicked "Start", false if the user pressed "Cancel"
 // or closed the dialog.
-bool OpenFirstRunDialog(Profile* profile, ProcessSingleton* process_singleton);
+bool OpenFirstRunDialog(Profile* profile,
+                        bool homepage_defined,
+                        ProcessSingleton* process_singleton);
 
 #endif  // CHROME_BROWSER_FIRST_RUN_H_
diff --git a/chrome/browser/first_run_gtk.cc b/chrome/browser/first_run_gtk.cc
index 314a462..dcd6074 100644
--- a/chrome/browser/first_run_gtk.cc
+++ b/chrome/browser/first_run_gtk.cc
@@ -7,7 +7,8 @@
 
 #include "chrome/browser/gtk/first_run_dialog.h"
 
-bool OpenFirstRunDialog(Profile* profile, ProcessSingleton* process_singleton) {
+bool OpenFirstRunDialog(Profile* profile, bool homepage_defined,
+                        ProcessSingleton* process_singleton) {
   // TODO(port): Use process_singleton to make sure Chrome can not be started
   // while this process is active.
   return FirstRunDialog::Show(profile);
diff --git a/chrome/browser/first_run_mac.mm b/chrome/browser/first_run_mac.mm
index cb354d4..808b79c 100644
--- a/chrome/browser/first_run_mac.mm
+++ b/chrome/browser/first_run_mac.mm
@@ -61,7 +61,9 @@ class FirstRunController : public ImportObserver {
 };
 
 
-bool OpenFirstRunDialog(Profile* profile, ProcessSingleton* process_singleton) {
+bool OpenFirstRunDialog(Profile* profile,
+                        bool homepage_defined,
+                        ProcessSingleton* process_singleton) {
 // OpenFirstRunDialog is a no-op on non-branded builds.
   FirstRunController* controller = new FirstRunController;
   return controller->DoFirstRun(profile, process_singleton);
diff --git a/chrome/browser/first_run_win.cc b/chrome/browser/first_run_win.cc
index 994fa71..403f5ad 100644
--- a/chrome/browser/first_run_win.cc
+++ b/chrome/browser/first_run_win.cc
@@ -168,7 +168,8 @@ bool FirstRun::CreateChromeQuickLaunchShortcut() {
 bool FirstRun::ProcessMasterPreferences(const FilePath& user_data_dir,
                                         const FilePath& master_prefs_path,
                                         std::vector<std::wstring>* new_tabs,
-                                        int* ping_delay) {
+                                        int* ping_delay,
+                                        bool* homepage_defined) {
   DCHECK(!user_data_dir.empty());
   FilePath master_prefs = master_prefs_path;
   if (master_prefs.empty()) {
@@ -194,6 +195,8 @@ bool FirstRun::ProcessMasterPreferences(const FilePath& user_data_dir,
       *ping_delay = 90;
     }
   }
+  if (homepage_defined)
+    prefs->GetBoolean(prefs::kHomePage, homepage_defined);
 
   if (installer_util::GetDistroBooleanPreference(prefs.get(),
       installer_util::master_preferences::kRequireEula)) {
@@ -351,13 +354,15 @@ bool Upgrade::SwapNewChromeExeIfPresent() {
 }
 
 bool OpenFirstRunDialog(Profile* profile,
+                        bool homepage_defined,
                         ProcessSingleton* process_singleton) {
   DCHECK(profile);
   DCHECK(process_singleton);
 
   // We need the FirstRunView to outlive its parent, as we retrieve the accept
   // state from it after the dialog has been closed.
-  scoped_ptr<FirstRunView> first_run_view(new FirstRunView(profile));
+  scoped_ptr<FirstRunView> first_run_view(new FirstRunView(profile,
+                                                           homepage_defined));
   first_run_view->SetParentOwned(false);
   views::Window* first_run_ui = views::Window::CreateChromeWindow(
       NULL, gfx::Rect(), first_run_view.get());
diff --git a/chrome/browser/views/first_run_customize_view.cc b/chrome/browser/views/first_run_customize_view.cc
index a61d124..f93d7a7 100644
--- a/chrome/browser/views/first_run_customize_view.cc
+++ b/chrome/browser/views/first_run_customize_view.cc
@@ -24,8 +24,9 @@
 FirstRunCustomizeView::FirstRunCustomizeView(Profile* profile,
                                              ImporterHost* importer_host,
                                              CustomizeViewObserver* observer,
-                                             bool default_browser_checked)
-    : FirstRunViewBase(profile),
+                                             bool default_browser_checked,
+                                             bool homepage_defined)
+    : FirstRunViewBase(profile, homepage_defined),
       main_label_(NULL),
       import_cbox_(NULL),
       import_from_combo_(NULL),
diff --git a/chrome/browser/views/first_run_customize_view.h b/chrome/browser/views/first_run_customize_view.h
index 13ef358..990bf27 100644
--- a/chrome/browser/views/first_run_customize_view.h
+++ b/chrome/browser/views/first_run_customize_view.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2009 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.
 
@@ -39,7 +39,8 @@ class FirstRunCustomizeView : public FirstRunViewBase,
   FirstRunCustomizeView(Profile* profile,
                         ImporterHost* importer_host,
                         CustomizeViewObserver* observer,
-                        bool default_browser_checked);
+                        bool default_browser_checked,
+                        bool homepage_defined);
   virtual ~FirstRunCustomizeView();
 
   // Overridden from views::View.
diff --git a/chrome/browser/views/first_run_view.cc b/chrome/browser/views/first_run_view.cc
index 1c28b3f..334213c 100644
--- a/chrome/browser/views/first_run_view.cc
+++ b/chrome/browser/views/first_run_view.cc
@@ -33,8 +33,8 @@ std::wstring AddBullet(const std::wstring& text) {
 
 }  // namespace
 
-FirstRunView::FirstRunView(Profile* profile)
-    : FirstRunViewBase(profile),
+FirstRunView::FirstRunView(Profile* profile, bool homepage_defined)
+    : FirstRunViewBase(profile, homepage_defined),
       welcome_label_(NULL),
       actions_label_(NULL),
       actions_import_(NULL),
@@ -153,7 +153,8 @@ void FirstRunView::OpenCustomizeDialog() {
       new FirstRunCustomizeView(profile_,
                                 importer_host_,
                                 this,
-                                default_browser_->checked()))->Show();
+                                default_browser_->checked(),
+                                homepage_defined_))->Show();
 }
 
 void FirstRunView::LinkActivated(views::Link* source, int event_flags) {
diff --git a/chrome/browser/views/first_run_view.h b/chrome/browser/views/first_run_view.h
index abc2d48..0f03203 100644
--- a/chrome/browser/views/first_run_view.h
+++ b/chrome/browser/views/first_run_view.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2009 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.
 
@@ -25,7 +25,7 @@ class FirstRunView : public FirstRunViewBase,
                      public views::LinkController,
                      public FirstRunCustomizeView::CustomizeViewObserver {
  public:
-  explicit FirstRunView(Profile* profile);
+  explicit FirstRunView(Profile* profile, bool homepage_defined);
   virtual ~FirstRunView();
 
   bool accepted() const { return accepted_;}
diff --git a/chrome/browser/views/first_run_view_base.cc b/chrome/browser/views/first_run_view_base.cc
index afb73f0..4d420e0 100644
--- a/chrome/browser/views/first_run_view_base.cc
+++ b/chrome/browser/views/first_run_view_base.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2009 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.
 
@@ -30,14 +30,15 @@
 #include "views/window/client_view.h"
 #include "views/window/window.h"
 
-FirstRunViewBase::FirstRunViewBase(Profile* profile)
+FirstRunViewBase::FirstRunViewBase(Profile* profile, bool homepage_defined)
     : preferred_width_(0),
       background_image_(NULL),
       separator_1_(NULL),
       default_browser_(NULL),
       separator_2_(NULL),
       importer_host_(NULL),
-      profile_(profile) {
+      profile_(profile),
+      homepage_defined_(homepage_defined) {
   DCHECK(profile);
   SetupControls();
 }
@@ -163,7 +164,10 @@ int FirstRunViewBase::GetDefaultImportItems() const {
   // It is best to avoid importing cookies because there is a bug that make
   // the process take way too much time among other issues. So for the time
   // being we say: TODO(CPU): Bug 1196875
-  return HISTORY | FAVORITES | PASSWORDS | SEARCH_ENGINES | HOME_PAGE;
+  int items = HISTORY | FAVORITES | PASSWORDS | SEARCH_ENGINES;
+  if (!homepage_defined_)
+    items = items | HOME_PAGE;
+  return items;
 };
 
 void FirstRunViewBase::DisableButtons() {
diff --git a/chrome/browser/views/first_run_view_base.h b/chrome/browser/views/first_run_view_base.h
index 2e19947..77db891 100644
--- a/chrome/browser/views/first_run_view_base.h
+++ b/chrome/browser/views/first_run_view_base.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2009 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.
 
@@ -26,7 +26,7 @@ class ImporterHost;
 class FirstRunViewBase : public views::View,
                          public views::DialogDelegate {
  public:
-  explicit FirstRunViewBase(Profile* profile);
+  explicit FirstRunViewBase(Profile* profile, bool homepage_defined);
   virtual ~FirstRunViewBase();
 
   // Overridden from views::View.
@@ -79,6 +79,9 @@ class FirstRunViewBase : public views::View,
   Profile* profile_;
   views::Checkbox* default_browser_;
 
+ protected:
+  bool homepage_defined_;
+
  private:
   // Initializes the controls on the dialog.
   void SetupControls();
diff --git a/chrome/common/temp_scaffolding_stubs.cc b/chrome/common/temp_scaffolding_stubs.cc
index b1d6f40..cf0f4b2 100644
--- a/chrome/common/temp_scaffolding_stubs.cc
+++ b/chrome/common/temp_scaffolding_stubs.cc
@@ -146,7 +146,8 @@ void AutomationProvider::OnMessageFromExternalHost(
 bool FirstRun::ProcessMasterPreferences(const FilePath& user_data_dir,
                                         const FilePath& master_prefs_path,
                                         std::vector<std::wstring>* new_tabs,
-                                        int* ping_delay) {
+                                        int* ping_delay,
+                                        bool* homepage_defined) {
   // http://code.google.com/p/chromium/issues/detail?id=11971
   // Pretend we processed them correctly.
   return true;
diff --git a/chrome/common/temp_scaffolding_stubs.h b/chrome/common/temp_scaffolding_stubs.h
index 0158700..1e681eb 100644
--- a/chrome/common/temp_scaffolding_stubs.h
+++ b/chrome/common/temp_scaffolding_stubs.h
@@ -52,8 +52,6 @@ class Message;
 //---------------------------------------------------------------------------
 // These stubs are for Browser_main()
 
-bool OpenFirstRunDialog(Profile* profile, ProcessSingleton* process_singleton);
-
 void InstallJankometer(const CommandLine&);
 
 //---------------------------------------------------------------------------
-- 
cgit v1.1