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

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

Issue 2090773002: Improves first run dialog performance on Win8 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cr Created 4 years, 5 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
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
deleted file mode 100644
index a9a6a9e2c79bc0e7310a1616e930e29c2dee3bc0..0000000000000000000000000000000000000000
--- a/chrome/browser/ui/webui/set_as_default_browser_ui.cc
+++ /dev/null
@@ -1,354 +0,0 @@
-// 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 "chrome/browser/ui/webui/set_as_default_browser_ui.h"
-
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/metrics/histogram.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/shell_integration.h"
-#include "chrome/browser/ui/browser.h"
-#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_list_observer.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/chrome_pages.h"
-#include "chrome/browser/ui/singleton_tabs.h"
-#include "chrome/browser/ui/startup/default_browser_prompt.h"
-#include "chrome/browser/ui/sync/sync_promo_ui.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
-#include "chrome/grit/locale_settings.h"
-#include "chrome/installer/util/install_util.h"
-#include "components/prefs/pref_service.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_contents_delegate.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "content/public/browser/web_ui_message_handler.h"
-#include "grit/browser_resources.h"
-#include "ui/base/l10n/l10n_font_util.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/gfx/font.h"
-#include "ui/views/widget/widget.h"
-#include "ui/web_dialogs/web_dialog_delegate.h"
-
-using content::BrowserThread;
-using content::WebContents;
-using content::WebUIMessageHandler;
-
-namespace {
-
-const char kSetAsDefaultBrowserHistogram[] = "DefaultBrowser.InteractionResult";
-
-// The enum permits registering in UMA the three possible outcomes (do not
-// reorder these).
-// ACCEPTED: user pressed Next and made Chrome default.
-// DECLINED: user simply closed the dialog without making Chrome default.
-// REGRETTED: user pressed Next but then elected a different default browser.
-enum MakeChromeDefaultResult {
- MAKE_CHROME_DEFAULT_ACCEPTED = 0,
- MAKE_CHROME_DEFAULT_DECLINED = 1,
- MAKE_CHROME_DEFAULT_REGRETTED = 2,
- // MAKE_CHROME_DEFAULT_ACCEPTED_IMMERSE = 3, // Deprecated.
- MAKE_CHROME_DEFAULT_MAX
-};
-
-content::WebUIDataSource* CreateSetAsDefaultBrowserUIHTMLSource() {
- content::WebUIDataSource* data_source = content::WebUIDataSource::Create(
- chrome::kChromeUIMetroFlowHost);
- data_source->AddLocalizedString("page-title", IDS_METRO_FLOW_TAB_TITLE);
- data_source->AddLocalizedString("flowTitle", IDS_METRO_FLOW_TITLE_SHORT);
- data_source->AddLocalizedString("flowDescription",
- IDS_METRO_FLOW_DESCRIPTION);
- data_source->AddLocalizedString("flowNext",
- IDS_METRO_FLOW_SET_DEFAULT);
- data_source->AddLocalizedString("chromeLogoString",
- IDS_METRO_FLOW_LOGO_STRING_ALT);
- data_source->SetJsonPath("strings.js");
- data_source->AddResourcePath("set_as_default_browser.js",
- IDR_SET_AS_DEFAULT_BROWSER_JS);
- data_source->SetDefaultResource(IDR_SET_AS_DEFAULT_BROWSER_HTML);
- return data_source;
-}
-
-// A simple class serving as a delegate for passing down the result of the
-// interaction.
-class ResponseDelegate {
- public:
- virtual void SetDialogInteractionResult(MakeChromeDefaultResult result) = 0;
-
- protected:
- virtual ~ResponseDelegate() { }
-};
-
-// Event handler for SetAsDefaultBrowserUI. Capable of setting Chrome as the
-// default browser on button click, closing itself and triggering Chrome
-// restart.
-class SetAsDefaultBrowserHandler : public WebUIMessageHandler {
- public:
- explicit SetAsDefaultBrowserHandler(
- const base::WeakPtr<ResponseDelegate>& response_delegate);
-
- // WebUIMessageHandler implementation.
- void RegisterMessages() override;
-
- private:
- // Handler for the 'Next' (or 'make Chrome the Metro browser') button.
- void HandleLaunchSetDefaultBrowserFlow(const base::ListValue* args);
-
- // Close this web ui.
- void ConcludeInteraction(MakeChromeDefaultResult interaction_result);
-
- void OnDefaultBrowserWorkerFinished(
- shell_integration::DefaultWebClientState state);
-
- // The worker pointer is reference counted. While it is running, the
- // message loops of the FILE and UI thread will hold references to it
- // and it will be automatically freed once all its tasks have finished.
- scoped_refptr<shell_integration::DefaultBrowserWorker>
- default_browser_worker_;
- base::WeakPtr<ResponseDelegate> response_delegate_;
-
- // Used to invalidate the DefaultBrowserWorker callback.
- base::WeakPtrFactory<SetAsDefaultBrowserHandler> weak_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(SetAsDefaultBrowserHandler);
-};
-
-SetAsDefaultBrowserHandler::SetAsDefaultBrowserHandler(
- const base::WeakPtr<ResponseDelegate>& response_delegate)
- : response_delegate_(response_delegate), weak_ptr_factory_(this) {
- default_browser_worker_ = new shell_integration::DefaultBrowserWorker(
- base::Bind(&SetAsDefaultBrowserHandler::OnDefaultBrowserWorkerFinished,
- weak_ptr_factory_.GetWeakPtr()));
-}
-
-void SetAsDefaultBrowserHandler::RegisterMessages() {
- web_ui()->RegisterMessageCallback(
- "SetAsDefaultBrowser:LaunchSetDefaultBrowserFlow",
- base::Bind(&SetAsDefaultBrowserHandler::HandleLaunchSetDefaultBrowserFlow,
- base::Unretained(this)));
-}
-
-void SetAsDefaultBrowserHandler::HandleLaunchSetDefaultBrowserFlow(
- const base::ListValue* args) {
- default_browser_worker_->StartSetAsDefault();
-}
-
-void SetAsDefaultBrowserHandler::ConcludeInteraction(
- MakeChromeDefaultResult interaction_result) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- if (response_delegate_)
- response_delegate_->SetDialogInteractionResult(interaction_result);
-
- WebContents* contents = web_ui()->GetWebContents();
-
- if (contents) {
- content::WebContentsDelegate* delegate = contents->GetDelegate();
- if (delegate)
- delegate->CloseContents(contents);
- }
-}
-
-void SetAsDefaultBrowserHandler::OnDefaultBrowserWorkerFinished(
- shell_integration::DefaultWebClientState state) {
- // The callback is expected to be invoked once the procedure has completed.
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (state == shell_integration::NOT_DEFAULT) {
- // The operation concluded, but Chrome is still not the default. This
- // suggests the user has decided not to make Chrome the default.
- ConcludeInteraction(MAKE_CHROME_DEFAULT_REGRETTED);
- } else if (state == shell_integration::IS_DEFAULT) {
- ConcludeInteraction(MAKE_CHROME_DEFAULT_ACCEPTED);
- }
-
- // Otherwise, keep the dialog open since the user probably didn't make a
- // choice.
-}
-
-// A web dialog delegate implementation for when 'Make Chrome Metro' UI
-// is displayed on a dialog.
-class SetAsDefaultBrowserDialogImpl : public ui::WebDialogDelegate,
- public ResponseDelegate,
- public chrome::BrowserListObserver {
- public:
- SetAsDefaultBrowserDialogImpl(Profile* profile, Browser* browser);
- ~SetAsDefaultBrowserDialogImpl() override;
- // Show a modal web dialog with kChromeUIMetroFlowURL page.
- void ShowDialog();
-
- protected:
- // Overridden from WebDialogDelegate:
- ui::ModalType GetDialogModalType() const override;
- base::string16 GetDialogTitle() const override;
- GURL GetDialogContentURL() const override;
- void GetWebUIMessageHandlers(
- std::vector<WebUIMessageHandler*>* handlers) const override;
- void GetDialogSize(gfx::Size* size) const override;
- std::string GetDialogArgs() const override;
- void OnDialogClosed(const std::string& json_retval) override;
- void OnCloseContents(WebContents* source, bool* out_close_dialog) override;
- bool ShouldShowDialogTitle() const override;
- bool HandleContextMenu(const content::ContextMenuParams& params) override;
-
- // Overridden from ResponseDelegate:
- void SetDialogInteractionResult(MakeChromeDefaultResult result) override;
-
- // Overridden from BrowserListObserver:
- void OnBrowserRemoved(Browser* browser) override;
-
- private:
- Profile* profile_;
- Browser* browser_;
- mutable bool owns_handler_;
- base::WeakPtrFactory<ResponseDelegate> response_delegate_ptr_factory_;
- SetAsDefaultBrowserHandler* handler_;
- MakeChromeDefaultResult dialog_interaction_result_;
-
- DISALLOW_COPY_AND_ASSIGN(SetAsDefaultBrowserDialogImpl);
-};
-
-SetAsDefaultBrowserDialogImpl::SetAsDefaultBrowserDialogImpl(Profile* profile,
- Browser* browser)
- : profile_(profile),
- browser_(browser),
- owns_handler_(true),
- response_delegate_ptr_factory_(this),
- handler_(new SetAsDefaultBrowserHandler(
- response_delegate_ptr_factory_.GetWeakPtr())),
- dialog_interaction_result_(MAKE_CHROME_DEFAULT_DECLINED) {
- BrowserList::AddObserver(this);
-}
-
-SetAsDefaultBrowserDialogImpl::~SetAsDefaultBrowserDialogImpl() {
- if (browser_)
- BrowserList::RemoveObserver(this);
- if (owns_handler_)
- delete handler_;
-}
-
-void SetAsDefaultBrowserDialogImpl::ShowDialog() {
- // Use a NULL parent window to make sure that the dialog will have an item
- // in the Windows task bar. The code below will make it highlight if the
- // dialog is not in the foreground.
- gfx::NativeWindow native_window = chrome::ShowWebDialog(NULL, profile_, this);
- views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
- native_window);
- widget->FlashFrame(true);
-}
-
-ui::ModalType SetAsDefaultBrowserDialogImpl::GetDialogModalType() const {
- return ui::MODAL_TYPE_SYSTEM;
-}
-
-base::string16 SetAsDefaultBrowserDialogImpl::GetDialogTitle() const {
- return l10n_util::GetStringUTF16(IDS_METRO_FLOW_TAB_TITLE);
-}
-
-GURL SetAsDefaultBrowserDialogImpl::GetDialogContentURL() const {
- std::string url_string(chrome::kChromeUIMetroFlowURL);
- return GURL(url_string);
-}
-
-void SetAsDefaultBrowserDialogImpl::GetWebUIMessageHandlers(
- std::vector<WebUIMessageHandler*>* handlers) const {
- handlers->push_back(handler_);
- owns_handler_ = false;
-}
-
-void SetAsDefaultBrowserDialogImpl::GetDialogSize(gfx::Size* size) const {
- PrefService* prefs = profile_->GetPrefs();
- gfx::Font approximate_web_font(
- prefs->GetString(prefs::kWebKitSansSerifFontFamily),
- prefs->GetInteger(prefs::kWebKitDefaultFontSize));
-
- *size = ui::GetLocalizedContentsSizeForFont(
- IDS_METRO_FLOW_WIDTH_CHARS, IDS_METRO_FLOW_HEIGHT_LINES,
- approximate_web_font);
-}
-
-std::string SetAsDefaultBrowserDialogImpl::GetDialogArgs() const {
- return "[]";
-}
-
-void SetAsDefaultBrowserDialogImpl::OnDialogClosed(
- const std::string& json_retval) {
- // Register the user's response in UMA.
- UMA_HISTOGRAM_ENUMERATION(kSetAsDefaultBrowserHistogram,
- dialog_interaction_result_,
- MAKE_CHROME_DEFAULT_MAX);
-
- // Suppress showing the default browser infobar if the user explicitly elected
- // *not to* make Chrome default.
- if (dialog_interaction_result_ == MAKE_CHROME_DEFAULT_REGRETTED)
- chrome::DefaultBrowserPromptDeclined(profile_);
-
- // Carry on with a normal chrome session. For the purpose of surfacing this
- // dialog the actual browser window had to remain hidden. Now it's time to
- // show it.
- if (browser_) {
- BrowserWindow* window = browser_->window();
- WebContents* contents = browser_->tab_strip_model()->GetActiveWebContents();
- window->Show();
- if (contents)
- contents->SetInitialFocus();
- }
-
- delete this;
-}
-
-void SetAsDefaultBrowserDialogImpl::OnCloseContents(WebContents* source,
- bool* out_close_dialog) {
- *out_close_dialog = true;
-}
-
-bool SetAsDefaultBrowserDialogImpl::ShouldShowDialogTitle() const {
- return true;
-}
-
-bool SetAsDefaultBrowserDialogImpl::HandleContextMenu(
- const content::ContextMenuParams& params) {
- return true;
-}
-
-void SetAsDefaultBrowserDialogImpl::SetDialogInteractionResult(
- MakeChromeDefaultResult result) {
- dialog_interaction_result_ = result;
-}
-
-void SetAsDefaultBrowserDialogImpl::OnBrowserRemoved(Browser* browser) {
- if (browser_ == browser) {
- browser_ = NULL;
- BrowserList::RemoveObserver(this);
- }
-}
-
-} // namespace
-
-SetAsDefaultBrowserUI::SetAsDefaultBrowserUI(content::WebUI* web_ui)
- : ui::WebDialogUI(web_ui) {
- content::WebUIDataSource::Add(
- Profile::FromWebUI(web_ui), CreateSetAsDefaultBrowserUIHTMLSource());
-}
-
-// static
-void SetAsDefaultBrowserUI::Show(Profile* profile, Browser* browser) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- SetAsDefaultBrowserDialogImpl* dialog =
- new SetAsDefaultBrowserDialogImpl(profile, browser);
- dialog->ShowDialog();
-}

Powered by Google App Engine
This is Rietveld 408576698