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