Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/chrome_pages.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/strings/string_number_conversions.h"
      9 #include "base/strings/stringprintf.h"
     10 #include "chrome/browser/download/download_shelf.h"
     11 #include "chrome/browser/profiles/profile.h"
     12 #include "chrome/browser/signin/signin_manager.h"
     13 #include "chrome/browser/signin/signin_manager_factory.h"
     14 #include "chrome/browser/ui/browser.h"
     15 #include "chrome/browser/ui/browser_finder.h"
     16 #include "chrome/browser/ui/browser_navigator.h"
     17 #include "chrome/browser/ui/browser_window.h"
     18 #include "chrome/browser/ui/singleton_tabs.h"
     19 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     20 #include "chrome/browser/ui/webui/options/content_settings_handler.h"
     21 #include "chrome/common/url_constants.h"
     22 #include "content/public/browser/user_metrics.h"
     23 #include "google_apis/gaia/gaia_urls.h"
     24 #include "net/base/url_util.h"
     25 #include "url/gurl.h"
     26 
     27 #if defined(OS_WIN)
     28 #include "chrome/browser/enumerate_modules_model_win.h"
     29 #endif
     30 
     31 using content::UserMetricsAction;
     32 
     33 namespace chrome {
     34 namespace {
     35 
     36 const char kHashMark[] = "#";
     37 
     38 void OpenBookmarkManagerWithHash(Browser* browser,
     39                                  const std::string& action,
     40                                  int64 node_id) {
     41   content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
     42   content::RecordAction(UserMetricsAction("ShowBookmarks"));
     43   NavigateParams params(GetSingletonTabNavigateParams(
     44       browser,
     45       GURL(kChromeUIBookmarksURL).Resolve(
     46           base::StringPrintf("/#%s%s", action.c_str(),
     47               base::Int64ToString(node_id).c_str()))));
     48   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
     49   ShowSingletonTabOverwritingNTP(browser, params);
     50 }
     51 
     52 void NavigateToSingletonTab(Browser* browser, const GURL& url) {
     53   NavigateParams params(GetSingletonTabNavigateParams(browser, url));
     54   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
     55   ShowSingletonTabOverwritingNTP(browser, params);
     56 }
     57 
     58 }  // namespace
     59 
     60 void ShowBookmarkManager(Browser* browser) {
     61   content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
     62   content::RecordAction(UserMetricsAction("ShowBookmarks"));
     63   ShowSingletonTabOverwritingNTP(
     64       browser,
     65       GetSingletonTabNavigateParams(browser, GURL(kChromeUIBookmarksURL)));
     66 }
     67 
     68 void ShowBookmarkManagerForNode(Browser* browser, int64 node_id) {
     69   OpenBookmarkManagerWithHash(browser, std::string(), node_id);
     70 }
     71 
     72 void ShowHistory(Browser* browser) {
     73   content::RecordAction(UserMetricsAction("ShowHistory"));
     74   NavigateParams params(
     75       GetSingletonTabNavigateParams(browser, GURL(kChromeUIHistoryURL)));
     76   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
     77   ShowSingletonTabOverwritingNTP(browser, params);
     78 }
     79 
     80 void ShowDownloads(Browser* browser) {
     81   content::RecordAction(UserMetricsAction("ShowDownloads"));
     82   if (browser->window()) {
     83     DownloadShelf* shelf = browser->window()->GetDownloadShelf();
     84     // The downloads page is always shown in response to a user action.
     85     if (shelf->IsShowing())
     86       shelf->Close(DownloadShelf::USER_ACTION);
     87   }
     88   ShowSingletonTabOverwritingNTP(
     89       browser,
     90       GetSingletonTabNavigateParams(browser, GURL(kChromeUIDownloadsURL)));
     91 }
     92 
     93 void ShowExtensions(Browser* browser,
     94                     const std::string& extension_to_highlight) {
     95   content::RecordAction(UserMetricsAction("ShowExtensions"));
     96   NavigateParams params(
     97       GetSingletonTabNavigateParams(browser, GURL(kChromeUIExtensionsURL)));
     98   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
     99   if (!extension_to_highlight.empty()) {
    100     GURL::Replacements replacements;
    101     std::string query("id=");
    102     query += extension_to_highlight;
    103     replacements.SetQueryStr(query);
    104     params.url = params.url.ReplaceComponents(replacements);
    105   }
    106   ShowSingletonTabOverwritingNTP(browser, params);
    107 }
    108 
    109 void ShowConflicts(Browser* browser) {
    110 #if defined(OS_WIN)
    111   EnumerateModulesModel* model = EnumerateModulesModel::GetInstance();
    112   if (model->modules_to_notify_about() > 0) {
    113     GURL help_center_url = model->GetFirstNotableConflict();
    114     if (help_center_url.is_valid()) {
    115       EnumerateModulesModel::RecordLearnMoreStat(true);
    116       ShowSingletonTab(browser, help_center_url);
    117       model->AcknowledgeConflictNotification();
    118       return;
    119     }
    120   }
    121 #endif
    122 
    123   content::RecordAction(UserMetricsAction("AboutConflicts"));
    124   ShowSingletonTab(browser, GURL(kChromeUIConflictsURL));
    125 }
    126 
    127 void ShowHelp(Browser* browser, HelpSource source) {
    128   content::RecordAction(UserMetricsAction("ShowHelpTab"));
    129   GURL url;
    130   switch (source) {
    131     case HELP_SOURCE_KEYBOARD:
    132       url = GURL(kChromeHelpViaKeyboardURL);
    133       break;
    134     case HELP_SOURCE_MENU:
    135       url = GURL(kChromeHelpViaMenuURL);
    136       break;
    137     case HELP_SOURCE_WEBUI:
    138       url = GURL(kChromeHelpViaWebUIURL);
    139       break;
    140     default:
    141       NOTREACHED() << "Unhandled help source " << source;
    142   }
    143   ShowSingletonTab(browser, url);
    144 }
    145 
    146 void ShowPolicy(Browser* browser) {
    147   ShowSingletonTab(browser, GURL(kChromeUIPolicyURL));
    148 }
    149 
    150 void ShowSlow(Browser* browser) {
    151 #if defined(OS_CHROMEOS)
    152   ShowSingletonTab(browser, GURL(kChromeUISlowURL));
    153 #endif
    154 }
    155 
    156 void ShowSettings(Browser* browser) {
    157   content::RecordAction(UserMetricsAction("ShowOptions"));
    158   ShowSettingsSubPage(browser, std::string());
    159 }
    160 
    161 void ShowSettingsSubPage(Browser* browser, const std::string& sub_page) {
    162   std::string url = std::string(kChromeUISettingsURL) + sub_page;
    163 #if defined(OS_CHROMEOS)
    164   if (sub_page.find(kInternetOptionsSubPage, 0) != std::string::npos) {
    165     std::string::size_type loc = sub_page.find("?", 0);
    166     std::string network_page = loc != std::string::npos ?
    167         sub_page.substr(loc) : std::string();
    168     url = std::string(kChromeUISettingsURL) + network_page;
    169   }
    170 #endif
    171   NavigateParams params(GetSingletonTabNavigateParams(browser, GURL(url)));
    172   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
    173   ShowSingletonTabOverwritingNTP(browser, params);
    174 }
    175 
    176 void ShowContentSettings(Browser* browser,
    177                          ContentSettingsType content_settings_type) {
    178   ShowSettingsSubPage(
    179       browser,
    180       kContentSettingsExceptionsSubPage + std::string(kHashMark) +
    181       options::ContentSettingsHandler::ContentSettingsTypeToGroupName(
    182           content_settings_type));
    183 }
    184 
    185 void ShowClearBrowsingDataDialog(Browser* browser) {
    186   content::RecordAction(UserMetricsAction("ClearBrowsingData_ShowDlg"));
    187   ShowSettingsSubPage(browser, kClearBrowserDataSubPage);
    188 }
    189 
    190 void ShowPasswordManager(Browser* browser) {
    191   content::RecordAction(UserMetricsAction("Options_ShowPasswordManager"));
    192   ShowSettingsSubPage(browser, kPasswordManagerSubPage);
    193 }
    194 
    195 void ShowImportDialog(Browser* browser) {
    196   content::RecordAction(UserMetricsAction("Import_ShowDlg"));
    197   ShowSettingsSubPage(browser, kImportDataSubPage);
    198 }
    199 
    200 void ShowAboutChrome(Browser* browser) {
    201   content::RecordAction(UserMetricsAction("AboutChrome"));
    202   NavigateParams params(
    203       GetSingletonTabNavigateParams(browser, GURL(kChromeUIUberURL)));
    204   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
    205   ShowSingletonTabOverwritingNTP(browser, params);
    206 }
    207 
    208 void ShowSearchEngineSettings(Browser* browser) {
    209   content::RecordAction(UserMetricsAction("EditSearchEngines"));
    210   ShowSettingsSubPage(browser, kSearchEnginesSubPage);
    211 }
    212 
    213 void ShowBrowserSignin(Browser* browser, signin::Source source) {
    214   Profile* original_profile = browser->profile()->GetOriginalProfile();
    215   SigninManagerBase* manager =
    216       SigninManagerFactory::GetForProfile(original_profile);
    217   DCHECK(manager->IsSigninAllowed());
    218   // If we're signed in, just show settings.
    219   if (!manager->GetAuthenticatedUsername().empty()) {
    220     ShowSettings(browser);
    221   } else {
    222     // If the browser's profile is an incognito profile, make sure to use
    223     // a browser window from the original profile.  The user cannot sign in
    224     // from an incognito window.
    225     if (browser->profile()->IsOffTheRecord()) {
    226       browser =
    227           chrome::FindOrCreateTabbedBrowser(original_profile,
    228                                             chrome::HOST_DESKTOP_TYPE_NATIVE);
    229     }
    230 
    231     NavigateToSingletonTab(browser,
    232                            GURL(signin::GetPromoURL(source, false)));
    233     DCHECK_GT(browser->tab_strip_model()->count(), 0);
    234   }
    235 }
    236 
    237 void ShowGaiaSignin(Browser* browser,
    238                     const std::string& service,
    239                     const GURL& continue_url) {
    240   GURL url(GaiaUrls::GetInstance()->service_login_url());
    241   url = net::AppendQueryParameter(url, "service", service);
    242   if (continue_url.is_valid())
    243     url = net::AppendQueryParameter(url, "continue", continue_url.spec());
    244   NavigateToSingletonTab(browser, url);
    245 }
    246 
    247 }  // namespace chrome
    248