Creating Chromium WebUI Interfaces

前言

在68.0.3440.84上,准备加一个webui.
webui的意思是内建的url, 不是远程的url.

官方文档有2个:
https://chromium.googlesource.com/chromium/src/+/master/docs/webui_in_components.md
https://www.chromium.org/developers/webui
按照官方的说法,这2种方法都能加webui.
比较起来,第一种好些,可以将加入的实现文件归在一起,好维护。

先按照第一种方法做实验,不成功。对照报错信息看, 是ui_0.lib报错。说定义的实现类找不到,那明显是实现文件没编进工程引起的。或者新加入的实现,编译后的obj, 没包进ui_0.lib. 估计是编进components的obj, 不在ui_0.lib的引用中。但是实现文件的编译,都是靠Build.gn手工配出来的,第一次玩,也不可能深究工程配置。看官方文档说的就那么几步(说的好轻松),再找不到详细说法了,放弃第一种方法。

按照第二种方法做的时候,靠谱点。报错信息只是说定义的资源ID找不到。对照已有的webui实现,对照了一下。发现资源ID定义的地方和文档上描述的不同,还发现头文件没包。调整后,这种方法编译过了。输入内建url后,可以输出实验的本地web页面。

还有2个问题,还没有实验。等有时间时,继续实验.

  • 官方的内建url只能是chrome://xx, 如果换成my_url://xx, 不走新建webui的流程,要跟下,看看在哪跑掉的。
  • 官方文档,在内建url显示后,还可以用c++和js交互,还可以弹出新的web-ui. 时间不够了,等后续再做实验。
    git可以在本地提交,还挺好用的。
    用autoninjia编译工程, 配合Everything找文件蛮方便,等工程都编译过了,再进vs2017修改实现.

实验

新建 Z:\chromium\src\chrome\browser\resources\hello_world.html

<!DOCTYPE HTML>
<html i18n-values="dir:textdirection">
<head>
  <meta charset="utf-8">
  <title i18n-content="helloWorldTitle"></title>
  <link rel="stylesheet" href="hello_world.css">
  <script src="chrome://resources/js/cr.js"></script>
  <script src="chrome://resources/js/load_time_data.js"></script>
  <script src="chrome://resources/js/util.js"></script>
  <script src="strings.js"></script>
  <script src="hello_world.js"></script>
</head>
<body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
  <h1 i18n-content="helloWorldTitle"></h1>
  <p id="welcome-message"></p>
 <script src="chrome://resources/js/i18n_template.js"></script>
</body>
</html>

新建Z:\chromium\src\chrome\browser\resources\hello_world.css

p {
  white-space: pre-wrap;
}

新建Z:\chromium\src\chrome\browser\resources\hello_world.js

cr.define('hello_world', function() {
  'use strict';

  /**
   * Be polite and insert translated hello world strings for the user on loading.
   */
  function initialize() {
    $('welcome-message').textContent = loadTimeData.getStringF('welcomeMessage',
        loadTimeData.getString('userName'));
  }

  // Return an object with all of the exports.
  return {
    initialize: initialize,
  };
});

document.addEventListener('DOMContentLoaded', hello_world.initialize);

编辑Z:\chromium\src\chrome\browser\browser_resources.grd

加入resources\hello_world.*

<?xml version="1.0" encoding="UTF-8"?>
<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
  <outputs>
    <output filename="grit/browser_resources.h" type="rc_header">
      <emit emit_type='prepend'></emit>
    </output>
    <output filename="browser_resources.pak" type="data_package" />
  </outputs>
  <release seq="1">
    <structures>
      <if expr="chromeos">
        <structure name="IDR_FIRST_RUN_HTML" file="resources\chromeos\first_run\first_run.html" flattenhtml="true" type="chrome_html"/>
        <structure name="IDR_FIRST_RUN_JS" file="resources\chromeos\first_run\first_run.js" flattenhtml="true" type="chrome_html" />
      </if>
      <if expr="not is_android">
        <structure name="IDR_INCOGNITO_TAB_HTML" file="resources\ntp4\incognito_tab.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_GUEST_TAB_HTML" file="resources\ntp4\guest_tab.html" flattenhtml="true" type="chrome_html" />
      </if>
      <if expr="chromeos">
        <structure name="IDR_LOCK_HTML" file="resources\chromeos\login\lock.html" flattenhtml="true" type="chrome_html" variables="OOBE=lock" expand_variables="true"/>
        <structure name="IDR_LOCK_JS" file="resources\chromeos\login\lock.js" flattenhtml="true" type="chrome_html" variables="OOBE=lock" expand_variables="true" />
        <structure name="IDR_MD_LOCK_HTML" file="resources\chromeos\login\md_lock.html" flattenhtml="true" type="chrome_html" variables="OOBE=md_lock" expand_variables="true"/>
        <structure name="IDR_MD_LOCK_JS" file="resources\chromeos\login\md_lock.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_LOGIN_HTML" file="resources\chromeos\login\login.html" flattenhtml="true" type="chrome_html" variables="OOBE=login" expand_variables="true"/>
        <structure name="IDR_LOGIN_JS" file="resources\chromeos\login\login.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_MD_LOGIN_HTML" file="resources\chromeos\login\md_login.html" flattenhtml="true" type="chrome_html" variables="OOBE=md_login" expand_variables="true"/>
        <structure name="IDR_MD_LOGIN_JS" file="resources\chromeos\login\md_login.js" flattenhtml="true" type="chrome_html" />
      </if>
      <if expr="not is_android">
        <structure name="IDR_NEW_INCOGNITO_TAB_THEME_CSS" file="resources\ntp4\new_incognito_tab_theme.css" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_NEW_TAB_4_HTML" file="resources\ntp4\new_tab.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_NEW_TAB_4_THEME_CSS" file="resources\ntp4\new_tab_theme.css" flattenhtml="true" type="chrome_html" />
      </if>
      <if expr="chromeos">
        <structure name="IDR_OOBE_HTML" file="resources\chromeos\login\oobe.html" flattenhtml="true" type="chrome_html" variables="OOBE=oobe" expand_variables="true"/>
        <structure name="IDR_OOBE_JS" file="resources\chromeos\login\oobe.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_OOBE_ENROLLMENT_HTML" file="resources\chromeos\login\oobe_screen_oauth_enrollment.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_OOBE_ENROLLMENT_CSS" file="resources\chromeos\login\oobe_screen_oauth_enrollment.css" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_OOBE_ENROLLMENT_JS" file="resources\chromeos\login\oobe_screen_oauth_enrollment.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_KEYBOARD_UTILS_JS" file="resources\chromeos\keyboard\keyboard_utils.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_OOBE_HTML" file="resources\chromeos\login\custom_elements_oobe.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_OOBE_JS" file="resources\chromeos\login\custom_elements_oobe.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_LOCK_HTML" file="resources\chromeos\login\custom_elements_lock.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_LOCK_JS" file="resources\chromeos\login\custom_elements_lock.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_USER_POD_HTML" file="resources\chromeos\login\custom_elements_user_pod.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_HTML" file="resources\chromeos\login\custom_elements_login.html" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_JS" file="resources\chromeos\login\custom_elements_login.js" flattenhtml="true" type="chrome_html" />
        <structure name="IDR_ASSISTANT_OPTIN_HTML" file="resources\chromeos\assistant_optin\assistant_optin.html" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
        <structure name="IDR_ASSISTANT_OPTIN_JS" file="resources\chromeos\assistant_optin\assistant_optin.js" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
      </if>
      <structure name="IDR_SIGNIN_SHARED_CSS_HTML" file="resources\signin\signin_shared_css.html" preprocess="true" allowexternalscript="true" type="chrome_html" />
      <if expr="not is_android and not chromeos">
        <structure name="IDR_WELCOME_CSS" file="resources\welcome\welcome.css" type="chrome_html" preprocess="true"/>
        <structure name="IDR_WELCOME_HTML" file="resources\welcome\welcome.html" type="chrome_html" preprocess="true"/>
        <structure name="IDR_WELCOME_JS" file="resources\welcome\welcome.js" type="chrome_html" preprocess="true"/>
        <structure name="IDR_DICE_WELCOME_CSS" file="resources\welcome\dice_welcome\welcome.css" type="chrome_html" preprocess="true"/>
        <structure name="IDR_DICE_WELCOME_HTML" file="resources\welcome\dice_welcome\welcome.html" type="chrome_html" preprocess="true"/>
        <structure name="IDR_DICE_WELCOME_BROWSER_PROXY_HTML" file="resources\welcome\dice_welcome\welcome_browser_proxy.html" type="chrome_html" preprocess="true"/>
        <structure name="IDR_DICE_WELCOME_BROWSER_PROXY_JS" file="resources\welcome\dice_welcome\welcome_browser_proxy.js" type="chrome_html" preprocess="true"/>
        <structure name="IDR_DICE_WELCOME_APP_HTML" file="resources\welcome\dice_welcome\welcome_app.html" type="chrome_html" preprocess="true"/>
        <structure name="IDR_DICE_WELCOME_APP_JS" file="resources\welcome\dice_welcome\welcome_app.js" type="chrome_html" preprocess="true"/>
      </if>
      <if expr="is_win">
        <structure name="IDR_WELCOME_WIN10_CSS" file="resources\welcome\welcome_win10.css" type="chrome_html" />
        <structure name="IDR_WELCOME_WIN10_HTML" file="resources\welcome\welcome_win10.html" type="chrome_html" />
        <structure name="IDR_WELCOME_WIN10_JS" file="resources\welcome\welcome_win10.js" type="chrome_html" />
      </if>
    </structures>
    <includes>
      <include name="IDR_HELLO_WORLD_HTML" file="resources\hello_world.html" type="BINDATA" />
      <include name="IDR_HELLO_WORLD_CSS" file="resources\hello_world.css" type="BINDATA" />
      <include name="IDR_HELLO_WORLD_JS" file="resources\hello_world.js" type="BINDATA" />
