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/command_line.h"
      8 #include "base/logging.h"
      9 #include "base/strings/string_number_conversions.h"
     10 #include "base/strings/stringprintf.h"
     11 #include "chrome/browser/download/download_shelf.h"
     12 #include "chrome/browser/profiles/profile.h"
     13 #include "chrome/browser/profiles/profile_manager.h"
     14 #include "chrome/browser/signin/signin_manager_factory.h"
     15 #include "chrome/browser/ui/browser.h"
     16 #include "chrome/browser/ui/browser_finder.h"
     17 #include "chrome/browser/ui/browser_navigator.h"
     18 #include "chrome/browser/ui/browser_window.h"
     19 #include "chrome/browser/ui/extensions/application_launch.h"
     20 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
     21 #include "chrome/browser/ui/settings_window_manager.h"
     22 #include "chrome/browser/ui/singleton_tabs.h"
     23 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     24 #include "chrome/browser/ui/webui/options/content_settings_handler.h"
     25 #include "chrome/common/chrome_switches.h"
     26 #include "chrome/common/url_constants.h"
     27 #include "components/signin/core/browser/signin_manager.h"
     28 #include "content/public/browser/user_metrics.h"
     29 #include "content/public/browser/web_contents.h"
     30 #include "google_apis/gaia/gaia_urls.h"
     31 #include "net/base/url_util.h"
     32 
     33 #if defined(OS_WIN)
     34 #include "chrome/browser/enumerate_modules_model_win.h"
     35 #endif
     36 
     37 #if defined(OS_CHROMEOS)
     38 #include "chrome/browser/chromeos/genius_app/app_id.h"
     39 #include "extensions/browser/extension_registry.h"
     40 #endif
     41 
     42 using base::UserMetricsAction;
     43 
     44 namespace chrome {
     45 namespace {
     46 
     47 const char kHashMark[] = "#";
     48 
     49 void OpenBookmarkManagerWithHash(Browser* browser,
     50                                  const std::string& action,
     51                                  int64 node_id) {
     52   content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
     53   content::RecordAction(UserMetricsAction("ShowBookmarks"));
     54   NavigateParams params(GetSingletonTabNavigateParams(
     55       browser,
     56       GURL(kChromeUIBookmarksURL).Resolve(base::StringPrintf(
     57           "/#%s%s", action.c_str(), base::Int64ToString(node_id).c_str()))));
     58   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
     59   ShowSingletonTabOverwritingNTP(browser, params);
     60 }
     61 
     62 void NavigateToSingletonTab(Browser* browser, const GURL& url) {
     63   NavigateParams params(GetSingletonTabNavigateParams(browser, url));
     64   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
     65   ShowSingletonTabOverwritingNTP(browser, params);
     66 }
     67 
     68 // Shows either the help app or the appropriate help page for |source|. If
     69 // |browser| is NULL and the help page is used (vs the app), the help page is
     70 // shown in the last active browser. If there is no such browser, a new browser
     71 // is created.
     72 void ShowHelpImpl(Browser* browser,
     73                   Profile* profile,
     74                   HostDesktopType host_desktop_type,
     75                   HelpSource source) {
     76   content::RecordAction(UserMetricsAction("ShowHelpTab"));
     77 #if defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD)
     78   const extensions::Extension* extension =
     79       extensions::ExtensionRegistry::Get(profile)->GetExtensionById(
     80           genius_app::kGeniusAppId,
     81           extensions::ExtensionRegistry::EVERYTHING);
     82   OpenApplication(AppLaunchParams(profile, extension, 0, host_desktop_type));
     83 #else
     84   GURL url;
     85   switch (source) {
     86     case HELP_SOURCE_KEYBOARD:
     87       url = GURL(kChromeHelpViaKeyboardURL);
     88       break;
     89     case HELP_SOURCE_MENU:
     90       url = GURL(kChromeHelpViaMenuURL);
     91       break;
     92     case HELP_SOURCE_WEBUI:
     93       url = GURL(kChromeHelpViaWebUIURL);
     94       break;
     95     default:
     96       NOTREACHED() << "Unhandled help source " << source;
     97   }
     98   scoped_ptr<ScopedTabbedBrowserDisplayer> displayer;
     99   if (!browser) {
    100     displayer.reset(
    101         new ScopedTabbedBrowserDisplayer(profile, host_desktop_type));
    102     browser = displayer->browser();
    103   }
    104   ShowSingletonTab(browser, url);
    105 #endif
    106 }
    107 
    108 }  // namespace
    109 
    110 void ShowBookmarkManager(Browser* browser) {
    111   content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
    112   content::RecordAction(UserMetricsAction("ShowBookmarks"));
    113   ShowSingletonTabOverwritingNTP(
    114       browser,
    115       GetSingletonTabNavigateParams(browser, GURL(kChromeUIBookmarksURL)));
    116 }
    117 
    118 void ShowBookmarkManagerForNode(Browser* browser, int64 node_id) {
    119   OpenBookmarkManagerWithHash(browser, std::string(), node_id);
    120 }
    121 
    122 void ShowHistory(Browser* browser) {
    123   content::RecordAction(UserMetricsAction("ShowHistory"));
    124   NavigateParams params(
    125       GetSingletonTabNavigateParams(browser, GURL(kChromeUIHistoryURL)));
    126   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
    127   ShowSingletonTabOverwritingNTP(browser, params);
    128 }
    129 
    130 void ShowDownloads(Browser* browser) {
    131   content::RecordAction(UserMetricsAction("ShowDownloads"));
    132   if (browser->window()) {
    133     DownloadShelf* shelf = browser->window()->GetDownloadShelf();
    134     // The downloads page is always shown in response to a user action.
    135     if (shelf->IsShowing())
    136       shelf->Close(DownloadShelf::USER_ACTION);
    137   }
    138   ShowSingletonTabOverwritingNTP(
    139       browser,
    140       GetSingletonTabNavigateParams(browser, GURL(kChromeUIDownloadsURL)));
    141 }
    142 
    143 void ShowExtensions(Browser* browser,
    144                     const std::string& extension_to_highlight) {
    145   content::RecordAction(UserMetricsAction("ShowExtensions"));
    146   NavigateParams params(
    147       GetSingletonTabNavigateParams(browser, GURL(kChromeUIExtensionsURL)));
    148   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
    149   if (!extension_to_highlight.empty()) {
    150     GURL::Replacements replacements;
    151     std::string query("id=");
    152     query += extension_to_highlight;
    153     replacements.SetQueryStr(query);
    154     params.url = params.url.ReplaceComponents(replacements);
    155   }
    156   ShowSingletonTabOverwritingNTP(browser, params);
    157 }
    158 
    159 void ShowConflicts(Browser* browser) {
    160 #if defined(OS_WIN)
    161   EnumerateModulesModel* model = EnumerateModulesModel::GetInstance();
    162   if (model->modules_to_notify_about() > 0) {
    163     GURL help_center_url = model->GetFirstNotableConflict();
    164     if (help_center_url.is_valid()) {
    165       ShowSingletonTab(browser, help_center_url);
    166       model->AcknowledgeConflictNotification();
    167       return;
    168     }
    169   }
    170 #endif
    171 
    172   content::RecordAction(UserMetricsAction("AboutConflicts"));
    173   ShowSingletonTab(browser, GURL(kChromeUIConflictsURL));
    174 }
    175 
    176 void ShowHelp(Browser* browser, HelpSource source) {
    177   ShowHelpImpl(
    178       browser, browser->profile(), browser->host_desktop_type(), source);
    179 }
    180 
    181 void ShowHelpForProfile(Profile* profile,
    182                         HostDesktopType host_desktop_type,
    183                         HelpSource source) {
    184   ShowHelpImpl(NULL, profile, host_desktop_type, source);
    185 }
    186 
    187 void ShowPolicy(Browser* browser) {
    188   ShowSingletonTab(browser, GURL(kChromeUIPolicyURL));
    189 }
    190 
    191 void ShowSlow(Browser* browser) {
    192 #if defined(OS_CHROMEOS)
    193   ShowSingletonTab(browser, GURL(kChromeUISlowURL));
    194 #endif
    195 }
    196 
    197 GURL GetSettingsUrl(const std::string& sub_page) {
    198   std::string url = std::string(kChromeUISettingsURL) + sub_page;
    199 #if defined(OS_CHROMEOS)
    200   if (sub_page.find(kInternetOptionsSubPage, 0) != std::string::npos) {
    201     std::string::size_type loc = sub_page.find("?", 0);
    202     std::string network_page =
    203         loc != std::string::npos ? sub_page.substr(loc) : std::string();
    204     url = std::string(kChromeUISettingsURL) + network_page;
    205   }
    206 #endif
    207   return GURL(url);
    208 }
    209 
    210 bool IsTrustedPopupWindowWithScheme(const Browser* browser,
    211                                     const std::string& scheme) {
    212   if (!browser->is_type_popup() || !browser->is_trusted_source())
    213     return false;
    214   if (scheme.empty())  // Any trusted popup window
    215     return true;
    216   const content::WebContents* web_contents =
    217       browser->tab_strip_model()->GetWebContentsAt(0);
    218   if (!web_contents)
    219     return false;
    220   GURL url(web_contents->GetURL());
    221   return url.SchemeIs(scheme.c_str());
    222 }
    223 
    224 void ShowSettings(Browser* browser) {
    225   ShowSettingsSubPage(browser, std::string());
    226 }
    227 
    228 void ShowSettingsSubPage(Browser* browser, const std::string& sub_page) {
    229   if (::switches::SettingsWindowEnabled()) {
    230     ShowSettingsSubPageForProfile(browser->profile(), sub_page);
    231     return;
    232   }
    233   ShowSettingsSubPageInTabbedBrowser(browser, sub_page);
    234 }
    235 
    236 void ShowSettingsSubPageForProfile(Profile* profile,
    237                                    const std::string& sub_page) {
    238   if (::switches::SettingsWindowEnabled()) {
    239     content::RecordAction(base::UserMetricsAction("ShowOptions"));
    240     SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
    241         profile, GetSettingsUrl(sub_page));
    242     return;
    243   }
    244   Browser* browser =
    245       chrome::FindTabbedBrowser(profile, false, HOST_DESKTOP_TYPE_NATIVE);
    246   if (!browser) {
    247     browser = new Browser(
    248         Browser::CreateParams(profile, chrome::HOST_DESKTOP_TYPE_NATIVE));
    249   }
    250   ShowSettingsSubPageInTabbedBrowser(browser, sub_page);
    251 }
    252 
    253 void ShowSettingsSubPageInTabbedBrowser(Browser* browser,
    254                                         const std::string& sub_page) {
    255   content::RecordAction(UserMetricsAction("ShowOptions"));
    256   GURL gurl = GetSettingsUrl(sub_page);
    257   NavigateParams params(GetSingletonTabNavigateParams(browser, gurl));
    258   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
    259   ShowSingletonTabOverwritingNTP(browser, params);
    260 }
    261 
    262 void ShowContentSettings(Browser* browser,
    263                          ContentSettingsType content_settings_type) {
    264   ShowSettingsSubPage(
    265       browser,
    266       kContentSettingsExceptionsSubPage + std::string(kHashMark) +
    267           options::ContentSettingsHandler::ContentSettingsTypeToGroupName(
    268               content_settings_type));
    269 }
    270 
    271 void ShowClearBrowsingDataDialog(Browser* browser) {
    272   content::RecordAction(UserMetricsAction("ClearBrowsingData_ShowDlg"));
    273   ShowSettingsSubPage(browser, kClearBrowserDataSubPage);
    274 }
    275 
    276 void ShowPasswordManager(Browser* browser) {
    277   content::RecordAction(UserMetricsAction("Options_ShowPasswordManager"));
    278   ShowSettingsSubPage(browser, kPasswordManagerSubPage);
    279 }
    280 
    281 void ShowImportDialog(Browser* browser) {
    282   content::RecordAction(UserMetricsAction("Import_ShowDlg"));
    283   ShowSettingsSubPage(browser, kImportDataSubPage);
    284 }
    285 
    286 void ShowAboutChrome(Browser* browser) {
    287   content::RecordAction(UserMetricsAction("AboutChrome"));
    288   if (::switches::SettingsWindowEnabled()) {
    289     SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
    290         browser->profile(), GURL(kChromeUIUberURL));
    291     return;
    292   }
    293   NavigateParams params(
    294       GetSingletonTabNavigateParams(browser, GURL(kChromeUIUberURL)));
    295   params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
    296   ShowSingletonTabOverwritingNTP(browser, params);
    297 }
    298 
    299 void ShowSearchEngineSettings(Browser* browser) {
    300   content::RecordAction(UserMetricsAction("EditSearchEngines"));
    301   ShowSettingsSubPage(browser, kSearchEnginesSubPage);
    302 }
    303 
    304 void ShowBrowserSignin(Browser* browser, signin::Source source) {
    305   Profile* original_profile = browser->profile()->GetOriginalProfile();
    306   SigninManagerBase* manager =
    307       SigninManagerFactory::GetForProfile(original_profile);
    308   DCHECK(manager->IsSigninAllowed());
    309   // If we're signed in, just show settings.
    310   if (manager->IsAuthenticated()) {
    311     ShowSettings(browser);
    312   } else {
    313     // If the browser's profile is an incognito profile, make sure to use
    314     // a browser window from the original profile.  The user cannot sign in
    315     // from an incognito window.
    316     scoped_ptr<ScopedTabbedBrowserDisplayer> displayer;
    317     if (browser->profile()->IsOffTheRecord()) {
    318       displayer.reset(new ScopedTabbedBrowserDisplayer(
    319           original_profile, chrome::HOST_DESKTOP_TYPE_NATIVE));
    320       browser = displayer->browser();
    321     }
    322 
    323     NavigateToSingletonTab(browser, GURL(signin::GetPromoURL(source, false)));
    324     DCHECK_GT(browser->tab_strip_model()->count(), 0);
    325   }
    326 }
    327 
    328 }  // namespace chrome
    329