chrome里面的about Scheme

本文解析了 Chrome 浏览器中关于 about Schemes 的处理方式及支持的 about URL 列表。详细介绍了如何通过特定的 about URL 访问浏览器内部信息及调试工具。

对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:about可以看到所有支持的about Scheme。 about:net-internals, about:tcmalloc, about:gpu 可以了解很多chrome的细节。
image

这些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";

PS D:\code\src> autoninja -C .\out\Default chrome ninja: Entering directory `.\out\Default' [0/1] Regenerating ninja filesERROR at //third_party/node/node.gni:9:3: Dependency not allowed. action(target_name) { ^-------------------- The item //chrome/browser/resources/new_tab_page_xiaozhi:build_ts can not depend on //third_party/lit/v3_0:build_ts because it is not in //third_party/lit/v3_0:build_ts's visibility list: [ //third_party/lit/v3_0:build_bundle //chrome/browser/resources/about_sys:build_ts //chrome/browser/resources/app_home:build_ts //chrome/browser/resources/app_settings:build_ts //chrome/browser/resources/bookmarks:build_ts //chrome/browser/resources/browser_switch:build_ts //chrome/browser/resources/certificate_viewer:build_ts //chrome/browser/resources/commerce/product_specifications:build_ts //chrome/browser/resources/components:build_ts //chrome/browser/resources/discards:build_ts //chrome/browser/resources/downloads:build_ts //chrome/browser/resources/extensions:build_ts //chrome/browser/resources/family_link_user_internals:build_ts //chrome/browser/resources/feedback:build_ts //chrome/browser/resources/history:build_ts //chrome/browser/resources/intro:build_ts //chrome/browser/resources/key_value_pair_viewer_shared:build_ts //chrome/browser/resources/lens/overlay:build_ts //chrome/browser/resources/management:build_ts //chrome/browser/resources/media_router/cast_feedback:build_ts //chrome/browser/resources/new_tab_footer:build_ts //chrome/browser/resources/new_tab_page:build_ts //chrome/browser/resources/omnibox_popup:build_ts //chrome/browser/resources/on_device_internals:build_ts //chrome/browser/resources/on_device_translation_internals:build_ts //chrome/browser/resources/pdf:build_ts //chrome/browser/resources/print_preview:build_ts //chrome/browser/resources/privacy_sandbox:build_ts //chrome/browser/resources/privacy_sandbox/internals/private_state_tokens:build_ts //chrome/browser/resources/privacy_sandbox/internals/related_website_sets:build_ts //chrome/browser/resources/profile_internals:build_ts //chrome/browser/resources/search_engine_choice:build_ts //chrome/browser/resources/settings:build_ts //chrome/browser/resources/side_panel/bookmarks:build_ts //chrome/browser/resources/side_panel/customize_chrome:build_ts //chrome/browser/resources/side_panel/history:build_ts //chrome/browser/resources/side_panel/history_clusters:build_ts //chrome/browser/resources/side_panel/read_anything:build_ts //chrome/browser/resources/side_panel/reading_list:build_ts //chrome/browser/resources/side_panel/shared:build_ts //chrome/browser/resources/signin:build_ts //chrome/browser/resources/signin/batch_upload:build_ts //chrome/browser/resources/signin/history_sync_optin:build_ts //chrome/browser/resources/signin/profile_picker:build_ts //chrome/browser/resources/signin/signout_confirmation:build_ts //chrome/browser/resources/suggest_internals:build_ts //chrome/browser/resources/tab_search:build_ts //chrome/browser/resources/user_education_internals:build_ts //chrome/browser/resources/webui_gallery:build_ts //chrome/browser/resources/whats_new:build_ts //chrome/test/data/pdf:build_ts //chrome/test/data/webui/app_home:build_ts //chrome/test/data/webui/app_settings:build_ts //chrome/test/data/webui/bookmarks:build_ts //chrome/test/data/webui/commerce/product_specifications:build_ts //chrome/test/data/webui/cr_components:build_ts //chrome/test/data/webui/cr_components/cr_shortcut_input:build_ts //chrome/test/data/webui/cr_components/custom_help_bubble:build_ts //chrome/test/data/webui/cr_components/help_bubble:build_ts //chrome/test/data/webui/cr_components/history_clusters:build_ts //chrome/test/data/webui/cr_elements:build_ts //chrome/test/data/webui/extensions:build_ts //chrome/test/data/webui/history:build_ts //chrome/test/data/webui/print_preview:build_ts //chrome/test/data/webui/privacy_sandbox/internals/private_state_tokens:build_ts //chrome/test/data/webui/privacy_sandbox/internals/related_website_sets:build_ts //chrome/test/data/webui/signin:build_ts //chrome/test/data/webui/signin/signout_confirmation:build_ts //chrome/test/data/webui/tab_search:build_ts //components/commerce/core/internals/resources:build_ts //components/download/resources/download_internals:build_ts //components/neterror/resources:build_ts //components/ntp_tiles/webui/resources:build_ts //components/signin/core/browser/resources:build_ts //components/sync/service/resources:build_ts //components/webui/chrome_urls/resources:build_ts //components/webui/flags/resources:build_ts //content/browser/resources/indexed_db:build_ts //content/browser/resources/service_worker:build_ts //content/browser/resources/traces_internals:build_ts //ios/chrome/app/resources/profile_internals:build_ts //ui/webui/resources/cr_components/certificate_manager:build_ts //ui/webui/resources/cr_components/cr_shortcut_input:build_ts //ui/webui/resources/cr_components/customize_color_scheme_mode:build_ts //ui/webui/resources/cr_components/help_bubble:build_ts //ui/webui/resources/cr_components/history_clusters:build_ts //ui/webui/resources/cr_components/history_embeddings:build_ts //ui/webui/resources/cr_components/localized_link:build_ts //ui/webui/resources/cr_components/managed_dialog:build_ts //ui/webui/resources/cr_components/managed_footnote:build_ts //ui/webui/resources/cr_components/most_visited:build_ts //ui/webui/resources/cr_components/theme_color_picker:build_ts //ui/webui/resources/cr_elements:build_ts ] ninja: error: rebuilding 'build.ninja': subcommand failed FAILED: build.ninja.stamp ../../buildtools/win/gn.exe --root=../.. -q --regeneration gen .
07-23
X64 40 0 2214 115 Copyright 2011 Google Inc Google Chrome是由Google开发的一款设计简单 高效的Web浏览工具   原版 正式版 右键 属性 验证数字签名完整      下载Chrome企业和教育版 MSI封装   Google Chrome的特点是简洁 快速 Google Chrome支持多标签浏览 每个标签页面都在独立的“沙箱”内运行 在提高安全性的同时 一个标签页面的崩溃也不会导致其他标签页面被关闭 此外 Google Chrome基于更强大的JavaScript V8引擎 这是当前Web浏览器所无法实现的   Google Chrome是一款基于开源软件 借鉴了苹果的WebKit Safari使用的引擎 Mozilla的Firefox及其他相关应用   主要特性:    Chrome浏览器基于开源的Webkit 其中包含谷歌Gears    Chrome提供了浏览器扩展框架 可以制作与Adobe AIR类似的混合应用    包含V8 Javascript虚拟机 这个多线程的虚拟机可以加速Javascript的执行    具备隐私模式 可以让用户无需在本地机器上登录即可使用 这个功能与微软IE8中的Incognito类似    浏览器将内置防止“网络钓鱼”及恶意软件功能   Google Chrome也有Mac和Linux版本 ">X64 40 0 2214 115 Copyright 2011 Google Inc Google Chrome是由Google开发的一款设计简单 高效的Web浏览工具   原版 正式版 右键 属性 验证数字签名完整      下载Chrome企业和教育版 MSI封装   Google Chrome的特点是简洁 [更多]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值