summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorkuchhal@chromium.org <kuchhal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-20 18:22:40 +0000
committerkuchhal@chromium.org <kuchhal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-20 18:22:40 +0000
commit6b208c8951739a6e27b7569601420842022af4bd (patch)
treeb2e12a9c9af271e58e7f1faf14f031b00ba46fc1 /chrome/browser
parentcc50156fdf206d2190f52032211bc34e8766f47c (diff)
downloadchromium_src-6b208c8951739a6e27b7569601420842022af4bd.zip
chromium_src-6b208c8951739a6e27b7569601420842022af4bd.tar.gz
chromium_src-6b208c8951739a6e27b7569601420842022af4bd.tar.bz2
During uninstall if Chrome is set as default, allow user to choose another browser as default.
BUG=14023 TEST=Make sure the option of choosing a different browser shows up during uninstall (and works as intended) iff chrome is set as default browser. Review URL: http://codereview.chromium.org/172080 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23841 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/browser_main_win.cc17
-rw-r--r--chrome/browser/views/uninstall_dialog.cc61
-rw-r--r--chrome/browser/views/uninstall_dialog.h39
-rw-r--r--chrome/browser/views/uninstall_view.cc150
-rw-r--r--chrome/browser/views/uninstall_view.h59
5 files changed, 222 insertions, 104 deletions
diff --git a/chrome/browser/browser_main_win.cc b/chrome/browser/browser_main_win.cc
index b4f1052..cb3551a 100644
--- a/chrome/browser/browser_main_win.cc
+++ b/chrome/browser/browser_main_win.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.
@@ -15,7 +15,7 @@
#include "base/win_util.h"
#include "chrome/browser/first_run.h"
#include "chrome/browser/metrics/metrics_service.h"
-#include "chrome/browser/views/uninstall_dialog.h"
+#include "chrome/browser/views/uninstall_view.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/env_vars.h"
#include "chrome/common/result_codes.h"
@@ -24,7 +24,6 @@
#include "chrome/installer/util/shell_util.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
-#include "views/controls/message_box_view.h"
#include "views/focus/accelerator_handler.h"
#include "views/window/window.h"
@@ -43,7 +42,8 @@ bool CheckForWin2000() {
int AskForUninstallConfirmation() {
int ret = ResultCodes::NORMAL_EXIT;
- UninstallDialog::ShowUninstallDialog(ret);
+ views::Window::CreateChromeWindow(NULL, gfx::Rect(),
+ new UninstallView(ret))->Show();
views::AcceleratorHandler accelerator_handler;
MessageLoopForUI::current()->Run(&accelerator_handler);
return ret;
@@ -57,11 +57,20 @@ void ShowCloseBrowserFirstMessageBox() {
}
int DoUninstallTasks(bool chrome_still_running) {
+ // We want to show a warning to user (and exit) if Chrome is already running
+ // *before* we show the uninstall confirmation dialog box. But while the
+ // uninstall confirmation dialog is up, user might start Chrome, so we
+ // check once again after user acknowledges Uninstall dialog.
if (chrome_still_running) {
ShowCloseBrowserFirstMessageBox();
return ResultCodes::UNINSTALL_CHROME_ALIVE;
}
int ret = AskForUninstallConfirmation();
+ if (Upgrade::IsBrowserAlreadyRunning()) {
+ ShowCloseBrowserFirstMessageBox();
+ return ResultCodes::UNINSTALL_CHROME_ALIVE;
+ }
+
if (ret != ResultCodes::UNINSTALL_USER_CANCEL) {
// The following actions are just best effort.
LOG(INFO) << "Executing uninstall actions";
diff --git a/chrome/browser/views/uninstall_dialog.cc b/chrome/browser/views/uninstall_dialog.cc
deleted file mode 100644
index f54fbc8..0000000
--- a/chrome/browser/views/uninstall_dialog.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-#include "chrome/browser/views/uninstall_dialog.h"
-
-#include "app/l10n_util.h"
-#include "app/message_box_flags.h"
-#include "base/message_loop.h"
-#include "chrome/common/result_codes.h"
-#include "grit/chromium_strings.h"
-#include "views/controls/message_box_view.h"
-#include "views/window/window.h"
-
-// static
-void UninstallDialog::ShowUninstallDialog(int& user_selection) {
- // When the window closes, it will delete itself.
- new UninstallDialog(user_selection);
-}
-
-bool UninstallDialog::Accept() {
- user_selection_ = ResultCodes::NORMAL_EXIT;
- if (message_box_view_->IsCheckBoxSelected())
- user_selection_ = ResultCodes::UNINSTALL_DELETE_PROFILE;
- return true;
-}
-
-bool UninstallDialog::Cancel() {
- user_selection_ = ResultCodes::UNINSTALL_USER_CANCEL;
- return true;
-}
-
-std::wstring UninstallDialog::GetWindowTitle() const {
- return l10n_util::GetString(IDS_UNINSTALL_CHROME);
-}
-
-void UninstallDialog::DeleteDelegate() {
- delete this;
-}
-
-views::View* UninstallDialog::GetContentsView() {
- return message_box_view_;
-}
-
-UninstallDialog::UninstallDialog(int& user_selection)
- : user_selection_(user_selection) {
- // Also deleted when the window closes.
- message_box_view_ = new MessageBoxView(
- MessageBoxFlags::kIsConfirmMessageBox |
- MessageBoxFlags::kAutoDetectAlignment,
- l10n_util::GetString(IDS_UNINSTALL_VERIFY).c_str(),
- std::wstring());
- message_box_view_->SetCheckBoxLabel(
- l10n_util::GetString(IDS_UNINSTALL_DELETE_PROFILE));
- message_box_view_->SetCheckBoxSelected(false);
- views::Window::CreateChromeWindow(NULL, gfx::Rect(), this)->Show();
-}
-
-UninstallDialog::~UninstallDialog() {
- MessageLoop::current()->Quit();
-}
diff --git a/chrome/browser/views/uninstall_dialog.h b/chrome/browser/views/uninstall_dialog.h
deleted file mode 100644
index 6987cb2..0000000
--- a/chrome/browser/views/uninstall_dialog.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.
-
-#ifndef CHROME_BROWSER_VIEWS_UNINSTALL_DIALOG_H_
-#define CHROME_BROWSER_VIEWS_UNINSTALL_DIALOG_H_
-
-#include "base/basictypes.h"
-#include "views/window/dialog_delegate.h"
-
-class MessageBoxView;
-
-// UninstallDialog implements the dialog that confirms Chrome uninstallation
-// and asks whether to delete Chrome profile.
-class UninstallDialog : public views::DialogDelegate {
- public:
- static void ShowUninstallDialog(int& user_selection);
-
- protected:
- // Overridden from views::DialogDelegate:
- virtual bool Accept();
- virtual bool Cancel();
- virtual std::wstring GetWindowTitle() const;
-
- // Overridden from views::WindowDelegate:
- virtual void DeleteDelegate();
- virtual views::View* GetContentsView();
-
- private:
- explicit UninstallDialog(int& user_selection);
- virtual ~UninstallDialog();
-
- MessageBoxView* message_box_view_;
- int& user_selection_;
-
- DISALLOW_COPY_AND_ASSIGN(UninstallDialog);
-};
-
-#endif // CHROME_BROWSER_VIEWS_UNINSTALL_DIALOG_H_
diff --git a/chrome/browser/views/uninstall_view.cc b/chrome/browser/views/uninstall_view.cc
new file mode 100644
index 0000000..c0438b1
--- /dev/null
+++ b/chrome/browser/views/uninstall_view.cc
@@ -0,0 +1,150 @@
+// 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.
+
+#include "chrome/browser/views/uninstall_view.h"
+
+#include "app/l10n_util.h"
+#include "base/message_loop.h"
+#include "base/process_util.h"
+#include "chrome/browser/shell_integration.h"
+#include "chrome/common/result_codes.h"
+#include "chrome/installer/util/shell_util.h"
+#include "views/controls/button/checkbox.h"
+#include "views/controls/label.h"
+#include "views/standard_layout.h"
+
+#include "grit/chromium_strings.h"
+
+UninstallView::UninstallView(int& user_selection)
+ : confirm_label_(NULL),
+ delete_profile_(NULL),
+ change_default_browser_(NULL),
+ browsers_combo_(NULL),
+ browsers_(NULL),
+ user_selection_(user_selection) {
+ SetupControls();
+}
+
+UninstallView::~UninstallView() {
+ // Exit the message loop we were started with so that uninstall can continue.
+ MessageLoop::current()->Quit();
+}
+
+void UninstallView::SetupControls() {
+ using views::ColumnSet;
+ using views::GridLayout;
+
+ GridLayout* layout = CreatePanelGridLayout(this);
+ SetLayoutManager(layout);
+
+ // Message to confirm uninstallation.
+ int column_set_id = 0;
+ ColumnSet* column_set = layout->AddColumnSet(column_set_id);
+ column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
+ GridLayout::USE_PREF, 0, 0);
+ layout->StartRow(0, column_set_id);
+ confirm_label_ = new views::Label(l10n_util::GetString(IDS_UNINSTALL_VERIFY));
+ confirm_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ layout->AddView(confirm_label_);
+
+ layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing);
+
+ // The "delete profile" check box.
+ ++column_set_id;
+ column_set = layout->AddColumnSet(column_set_id);
+ column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing);
+ column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
+ GridLayout::USE_PREF, 0, 0);
+ layout->StartRow(0, column_set_id);
+ delete_profile_ = new views::Checkbox(
+ l10n_util::GetString(IDS_UNINSTALL_DELETE_PROFILE));
+ layout->AddView(delete_profile_);
+
+ // Set default browser combo box
+ if (ShellIntegration::IsDefaultBrowser()) {
+ browsers_.reset(new BrowsersMap());
+ ShellUtil::GetRegisteredBrowsers(browsers_.get());
+ if (!browsers_->empty()) {
+ layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
+
+ ++column_set_id;
+ column_set = layout->AddColumnSet(column_set_id);
+ column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing);
+ column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
+ GridLayout::USE_PREF, 0, 0);
+ column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing);
+ column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
+ GridLayout::USE_PREF, 0, 0);
+ layout->StartRow(0, column_set_id);
+ change_default_browser_ = new views::Checkbox(
+ l10n_util::GetString(IDS_UNINSTALL_SET_DEFAULT_BROWSER));
+ change_default_browser_->set_listener(this);
+ layout->AddView(change_default_browser_);
+ browsers_combo_ = new views::Combobox(this);
+ layout->AddView(browsers_combo_);
+ browsers_combo_->SetEnabled(false);
+ }
+ }
+
+ layout->AddPaddingRow(0, kRelatedControlSmallVerticalSpacing);
+}
+
+bool UninstallView::Accept() {
+ user_selection_ = ResultCodes::NORMAL_EXIT;
+ if (delete_profile_->checked())
+ user_selection_ = ResultCodes::UNINSTALL_DELETE_PROFILE;
+ if (change_default_browser_ && change_default_browser_->checked()) {
+ int index = browsers_combo_->selected_item();
+ BrowsersMap::const_iterator it = browsers_->begin();
+ std::advance(it, index);
+ base::LaunchApp((*it).second, false, true, NULL);
+ }
+ return true;
+}
+
+bool UninstallView::Cancel() {
+ user_selection_ = ResultCodes::UNINSTALL_USER_CANCEL;
+ return true;
+}
+
+std::wstring UninstallView::GetDialogButtonLabel(
+ MessageBoxFlags::DialogButton button) const {
+ // We only want to give custom name to OK button - 'Uninstall'. Cancel
+ // button remains same.
+ std::wstring label = L"";
+ if (button == MessageBoxFlags::DIALOGBUTTON_OK)
+ label = l10n_util::GetString(IDS_UNINSTALL_BUTTON_TEXT);
+ return label;
+}
+
+void UninstallView::ButtonPressed(views::Button* sender) {
+ if (change_default_browser_ == sender) {
+ // Disable the browsers combobox if the user unchecks the checkbox.
+ DCHECK(browsers_combo_);
+ browsers_combo_->SetEnabled(change_default_browser_->checked());
+ }
+}
+
+std::wstring UninstallView::GetWindowTitle() const {
+ return l10n_util::GetString(IDS_UNINSTALL_CHROME);
+}
+
+views::View* UninstallView::GetContentsView() {
+ return this;
+}
+
+int UninstallView::GetItemCount(views::Combobox* source) {
+ DCHECK(source == browsers_combo_);
+ DCHECK(!browsers_->empty());
+ return browsers_->size();
+}
+
+std::wstring UninstallView::GetItemAt(views::Combobox* source, int index) {
+ DCHECK(source == browsers_combo_);
+ DCHECK(index < (int) browsers_->size());
+ BrowsersMap::const_iterator it = browsers_->begin();
+ std::advance(it, index);
+ return (*it).first;
+}
+
diff --git a/chrome/browser/views/uninstall_view.h b/chrome/browser/views/uninstall_view.h
new file mode 100644
index 0000000..6b5933c
--- /dev/null
+++ b/chrome/browser/views/uninstall_view.h
@@ -0,0 +1,59 @@
+// 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.
+
+#ifndef CHROME_BROWSER_VIEWS_UNINSTALL_VIEW_H_
+#define CHROME_BROWSER_VIEWS_UNINSTALL_VIEW_H_
+
+#include "views/controls/combobox/combobox.h"
+#include "views/window/dialog_delegate.h"
+
+namespace views {
+class Checkbox;
+class Label;
+}
+
+// UninstallView implements the dialog that confirms Chrome uninstallation
+// and asks whether to delete Chrome profile. Also if currently Chrome is set
+// as default browser, it asks users whether to set another browser as default.
+class UninstallView : public views::View,
+ public views::ButtonListener,
+ public views::DialogDelegate,
+ public views::Combobox::Model {
+ public:
+ explicit UninstallView(int& user_selection);
+ virtual ~UninstallView();
+
+ // Overridden from views::DialogDelegate:
+ virtual bool Accept();
+ virtual bool Cancel();
+ virtual std::wstring GetDialogButtonLabel(
+ MessageBoxFlags::DialogButton button) const;
+
+ // Overridden form views::ButtonListener.
+ virtual void ButtonPressed(views::Button* sender);
+
+ // Overridden from views::WindowDelegate:
+ virtual std::wstring GetWindowTitle() const;
+ virtual views::View* GetContentsView();
+
+ // Overridden from views::Combobox::Model.
+ virtual int GetItemCount(views::Combobox* source);
+ virtual std::wstring GetItemAt(views::Combobox* source, int index);
+
+ private:
+ // Initializes the controls on the dialog.
+ void SetupControls();
+
+ views::Label* confirm_label_;
+ views::Checkbox* delete_profile_;
+ views::Checkbox* change_default_browser_;
+ views::Combobox* browsers_combo_;
+ typedef std::map<std::wstring, std::wstring> BrowsersMap;
+ scoped_ptr<BrowsersMap> browsers_;
+ int& user_selection_;
+
+ DISALLOW_COPY_AND_ASSIGN(UninstallView);
+};
+
+#endif // CHROME_BROWSER_VIEWS_UNINSTALL_VIEW_H_ \ No newline at end of file