...

编辑Z:\chromium\src\chrome\common\webui_url_constants.h

这步和官方文档不一样了, 我比对其他web-ui找出来的。
也不确定,这里不一样会不会编译不过。因为中间出现了许多次错误,如果要验证,等将前置实验都做完了,做正式实验时,才能确定这里是不是可以按照官方文档来。

// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Contains constants for WebUI UI/Host/SubPage constants. Anything else go in
// chrome/common/url_constants.h.

#ifndef CHROME_COMMON_WEBUI_URL_CONSTANTS_H_
#define CHROME_COMMON_WEBUI_URL_CONSTANTS_H_

#include <stddef.h>

#include "build/build_config.h"
#include "chrome/common/buildflags.h"
#include "content/public/common/url_constants.h"
#include "media/media_buildflags.h"
#include "printing/buildflags/buildflags.h"

namespace chrome {

// chrome: components (without schemes) and URLs (including schemes).
// e.g. kChromeUIFooHost = "foo" and kChromeUIFooURL = "chrome://foo/"
// Not all components have corresponding URLs and vice versa. Only add as
// needed.
// Please keep in alphabetical order, with OS/feature specific sections below.

extern const char kChromeUIHelloWorldURL[];
extern const char kChromeUIHelloWorldHost[];
...

编辑Z:\chromium\src\chrome\common\webui_url_constants.cc

这步和官方文档不一样了, 我比对其他web-ui找出来的。

// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/common/webui_url_constants.h"

#include "base/macros.h"
#include "components/nacl/common/buildflags.h"
#include "components/safe_browsing/web_ui/constants.h"
#include "extensions/buildflags/buildflags.h"

namespace chrome {

// Please keep this file in the same order as the header.

// Note: Add hosts to |kChromePaths| in browser_about_handler.cc to be listed by
// chrome://chrome-urls (about:about) and the built-in AutocompleteProvider.

	const char kChromeUIHelloWorldURL[] = "chrome://my_page/";
	const char kChromeUIHelloWorldHost[] = "my_page";

const char kChromeUIAboutHost[] = "about";
...

编辑Z:\chromium\src\chrome\app\generated_resources.grd

<?xml version="1.0" encoding="utf-8"?>

<!--
This file contains definitions of resources that will be translated for each
locale.  The variables is_win, is_macosx, is_linux, and is_posix are available
for making strings OS specific.  Other platform defines such as use_titlecase
are declared in build/common.gypi.
-->

<grit base_dir="." latest_public_release="0" current_release="1"
      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
  <outputs>
    <output filename="grit/generated_resources.h" type="rc_header">
      <emit emit_type='prepend'></emit>
    </output>
    <output filename="generated_resources_am.pak" type="data_package" lang="am" />
    <output filename="generated_resources_ar.pak" type="data_package" lang="ar" />
    <output filename="generated_resources_bg.pak" type="data_package" lang="bg" />
    <output filename="generated_resources_bn.pak" type="data_package" lang="bn" />
    <output filename="generated_resources_ca.pak" type="data_package" lang="ca" />
    <output filename="generated_resources_cs.pak" type="data_package" lang="cs" />
    <output filename="generated_resources_da.pak" type="data_package" lang="da" />
    <output filename="generated_resources_de.pak" type="data_package" lang="de" />
    <output filename="generated_resources_el.pak" type="data_package" lang="el" />
    <output filename="generated_resources_en-GB.pak" type="data_package" lang="en-GB" />
    <output filename="generated_resources_en-US.pak" type="data_package" lang="en" />
    <output filename="generated_resources_es.pak" type="data_package" lang="es" />
    <output filename="generated_resources_es-419.pak" type="data_package" lang="es-419" />
    <output filename="generated_resources_et.pak" type="data_package" lang="et" />
    <output filename="generated_resources_fa.pak" type="data_package" lang="fa" />
    <output filename="generated_resources_fake-bidi.pak" type="data_package" lang="fake-bidi" />
    <output filename="generated_resources_fi.pak" type="data_package" lang="fi" />
    <output filename="generated_resources_fil.pak" type="data_package" lang="fil" />
    <output filename="generated_resources_fr.pak" type="data_package" lang="fr" />
    <output filename="generated_resources_gu.pak" type="data_package" lang="gu" />
    <output filename="generated_resources_he.pak" type="data_package" lang="he" />
    <output filename="generated_resources_hi.pak" type="data_package" lang="hi" />
    <output filename="generated_resources_hr.pak" type="data_package" lang="hr" />
    <output filename="generated_resources_hu.pak" type="data_package" lang="hu" />
    <output filename="generated_resources_id.pak" type="data_package" lang="id" />
    <output filename="generated_resources_it.pak" type="data_package" lang="it" />
    <output filename="generated_resources_ja.pak" type="data_package" lang="ja" />
    <output filename="generated_resources_kn.pak" type="data_package" lang="kn" />
    <output filename="generated_resources_ko.pak" type="data_package" lang="ko" />
    <output filename="generated_resources_lt.pak" type="data_package" lang="lt" />
    <output filename="generated_resources_lv.pak" type="data_package" lang="lv" />
    <output filename="generated_resources_ml.pak" type="data_package" lang="ml" />
    <output filename="generated_resources_mr.pak" type="data_package" lang="mr" />
    <output filename="generated_resources_ms.pak" type="data_package" lang="ms" />
    <output filename="generated_resources_nl.pak" type="data_package" lang="nl" />
    <!-- The translation console uses 'no' for Norwegian Bokmål. It should
         be 'nb'. -->
    <output filename="generated_resources_nb.pak" type="data_package" lang="no" />
    <output filename="generated_resources_pl.pak" type="data_package" lang="pl" />
    <output filename="generated_resources_pt-BR.pak" type="data_package" lang="pt-BR" />
    <output filename="generated_resources_pt-PT.pak" type="data_package" lang="pt-PT" />
    <output filename="generated_resources_ro.pak" type="data_package" lang="ro" />
    <output filename="generated_resources_ru.pak" type="data_package" lang="ru" />
    <output filename="generated_resources_sk.pak" type="data_package" lang="sk" />
    <output filename="generated_resources_sl.pak" type="data_package" lang="sl" />
    <output filename="generated_resources_sr.pak" type="data_package" lang="sr" />
    <output filename="generated_resources_sv.pak" type="data_package" lang="sv" />
    <output filename="generated_resources_sw.pak" type="data_package" lang="sw" />
    <output filename="generated_resources_ta.pak" type="data_package" lang="ta" />
    <output filename="generated_resources_te.pak" type="data_package" lang="te" />
    <output filename="generated_resources_th.pak" type="data_package" lang="th" />
    <output filename="generated_resources_tr.pak" type="data_package" lang="tr" />
    <output filename="generated_resources_uk.pak" type="data_package" lang="uk" />
    <output filename="generated_resources_vi.pak" type="data_package" lang="vi" />
    <output filename="generated_resources_zh-CN.pak" type="data_package" lang="zh-CN" />
    <output filename="generated_resources_zh-TW.pak" type="data_package" lang="zh-TW" />

