15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_shelf.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/browser_finder.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/settings_window_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/content_settings_handler.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/chrome_switches.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/web_contents.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/url_util.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/enumerate_modules_model_win.h"
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS)
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/chromeos/genius_app/app_id.h"
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h"
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHashMark[] = "#";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OpenBookmarkManagerWithHash(Browser* browser,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& action,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int64 node_id) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowBookmarks"));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateParams params(GetSingletonTabNavigateParams(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser,
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL(kChromeUIBookmarksURL).Resolve(base::StringPrintf(
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          "/#%s%s", action.c_str(), base::Int64ToString(node_id).c_str()))));
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser, params);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NavigateToSingletonTab(Browser* browser, const GURL& url) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigateParams params(GetSingletonTabNavigateParams(browser, url));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser, params);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Shows either the help app or the appropriate help page for |source|. If
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// |browser| is NULL and the help page is used (vs the app), the help page is
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// shown in the last active browser. If there is no such browser, a new browser
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// is created.
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ShowHelpImpl(Browser* browser,
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  Profile* profile,
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  HostDesktopType host_desktop_type,
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  HelpSource source) {
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowHelpTab"));
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const extensions::Extension* extension =
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::ExtensionRegistry::Get(profile)->GetExtensionById(
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          genius_app::kGeniusAppId,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          extensions::ExtensionRegistry::EVERYTHING);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OpenApplication(AppLaunchParams(profile, extension, 0, host_desktop_type));
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GURL url;
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (source) {
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case HELP_SOURCE_KEYBOARD:
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      url = GURL(kChromeHelpViaKeyboardURL);
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case HELP_SOURCE_MENU:
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      url = GURL(kChromeHelpViaMenuURL);
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case HELP_SOURCE_WEBUI:
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      url = GURL(kChromeHelpViaWebUIURL);
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    default:
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      NOTREACHED() << "Unhandled help source " << source;
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<ScopedTabbedBrowserDisplayer> displayer;
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!browser) {
1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    displayer.reset(
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        new ScopedTabbedBrowserDisplayer(profile, host_desktop_type));
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    browser = displayer->browser();
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ShowSingletonTab(browser, url);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowBookmarkManager(Browser* browser) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowBookmarkManager"));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowBookmarks"));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSingletonTabNavigateParams(browser, GURL(kChromeUIBookmarksURL)));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowBookmarkManagerForNode(Browser* browser, int64 node_id) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OpenBookmarkManagerWithHash(browser, std::string(), node_id);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowHistory(Browser* browser) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowHistory"));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateParams params(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSingletonTabNavigateParams(browser, GURL(kChromeUIHistoryURL)));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser, params);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowDownloads(Browser* browser) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowDownloads"));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser->window()) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadShelf* shelf = browser->window()->GetDownloadShelf();
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The downloads page is always shown in response to a user action.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (shelf->IsShowing())
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shelf->Close(DownloadShelf::USER_ACTION);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSingletonTabNavigateParams(browser, GURL(kChromeUIDownloadsURL)));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowExtensions(Browser* browser,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const std::string& extension_to_highlight) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ShowExtensions"));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateParams params(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSingletonTabNavigateParams(browser, GURL(kChromeUIExtensionsURL)));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!extension_to_highlight.empty()) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL::Replacements replacements;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string query("id=");
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    query += extension_to_highlight;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replacements.SetQueryStr(query);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.url = params.url.ReplaceComponents(replacements);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser, params);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowConflicts(Browser* browser) {
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnumerateModulesModel* model = EnumerateModulesModel::GetInstance();
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (model->modules_to_notify_about() > 0) {
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    GURL help_center_url = model->GetFirstNotableConflict();
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (help_center_url.is_valid()) {
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ShowSingletonTab(browser, help_center_url);
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      model->AcknowledgeConflictNotification();
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("AboutConflicts"));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTab(browser, GURL(kChromeUIConflictsURL));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowHelp(Browser* browser, HelpSource source) {
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ShowHelpImpl(
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      browser, browser->profile(), browser->host_desktop_type(), source);
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ShowHelpForProfile(Profile* profile,
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                        HostDesktopType host_desktop_type,
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                        HelpSource source) {
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ShowHelpImpl(NULL, profile, host_desktop_type, source);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowPolicy(Browser* browser) {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowSingletonTab(browser, GURL(kChromeUIPolicyURL));
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid ShowSlow(Browser* browser) {
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_CHROMEOS)
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ShowSingletonTab(browser, GURL(kChromeUISlowURL));
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
197effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochGURL GetSettingsUrl(const std::string& sub_page) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url = std::string(kChromeUISettingsURL) + sub_page;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sub_page.find(kInternetOptionsSubPage, 0) != std::string::npos) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string::size_type loc = sub_page.find("?", 0);
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string network_page =
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        loc != std::string::npos ? sub_page.substr(loc) : std::string();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url = std::string(kChromeUISettingsURL) + network_page;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return GURL(url);
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool IsTrustedPopupWindowWithScheme(const Browser* browser,
2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                    const std::string& scheme) {
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!browser->is_type_popup() || !browser->is_trusted_source())
2130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return false;
2140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (scheme.empty())  // Any trusted popup window
2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return true;
2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const content::WebContents* web_contents =
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      browser->tab_strip_model()->GetWebContentsAt(0);
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!web_contents)
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return false;
2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL url(web_contents->GetURL());
2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return url.SchemeIs(scheme.c_str());
2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ShowSettings(Browser* browser) {
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ShowSettingsSubPage(browser, std::string());
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ShowSettingsSubPage(Browser* browser, const std::string& sub_page) {
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (::switches::SettingsWindowEnabled()) {
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ShowSettingsSubPageForProfile(browser->profile(), sub_page);
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ShowSettingsSubPageInTabbedBrowser(browser, sub_page);
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ShowSettingsSubPageForProfile(Profile* profile,
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                   const std::string& sub_page) {
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (::switches::SettingsWindowEnabled()) {
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    content::RecordAction(base::UserMetricsAction("ShowOptions"));
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        profile, GetSettingsUrl(sub_page));
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Browser* browser =
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      chrome::FindTabbedBrowser(profile, false, HOST_DESKTOP_TYPE_NATIVE);
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!browser) {
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    browser = new Browser(
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        Browser::CreateParams(profile, chrome::HOST_DESKTOP_TYPE_NATIVE));
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ShowSettingsSubPageInTabbedBrowser(browser, sub_page);
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ShowSettingsSubPageInTabbedBrowser(Browser* browser,
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        const std::string& sub_page) {
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  content::RecordAction(UserMetricsAction("ShowOptions"));
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GURL gurl = GetSettingsUrl(sub_page);
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NavigateParams params(GetSingletonTabNavigateParams(browser, gurl));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser, params);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowContentSettings(Browser* browser,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ContentSettingsType content_settings_type) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSettingsSubPage(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kContentSettingsExceptionsSubPage + std::string(kHashMark) +
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          options::ContentSettingsHandler::ContentSettingsTypeToGroupName(
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              content_settings_type));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowClearBrowsingDataDialog(Browser* browser) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ClearBrowsingData_ShowDlg"));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSettingsSubPage(browser, kClearBrowserDataSubPage);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowPasswordManager(Browser* browser) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("Options_ShowPasswordManager"));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSettingsSubPage(browser, kPasswordManagerSubPage);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowImportDialog(Browser* browser) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("Import_ShowDlg"));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSettingsSubPage(browser, kImportDataSubPage);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowAboutChrome(Browser* browser) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("AboutChrome"));
288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (::switches::SettingsWindowEnabled()) {
289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        browser->profile(), GURL(kChromeUIUberURL));
291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateParams params(
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSingletonTabNavigateParams(browser, GURL(kChromeUIUberURL)));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSingletonTabOverwritingNTP(browser, params);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowSearchEngineSettings(Browser* browser) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("EditSearchEngines"));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSettingsSubPage(browser, kSearchEnginesSubPage);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ShowBrowserSignin(Browser* browser, signin::Source source) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* original_profile = browser->profile()->GetOriginalProfile();
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManagerBase* manager =
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SigninManagerFactory::GetForProfile(original_profile);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(manager->IsSigninAllowed());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we're signed in, just show settings.
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (manager->IsAuthenticated()) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowSettings(browser);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the browser's profile is an incognito profile, make sure to use
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // a browser window from the original profile.  The user cannot sign in
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // from an incognito window.
3160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<ScopedTabbedBrowserDisplayer> displayer;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (browser->profile()->IsOffTheRecord()) {
3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      displayer.reset(new ScopedTabbedBrowserDisplayer(
3190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          original_profile, chrome::HOST_DESKTOP_TYPE_NATIVE));
3200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      browser = displayer->browser();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NavigateToSingletonTab(browser, GURL(signin::GetPromoURL(source, false)));
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_GT(browser->tab_strip_model()->count(), 0);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
329