Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3437)

Unified Diff: chrome/browser/ui/webui/set_as_default_browser_ui.cc

Issue 10696093: Hide the main window when Set-As-Default dialog is present. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed owner's remarks. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/set_as_default_browser_ui.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/webui/set_as_default_browser_ui.cc
diff --git a/chrome/browser/ui/webui/set_as_default_browser_ui.cc b/chrome/browser/ui/webui/set_as_default_browser_ui.cc
index 94ce9d00ac65e04d09e749460b45c0fc9fbb97aa..2f03e8855cc0bb9e3f8407a86e126dbf2223cfb5 100644
--- a/chrome/browser/ui/webui/set_as_default_browser_ui.cc
+++ b/chrome/browser/ui/webui/set_as_default_browser_ui.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/singleton_tabs.h"
@@ -25,6 +26,7 @@
#include "chrome/installer/util/install_util.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/browser/web_contents_view.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "grit/browser_resources.h"
@@ -59,6 +61,13 @@ ChromeWebUIDataSource* CreateSetAsDefaultBrowserUIHTMLSource() {
return data_source;
}
+// A simple class serving as a delegate for passing down the result of the
+// interaction.
+class ResponseDelegate {
+ public:
+ virtual void SetChromeShutdownRequired(bool shutdown_chrome) = 0;
+};
sky 2012/08/09 16:13:47 Add a protected virtual destructor.
motek. 2012/08/09 17:17:48 Done.
+
// Event handler for SetAsDefaultBrowserUI. Capable of setting Chrome as the
// default browser on button click, closing itself and triggering Chrome
// restart.
@@ -67,7 +76,7 @@ class SetAsDefaultBrowserHandler
public base::SupportsWeakPtr<SetAsDefaultBrowserHandler>,
public ShellIntegration::DefaultWebClientObserver {
public:
- SetAsDefaultBrowserHandler();
+ explicit SetAsDefaultBrowserHandler(ResponseDelegate* response_delegate);
virtual ~SetAsDefaultBrowserHandler();
// WebUIMessageHandler implementation.
@@ -76,7 +85,7 @@ class SetAsDefaultBrowserHandler
// ShellIntegration::DefaultWebClientObserver implementation.
virtual void SetDefaultWebClientUIState(
ShellIntegration::DefaultWebClientUIState state) OVERRIDE;
- virtual void OnSetAsDefaultConcluded(bool call_result) OVERRIDE;
+ virtual void OnSetAsDefaultConcluded(bool close_chrome) OVERRIDE;
virtual bool IsInteractiveSetDefaultPermitted() OVERRIDE;
private:
@@ -84,7 +93,7 @@ class SetAsDefaultBrowserHandler
void HandleLaunchSetDefaultBrowserFlow(const ListValue* args);
// Close this web ui.
- void ConcludeInteraction();
+ void ConcludeInteraction(bool mark_success);
// If required and possible, spawns a new Chrome in Metro mode and closes the
// current instance. Windows 8 only, on earlier systems it will simply close
@@ -94,14 +103,17 @@ class SetAsDefaultBrowserHandler
scoped_refptr<ShellIntegration::DefaultBrowserWorker> default_browser_worker_;
bool set_default_returned_;
bool set_default_result_;
+ ResponseDelegate* response_delegate_;
DISALLOW_COPY_AND_ASSIGN(SetAsDefaultBrowserHandler);
};
-SetAsDefaultBrowserHandler::SetAsDefaultBrowserHandler()
+SetAsDefaultBrowserHandler::SetAsDefaultBrowserHandler(
+ ResponseDelegate* response_delegate)
: ALLOW_THIS_IN_INITIALIZER_LIST(default_browser_worker_(
new ShellIntegration::DefaultBrowserWorker(this))),
- set_default_returned_(false), set_default_result_(false) {
+ set_default_returned_(false), set_default_result_(false),
+ response_delegate_(response_delegate) {
}
SetAsDefaultBrowserHandler::~SetAsDefaultBrowserHandler() {
@@ -126,7 +138,7 @@ void SetAsDefaultBrowserHandler::SetDefaultWebClientUIState(
// The operation concluded, but Chrome is still not the default.
// If the call has succeeded, this suggests user has decided not to make
// chrome the default. We fold this UI and move on.
- ConcludeInteraction();
+ ConcludeInteraction(false);
} else if (state == ShellIntegration::STATE_IS_DEFAULT) {
if (!Profile::FromWebUI(web_ui())->GetPrefs()->GetBoolean(
prefs::kSuppressSwitchToMetroModeOnSetDefault)) {
@@ -135,7 +147,7 @@ void SetAsDefaultBrowserHandler::SetDefaultWebClientUIState(
base::Bind(&SetAsDefaultBrowserHandler::ActivateMetroChrome,
base::Unretained(this)));
} else {
- ConcludeInteraction();
+ ConcludeInteraction(false);
}
}
}
@@ -156,9 +168,12 @@ void SetAsDefaultBrowserHandler::HandleLaunchSetDefaultBrowserFlow(
default_browser_worker_->StartSetAsDefault();
}
-void SetAsDefaultBrowserHandler::ConcludeInteraction() {
+void SetAsDefaultBrowserHandler::ConcludeInteraction(bool close_chrome) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
WebContents* contents = web_ui()->GetWebContents();
+ if (response_delegate_)
+ response_delegate_->SetChromeShutdownRequired(close_chrome);
+
if (contents) {
content::WebContentsDelegate* delegate = contents->GetDelegate();
if (delegate)
@@ -178,31 +193,23 @@ void SetAsDefaultBrowserHandler::ActivateMetroChrome() {
sentinel_removed = first_run::RemoveSentinel();
}
- if (ShellIntegration::ActivateMetroChrome()) {
- // If Metro Chrome has been activated, we should close this process.
- // We are restarting as metro now.
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&BrowserList::CloseAllBrowsersWithProfile,
- Profile::FromWebUI(web_ui())));
- } else {
- // This will return false if the operation failed for any reason,
- // including invocation under a Windows version earlier than 8.
- // In such case we simply close the window and carry on.
- if (sentinel_removed)
+ bool metro_chrome_activated = ShellIntegration::ActivateMetroChrome();
+ if (!metro_chrome_activated && sentinel_removed)
first_run::CreateSentinel();
- BrowserThread::PostTask(
+ BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&SetAsDefaultBrowserHandler::ConcludeInteraction,
- base::Unretained(this)));
- }
+ base::Unretained(this), metro_chrome_activated));
}
// A web dialog delegate implementation for when 'Make Chrome Metro' UI
// is displayed on a dialog.
-class SetAsDefaultBrowserDialogImpl : public ui::WebDialogDelegate {
+class SetAsDefaultBrowserDialogImpl : public ui::WebDialogDelegate,
+ public ResponseDelegate {
public:
SetAsDefaultBrowserDialogImpl(Profile* profile, Browser* browser);
+ virtual ~SetAsDefaultBrowserDialogImpl();
// Show a modal web dialog with kChromeUIMetroFlowURL page.
void ShowDialog();
@@ -222,16 +229,31 @@ class SetAsDefaultBrowserDialogImpl : public ui::WebDialogDelegate {
virtual bool HandleContextMenu(
const content::ContextMenuParams& params) OVERRIDE;
+ // Overridden from ResponseDelegate:
+ virtual void SetChromeShutdownRequired(bool shutdown_chrome);
+
private:
Profile* profile_;
Browser* browser_;
+ mutable bool owns_handler_;
+ SetAsDefaultBrowserHandler* handler_;
+ bool response_is_close_chrome_;
DISALLOW_COPY_AND_ASSIGN(SetAsDefaultBrowserDialogImpl);
};
SetAsDefaultBrowserDialogImpl::SetAsDefaultBrowserDialogImpl(Profile* profile,
Browser* browser)
- : profile_(profile), browser_(browser) {
+ : profile_(profile),
+ browser_(browser),
+ owns_handler_(true),
+ handler_(new SetAsDefaultBrowserHandler(this)),
+ response_is_close_chrome_(false) {
+}
+
+SetAsDefaultBrowserDialogImpl::~SetAsDefaultBrowserDialogImpl() {
+ if (owns_handler_)
+ delete handler_;
}
void SetAsDefaultBrowserDialogImpl::ShowDialog() {
@@ -254,6 +276,8 @@ GURL SetAsDefaultBrowserDialogImpl::GetDialogContentURL() const {
void SetAsDefaultBrowserDialogImpl::GetWebUIMessageHandlers(
std::vector<WebUIMessageHandler*>* handlers) const {
+ handlers->push_back(handler_);
+ owns_handler_ = false;
}
void SetAsDefaultBrowserDialogImpl::GetDialogSize(gfx::Size* size) const {
@@ -273,6 +297,25 @@ std::string SetAsDefaultBrowserDialogImpl::GetDialogArgs() const {
void SetAsDefaultBrowserDialogImpl::OnDialogClosed(
const std::string& json_retval) {
+ if (response_is_close_chrome_) {
+ // If Metro Chrome has been activated, we should close this process.
+ // We are restarting as metro now.
+ BrowserList::CloseAllBrowsersWithProfile(profile_);
+ } else {
+ // This will be false if the user closed the dialog without doing anything
+ // or if operation failed for any reason (including invocation under a
+ // Windows version earlier than 8).
+ // In such case we just carry on with a normal chrome session. However, for
+ // the purpose of surfacing this dialog the actual browser window had to
+ // remain hidden. Now it's the time to show it.
+ BrowserWindow* window = browser_->window();
sky 2012/08/09 16:13:47 Do you need to worry about browser being deleted o
motek. 2012/08/09 17:17:48 I did, sort of. But if I am not mistaken, this cod
+ WebContents* contents = chrome::GetActiveWebContents(browser_);
+ if (window)
sky 2012/08/09 16:13:47 This should never be NULL.
motek. 2012/08/09 17:17:48 Done.
+ window->Show();
+ if (contents)
+ contents->GetView()->SetInitialFocus();
+ }
+
delete this;
}
@@ -290,11 +333,15 @@ bool SetAsDefaultBrowserDialogImpl::HandleContextMenu(
return true;
}
+void SetAsDefaultBrowserDialogImpl::SetChromeShutdownRequired(
+ bool shutdown_chrome) {
+ response_is_close_chrome_ = shutdown_chrome;
+}
+
} // namespace
SetAsDefaultBrowserUI::SetAsDefaultBrowserUI(content::WebUI* web_ui)
- : WebUIController(web_ui) {
- web_ui->AddMessageHandler(new SetAsDefaultBrowserHandler());
+ : ui::WebDialogUI(web_ui) {
ChromeURLDataManager::AddDataSource(Profile::FromWebUI(web_ui),
CreateSetAsDefaultBrowserUIHTMLSource());
}
« no previous file with comments | « chrome/browser/ui/webui/set_as_default_browser_ui.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698