browser_about_handler.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/browser_about_handler.h"
6
7#include <algorithm>
8#include <string>
9
10#include "base/command_line.h"
11#include "base/logging.h"
12#include "base/memory/singleton.h"
13#include "base/string_util.h"
14#include "chrome/browser/net/url_fixer_upper.h"
15#include "chrome/browser/ui/browser_dialogs.h"
16#include "chrome/common/chrome_switches.h"
17#include "chrome/common/url_constants.h"
18
19namespace {
20
21// Add paths here to be included in chrome://chrome-urls (about:about).
22// These paths will also be suggested by BuiltinProvider.
23const char* const kPaths[] = {
24  chrome::kChromeUIAccessibilityHost,
25  chrome::kChromeUIAppCacheInternalsHost,
26  chrome::kChromeUIBlobInternalsHost,
27  chrome::kChromeUICacheHost,
28  chrome::kChromeUIChromeURLsHost,
29  chrome::kChromeUICrashesHost,
30  chrome::kChromeUICreditsHost,
31  chrome::kChromeUIDNSHost,
32  chrome::kChromeUIFlagsHost,
33  chrome::kChromeUIGpuHost,
34  chrome::kChromeUIHistoryHost,
35  chrome::kChromeUIIPCHost,
36  chrome::kChromeUIMediaInternalsHost,
37  chrome::kChromeUIMemoryHost,
38#if defined(OS_ANDROID) || defined(OS_IOS)
39  chrome::kChromeUINetExportHost,
40#endif
41  chrome::kChromeUINetInternalsHost,
42  chrome::kChromeUINetworkViewCacheHost,
43  chrome::kChromeUINewTabHost,
44  chrome::kChromeUIOmniboxHost,
45  chrome::kChromeUIPredictorsHost,
46  chrome::kChromeUIProfilerHost,
47  chrome::kChromeUIQuotaInternalsHost,
48  chrome::kChromeUISignInInternalsHost,
49  chrome::kChromeUIStatsHost,
50  chrome::kChromeUISyncInternalsHost,
51  chrome::kChromeUITermsHost,
52  chrome::kChromeUIUserActionsHost,
53  chrome::kChromeUIVersionHost,
54#if defined(OS_ANDROID)
55  chrome::kChromeUIWelcomeHost,
56#else
57  chrome::kChromeUIBookmarksHost,
58  chrome::kChromeUIDownloadsHost,
59  chrome::kChromeUIFlashHost,
60  chrome::kChromeUIInspectHost,
61  chrome::kChromeUIPluginsHost,
62  chrome::kChromeUISettingsHost,
63  chrome::kChromeUITracingHost,
64  chrome::kChromeUIWebRTCInternalsHost,
65#endif
66#if defined(OS_WIN)
67  chrome::kChromeUIConflictsHost,
68#endif
69#if defined(OS_LINUX) || defined(OS_OPENBSD)
70  chrome::kChromeUILinuxProxyConfigHost,
71  chrome::kChromeUISandboxHost,
72#endif
73#if defined(OS_CHROMEOS)
74  chrome::kChromeUIChooseMobileNetworkHost,
75  chrome::kChromeUICryptohomeHost,
76  chrome::kChromeUIDiagnosticsHost,
77  chrome::kChromeUIDiscardsHost,
78  chrome::kChromeUIDriveInternalsHost,
79  chrome::kChromeUIImageBurnerHost,
80  chrome::kChromeUIKeyboardOverlayHost,
81  chrome::kChromeUILoginHost,
82  chrome::kChromeUINetworkHost,
83  chrome::kChromeUIOobeHost,
84  chrome::kChromeUIOSCreditsHost,
85  chrome::kChromeUIProxySettingsHost,
86  chrome::kChromeUISystemInfoHost,
87  chrome::kChromeUITaskManagerHost,
88#endif
89#if !defined(DISABLE_NACL)
90  chrome::kChromeUINaClHost,
91#endif
92#if defined(ENABLE_CONFIGURATION_POLICY)
93  chrome::kChromeUIPolicyHost,
94#endif
95#if defined(ENABLE_EXTENSIONS)
96  chrome::kChromeUIExtensionsHost,
97#endif
98#if defined(ENABLE_PRINTING)
99  chrome::kChromeUIPrintHost,
100#endif
101};
102
103}  // namespace
104
105bool WillHandleBrowserAboutURL(GURL* url,
106                               content::BrowserContext* browser_context) {
107  // TODO(msw): Eliminate "about:*" constants and literals from code and tests,
108  //            then hopefully we can remove this forced fixup.
109  *url = URLFixerUpper::FixupURL(url->possibly_invalid_spec(), std::string());
110
111  // Check that about: URLs are fixed up to chrome: by URLFixerUpper::FixupURL.
112  DCHECK((*url == GURL(chrome::kAboutBlankURL)) ||
113         !url->SchemeIs(chrome::kAboutScheme));
114
115  // Only handle chrome://foo/, URLFixerUpper::FixupURL translates about:foo.
116  if (!url->SchemeIs(chrome::kChromeUIScheme))
117    return false;
118
119  std::string host(url->host());
120  std::string path;
121  // Replace about with chrome-urls.
122  if (host == chrome::kChromeUIAboutHost)
123    host = chrome::kChromeUIChromeURLsHost;
124  // Replace cache with view-http-cache.
125  if (host == chrome::kChromeUICacheHost) {
126    host = chrome::kChromeUINetworkViewCacheHost;
127  // Replace sync with sync-internals (for legacy reasons).
128  } else if (host == chrome::kChromeUISyncHost) {
129    host = chrome::kChromeUISyncInternalsHost;
130  // Redirect chrome://extensions.
131  } else if (host == chrome::kChromeUIExtensionsHost) {
132    host = chrome::kChromeUIUberHost;
133    path = chrome::kChromeUIExtensionsHost + url->path();
134  // Redirect chrome://settings/extensions.
135  // TODO(csilv): Remove this URL after M22 (legacy URL).
136  } else if (host == chrome::kChromeUISettingsHost &&
137      url->path() == std::string("/") + chrome::kExtensionsSubPage) {
138    host = chrome::kChromeUIUberHost;
139    path = chrome::kChromeUIExtensionsHost;
140  // Redirect chrome://history.
141  } else if (host == chrome::kChromeUIHistoryHost) {
142#if defined(OS_ANDROID)
143    // On Android, redirect directly to chrome://history-frame since
144    // uber page is unsupported.
145    host = chrome::kChromeUIHistoryFrameHost;
146#else
147    host = chrome::kChromeUIUberHost;
148    path = chrome::kChromeUIHistoryHost + url->path();
149#endif
150  // Redirect chrome://settings
151  } else if (host == chrome::kChromeUISettingsHost) {
152    host = chrome::kChromeUIUberHost;
153    path = chrome::kChromeUISettingsHost + url->path();
154  // Redirect chrome://help
155  } else if (host == chrome::kChromeUIHelpHost) {
156    host = chrome::kChromeUIUberHost;
157    path = chrome::kChromeUIHelpHost + url->path();
158  }
159  GURL::Replacements replacements;
160  replacements.SetHostStr(host);
161  if (!path.empty())
162    replacements.SetPathStr(path);
163  *url = url->ReplaceComponents(replacements);
164
165  // Having re-written the URL, make the chrome: handler process it.
166  return false;
167}
168
169bool HandleNonNavigationAboutURL(const GURL& url) {
170  std::string host(url.host());
171
172  // chrome://ipc/ is currently buggy, so we disable it for official builds.
173#if !defined(OFFICIAL_BUILD)
174
175#if (defined(OS_MACOSX) || defined(OS_WIN)) && defined(IPC_MESSAGE_LOG_ENABLED)
176  if (LowerCaseEqualsASCII(url.spec(), chrome::kChromeUIIPCURL)) {
177    // Run the dialog. This will re-use the existing one if it's already up.
178    chrome::ShowAboutIPCDialog();
179    return true;
180  }
181#endif
182
183#endif  // OFFICIAL_BUILD
184
185  return false;
186}
187
188std::vector<std::string> ChromePaths() {
189  std::vector<std::string> paths(kPaths, kPaths + arraysize(kPaths));
190  std::sort(paths.begin(), paths.end());
191  return paths;
192}
193