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