Adding instrumentation to locate the source of jankiness
[chromium-blink-merge.git] / chrome / browser / ui / chrome_pages.cc
blob093889d53e32b7b285fd092b23b444449f7c35a7
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.
5 #include "chrome/browser/ui/chrome_pages.h"
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"
33 #if defined(OS_WIN)
34 #include "chrome/browser/enumerate_modules_model_win.h"
35 #endif
37 #if defined(OS_CHROMEOS)
38 #include "chrome/browser/chromeos/genius_app/app_id.h"
39 #include "extensions/browser/extension_registry.h"
40 #endif
42 using base::UserMetricsAction;
44 namespace chrome {
45 namespace {
47 const char kHashMark[] = "#";
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);
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);
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;
98 scoped_ptr<ScopedTabbedBrowserDisplayer> displayer;
99 if (!browser) {
100 displayer.reset(
101 new ScopedTabbedBrowserDisplayer(profile, host_desktop_type));
102 browser = displayer->browser();
104 ShowSingletonTab(browser, url);
105 #endif
108 } // namespace
110 void ShowBookmarkManager(Browser* browser) {
111 content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
112 content::RecordAction(UserMetricsAction("ShowBookmarks"));
113 ShowSingletonTabOverwritingNTP(
114 browser,
115 GetSingletonTabNavigateParams(browser, GURL(kChromeUIBookmarksURL)));
118 void ShowBookmarkManagerForNode(Browser* browser, int64 node_id) {
119 OpenBookmarkManagerWithHash(browser, std::string(), node_id);
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);
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);
138 ShowSingletonTabOverwritingNTP(
139 browser,
140 GetSingletonTabNavigateParams(browser, GURL(kChromeUIDownloadsURL)));
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);
156 ShowSingletonTabOverwritingNTP(browser, params);
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;
170 #endif
172 content::RecordAction(UserMetricsAction("AboutConflicts"));
173 ShowSingletonTab(browser, GURL(kChromeUIConflictsURL));
176 void ShowHelp(Browser* browser, HelpSource source) {
177 ShowHelpImpl(
178 browser, browser->profile(), browser->host_desktop_type(), source);
181 void ShowHelpForProfile(Profile* profile,
182 HostDesktopType host_desktop_type,
183 HelpSource source) {
184 ShowHelpImpl(NULL, profile, host_desktop_type, source);
187 void ShowPolicy(Browser* browser) {
188 ShowSingletonTab(browser, GURL(kChromeUIPolicyURL));
191 void ShowSlow(Browser* browser) {
192 #if defined(OS_CHROMEOS)
193 ShowSingletonTab(browser, GURL(kChromeUISlowURL));
194 #endif
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;
206 #endif
207 return GURL(url);
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());
224 void ShowSettings(Browser* browser) {
225 ShowSettingsSubPage(browser, std::string());
228 void ShowSettingsSubPage(Browser* browser, const std::string& sub_page) {
229 if (::switches::SettingsWindowEnabled()) {
230 ShowSettingsSubPageForProfile(browser->profile(), sub_page);
231 return;
233 ShowSettingsSubPageInTabbedBrowser(browser, sub_page);
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;
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));
250 ShowSettingsSubPageInTabbedBrowser(browser, sub_page);
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);
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));
271 void ShowClearBrowsingDataDialog(Browser* browser) {
272 content::RecordAction(UserMetricsAction("ClearBrowsingData_ShowDlg"));
273 ShowSettingsSubPage(browser, kClearBrowserDataSubPage);
276 void ShowPasswordManager(Browser* browser) {
277 content::RecordAction(UserMetricsAction("Options_ShowPasswordManager"));
278 ShowSettingsSubPage(browser, kPasswordManagerSubPage);
281 void ShowImportDialog(Browser* browser) {
282 content::RecordAction(UserMetricsAction("Import_ShowDlg"));
283 ShowSettingsSubPage(browser, kImportDataSubPage);
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;
293 NavigateParams params(
294 GetSingletonTabNavigateParams(browser, GURL(kChromeUIUberURL)));
295 params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
296 ShowSingletonTabOverwritingNTP(browser, params);
299 void ShowSearchEngineSettings(Browser* browser) {
300 content::RecordAction(UserMetricsAction("EditSearchEngines"));
301 ShowSettingsSubPage(browser, kSearchEnginesSubPage);
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();
323 NavigateToSingletonTab(browser, GURL(signin::GetPromoURL(source, false)));
324 DCHECK_GT(browser->tab_strip_model()->count(), 0);
328 } // namespace chrome