对about Scheme进行处理的地方:
D:/project/chrome/src/src/chrome/browser/browser_url_handler.cc的void BrowserURLHandler::InitURLHandlers()函数
// static void BrowserURLHandler::InitURLHandlers() { if (!url_handlers_.empty()) return; // Visual Studio 2010 has problems converting NULL to the null pointer for // std::pair. See http://connect.microsoft.com/VisualStudio/feedback/details/520043/error-converting-from-null-to-a-pointer-type-in-std-pair // It will work if we pass nullptr. #if defined(_MSC_VER) && _MSC_VER >= 1600 URLHandler null_handler = nullptr; #else URLHandler null_handler = NULL; #endif // Add the default URL handlers. url_handlers_.push_back( HandlerPair(&ExtensionWebUI::HandleChromeURLOverride, null_handler)); // about: url_handlers_.push_back(HandlerPair(&WillHandleBrowserAboutURL, null_handler)); // chrome: & friends. url_handlers_.push_back(HandlerPair(&HandleWebUI, null_handler)); // view-source: url_handlers_.push_back(HandlerPair(&HandleViewSource, &ReverseViewSource)); }
D:/project/chrome/src/src/chrome/browser/browser_about_handler.cc 的bool WillHandleBrowserAboutURL(GURL* url, Profile* profile)
WillHandleBrowserAboutURL bool WillHandleBrowserAboutURL(GURL* url, Profile* profile) { // We only handle about: schemes. if (!url->SchemeIs(chrome::kAboutScheme)) return false; // about:blank is special. Frames are allowed to access about:blank, // but they are not allowed to access other types of about pages. // Just ignore the about:blank and let the TAB_CONTENTS_WEB handle it. if (LowerCaseEqualsASCII(url->spec(), chrome::kAboutBlankURL)) return false; // Rewrite about:cache/* URLs to chrome://view-http-cache/* if (StartsWithAboutSpecifier(*url, chrome::kAboutCacheURL)) { *url = RemapAboutURL(chrome::kNetworkViewCacheURL, *url); return true; } #if defined(OS_WIN) // Rewrite about:conflicts/* URLs to chrome://conflicts/* if (StartsWithAboutSpecifier(*url, chrome::kAboutConflicts)) { *url = GURL(chrome::kChromeUIConflictsURL); return true; } #endif // Rewrite about:flags to chrome://flags/. if (LowerCaseEqualsASCII(url->spec(), chrome::kAboutFlagsURL)) { *url = GURL(chrome::kChromeUIFlagsURL); return true; } // Rewrite about:net-internals/* URLs to chrome://net-internals/* if (StartsWithAboutSpecifier(*url, chrome::kAboutNetInternalsURL)) { *url = RemapAboutURL(chrome::kNetworkViewInternalsURL, *url); return true; } // Rewrite about:gpu/* URLs to chrome://gpu-internals/* if (StartsWithAboutSpecifier(*url, chrome::kAboutGpuURL)) { *url = RemapAboutURL(chrome::kGpuInternalsURL, *url); return true; } // Rewrite about:appcache-internals/* URLs to chrome://appcache/* if (StartsWithAboutSpecifier(*url, chrome::kAboutAppCacheInternalsURL)) { *url = RemapAboutURL(chrome::kAppCacheViewInternalsURL, *url); return true; } // Rewrite about:sync-internals/* URLs (and about:sync, too, for // legacy reasons) to chrome://sync-internals/* if (StartsWithAboutSpecifier(*url, chrome::kAboutSyncInternalsURL) || StartsWithAboutSpecifier(*url, chrome::kAboutSyncURL)) { *url = RemapAboutURL(chrome::kSyncViewInternalsURL, *url); return true; } // Rewrite about:plugins to chrome://plugins/. if (LowerCaseEqualsASCII(url->spec(), chrome::kAboutPluginsURL)) { *url = GURL(chrome::kChromeUIPluginsURL); return true; } // Handle URL to crash the browser process. if (LowerCaseEqualsASCII(url->spec(), chrome::kAboutBrowserCrash)) { // Induce an intentional crash in the browser process. int* bad_pointer = NULL; *bad_pointer = 42; return true; } // Handle URLs to wreck the gpu process. GpuProcessHostUIShim* gpu_ui_shim = GpuProcessHostUIShim::GetForRenderer(0); if (gpu_ui_shim) { if (LowerCaseEqualsASCII(url->spec(), chrome::kAboutGpuCrashURL)) { gpu_ui_shim->SendAboutGpuCrash(); return true; } if (LowerCaseEqualsASCII(url->spec(), chrome::kAboutGpuHangURL)) { gpu_ui_shim->SendAboutGpuHang(); return true; } } // There are a few about: URLs that we hand over to the renderer. If the // renderer wants them, don't do any rewriting. if (chrome_about_handler::WillHandle(*url)) return false; // Anything else requires our special handler; make sure it's initialized. InitializeAboutDataSource(profile); // Special case about:memory to go through a redirect before ending up on // the final page. See GetAboutMemoryRedirectResponse above for why. if (LowerCaseEqualsASCII(url->path(), kMemoryPath)) { *url = GURL("chrome://about/memory-redirect"); return true; } // Rewrite the about URL to use chrome:. WebKit treats all about URLS the // same (blank page), so if we want to display content, we need another // scheme. std::string about_url = "chrome://about/"; about_url.append(url->path()); *url = GURL(about_url); return true; }

这些about scheme的定义在D:/project/chrome/src/src/chrome/common/url_constants.cc :
url_constants.cc const char kAboutScheme[] = "about"; const char kBlobScheme[] = "blob"; const char kChromeDevToolsScheme[] = "chrome-devtools"; const char kChromeInternalScheme[] = "chrome-internal"; const char kChromeUIScheme[] = "chrome"; const char kDataScheme[] = "data"; const char kExtensionScheme[] = "chrome-extension"; const char kFileScheme[] = "file"; const char kFileSystemScheme[] = "filesystem"; const char kFtpScheme[] = "ftp"; const char kHttpScheme[] = "http"; const char kHttpsScheme[] = "https"; const char kJavaScriptScheme[] = "javascript"; const char kMailToScheme[] = "mailto"; const char kMetadataScheme[] = "metadata"; const char kUserScriptScheme[] = "chrome-user-script"; const char kViewSourceScheme[] = "view-source"; #if defined(OS_CHROMEOS) const char kCrosScheme[] = "cros"; #endif const char kStandardSchemeSeparator[] = "://"; const char* kSavableSchemes[] = { kHttpScheme, kHttpsScheme, kFileScheme, kFtpScheme, kExtensionScheme, kChromeDevToolsScheme, kChromeUIScheme, NULL }; const char kAboutAboutURL[] = "about:about"; const char kAboutAppCacheInternalsURL[] = "about:appcache-internals"; const char kAboutBlankURL[] = "about:blank"; const char kAboutCacheURL[] = "about:cache"; const char kAboutConflicts[] = "about:conflicts"; const char kAboutCrashURL[] = "about:crash"; const char kAboutKillURL[] = "about:kill"; const char kAboutCreditsURL[] = "about:credits"; const char kAboutDNSURL[] = "about:dns"; const char kAboutFlagsURL[] = "about:flags"; const char kAboutGpuURL[] = "about:gpu"; const char kAboutGpuCrashURL[] = "about:gpucrash"; const char kAboutGpuHangURL[] = "about:gpuhang"; const char kAboutHangURL[] = "about:hang"; const char kAboutHistogramsURL[] = "about:histograms"; const char kAboutMemoryURL[] = "about:memory"; const char kAboutNetInternalsURL[] = "about:net-internals"; const char kAboutPluginsURL[] = "about:plugins"; const char kAboutShorthangURL[] = "about:shorthang"; const char kAboutSyncURL[] = "about:sync"; const char kAboutSyncInternalsURL[] = "about:sync-internals"; const char kAboutTermsURL[] = "about:terms"; const char kAboutVersionURL[] = "about:version"; // Use an obfuscated URL to make this nondiscoverable, we only want this // to be used for testing. const char kAboutBrowserCrash[] = "about:inducebrowsercrashforrealz"; const char kChromeUIAboutAboutURL[] = "chrome://about/about"; const char kChromeUIAboutCreditsURL[] = "chrome://about/credits"; const char kChromeUIAboutURL[] = "chrome://settings/about"; const char kChromeUIAppLauncherURL[] = "chrome://newtab/#mode=app-launcher"; const char kChromeUIBookmarksURL[] = "chrome://bookmarks/"; const char kChromeUIBugReportURL[] = "chrome://bugreport/"; const char kChromeUIConflictsURL[] = "chrome://conflicts/"; const char kChromeUIConstrainedHTMLTestURL[] = "chrome://constrained-test/"; const char kChromeUICrashesURL[] = "chrome://crashes/"; const char kChromeUIDevToolsURL[] = "chrome-devtools://devtools/"; const char kChromeUIDownloadsURL[] = "chrome://downloads/"; const char kChromeUIExtensionIconURL[] = "chrome://extension-icon/"; const char kChromeUIExtensionsURL[] = "chrome://extensions/"; const char kChromeUIFavIconURL[] = "chrome://favicon/"; const char kChromeUIFlagsURL[] = "chrome://flags/"; const char kChromeUIHistory2URL[] = "chrome://history2/"; const char kChromeUIHistoryURL[] = "chrome://history/"; const char kChromeUIIPCURL[] = "chrome://about/ipc"; const char kChromeUIKeyboardURL[] = "chrome://keyboard/"; const char kChromeUINewTabURL[] = "chrome://newtab"; const char kChromeUIPluginsURL[] = "chrome://plugins/"; const char kChromeUIPrintURL[] = "chrome://print/"; const char kChromeUISettingsURL[] = "chrome://settings/"; const char kChromeUITextfieldsURL[] = "chrome://textfields/"; #if defined(OS_CHROMEOS) const char kChromeUIAboutOSCreditsURL[] = "chrome://about/os-credits"; const char kChromeUIActivationMessage[] = "chrome://activationmessage/"; const char kChromeUIFileBrowseURL[] = "chrome://filebrowse/"; const char kChromeUICollectedCookiesURL[] = "chrome://collected-cookies/"; const char kChromeUIImageBurnerURL[] = "chrome://imageburner/"; const char kChromeUIKeyboardOverlayURL[] = "chrome://keyboardoverlay/"; const char kChromeUIMediaplayerURL[] = "chrome://mediaplayer/"; const char kChromeUIMobileSetupURL[] = "chrome://mobilesetup/"; const char kChromeUIRegisterPageURL[] = "chrome://register/"; const char kChromeUISlideshowURL[] = "chrome://slideshow/"; const char kChromeUISystemInfoURL[] = "chrome://system/"; const char kChromeUIUserImageURL[] = "chrome://userimage/"; #endif // Keep this list sorted please. const char kChromeUIBookmarksHost[] = "bookmarks"; const char kChromeUIBugReportHost[] = "bugreport"; const char kChromeUIConflictsHost[] = "conflicts"; const char kChromeUICrashesHost[] = "crashes"; const char kChromeUIDevToolsHost[] = "devtools"; const char kChromeUIDialogHost[] = "dialog"; const char kChromeUIDownloadsHost[] = "downloads"; const char kChromeUIExtensionIconHost[] = "extension-icon"; const char kChromeUIExtensionsHost[] = "extensions"; const char kChromeUIFavIconHost[] = "favicon"; const char kChromeUIFlagsHost[] = "flags"; const char kChromeUIGpuInternalsHost[] = "gpu-internals"; const char kChromeUIHistoryHost[] = "history"; const char kChromeUIHistory2Host[] = "history2"; const char kChromeUIInspectorHost[] = "inspector"; const char kChromeUIKeyboardHost[] = "keyboard"; const char kChromeUINetInternalsHost[] = "net-internals"; const char kChromeUINewTabHost[] = "newtab"; const char kChromeUIPluginsHost[] = "plugins"; const char kChromeUIPrintHost[] = "print"; const char kChromeUIRemotingHost[] = "remoting"; const char kChromeUIRemotingResourcesHost[] = "remotingresources"; const char kChromeUIResourcesHost[] = "resources"; const char kChromeUIScreenshotPath[] = "screenshots"; const char kChromeUISettingsHost[] = "settings"; const char kChromeUISyncInternalsHost[] = "sync-internals"; const char kChromeUISyncResourcesHost[] = "syncresources"; const char kChromeUITextfieldsHost[] = "textfields"; const char kChromeUIThemePath[] = "theme"; const char kChromeUIThumbnailPath[] = "thumb"; #if defined(OS_CHROMEOS) const char kChromeUIActivationMessageHost[] = "activationmessage"; const char kChromeUICollectedCookiesHost[] = "collected-cookies"; const char kChromeUIFileBrowseHost[] = "filebrowse"; const char kChromeUIImageBurnerHost[] = "imageburner"; const char kChromeUIKeyboardOverlayHost[] = "keyboardoverlay"; const char kChromeUIMediaplayerHost[] = "mediaplayer"; const char kChromeUIMobileSetupHost[] = "mobilesetup"; const char kChromeUIRegisterPageHost[] = "register"; const char kChromeUISlideshowHost[] = "slideshow"; const char kChromeUISystemInfoHost[] = "system"; const char kChromeUIMenu[] = "menu"; const char kChromeUIWrenchMenu[] = "wrench-menu"; const char kChromeUINetworkMenu[] = "network-menu"; const char kChromeUIUserImageHost[] = "userimage"; #endif #if defined(OS_CHROMEOS) && defined(TOUCH_UI) const char kChromeUILoginContainerHost[] = "login-container"; const char kChromeUILoginHost[] = "login"; #endif const char kUnreachableWebDataURL[] = "chrome://chromewebdata/"; const char kAppCacheViewInternalsURL[] = "chrome://appcache-internals/"; const char kBlobViewInternalsURL[] = "chrome://blob-internals/"; const char kCloudPrintResourcesURL[] = "chrome://cloudprintresources/"; const char kCloudPrintResourcesHost[] = "cloudprintresources"; const char kCloudPrintSetupHost[] = "cloudprintsetup"; const char kNetworkViewInternalsURL[] = "chrome://net-internals/"; const char kNetworkViewCacheURL[] = "chrome://view-http-cache/"; const char kSyncViewInternalsURL[] = "chrome://sync-internals/"; // GPU sub pages const char kGpuInternalsURL[] = "chrome://gpu-internals/"; // Option sub pages. const char kAdvancedOptionsSubPage[] = "advanced"; const char kAutoFillSubPage[] = "autofill"; const char kBrowserOptionsSubPage[] = "browser"; const char kClearBrowserDataSubPage[] = "clearBrowserData"; const char kContentSettingsSubPage[] = "content"; const char kContentSettingsExceptionsSubPage[] = "contentExceptions"; const char kDefaultOptionsSubPage[] = ""; const char kImportDataSubPage[] = "importData"; const char kInstantConfirmPage[] = "instantConfirm"; const char kLanguageOptionsSubPage[] = "languages"; const char kPersonalOptionsSubPage[] = "personal"; const char kPasswordManagerSubPage[] = "passwords"; const char kSearchEnginesSubPage[] = "searchEngines"; #if defined(OS_CHROMEOS) const char kInternetOptionsSubPage[] = "internet"; const char kSystemOptionsSubPage[] = "system"; #endif const char kChromeHelpURL[] = #if defined(OS_CHROMEOS) "http://www.google.com/support/chromeos/"; #else "http://www.google.com/support/chrome/"; #endif const char kPageInfoHelpCenterURL[] = #if defined(OS_CHROMEOS) "http://www.google.com/support/chromeos/bin/answer.py?answer=95617"; #else "http://www.google.com/support/chrome/bin/answer.py?answer=95617"; #endif const char kCrashReasonURL[] = #if defined(OS_CHROMEOS) "http://www.google.com/support/chromeos/bin/answer.py?answer=1047340"; #else "http://www.google.com/support/chrome/bin/answer.py?answer=95669"; #endif // TODO: These are currently placeholders that point to the crash // docs. See bug http://crosbug.com/10711 const char kKillReasonURL[] = #if defined(OS_CHROMEOS) "http://www.google.com/support/chromeos/bin/answer.py?answer=1047340"; #else "http://www.google.com/support/chrome/bin/answer.py?answer=95669"; #endif const char kPrivacyLearnMoreURL[] = #if defined(OS_CHROMEOS) "http://www.google.com/support/chromeos/bin/answer.py?answer=1047334"; #else "http://www.google.com/support/chrome/bin/answer.py?answer=114836"; #endif const char kChromiumProjectURL[] = "http://code.google.com/chromium/"; const char kLearnMoreReportingURL[] = "http://www.google.com/support/chrome/bin/answer.py?answer=96817"; const char kOutdatedPluginLearnMoreURL[] = "http://www.google.com/support/chrome/bin/answer.py?answer=1181003";