// 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/chrome_pages.h" #include "base/command_line.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "chrome/browser/download/download_shelf.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/extensions/application_launch.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "chrome/browser/ui/settings_window_manager.h" #include "chrome/browser/ui/singleton_tabs.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/webui/options/content_settings_handler.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "components/signin/core/browser/signin_manager.h" #include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" #include "google_apis/gaia/gaia_urls.h" #include "net/base/url_util.h" #if defined(OS_WIN) #include "chrome/browser/enumerate_modules_model_win.h" #endif #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/genius_app/app_id.h" #include "extensions/browser/extension_registry.h" #endif using base::UserMetricsAction; namespace chrome { namespace { const char kHashMark[] = "#"; void OpenBookmarkManagerWithHash(Browser* browser, const std::string& action, int64 node_id) { content::RecordAction(UserMetricsAction("ShowBookmarkManager")); content::RecordAction(UserMetricsAction("ShowBookmarks")); NavigateParams params(GetSingletonTabNavigateParams( browser, GURL(kChromeUIBookmarksURL).Resolve(base::StringPrintf( "/#%s%s", action.c_str(), base::Int64ToString(node_id).c_str())))); params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; ShowSingletonTabOverwritingNTP(browser, params); } void NavigateToSingletonTab(Browser* browser, const GURL& url) { NavigateParams params(GetSingletonTabNavigateParams(browser, url)); params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; ShowSingletonTabOverwritingNTP(browser, params); } // Shows either the help app or the appropriate help page for |source|. If // |browser| is NULL and the help page is used (vs the app), the help page is // shown in the last active browser. If there is no such browser, a new browser // is created. void ShowHelpImpl(Browser* browser, Profile* profile, HostDesktopType host_desktop_type, HelpSource source) { content::RecordAction(UserMetricsAction("ShowHelpTab")); #if defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD) const extensions::Extension* extension = extensions::ExtensionRegistry::Get(profile)->GetExtensionById( genius_app::kGeniusAppId, extensions::ExtensionRegistry::EVERYTHING); OpenApplication(AppLaunchParams(profile, extension, 0, host_desktop_type)); #else GURL url; switch (source) { case HELP_SOURCE_KEYBOARD: url = GURL(kChromeHelpViaKeyboardURL); break; case HELP_SOURCE_MENU: url = GURL(kChromeHelpViaMenuURL); break; case HELP_SOURCE_WEBUI: url = GURL(kChromeHelpViaWebUIURL); break; default: NOTREACHED() << "Unhandled help source " << source; } scoped_ptr displayer; if (!browser) { displayer.reset( new ScopedTabbedBrowserDisplayer(profile, host_desktop_type)); browser = displayer->browser(); } ShowSingletonTab(browser, url); #endif } } // namespace void ShowBookmarkManager(Browser* browser) { content::RecordAction(UserMetricsAction("ShowBookmarkManager")); content::RecordAction(UserMetricsAction("ShowBookmarks")); ShowSingletonTabOverwritingNTP( browser, GetSingletonTabNavigateParams(browser, GURL(kChromeUIBookmarksURL))); } void ShowBookmarkManagerForNode(Browser* browser, int64 node_id) { OpenBookmarkManagerWithHash(browser, std::string(), node_id); } void ShowHistory(Browser* browser) { content::RecordAction(UserMetricsAction("ShowHistory")); NavigateParams params( GetSingletonTabNavigateParams(browser, GURL(kChromeUIHistoryURL))); params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; ShowSingletonTabOverwritingNTP(browser, params); } void ShowDownloads(Browser* browser) { content::RecordAction(UserMetricsAction("ShowDownloads")); if (browser->window()) { DownloadShelf* shelf = browser->window()->GetDownloadShelf(); // The downloads page is always shown in response to a user action. if (shelf->IsShowing()) shelf->Close(DownloadShelf::USER_ACTION); } ShowSingletonTabOverwritingNTP( browser, GetSingletonTabNavigateParams(browser, GURL(kChromeUIDownloadsURL))); } void ShowExtensions(Browser* browser, const std::string& extension_to_highlight) { content::RecordAction(UserMetricsAction("ShowExtensions")); NavigateParams params( GetSingletonTabNavigateParams(browser, GURL(kChromeUIExtensionsURL))); params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; if (!extension_to_highlight.empty()) { GURL::Replacements replacements; std::string query("id="); query += extension_to_highlight; replacements.SetQueryStr(query); params.url = params.url.ReplaceComponents(replacements); } ShowSingletonTabOverwritingNTP(browser, params); } void ShowConflicts(Browser* browser) { #if defined(OS_WIN) EnumerateModulesModel* model = EnumerateModulesModel::GetInstance(); if (model->modules_to_notify_about() > 0) { GURL help_center_url = model->GetFirstNotableConflict(); if (help_center_url.is_valid()) { ShowSingletonTab(browser, help_center_url); model->AcknowledgeConflictNotification(); return; } } #endif content::RecordAction(UserMetricsAction("AboutConflicts")); ShowSingletonTab(browser, GURL(kChromeUIConflictsURL)); } void ShowHelp(Browser* browser, HelpSource source) { ShowHelpImpl( browser, browser->profile(), browser->host_desktop_type(), source); } void ShowHelpForProfile(Profile* profile, HostDesktopType host_desktop_type, HelpSource source) { ShowHelpImpl(NULL, profile, host_desktop_type, source); } void ShowPolicy(Browser* browser) { ShowSingletonTab(browser, GURL(kChromeUIPolicyURL)); } void ShowSlow(Browser* browser) { #if defined(OS_CHROMEOS) ShowSingletonTab(browser, GURL(kChromeUISlowURL)); #endif } GURL GetSettingsUrl(const std::string& sub_page) { std::string url = std::string(kChromeUISettingsURL) + sub_page; #if defined(OS_CHROMEOS) if (sub_page.find(kInternetOptionsSubPage, 0) != std::string::npos) { std::string::size_type loc = sub_page.find("?", 0); std::string network_page = loc != std::string::npos ? sub_page.substr(loc) : std::string(); url = std::string(kChromeUISettingsURL) + network_page; } #endif return GURL(url); } bool IsTrustedPopupWindowWithScheme(const Browser* browser, const std::string& scheme) { if (!browser->is_type_popup() || !browser->is_trusted_source()) return false; if (scheme.empty()) // Any trusted popup window return true; const content::WebContents* web_contents = browser->tab_strip_model()->GetWebContentsAt(0); if (!web_contents) return false; GURL url(web_contents->GetURL()); return url.SchemeIs(scheme.c_str()); } void ShowSettings(Browser* browser) { ShowSettingsSubPage(browser, std::string()); } void ShowSettingsSubPage(Browser* browser, const std::string& sub_page) { if (::switches::SettingsWindowEnabled()) { ShowSettingsSubPageForProfile(browser->profile(), sub_page); return; } ShowSettingsSubPageInTabbedBrowser(browser, sub_page); } void ShowSettingsSubPageForProfile(Profile* profile, const std::string& sub_page) { if (::switches::SettingsWindowEnabled()) { content::RecordAction(base::UserMetricsAction("ShowOptions")); SettingsWindowManager::GetInstance()->ShowChromePageForProfile( profile, GetSettingsUrl(sub_page)); return; } Browser* browser = chrome::FindTabbedBrowser(profile, false, HOST_DESKTOP_TYPE_NATIVE); if (!browser) { browser = new Browser( Browser::CreateParams(profile, chrome::HOST_DESKTOP_TYPE_NATIVE)); } ShowSettingsSubPageInTabbedBrowser(browser, sub_page); } void ShowSettingsSubPageInTabbedBrowser(Browser* browser, const std::string& sub_page) { content::RecordAction(UserMetricsAction("ShowOptions")); GURL gurl = GetSettingsUrl(sub_page); NavigateParams params(GetSingletonTabNavigateParams(browser, gurl)); params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; ShowSingletonTabOverwritingNTP(browser, params); } void ShowContentSettings(Browser* browser, ContentSettingsType content_settings_type) { ShowSettingsSubPage( browser, kContentSettingsExceptionsSubPage + std::string(kHashMark) + options::ContentSettingsHandler::ContentSettingsTypeToGroupName( content_settings_type)); } void ShowClearBrowsingDataDialog(Browser* browser) { content::RecordAction(UserMetricsAction("ClearBrowsingData_ShowDlg")); ShowSettingsSubPage(browser, kClearBrowserDataSubPage); } void ShowPasswordManager(Browser* browser) { content::RecordAction(UserMetricsAction("Options_ShowPasswordManager")); ShowSettingsSubPage(browser, kPasswordManagerSubPage); } void ShowImportDialog(Browser* browser) { content::RecordAction(UserMetricsAction("Import_ShowDlg")); ShowSettingsSubPage(browser, kImportDataSubPage); } void ShowAboutChrome(Browser* browser) { content::RecordAction(UserMetricsAction("AboutChrome")); if (::switches::SettingsWindowEnabled()) { SettingsWindowManager::GetInstance()->ShowChromePageForProfile( browser->profile(), GURL(kChromeUIUberURL)); return; } NavigateParams params( GetSingletonTabNavigateParams(browser, GURL(kChromeUIUberURL))); params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; ShowSingletonTabOverwritingNTP(browser, params); } void ShowSearchEngineSettings(Browser* browser) { content::RecordAction(UserMetricsAction("EditSearchEngines")); ShowSettingsSubPage(browser, kSearchEnginesSubPage); } void ShowBrowserSignin(Browser* browser, signin::Source source) { Profile* original_profile = browser->profile()->GetOriginalProfile(); SigninManagerBase* manager = SigninManagerFactory::GetForProfile(original_profile); DCHECK(manager->IsSigninAllowed()); // If we're signed in, just show settings. if (manager->IsAuthenticated()) { ShowSettings(browser); } else { // If the browser's profile is an incognito profile, make sure to use // a browser window from the original profile. The user cannot sign in // from an incognito window. scoped_ptr displayer; if (browser->profile()->IsOffTheRecord()) { displayer.reset(new ScopedTabbedBrowserDisplayer( original_profile, chrome::HOST_DESKTOP_TYPE_NATIVE)); browser = displayer->browser(); } NavigateToSingletonTab(browser, GURL(signin::GetPromoURL(source, false))); DCHECK_GT(browser->tab_strip_model()->count(), 0); } } } // namespace chrome