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