blob: 4b19c166e538dbc06b53873846f176023f8120e9 [file] [log] [blame]
// 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/startup/default_browser_prompt.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/shell_integration.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/webui/set_as_default_browser_ui.h"
#include "components/startup_metric_utils/startup_metric_utils.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
using content::BrowserThread;
namespace {
// Show the page prompting the user to make Chrome the default browser on
// Windows 8 (which means becoming "the browser" in Metro mode). The page
// will be shown at the first appropriate opportunity. It can be placed in
// a tab or in a dialog, depending on other settings.
class SetMetroBrowserFlowLauncher : public content::NotificationObserver {
public:
static void LaunchSoon(Profile* profile) {
// The instance will manage its own lifetime.
new SetMetroBrowserFlowLauncher(profile);
}
private:
explicit SetMetroBrowserFlowLauncher(Profile* profile)
: profile_(profile) {
registrar_.Add(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
content::NotificationService::AllSources());
}
// content::NotificationObserver override:
void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
content::NotificationRegistrar registrar_;
Profile* profile_;
DISALLOW_COPY_AND_ASSIGN(SetMetroBrowserFlowLauncher);
};
void SetMetroBrowserFlowLauncher::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
DCHECK_EQ(type, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME);
Browser* browser = chrome::FindBrowserWithWebContents(
content::Source<content::WebContents>(source).ptr());
if (!browser || !browser->is_type_tabbed())
return;
// Unregister and delete.
registrar_.RemoveAll();
SetAsDefaultBrowserUI::Show(profile_, browser);
delete this;
}
} // namespace
namespace chrome {
bool ShowFirstRunDefaultBrowserPrompt(Profile* profile) {
// If the only available mode of setting the default browser requires
// user interaction, it means this couldn't have been done yet. Therefore,
// we launch the dialog and inform the caller of it.
bool show_status =
(ShellIntegration::CanSetAsDefaultBrowser() ==
ShellIntegration::SET_DEFAULT_INTERACTIVE) &&
(ShellIntegration::GetDefaultBrowser() == ShellIntegration::NOT_DEFAULT);
if (show_status) {
startup_metric_utils::SetNonBrowserUIDisplayed();
SetMetroBrowserFlowLauncher::LaunchSoon(profile);
}
return show_status;
}
} // namespace chrome