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