    <!-- On Android, output some strings into Android's xml string format.
         These strings are tagged with formatter_data="android_java" -->
    <if expr="is_android">
      <output filename="java/res/values-am/generated_resources.xml" lang="am" type="android" context="android_java" />
      <output filename="java/res/values-ar/generated_resources.xml" lang="ar" type="android" context="android_java" />
      <output filename="java/res/values-bg/generated_resources.xml" lang="bg" type="android" context="android_java" />
      <output filename="java/res/values-ca/generated_resources.xml" lang="ca" type="android" context="android_java" />
      <output filename="java/res/values-cs/generated_resources.xml" lang="cs" type="android" context="android_java" />
      <output filename="java/res/values-da/generated_resources.xml" lang="da" type="android" context="android_java" />
      <output filename="java/res/values-de/generated_resources.xml" lang="de" type="android" context="android_java" />
      <output filename="java/res/values-el/generated_resources.xml" lang="el" type="android" context="android_java" />
      <output filename="java/res/values/generated_resources.xml" lang="en" type="android" context="android_java" />
      <output filename="java/res/values-en-rGB/generated_resources.xml" lang="en-GB" type="android" context="android_java" />
      <output filename="java/res/values-es/generated_resources.xml" lang="es" type="android" context="android_java" />
      <output filename="java/res/values-es-rUS/generated_resources.xml" lang="es-419" type="android" context="android_java" />
      <output filename="java/res/values-fa/generated_resources.xml" lang="fa" type="android" context="android_java" />
      <output filename="java/res/values-fi/generated_resources.xml" lang="fi" type="android" context="android_java" />
      <output filename="java/res/values-tl/generated_resources.xml" lang="fil" type="android" context="android_java" />
      <output filename="java/res/values-fr/generated_resources.xml" lang="fr" type="android" context="android_java" />
      <output filename="java/res/values-hi/generated_resources.xml" lang="hi" type="android" context="android_java" />
      <output filename="java/res/values-hr/generated_resources.xml" lang="hr" type="android" context="android_java" />
      <output filename="java/res/values-hu/generated_resources.xml" lang="hu" type="android" context="android_java" />
      <output filename="java/res/values-in/generated_resources.xml" lang="id" type="android" context="android_java" />
      <output filename="java/res/values-it/generated_resources.xml" lang="it" type="android" context="android_java" />
      <output filename="java/res/values-iw/generated_resources.xml" lang="he" type="android" context="android_java" />
      <output filename="java/res/values-ja/generated_resources.xml" lang="ja" type="android" context="android_java" />
      <output filename="java/res/values-ko/generated_resources.xml" lang="ko" type="android" context="android_java" />
      <output filename="java/res/values-lt/generated_resources.xml" lang="lt" type="android" context="android_java" />
      <output filename="java/res/values-lv/generated_resources.xml" lang="lv" type="android" context="android_java" />
      <output filename="java/res/values-nl/generated_resources.xml" lang="nl" type="android" context="android_java" />
      <output filename="java/res/values-nb/generated_resources.xml" lang="no" type="android" context="android_java" />
      <output filename="java/res/values-pl/generated_resources.xml" lang="pl" type="android" context="android_java" />
      <output filename="java/res/values-pt-rBR/generated_resources.xml" lang="pt-BR" type="android" context="android_java" />
      <output filename="java/res/values-pt-rPT/generated_resources.xml" lang="pt-PT" type="android" context="android_java" />
      <output filename="java/res/values-ro/generated_resources.xml" lang="ro" type="android" context="android_java" />
      <output filename="java/res/values-ru/generated_resources.xml" lang="ru" type="android" context="android_java" />
      <output filename="java/res/values-sk/generated_resources.xml" lang="sk" type="android" context="android_java" />
      <output filename="java/res/values-sl/generated_resources.xml" lang="sl" type="android" context="android_java" />
      <output filename="java/res/values-sr/generated_resources.xml" lang="sr" type="android" context="android_java" />
      <output filename="java/res/values-sv/generated_resources.xml" lang="sv" type="android" context="android_java" />
      <output filename="java/res/values-sw/generated_resources.xml" lang="sw" type="android" context="android_java" />
      <output filename="java/res/values-th/generated_resources.xml" lang="th" type="android" context="android_java" />
      <output filename="java/res/values-tr/generated_resources.xml" lang="tr" type="android" context="android_java" />
      <output filename="java/res/values-uk/generated_resources.xml" lang="uk" type="android" context="android_java" />
      <output filename="java/res/values-vi/generated_resources.xml" lang="vi" type="android" context="android_java" />
      <output filename="java/res/values-zh-rCN/generated_resources.xml" lang="zh-CN" type="android" context="android_java" />
      <output filename="java/res/values-zh-rTW/generated_resources.xml" lang="zh-TW" type="android" context="android_java" />
    </if>
  </outputs>
  <translations>
    <file path="resources/generated_resources_am.xtb" lang="am" />
    <file path="resources/generated_resources_ar.xtb" lang="ar" />
    <file path="resources/generated_resources_bg.xtb" lang="bg" />
    <file path="resources/generated_resources_bn.xtb" lang="bn" />
    <file path="resources/generated_resources_ca.xtb" lang="ca" />
    <file path="resources/generated_resources_cs.xtb" lang="cs" />
    <file path="resources/generated_resources_da.xtb" lang="da" />
    <file path="resources/generated_resources_de.xtb" lang="de" />
    <file path="resources/generated_resources_el.xtb" lang="el" />
    <file path="resources/generated_resources_en-GB.xtb" lang="en-GB" />
    <file path="resources/generated_resources_es.xtb" lang="es" />
    <file path="resources/generated_resources_es-419.xtb" lang="es-419" />
    <file path="resources/generated_resources_et.xtb" lang="et" />
    <file path="resources/generated_resources_fa.xtb" lang="fa" />
    <file path="resources/generated_resources_fi.xtb" lang="fi" />
    <file path="resources/generated_resources_fil.xtb" lang="fil" />
    <file path="resources/generated_resources_fr.xtb" lang="fr" />
    <file path="resources/generated_resources_gu.xtb" lang="gu" />
    <file path="resources/generated_resources_hi.xtb" lang="hi" />
    <file path="resources/generated_resources_hr.xtb" lang="hr" />
    <file path="resources/generated_resources_hu.xtb" lang="hu" />
    <file path="resources/generated_resources_id.xtb" lang="id" />
    <file path="resources/generated_resources_it.xtb" lang="it" />
    <!-- The translation console uses 'iw' for Hebrew, but we use 'he'. -->
    <file path="resources/generated_resources_iw.xtb" lang="he" />
    <file path="resources/generated_resources_ja.xtb" lang="ja" />
    <file path="resources/generated_resources_kn.xtb" lang="kn" />
    <file path="resources/generated_resources_ko.xtb" lang="ko" />
    <file path="resources/generated_resources_lt.xtb" lang="lt" />
    <file path="resources/generated_resources_lv.xtb" lang="lv" />
    <file path="resources/generated_resources_ml.xtb" lang="ml" />
    <file path="resources/generated_resources_mr.xtb" lang="mr" />
    <file path="resources/generated_resources_ms.xtb" lang="ms" />
    <file path="resources/generated_resources_nl.xtb" lang="nl" />
    <file path="resources/generated_resources_no.xtb" lang="no" />
    <file path="resources/generated_resources_pl.xtb" lang="pl" />
    <file path="resources/generated_resources_pt-BR.xtb" lang="pt-BR" />
    <file path="resources/generated_resources_pt-PT.xtb" lang="pt-PT" />
    <file path="resources/generated_resources_ro.xtb" lang="ro" />
    <file path="resources/generated_resources_ru.xtb" lang="ru" />
    <file path="resources/generated_resources_sk.xtb" lang="sk" />
    <file path="resources/generated_resources_sl.xtb" lang="sl" />
    <file path="resources/generated_resources_sr.xtb" lang="sr" />
    <file path="resources/generated_resources_sv.xtb" lang="sv" />
    <file path="resources/generated_resources_sw.xtb" lang="sw" />
    <file path="resources/generated_resources_ta.xtb" lang="ta" />
    <file path="resources/generated_resources_te.xtb" lang="te" />
    <file path="resources/generated_resources_th.xtb" lang="th" />
    <file path="resources/generated_resources_tr.xtb" lang="tr" />
    <file path="resources/generated_resources_uk.xtb" lang="uk" />
    <file path="resources/generated_resources_vi.xtb" lang="vi" />
    <file path="resources/generated_resources_zh-CN.xtb" lang="zh-CN" />
    <file path="resources/generated_resources_zh-TW.xtb" lang="zh-TW" />
  </translations>
  <release seq="1" allow_pseudo="false">
    <messages fallback_to_english="true">
      <!-- Bookmarks specific strings -->
      <part file="bookmarks_strings.grdp" />

      <!-- Chrome-OS-specific strings -->
      <if expr="chromeos">
        <part file="chromeos_strings.grdp" />
      </if>

      <!-- Media Router specific strings -->
      <part file="media_router_strings.grdp" />

      <!-- Settings specific strings -->
      <if expr="not is_android">
        <part file="settings_strings.grdp" />
      </if>

      <!-- MD Extensions specific strings -->
      <if expr="enable_extensions">
        <part file="md_extensions_strings.grdp" />
      </if>

      <!-- Printing specific strings -->
      <if expr="enable_printing">
        <part file="printing_strings.grdp" />
      </if>

