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