browser_about_handler.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/browser_about_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_fixer_upper.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add paths here to be included in chrome://chrome-urls (about:about). 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These paths will also be suggested by BuiltinProvider. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kPaths[] = { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUIAccessibilityHost, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIAppCacheInternalsHost, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIBlobInternalsHost, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUICacheHost, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIChromeURLsHost, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUICrashesHost, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUICreditsHost, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIDNSHost, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUIFlagsHost, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUIGpuHost, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIHistoryHost, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIIPCHost, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIMediaInternalsHost, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIMemoryHost, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUINetExportHost, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUINetInternalsHost, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUINetworkViewCacheHost, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUINewTabHost, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIOmniboxHost, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIPredictorsHost, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIProfilerHost, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIQuotaInternalsHost, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUISignInInternalsHost, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIStatsHost, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUISyncInternalsHost, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUITermsHost, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUIUserActionsHost, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIVersionHost, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIWelcomeHost, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIBookmarksHost, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIDownloadsHost, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIFlashHost, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIInspectHost, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIPluginsHost, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUISettingsHost, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUITracingHost, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeUIWebRTCInternalsHost, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIConflictsHost, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_OPENBSD) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUILinuxProxyConfigHost, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUISandboxHost, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIChooseMobileNetworkHost, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUICryptohomeHost, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIDiagnosticsHost, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIDiscardsHost, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIDriveInternalsHost, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIImageBurnerHost, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIKeyboardOverlayHost, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUILoginHost, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUINetworkHost, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIOobeHost, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIOSCreditsHost, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIProxySettingsHost, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUISystemInfoHost, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUITaskManagerHost, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_NACL) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUINaClHost, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIPolicyHost, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIExtensionsHost, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kChromeUIPrintHost, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WillHandleBrowserAboutURL(GURL* url, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(msw): Eliminate "about:*" constants and literals from code and tests, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then hopefully we can remove this forced fixup. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = URLFixerUpper::FixupURL(url->possibly_invalid_spec(), std::string()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that about: URLs are fixed up to chrome: by URLFixerUpper::FixupURL. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK((*url == GURL(chrome::kAboutBlankURL)) || 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !url->SchemeIs(chrome::kAboutScheme)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only handle chrome://foo/, URLFixerUpper::FixupURL translates about:foo. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->SchemeIs(chrome::kChromeUIScheme)) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string host(url->host()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace about with chrome-urls. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host == chrome::kChromeUIAboutHost) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUIChromeURLsHost; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace cache with view-http-cache. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host == chrome::kChromeUICacheHost) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUINetworkViewCacheHost; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace sync with sync-internals (for legacy reasons). 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (host == chrome::kChromeUISyncHost) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUISyncInternalsHost; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirect chrome://extensions. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (host == chrome::kChromeUIExtensionsHost) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUIUberHost; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = chrome::kChromeUIExtensionsHost + url->path(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirect chrome://settings/extensions. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(csilv): Remove this URL after M22 (legacy URL). 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (host == chrome::kChromeUISettingsHost && 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url->path() == std::string("/") + chrome::kExtensionsSubPage) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUIUberHost; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = chrome::kChromeUIExtensionsHost; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirect chrome://history. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (host == chrome::kChromeUIHistoryHost) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Android, redirect directly to chrome://history-frame since 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // uber page is unsupported. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host = chrome::kChromeUIHistoryFrameHost; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUIUberHost; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = chrome::kChromeUIHistoryHost + url->path(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirect chrome://settings 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (host == chrome::kChromeUISettingsHost) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUIUberHost; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = chrome::kChromeUISettingsHost + url->path(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirect chrome://help 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (host == chrome::kChromeUIHelpHost) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host = chrome::kChromeUIUberHost; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = chrome::kChromeUIHelpHost + url->path(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements replacements; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetHostStr(host); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!path.empty()) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetPathStr(path); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = url->ReplaceComponents(replacements); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Having re-written the URL, make the chrome: handler process it. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleNonNavigationAboutURL(const GURL& url) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string host(url.host()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome://ipc/ is currently buggy, so we disable it for official builds. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OFFICIAL_BUILD) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(OS_MACOSX) || defined(OS_WIN)) && defined(IPC_MESSAGE_LOG_ENABLED) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LowerCaseEqualsASCII(url.spec(), chrome::kChromeUIIPCURL)) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the dialog. This will re-use the existing one if it's already up. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowAboutIPCDialog(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OFFICIAL_BUILD 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<std::string> ChromePaths() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> paths(kPaths, kPaths + arraysize(kPaths)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(paths.begin(), paths.end()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return paths; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 193