      <!-- TODO add all of your "string table" messages here.  Remember to
      change nontranslateable parts of the messages into placeholders (using the
      <ph> element).  You can also use the 'grit add' tool to help you identify
      nontranslateable parts and create placeholders for them. -->
      <message name="IDS_HELLO_WORLD_TITLE" desc="A happy message saying hello to the world">
        Hello World!
      </message>
      <message name="IDS_HELLO_WORLD_WELCOME_TEXT" desc="Message welcoming the user to the hello world page">
        Welcome to this fancy Hello World page <ph name="WELCOME_NAME">$1<ex>Chromium User</ex></ph>!
      </message>
...

新建Z:\chromium\src\chrome\browser\ui\webui\hello_world_ui.h

// @file Z:\chromium\src\components\hello_world\hello_world_ui.h
#ifndef COMPONENTS_HELLO_WORLD_HELLO_WORLD_UI_H_
#define COMPONENTS_HELLO_WORLD_HELLO_WORLD_UI_H_
#pragma once

#include "base/macros.h"
#include "content/public/browser/web_ui_controller.h"

// The WebUI for chrome://hello-world
class HelloWorldUI : public content::WebUIController {
 public:
  explicit HelloWorldUI(content::WebUI* web_ui);
  ~HelloWorldUI() override;
 private:
  DISALLOW_COPY_AND_ASSIGN(HelloWorldUI);
};

#endif  // COMPONENTS_HELLO_WORLD_HELLO_WORLD_UI_H_

新建Z:\chromium\src\chrome\browser\ui\webui\hello_world_ui.cc

// @file Z:\chromium\src\chrome\browser\ui\webui\hello_world_ui.cc

// #include "chrome\grit\browser_resources.h"
// #include "chrome/browser/ui/webui/hello_world_ui.h"

// #include "components/grit/components_resources.h"

// #include "components/grit/components_scaled_resources.h"

// #include "chrome/common/webui_url_constants.h"

// #include "components/strings/grit/components_strings.h"

#include "content/public/browser/browser_context.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"

// ok
#include "chrome/browser/ui/webui/hello_world_ui.h"

#include "chrome/browser/profiles/profile.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/web_ui_data_source.h"

HelloWorldUI::HelloWorldUI(content::WebUI* web_ui)
    : content::WebUIController(web_ui) {
  // Set up the chrome://hello-world source.
  content::WebUIDataSource* html_source =
      content::WebUIDataSource::Create(chrome::kChromeUIHelloWorldHost);

  // Localized strings.
  html_source->AddLocalizedString("helloWorldTitle", IDS_HELLO_WORLD_TITLE);
  html_source->AddLocalizedString("welcomeMessage", IDS_HELLO_WORLD_WELCOME_TEXT);

  // As a demonstration of passing a variable for JS to use we pass in the name "Bob".
  html_source->AddString("userName", "Bob");
  html_source->SetJsonPath("strings.js");

  // Add required resources.
  html_source->AddResourcePath("hello_world.css", IDR_HELLO_WORLD_CSS);
  html_source->AddResourcePath("hello_world.js", IDR_HELLO_WORLD_JS);
  html_source->SetDefaultResource(IDR_HELLO_WORLD_HTML);

  content::BrowserContext* browser_context =
      web_ui->GetWebContents()->GetBrowserContext();
  content::WebUIDataSource::Add(browser_context, html_source);
}

HelloWorldUI::~HelloWorldUI() {
}

/*
HelloWorldUI::HelloWorldUI(content::WebUI* web_ui)
    : content::WebUIController(web_ui) {
  // Set up the chrome://hello-world source.
  content::WebUIDataSource* html_source =
      content::WebUIDataSource::Create(chrome::kChromeUIHelloWorldHost);

  // Localized strings.
  html_source->AddLocalizedString("helloWorldTitle", IDS_HELLO_WORLD_TITLE);
  html_source->AddLocalizedString("welcomeMessage", IDS_HELLO_WORLD_WELCOME_TEXT);

  // As a demonstration of passing a variable for JS to use we pass in the name "Bob".
  html_source->AddString("userName", "Bob");
  html_source->SetJsonPath("strings.js");

  // Add required resources.
  html_source->AddResourcePath("hello_world.css", IDR_HELLO_WORLD_CSS);
  html_source->AddResourcePath("hello_world.js", IDR_HELLO_WORLD_JS);
  html_source->SetDefaultResource(IDR_HELLO_WORLD_HTML);

  Profile* profile = Profile::FromWebUI(web_ui);
  content::WebUIDataSource::Add(profile, html_source);
}

HelloWorldUI::~HelloWorldUI() {
}
*/

编辑Z:\chromium\src\chrome\browser\ui\BUILD.gn

# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/config/chromecast_build.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/crypto.gni")
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//build/split_static_library.gni")
import("//chrome/common/features.gni")
import("//chromeos/assistant/assistant.gni")
import("//components/nacl/features.gni")
import("//components/offline_pages/buildflags/features.gni")
import("//components/signin/features.gni")
import("//extensions/buildflags/buildflags.gni")
import("//ppapi/buildflags/buildflags.gni")
import("//printing/buildflags/buildflags.gni")
import("//rlz/buildflags/buildflags.gni")
import("//ui/base/ui_features.gni")
import("//ui/views/features.gni")

config("ui_warnings") {
  if (is_clang) {
    # TODO(thakis): Remove this once http://crbug.com/383820 is figured out
    cflags = [ "-Wno-nonnull" ]
  }
}

# Use a static library here because many test binaries depend on this but don't
# require many files from it. This makes linking more efficient.
split_static_library("ui") {
  # Split into multiple static libraries on Windows builds. We have hit size
  # limits on Windows official builds and on goma builds when symbol_level = 2
  # is selected. Always splitting on Windows builds is simpler than trying to
  # perfectly calculate the scenarios where it is required.
  if (is_win) {
    split_count = 5
  } else {
    split_count = 1
  }

  # The cocoa browser (ie, primary ui) sources. These are in a separate
  # variable temporarily to ease the work on https://crbug.com/804950 and
  # https://crbug.com/802257.
  # TODO(ellyjones): Remove this variable once 804950 and 802257 are fixed.
  if (is_mac) {
    cocoa_browser_sources = [
      "cocoa/animatable_image.h",
      "cocoa/animatable_image.mm",
      "cocoa/animatable_view.h",
      "cocoa/animatable_view.mm",
      "cocoa/app_menu/app_menu_button_cell.h",
      "cocoa/app_menu/app_menu_button_cell.mm",
      "cocoa/app_menu/app_menu_controller.h",
      "cocoa/app_menu/app_menu_controller.mm",
      "cocoa/app_menu/menu_tracked_button.h",
      "cocoa/app_menu/menu_tracked_button.mm",
      "cocoa/app_menu/menu_tracked_root_view.h",
      "cocoa/app_menu/menu_tracked_root_view.mm",
      "cocoa/app_menu/recent_tabs_menu_model_delegate.h",
      "cocoa/app_menu/recent_tabs_menu_model_delegate.mm",
      "cocoa/apps/chrome_app_window_client_views_cocoa.mm",
      "cocoa/apps/native_app_window_cocoa.h",
      "cocoa/apps/native_app_window_cocoa.mm",
      "cocoa/autofill/autofill_bubble_controller.h",
      "cocoa/autofill/autofill_bubble_controller.mm",
      "cocoa/autofill/autofill_dialog_constants.h",
      "cocoa/autofill/autofill_popup_base_view_cocoa.h",
      "cocoa/autofill/autofill_popup_base_view_cocoa.mm",
      "cocoa/autofill/autofill_popup_view_bridge.h",
      "cocoa/autofill/autofill_popup_view_bridge.mm",
      "cocoa/autofill/autofill_popup_view_cocoa.h",
      "cocoa/autofill/autofill_popup_view_cocoa.mm",
      "cocoa/autofill/autofill_tooltip_controller.h",
      "cocoa/autofill/autofill_tooltip_controller.mm",
      "cocoa/autofill/credit_card_autofill_touch_bar_controller.h",
      "cocoa/autofill/credit_card_autofill_touch_bar_controller.mm",
      "cocoa/autofill/password_generation_popup_view_bridge.h",
      "cocoa/autofill/password_generation_popup_view_bridge.mm",
      "cocoa/autofill/password_generation_popup_view_cocoa.h",
      "cocoa/autofill/password_generation_popup_view_cocoa.mm",
      "cocoa/autofill/save_card_bubble_view_views.h",
      "cocoa/autofill/save_card_bubble_view_views.mm",
      "cocoa/background_gradient_view.h",
      "cocoa/background_gradient_view.mm",
      "cocoa/base_bubble_controller.h",
      "cocoa/base_bubble_controller.mm",
      "cocoa/bookmarks/bookmark_all_tabs_controller.h",
      "cocoa/bookmarks/bookmark_all_tabs_controller.mm",
      "cocoa/bookmarks/bookmark_bar_bridge.h",
      "cocoa/bookmarks/bookmark_bar_bridge.mm",
      "cocoa/bookmarks/bookmark_bar_constants.h",
      "cocoa/bookmarks/bookmark_bar_controller.h",
      "cocoa/bookmarks/bookmark_bar_controller.mm",
      "cocoa/bookmarks/bookmark_bar_folder_button_cell.h",
      "cocoa/bookmarks/bookmark_bar_folder_button_cell.mm",
      "cocoa/bookmarks/bookmark_bar_folder_controller.h",
      "cocoa/bookmarks/bookmark_bar_folder_controller.mm",
      "cocoa/bookmarks/bookmark_bar_folder_hover_state.h",
      "cocoa/bookmarks/bookmark_bar_folder_hover_state.mm",
      "cocoa/bookmarks/bookmark_bar_folder_view.h",
      "cocoa/bookmarks/bookmark_bar_folder_view.mm",
      "cocoa/bookmarks/bookmark_bar_folder_window.h",
      "cocoa/bookmarks/bookmark_bar_folder_window.mm",
      "cocoa/bookmarks/bookmark_bar_state.h",
      "cocoa/bookmarks/bookmark_bar_toolbar_view.h",
      "cocoa/bookmarks/bookmark_bar_toolbar_view.mm",
      "cocoa/bookmarks/bookmark_bar_view_cocoa.h",
      "cocoa/bookmarks/bookmark_bar_view_cocoa.mm",
      "cocoa/bookmarks/bookmark_bubble_controller.h",
      "cocoa/bookmarks/bookmark_bubble_controller.mm",
      "cocoa/bookmarks/bookmark_bubble_observer_cocoa.h",
      "cocoa/bookmarks/bookmark_bubble_observer_cocoa.mm",
      "cocoa/bookmarks/bookmark_button.h",
      "cocoa/bookmarks/bookmark_button.mm",
      "cocoa/bookmarks/bookmark_button_cell.h",
      "cocoa/bookmarks/bookmark_button_cell.mm",
      "cocoa/bookmarks/bookmark_context_menu_cocoa_controller.h",
      "cocoa/bookmarks/bookmark_context_menu_cocoa_controller.mm",
      "cocoa/bookmarks/bookmark_drag_drop_cocoa.mm",
      "cocoa/bookmarks/bookmark_editor_base_controller.h",
      "cocoa/bookmarks/bookmark_editor_base_controller.mm",
      "cocoa/bookmarks/bookmark_editor_controller.h",
      "cocoa/bookmarks/bookmark_editor_controller.mm",
      "cocoa/bookmarks/bookmark_folder_target.h",
      "cocoa/bookmarks/bookmark_folder_target.mm",
      "cocoa/bookmarks/bookmark_model_observer_for_cocoa.h",
      "cocoa/bookmarks/bookmark_model_observer_for_cocoa.mm",
      "cocoa/bookmarks/bookmark_name_folder_controller.h",
      "cocoa/bookmarks/bookmark_name_folder_controller.mm",
      "cocoa/bookmarks/bookmark_tree_browser_cell.h",
      "cocoa/bookmarks/bookmark_tree_browser_cell.mm",
      "cocoa/browser/exclusive_access_controller_views.h",
      "cocoa/browser/exclusive_access_controller_views.mm",
      "cocoa/browser/zoom_bubble_controller.h",
      "cocoa/browser/zoom_bubble_controller.mm",
      "cocoa/browser_dialogs_views_mac.cc",
      "cocoa/browser_dialogs_views_mac.h",
      "cocoa/browser_window_cocoa.h",
      "cocoa/browser_window_cocoa.mm",
      "cocoa/browser_window_cocoa_views_mac.mm",
      "cocoa/browser_window_controller.h",
      "cocoa/browser_window_controller.mm",
      "cocoa/browser_window_controller_private.h",
      "cocoa/browser_window_controller_private.mm",
      "cocoa/browser_window_factory_cocoa.mm",
      "cocoa/browser_window_fullscreen_transition.h",
      "cocoa/browser_window_fullscreen_transition.mm",
      "cocoa/browser_window_layout.h",
      "cocoa/browser_window_layout.mm",
      "cocoa/browser_window_touch_bar.h",
      "cocoa/browser_window_touch_bar.mm",
      "cocoa/browser_window_utils.h",
      "cocoa/browser_window_utils.mm",
      "cocoa/bubble_anchor_helper.h",
      "cocoa/bubble_anchor_helper.mm",
      "cocoa/bubble_anchor_helper_views.h",
      "cocoa/bubble_anchor_helper_views.mm",
      "cocoa/bubble_anchor_util_views_mac.mm",
      "cocoa/bubble_combobox.h",
      "cocoa/bubble_combobox.mm",
      "cocoa/bubble_sync_promo_controller.h",
      "cocoa/bubble_sync_promo_controller.mm",
      "cocoa/bubble_view.h",
      "cocoa/bubble_view.mm",
      "cocoa/certificate_viewer_mac_cocoa.h",
      "cocoa/certificate_viewer_mac_cocoa.mm",
      "cocoa/chrome_browser_window.h",
      "cocoa/chrome_browser_window.mm",
      "cocoa/chrome_event_processing_window.h",
      "cocoa/chrome_event_processing_window.mm",
      "cocoa/clickhold_button_cell.h",
      "cocoa/clickhold_button_cell.mm",
      "cocoa/constrained_web_dialog_delegate_mac.mm",
      "cocoa/constrained_window/constrained_window_alert.h",
      "cocoa/constrained_window/constrained_window_alert.mm",
      "cocoa/constrained_window/constrained_window_button.h",
      "cocoa/constrained_window/constrained_window_button.mm",
      "cocoa/constrained_window/constrained_window_control_utils.h",
      "cocoa/constrained_window/constrained_window_control_utils.mm",
      "cocoa/constrained_window/constrained_window_custom_sheet.h",
      "cocoa/constrained_window/constrained_window_custom_sheet.mm",
      "cocoa/constrained_window/constrained_window_custom_window.h",
      "cocoa/constrained_window/constrained_window_custom_window.mm",
      "cocoa/constrained_window/constrained_window_mac.h",
      "cocoa/constrained_window/constrained_window_mac.mm",
      "cocoa/constrained_window/constrained_window_sheet.h",
      "cocoa/constrained_window/constrained_window_sheet_controller.h",
      "cocoa/constrained_window/constrained_window_sheet_controller.mm",
      "cocoa/constrained_window/constrained_window_sheet_info.h",
      "cocoa/constrained_window/constrained_window_sheet_info.mm",
      "cocoa/constrained_window/constrained_window_web_dialog_sheet.h",
      "cocoa/constrained_window/constrained_window_web_dialog_sheet.mm",
      "cocoa/content_settings/blocked_plugin_bubble_controller.h",
      "cocoa/content_settings/blocked_plugin_bubble_controller.mm",
      "cocoa/content_settings/collected_cookies_mac.h",
      "cocoa/content_settings/collected_cookies_mac.mm",
      "cocoa/content_settings/content_setting_bubble_cocoa.h",
      "cocoa/content_settings/content_setting_bubble_cocoa.mm",
      "cocoa/content_settings/cookie_details.h",
      "cocoa/content_settings/cookie_details.mm",
      "cocoa/content_settings/cookie_details_view_controller.h",
      "cocoa/content_settings/cookie_details_view_controller.mm",
      "cocoa/content_settings/cookie_tree_node.h",
      "cocoa/content_settings/cookie_tree_node.mm",
      "cocoa/content_settings/cookies_tree_controller_bridge.h",
      "cocoa/content_settings/cookies_tree_controller_bridge.mm",
      "cocoa/create_native_web_modal_manager_cocoa.mm",
      "cocoa/dev_tools_controller.h",
      "cocoa/dev_tools_controller.mm",
      "cocoa/device_chooser_content_view_cocoa.h",
      "cocoa/device_chooser_content_view_cocoa.mm",
      "cocoa/dialog_text_field_editor.h",
      "cocoa/dialog_text_field_editor.mm",
      "cocoa/download/background_theme.h",
      "cocoa/download/background_theme.mm",
      "cocoa/download/download_danger_prompt_impl.cc",
      "cocoa/download/download_item_button.h",
      "cocoa/download/download_item_button.mm",
      "cocoa/download/download_item_cell.h",
      "cocoa/download/download_item_cell.mm",
      "cocoa/download/download_item_controller.h",
      "cocoa/download/download_item_controller.mm",
      "cocoa/download/download_item_mac.h",
      "cocoa/download/download_item_mac.mm",
      "cocoa/download/download_item_view_protocol.h",
      "cocoa/download/download_shelf_context_menu_controller.h",
      "cocoa/download/download_shelf_context_menu_controller.mm",
      "cocoa/download/download_shelf_controller.h",
      "cocoa/download/download_shelf_controller.mm",
      "cocoa/download/download_shelf_mac.h",
      "cocoa/download/download_shelf_mac.mm",
      "cocoa/download/download_shelf_view_cocoa.h",
      "cocoa/download/download_shelf_view_cocoa.mm",
      "cocoa/download/download_show_all_button.h",
      "cocoa/download/download_show_all_button.mm",
      "cocoa/download/download_show_all_cell.h",
      "cocoa/download/download_show_all_cell.mm",
      "cocoa/download/download_started_animation_mac.mm",
      "cocoa/download/md_download_item_progress_indicator.h",
      "cocoa/download/md_download_item_progress_indicator.mm",
      "cocoa/download/md_download_item_view.h",
      "cocoa/download/md_download_item_view.mm",
      "cocoa/download/md_download_item_view_testing.h",
      "cocoa/drag_util.h",
      "cocoa/drag_util.mm",
      "cocoa/draggable_button.h",
      "cocoa/draggable_button.mm",
      "cocoa/draggable_button_mixin.h",
      "cocoa/draggable_button_mixin.mm",
      "cocoa/extensions/browser_action_button.h",
      "cocoa/extensions/browser_action_button.mm",
      "cocoa/extensions/browser_actions_container_view.h",
      "cocoa/extensions/browser_actions_container_view.mm",
      "cocoa/extensions/browser_actions_controller.h",
      "cocoa/extensions/browser_actions_controller.mm",
      "cocoa/extensions/chooser_dialog_cocoa.h",
      "cocoa/extensions/chooser_dialog_cocoa.mm",
      "cocoa/extensions/chooser_dialog_cocoa_controller.h",
      "cocoa/extensions/chooser_dialog_cocoa_controller.mm",
      "cocoa/extensions/extension_action_platform_delegate_cocoa.h",
      "cocoa/extensions/extension_action_platform_delegate_cocoa.mm",
      "cocoa/extensions/extension_install_dialog_controller.h",
      "cocoa/extensions/extension_install_dialog_controller.mm",
      "cocoa/extensions/extension_install_view_controller.h",
      "cocoa/extensions/extension_install_view_controller.mm",
      "cocoa/extensions/extension_installed_bubble_controller.h",
      "cocoa/extensions/extension_installed_bubble_controller.mm",
      "cocoa/extensions/extension_keybinding_registry_cocoa.h",
      "cocoa/extensions/extension_keybinding_registry_cocoa.mm",
      "cocoa/extensions/extension_popup_controller.h",
      "cocoa/extensions/extension_popup_controller.mm",
      "cocoa/extensions/extension_popup_views_mac.h",
      "cocoa/extensions/extension_popup_views_mac.mm",
      "cocoa/extensions/extension_uninstall_dialog_cocoa.mm",
      "cocoa/extensions/extension_view_mac.h",
      "cocoa/extensions/extension_view_mac.mm",
      "cocoa/extensions/media_galleries_dialog_cocoa.h",
      "cocoa/extensions/media_galleries_dialog_cocoa.mm",
      "cocoa/extensions/media_gallery_list_entry_view.h",
      "cocoa/extensions/media_gallery_list_entry_view.mm",
      "cocoa/extensions/toolbar_actions_bar_bubble_mac.h",
      "cocoa/extensions/toolbar_actions_bar_bubble_mac.mm",
      "cocoa/extensions/toolbar_actions_bar_bubble_views_presenter.h",
      "cocoa/extensions/toolbar_actions_bar_bubble_views_presenter.mm",
      "cocoa/extensions/windowed_install_dialog_controller.h",
      "cocoa/extensions/windowed_install_dialog_controller.mm",
      "cocoa/external_protocol_dialog.h",
      "cocoa/external_protocol_dialog_cocoa.mm",
      "cocoa/external_protocol_dialog_views_mac.mm",
      "cocoa/fast_resize_view.h",
      "cocoa/fast_resize_view.mm",
      "cocoa/find_bar/find_bar_bridge.h",
      "cocoa/find_bar/find_bar_bridge.mm",
      "cocoa/find_bar/find_bar_cocoa_controller.h",
      "cocoa/find_bar/find_bar_cocoa_controller.mm",
      "cocoa/find_bar/find_bar_text_field.h",
      "cocoa/find_bar/find_bar_text_field.mm",
      "cocoa/find_bar/find_bar_text_field_cell.h",
      "cocoa/find_bar/find_bar_text_field_cell.mm",
      "cocoa/find_bar/find_bar_view_cocoa.h",
      "cocoa/find_bar/find_bar_view_cocoa.mm",
      "cocoa/floating_bar_backing_view.h",
      "cocoa/floating_bar_backing_view.mm",
      "cocoa/framed_browser_window.h",
      "cocoa/framed_browser_window.mm",
      "cocoa/fullscreen/fullscreen_menubar_tracker.h",
      "cocoa/fullscreen/fullscreen_menubar_tracker.mm",
      "cocoa/fullscreen/fullscreen_toolbar_animation_controller.h",
      "cocoa/fullscreen/fullscreen_toolbar_animation_controller.mm",
      "cocoa/fullscreen/fullscreen_toolbar_controller.h",
      "cocoa/fullscreen/fullscreen_toolbar_controller.mm",
      "cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.h",
      "cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.mm",
      "cocoa/fullscreen/fullscreen_toolbar_visibility_lock_controller.h",
      "cocoa/fullscreen/fullscreen_toolbar_visibility_lock_controller.mm",
      "cocoa/fullscreen/immersive_fullscreen_controller.h",
      "cocoa/fullscreen/immersive_fullscreen_controller.mm",
      "cocoa/fullscreen_placeholder_view.h",
      "cocoa/fullscreen_placeholder_view.mm",
      "cocoa/fullscreen_window.h",
      "cocoa/fullscreen_window.mm",
      "cocoa/global_error_bubble_controller.h",
      "cocoa/global_error_bubble_controller.mm",
      "cocoa/global_error_bubble_controller_views.mm",
      "cocoa/gradient_button_cell.h",
      "cocoa/gradient_button_cell.mm",
      "cocoa/harmony_button.h",
      "cocoa/harmony_button.mm",
      "cocoa/has_weak_browser_pointer.h",
      "cocoa/hover_close_button.h",
      "cocoa/hover_close_button.mm",
      "cocoa/hung_renderer_controller.h",
      "cocoa/hung_renderer_controller.mm",
      "cocoa/image_button_cell.h",
      "cocoa/image_button_cell.mm",
      "cocoa/importer/import_lock_dialog_cocoa.mm",
      "cocoa/info_bubble_view.h",
      "cocoa/info_bubble_view.mm",
      "cocoa/info_bubble_window.h",
      "cocoa/info_bubble_window.mm",
      "cocoa/infobars/after_translate_infobar_controller.h",
      "cocoa/infobars/after_translate_infobar_controller.mm",
      "cocoa/infobars/alternate_nav_infobar_controller.h",
      "cocoa/infobars/alternate_nav_infobar_controller.mm",
      "cocoa/infobars/before_translate_infobar_controller.h",
      "cocoa/infobars/before_translate_infobar_controller.mm",
      "cocoa/infobars/confirm_infobar_controller.h",
      "cocoa/infobars/confirm_infobar_controller.mm",
      "cocoa/infobars/infobar_background_view.h",
      "cocoa/infobars/infobar_background_view.mm",
      "cocoa/infobars/infobar_cocoa.h",
      "cocoa/infobars/infobar_cocoa.mm",
      "cocoa/infobars/infobar_container_cocoa.h",
      "cocoa/infobars/infobar_container_cocoa.mm",
      "cocoa/infobars/infobar_container_controller.h",
      "cocoa/infobars/infobar_container_controller.mm",
      "cocoa/infobars/infobar_controller.h",
      "cocoa/infobars/infobar_controller.mm",
      "cocoa/infobars/infobar_utilities.h",
      "cocoa/infobars/infobar_utilities.mm",
      "cocoa/infobars/translate_infobar_base.h",
      "cocoa/infobars/translate_infobar_base.mm",
      "cocoa/infobars/translate_message_infobar_controller.h",
      "cocoa/infobars/translate_message_infobar_controller.mm",
      "cocoa/javascript_app_modal_dialog_cocoa.h",
      "cocoa/javascript_app_modal_dialog_cocoa.mm",
      "cocoa/location_bar/autocomplete_text_field.h",
      "cocoa/location_bar/autocomplete_text_field.mm",
      "cocoa/location_bar/autocomplete_text_field_cell.h",
      "cocoa/location_bar/autocomplete_text_field_cell.mm",
      "cocoa/location_bar/autocomplete_text_field_editor.h",
      "cocoa/location_bar/autocomplete_text_field_editor.mm",
      "cocoa/location_bar/bubble_decoration.h",
      "cocoa/location_bar/bubble_decoration.mm",
      "cocoa/location_bar/content_setting_decoration.h",
      "cocoa/location_bar/content_setting_decoration.mm",
      "cocoa/location_bar/image_decoration.h",
      "cocoa/location_bar/image_decoration.mm",
      "cocoa/location_bar/keyword_hint_decoration.h",
      "cocoa/location_bar/keyword_hint_decoration.mm",
      "cocoa/location_bar/location_bar_decoration.h",
      "cocoa/location_bar/location_bar_decoration.mm",
      "cocoa/location_bar/location_bar_view_mac.h",
      "cocoa/location_bar/location_bar_view_mac.mm",
      "cocoa/location_bar/manage_passwords_decoration.h",
      "cocoa/location_bar/manage_passwords_decoration.mm",
      "cocoa/location_bar/page_info_bubble_decoration.h",
      "cocoa/location_bar/page_info_bubble_decoration.mm",
      "cocoa/location_bar/save_credit_card_decoration.h",
      "cocoa/location_bar/save_credit_card_decoration.mm",
      "cocoa/location_bar/selected_keyword_decoration.h",
      "cocoa/location_bar/selected_keyword_decoration.mm",
      "cocoa/location_bar/star_decoration.h",
      "cocoa/location_bar/star_decoration.mm",
      "cocoa/location_bar/translate_decoration.h",
      "cocoa/location_bar/translate_decoration.mm",
      "cocoa/location_bar/zoom_decoration.h",
      "cocoa/location_bar/zoom_decoration.mm",
      "cocoa/login_handler_cocoa.h",
      "cocoa/login_handler_cocoa.mm",
      "cocoa/main_menu_item.h",
      "cocoa/menu_button.h",
      "cocoa/menu_button.mm",
      "cocoa/multi_key_equivalent_button.h",
      "cocoa/multi_key_equivalent_button.mm",
      "cocoa/new_tab_button.h",
      "cocoa/new_tab_button_cocoa.mm",
      "cocoa/nsview_additions.h",
      "cocoa/nsview_additions.mm",
      "cocoa/omnibox/omnibox_popup_cell.h",
      "cocoa/omnibox/omnibox_popup_cell.mm",
      "cocoa/omnibox/omnibox_popup_matrix.h",
      "cocoa/omnibox/omnibox_popup_matrix.mm",
      "cocoa/omnibox/omnibox_popup_separator_view.h",
      "cocoa/omnibox/omnibox_popup_separator_view.mm",
      "cocoa/omnibox/omnibox_popup_view_mac.h",
      "cocoa/omnibox/omnibox_popup_view_mac.mm",
      "cocoa/omnibox/omnibox_view_mac.h",
      "cocoa/omnibox/omnibox_view_mac.mm",
      "cocoa/omnibox_decoration_bubble_controller.h",
      "cocoa/omnibox_decoration_bubble_controller.mm",
      "cocoa/one_click_signin_dialog_controller.h",
      "cocoa/one_click_signin_dialog_controller.mm",
      "cocoa/one_click_signin_view_controller.h",
      "cocoa/one_click_signin_view_controller.mm",
      "cocoa/page_info/page_info_bubble_controller.h",
      "cocoa/page_info/page_info_bubble_controller.mm",
      "cocoa/page_info/page_info_utils_cocoa.h",
      "cocoa/page_info/page_info_utils_cocoa.mm",
      "cocoa/page_info/permission_selector_button.h",
      "cocoa/page_info/permission_selector_button.mm",
      "cocoa/page_info/split_block_button.h",
      "cocoa/page_info/split_block_button.mm",
      "cocoa/password_reuse_warning_dialog_cocoa.h",
      "cocoa/password_reuse_warning_dialog_cocoa.mm",
      "cocoa/password_reuse_warning_view_controller.h",
      "cocoa/password_reuse_warning_view_controller.mm",
      "cocoa/permission_bubble/chooser_bubble_ui_cocoa.h",
      "cocoa/permission_bubble/chooser_bubble_ui_cocoa.mm",
      "cocoa/permission_bubble/chooser_bubble_ui_views_mac.mm",
      "cocoa/permission_bubble/permission_prompt_impl_views_mac.mm",
      "cocoa/profiles/avatar_base_controller.h",
      "cocoa/profiles/avatar_base_controller.mm",
      "cocoa/profiles/avatar_button.h",
      "cocoa/profiles/avatar_button_cocoa.mm",
      "cocoa/profiles/avatar_button_controller.h",
      "cocoa/profiles/avatar_button_controller.mm",
      "cocoa/profiles/avatar_icon_controller.h",
      "cocoa/profiles/avatar_icon_controller.mm",
      "cocoa/profiles/profile_chooser_bridge_views.h",
      "cocoa/profiles/profile_chooser_bridge_views.mm",
      "cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h",
      "cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm",
      "cocoa/profiles/profile_signin_confirmation_view_controller.h",
      "cocoa/profiles/profile_signin_confirmation_view_controller.mm",
      "cocoa/profiles/signin_view_controller_delegate_mac.h",
      "cocoa/profiles/signin_view_controller_delegate_mac.mm",
      "cocoa/profiles/user_manager_mac.h",
      "cocoa/profiles/user_manager_mac.mm",
      "cocoa/rect_path_utils.h",
      "cocoa/rect_path_utils.mm",
      "cocoa/restart_browser.h",
      "cocoa/restart_browser.mm",
      "cocoa/screen_capture_notification_ui_cocoa.h",
      "cocoa/screen_capture_notification_ui_cocoa.mm",
      "cocoa/separate_fullscreen_window.h",
      "cocoa/separate_fullscreen_window.mm",
      "cocoa/simple_message_box_bridge_views.mm",
      "cocoa/simple_message_box_cocoa.h",
      "cocoa/simple_message_box_cocoa.mm",
      "cocoa/single_web_contents_dialog_manager_cocoa.h",
      "cocoa/single_web_contents_dialog_manager_cocoa.mm",
      "cocoa/spinner_view.h",
      "cocoa/spinner_view.mm",
      "cocoa/ssl_client_certificate_selector_cocoa.h",
      "cocoa/ssl_client_certificate_selector_cocoa.mm",
      "cocoa/status_bubble_mac.h",
      "cocoa/status_bubble_mac.mm",
      "cocoa/styled_text_field.h",
      "cocoa/styled_text_field.mm",
      "cocoa/styled_text_field_cell.h",
      "cocoa/styled_text_field_cell.mm",
      "cocoa/subresource_filter/subresource_filter_bubble_controller.h",
      "cocoa/subresource_filter/subresource_filter_bubble_controller.mm",
      "cocoa/tab_contents/favicon_util_mac.h",
      "cocoa/tab_contents/favicon_util_mac.mm",
      "cocoa/tab_contents/overlayable_contents_controller.h",
      "cocoa/tab_contents/overlayable_contents_controller.mm",
      "cocoa/tab_contents/sad_tab_mac.mm",
      "cocoa/tab_contents/sad_tab_view_cocoa.h",
      "cocoa/tab_contents/sad_tab_view_cocoa.mm",
      "cocoa/tab_contents/tab_contents_controller.h",
      "cocoa/tab_contents/tab_contents_controller.mm",
      "cocoa/tab_dialogs_cocoa.h",
      "cocoa/tab_dialogs_cocoa.mm",
      "cocoa/tab_dialogs_views_mac.h",
      "cocoa/tab_dialogs_views_mac.mm",
      "cocoa/tab_modal_confirm_dialog_mac.h",
      "cocoa/tab_modal_confirm_dialog_mac.mm",
      "cocoa/tabbed_browser_window.h",
      "cocoa/tabbed_browser_window.mm",
      "cocoa/tabs/alert_indicator_button_cocoa.h",
      "cocoa/tabs/alert_indicator_button_cocoa.mm",
      "cocoa/tabs/tab_controller.h",
      "cocoa/tabs/tab_controller.mm",
      "cocoa/tabs/tab_controller_target.h",
      "cocoa/tabs/tab_favicon_view.h",
      "cocoa/tabs/tab_favicon_view.mm",
      "cocoa/tabs/tab_spinner_view.h",
      "cocoa/tabs/tab_spinner_view.mm",
      "cocoa/tabs/tab_strip_background_view.h",
      "cocoa/tabs/tab_strip_background_view.mm",
      "cocoa/tabs/tab_strip_controller.h",
      "cocoa/tabs/tab_strip_controller.mm",
      "cocoa/tabs/tab_strip_drag_controller.h",
      "cocoa/tabs/tab_strip_drag_controller.mm",
      "cocoa/tabs/tab_strip_model_observer_bridge.h",
      "cocoa/tabs/tab_strip_model_observer_bridge.mm",
      "cocoa/tabs/tab_strip_view.h",
      "cocoa/tabs/tab_strip_view.mm",
      "cocoa/tabs/tab_view.h",
      "cocoa/tabs/tab_view.mm",
      "cocoa/tabs/tab_window_controller.h",
      "cocoa/tabs/tab_window_controller.mm",
      "cocoa/themed_window.h",
      "cocoa/themed_window.mm",
      "cocoa/toolbar/app_toolbar_button.h",
      "cocoa/toolbar/app_toolbar_button.mm",
      "cocoa/toolbar/app_toolbar_button_cell.h",
      "cocoa/toolbar/app_toolbar_button_cell.mm",
      "cocoa/toolbar/back_forward_menu_controller.h",
      "cocoa/toolbar/back_forward_menu_controller.mm",
      "cocoa/toolbar/media_router_action_platform_delegate_cocoa.h",
      "cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm",
      "cocoa/toolbar/reload_button_cocoa.h",
      "cocoa/toolbar/reload_button_cocoa.mm",
      "cocoa/toolbar/toolbar_button_cocoa.h",
      "cocoa/toolbar/toolbar_button_cocoa.mm",
      "cocoa/toolbar/toolbar_controller.h",
      "cocoa/toolbar/toolbar_controller.mm",
      "cocoa/toolbar/toolbar_view_cocoa.h",
      "cocoa/toolbar/toolbar_view_cocoa.mm",
      "cocoa/translate/translate_bubble_bridge_views.h",
      "cocoa/translate/translate_bubble_bridge_views.mm",
      "cocoa/translate/translate_bubble_controller.h",
      "cocoa/translate/translate_bubble_controller.mm",
      "cocoa/url_drop_target.h",
      "cocoa/url_drop_target.mm",
      "cocoa/vertical_gradient_view.h",
      "cocoa/vertical_gradient_view.mm",
      "cocoa/view_id_util.h",
      "cocoa/view_id_util.mm",
      "cocoa/view_resizer.h",
      "cocoa/web_contents_modal_dialog_manager_views_mac.h",
      "cocoa/web_contents_modal_dialog_manager_views_mac.mm",
      "cocoa/web_textfield_touch_bar_controller.h",
      "cocoa/web_textfield_touch_bar_controller.mm",

      # TODO(estade): this class should be deleted in favor of a combobox model.
      # See crbug.com/590850
      "content_settings/content_setting_media_menu_model.cc",
      "content_settings/content_setting_media_menu_model.h",
      "javascript_dialogs/javascript_dialog_cocoa.h",
      "javascript_dialogs/javascript_dialog_cocoa.mm",
      "javascript_dialogs/javascript_dialog_mac.cc",
      "proximity_auth/proximity_auth_error_bubble_stub.cc",
      "startup/session_crashed_infobar_delegate.cc",
      "startup/session_crashed_infobar_delegate.h",
    ]
  }

  sources = [
    "accelerator_utils.h",
    "app_list/app_list_util.cc",
    "app_list/app_list_util.h",

    # All other browser/ui/app_list files go under enable_app_list below.
    "webui/hello_world_ui.cc",
    "webui/hello_world_ui.h",
...

编辑Z:\chromium\src\chrome\browser\ui\webui\chrome_web_ui_controller_factory.cc

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"

#include <stddef.h>

#include <vector>

#include "base/bind.h"
#include "base/feature_list.h"
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "chrome/browser/about_flags.h"
#include "chrome/browser/devtools/devtools_ui_bindings.h"
#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
#include "chrome/browser/engagement/site_engagement_service.h"
#include "chrome/browser/media/media_engagement_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/search/suggestions/suggestions_ui.h"
#include "chrome/browser/ui/history_ui.h"
#include "chrome/browser/ui/webui/about_ui.h"
#include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h"
#include "chrome/browser/ui/webui/components_ui.h"
#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
#include "chrome/browser/ui/webui/crashes_ui.h"
#include "chrome/browser/ui/webui/device_log_ui.h"
#include "chrome/browser/ui/webui/domain_reliability_internals_ui.h"
#include "chrome/browser/ui/webui/download_internals/download_internals_ui.h"
#include "chrome/browser/ui/webui/engagement/site_engagement_ui.h"
#include "chrome/browser/ui/webui/flags_ui.h"
#include "chrome/browser/ui/webui/flash_ui.h"
#include "chrome/browser/ui/webui/gcm_internals_ui.h"
#include "chrome/browser/ui/webui/identity_internals_ui.h"
#include "chrome/browser/ui/webui/interstitials/interstitial_ui.h"
#include "chrome/browser/ui/webui/interventions_internals/interventions_internals_ui.h"
#include "chrome/browser/ui/webui/invalidations_ui.h"
#include "chrome/browser/ui/webui/local_state/local_state_ui.h"
#include "chrome/browser/ui/webui/log_web_ui_url.h"
#include "chrome/browser/ui/webui/media/media_engagement_ui.h"
#include "chrome/browser/ui/webui/media/webrtc_logs_ui.h"
#include "chrome/browser/ui/webui/memory_internals_ui.h"
#include "chrome/browser/ui/webui/net_export_ui.h"
#include "chrome/browser/ui/webui/net_internals/net_internals_ui.h"
#include "chrome/browser/ui/webui/ntp_tiles_internals_ui.h"
#include "chrome/browser/ui/webui/omnibox/omnibox_ui.h"
#include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
#include "chrome/browser/ui/webui/policy_tool_ui.h"
#include "chrome/browser/ui/webui/policy_ui.h"
#include "chrome/browser/ui/webui/predictors/predictors_ui.h"
#include "chrome/browser/ui/webui/quota_internals/quota_internals_ui.h"
#include "chrome/browser/ui/webui/settings/md_settings_ui.h"
#include "chrome/browser/ui/webui/settings_utils.h"
#include "chrome/browser/ui/webui/signin_internals_ui.h"
#include "chrome/browser/ui/webui/supervised_user_internals_ui.h"
#include "chrome/browser/ui/webui/sync_internals_ui.h"
#include "chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.h"
#include "chrome/browser/ui/webui/translate_internals/translate_internals_ui.h"
#include "chrome/browser/ui/webui/usb_internals/usb_internals_ui.h"
#include "chrome/browser/ui/webui/user_actions/user_actions_ui.h"

#include "chrome/browser/ui/webui/version_ui.h"


#include "chrome/common/buildflags.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "components/dom_distiller/core/dom_distiller_constants.h"
#include "components/dom_distiller/core/dom_distiller_features.h"
#include "components/dom_distiller/core/dom_distiller_service.h"
#include "components/dom_distiller/core/url_constants.h"
#include "components/dom_distiller/webui/dom_distiller_ui.h"
#include "components/favicon/core/favicon_service.h"
#include "components/favicon_base/favicon_util.h"
#include "components/favicon_base/select_favicon_frames.h"
#include "components/history/core/browser/history_types.h"
#include "components/nacl/common/buildflags.h"
#include "components/prefs/pref_service.h"

#include "components/safe_browsing/web_ui/constants.h"
#include "components/safe_browsing/web_ui/safe_browsing_ui.h"

#include "chrome/browser/ui/webui/hello_world_ui.h"
// #include "components/hello_world/constants.h"

#include "components/security_interstitials/content/connection_help_ui.h"
#include "components/security_interstitials/content/urls.h"
#include "components/signin/core/browser/profile_management_switches.h"
#include "components/signin/core/browser/signin_buildflags.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/common/content_client.h"
#include "content/public/common/url_utils.h"
#include "extensions/buildflags/buildflags.h"
#include "media/media_buildflags.h"
#include "ppapi/buildflags/buildflags.h"
#include "printing/buildflags/buildflags.h"
#include "ui/gfx/favicon_size.h"
#include "ui/web_dialogs/web_dialog_ui.h"
#include "url/gurl.h"

#if BUILDFLAG(ENABLE_NACL)
#include "chrome/browser/ui/webui/nacl_ui.h"
#endif

#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
#endif

#if !defined(OS_ANDROID)
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/ui/webui/media_router/media_router_internals_ui.h"
#include "chrome/browser/ui/webui/media_router/media_router_ui.h"
#endif
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
#include "chrome/browser/ui/webui/cast/cast_ui.h"
#endif

#if defined(OS_ANDROID)
#include "chrome/browser/ui/webui/offline/offline_internals_ui.h"
#include "chrome/browser/ui/webui/snippets_internals/snippets_internals_ui.h"
#include "chrome/browser/ui/webui/webapks_ui.h"
#else
#include "chrome/browser/ui/webui/devtools_ui.h"
#include "chrome/browser/ui/webui/inspect_ui.h"
#include "chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.h"
#include "chrome/browser/ui/webui/md_downloads/md_downloads_ui.h"
#include "chrome/browser/ui/webui/md_history_ui.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
#include "chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.h"
#include "chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.h"
#include "chrome/browser/ui/webui/system_info_ui.h"
#endif

#if defined(OS_CHROMEOS)
#include "base/sys_info.h"
#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_service.h"
#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_factory.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h"
#include "chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.h"
#include "chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.h"
#include "chrome/browser/ui/webui/chromeos/cryptohome_ui.h"
#include "chrome/browser/ui/webui/chromeos/drive_internals_ui.h"
#include "chrome/browser/ui/webui/chromeos/first_run/first_run_ui.h"
#include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
#include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
#include "chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/browser/ui/webui/chromeos/mobile_setup_ui.h"
#include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h"
#include "chrome/browser/ui/webui/chromeos/network_ui.h"
#include "chrome/browser/ui/webui/chromeos/power_ui.h"
#include "chrome/browser/ui/webui/chromeos/set_time_ui.h"
#include "chrome/browser/ui/webui/chromeos/slow_trace_ui.h"
#include "chrome/browser/ui/webui/chromeos/slow_ui.h"
#include "chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_ui.h"
#include "chromeos/components/proximity_auth/webui/proximity_auth_ui.h"
#include "chromeos/components/proximity_auth/webui/url_constants.h"
#endif

#if defined(OS_CHROMEOS) && !defined(OFFICIAL_BUILD)
#include "chrome/browser/ui/webui/chromeos/emulator/device_emulator_ui.h"
#endif

#if !defined(OS_CHROMEOS)
#include "chrome/browser/ui/webui/app_launcher_page_ui.h"
#endif

#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
#include "chrome/browser/ui/sync/sync_promo_ui.h"
#include "chrome/browser/ui/webui/signin/inline_login_ui.h"
#include "chrome/browser/ui/webui/signin/md_user_manager_ui.h"
#include "chrome/browser/ui/webui/signin/signin_email_confirmation_ui.h"
#include "chrome/browser/ui/webui/signin/signin_error_ui.h"
#include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h"
#include "chrome/browser/ui/webui/welcome_ui.h"
#endif

#if defined(OS_WIN)
#include "chrome/browser/ui/webui/conflicts_ui.h"
#include "chrome/browser/ui/webui/set_as_default_browser_ui_win.h"
#include "chrome/browser/ui/webui/welcome_win10_ui.h"
#endif

#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
#include "chrome/browser/ui/webui/discards/discards_ui.h"
#endif

#if defined(OS_LINUX) || defined(OS_ANDROID)
#include "chrome/browser/ui/webui/sandbox_internals_ui.h"
#endif

#if defined(USE_NSS_CERTS) && defined(USE_AURA)
#include "chrome/browser/ui/webui/certificate_viewer_ui.h"
#endif

#if BUILDFLAG(ENABLE_SERVICE_DISCOVERY)
#include "chrome/browser/ui/webui/local_discovery/local_discovery_ui.h"
#endif

#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/extensions/extension_web_ui.h"
#include "chrome/browser/ui/webui/extensions/extensions_ui.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/extensions/extension_constants.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/manifest.h"
#endif

#if defined(SAFE_BROWSING_DB_LOCAL)
#include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
#include "chrome/browser/ui/webui/reset_password/reset_password_ui.h"
#include "components/safe_browsing/features.h"
#endif

using content::WebUI;
using content::WebUIController;
using ui::WebDialogUI;

namespace {

// A function for creating a new WebUI. The caller owns the return value, which
// may be NULL (for example, if the URL refers to an non-existent extension).
typedef WebUIController* (*WebUIFactoryFunction)(WebUI* web_ui,
                                                 const GURL& url);

// Template for defining WebUIFactoryFunction.
template<class T>
WebUIController* NewWebUI(WebUI* web_ui, const GURL& url) {
  return new T(web_ui);
}

#if !defined(OS_ANDROID)
template <>
WebUIController* NewWebUI<PageNotAvailableForGuestUI>(WebUI* web_ui,
                                                      const GURL& url) {
  return new PageNotAvailableForGuestUI(web_ui, url.host());
}
#endif

// Special case for older about: handlers.
template<>
WebUIController* NewWebUI<AboutUI>(WebUI* web_ui, const GURL& url) {
  return new AboutUI(web_ui, url.host());
}

#if defined(OS_CHROMEOS)
template<>
WebUIController* NewWebUI<chromeos::OobeUI>(WebUI* web_ui, const GURL& url) {
  return new chromeos::OobeUI(web_ui, url);
}

// Special case for chrome://proximity_auth.
template <>
WebUIController* NewWebUI<proximity_auth::ProximityAuthUI>(WebUI* web_ui,
                                                           const GURL& url) {
  content::BrowserContext* browser_context =
      web_ui->GetWebContents()->GetBrowserContext();
  return new proximity_auth::ProximityAuthUI(
      web_ui,
      chromeos::EasyUnlockServiceFactory::GetForBrowserContext(browser_context)
          ->proximity_auth_client());
}
#endif

// Special cases for DOM distiller.
template<>
WebUIController* NewWebUI<dom_distiller::DomDistillerUi>(WebUI* web_ui,
                                                         const GURL& url) {
  // The DomDistillerUi can not depend on components/dom_distiller/content,
  // so inject the correct DomDistillerService from chrome/.
  content::BrowserContext* browser_context =
      web_ui->GetWebContents()->GetBrowserContext();
  dom_distiller::DomDistillerService* service =
      dom_distiller::DomDistillerServiceFactory::GetForBrowserContext(
          browser_context);
  return new dom_distiller::DomDistillerUi(
      web_ui, service, dom_distiller::kDomDistillerScheme);
}

#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
template <>
WebUIController* NewWebUI<WelcomeUI>(WebUI* web_ui, const GURL& url) {
  return new WelcomeUI(web_ui, url);
}
#endif  // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)

#if defined(OS_WIN)
template <>
WebUIController* NewWebUI<WelcomeWin10UI>(WebUI* web_ui, const GURL& url) {
  return new WelcomeWin10UI(web_ui, url);
}
#endif  // defined(OS_WIN)

bool IsAboutUI(const GURL& url) {
  return (url.host_piece() == chrome::kChromeUIChromeURLsHost ||
          url.host_piece() == chrome::kChromeUICreditsHost ||
          url.host_piece() == chrome::kChromeUIDNSHost
#if !defined(OS_ANDROID)
          || url.host_piece() == chrome::kChromeUITermsHost
#endif
#if defined(OS_LINUX) || defined(OS_OPENBSD)
          || url.host_piece() == chrome::kChromeUILinuxProxyConfigHost
#endif
#if defined(OS_CHROMEOS)
          || url.host_piece() == chrome::kChromeUIOSCreditsHost
#endif
          );  // NOLINT
}

// Returns a function that can be used to create the right type of WebUI for a
// tab, based on its URL. Returns NULL if the URL doesn't have WebUI associated
// with it.
WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
                                             Profile* profile,
                                             const GURL& url) {
  // This will get called a lot to check all URLs, so do a quick check of other
  // schemes to filter out most URLs.
  if (!url.SchemeIs(content::kChromeDevToolsScheme) &&
      !url.SchemeIs(content::kChromeUIScheme)) {
    return NULL;
  }

  // @todo ls
  if (url.host() == chrome::kChromeUIHelloWorldHost) {
	 return &NewWebUI<HelloWorldUI>;
  }

重新生成工程文件

Z:\chromium\src>gn gen --ide=vs out\Default_68_0_3440_84

重新编译工程

这步是编译过的,如果编译不过,对照官方文档和已有的web-ui实现,比对下区别.
官方文档很少有不对的时候,深深怀疑自己哪里搞错了。
也可能是做实验时间太长了,大脑短路了。

Z:\chromium\src>autoninja -C out\Default_68_0_3440_84 chrome

实验运行新加入的web_ui的效果

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值