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