Chromium源码(基于103版本) 实现内置扩展

1. 创建扩展的web资源文件

在src\chrome\browser\resources\myapi文件夹下,其中manifest.json文件的“key”的来源:通过载入一个自定义的crx插件然后在chromium的appdata下找到该插件的key,该key可能被用于计算extension-id,如果扩展无法调用接口,有可能是key不对,在src\base\base64.cc的Base64Decode函数处做检查。

manifest.json:

{
    "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi4h7GFx0NvfD3EhvKNf7bAp2/U+0Be92WDRgkkOG8l+73weIDb7/UpZ831JSFxnjtOoKj7PLTYk//tYd3ZYhIdnZfPap6M6s0v8nzibCkvqCbsChg7EbuJ6Cf3l4upU+0QTPHYKswcDBkMg6oNrRj3vhWeKUEBPktBu99/S2MKwIDAQAB",
    "name": "myapi_rmb999",
    "version": "1.0",
    "manifest_version": 2,
    "description": "myapi",
    "permissions": ["myapi"],
    "chrome_url_overrides": {
        "rmb999": "popup.html"
    },
    "content_security_policy": "object-src 'self'; script-src chrome://resources 'self'"
}

popup.html:

<html>
<body>
    <p>Hello World</p>
    <script type="text/javascript" src="test.js">
    </script>
</body>
</html>

test.js:

function myapi() {
    var input = {};
    input.data = 'helloworld';
    input.name = 'rmb999';
    var strInput = JSON.stringify(input);
    chrome.myapi.helloWorld((strInput), function(data){
        alert('result = ' + data);
    });        
}
chrome.browserAction.onClicked.addListener(myapi);
myapi();

2. 把web资源添加到src\chrome\browser\resources\component_extension_resources.grd文件中,用于资源打包,必须把除了mainfest.json文件之外的其他独立文件都加进来

  <include name="IDR_MYAPI_MAIN" file="myapi/popup.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
  <include name="IDR_MYAPI_COMMON_JS" file="myapi/test.js" type="BINDATA" />

3. 添加ID跟扩展资源的对应关系。在:src\chrome\browser\browser_resources.grd 文件下,定义一个ID IDR_MYAPI_MANIFEST跟扩展mainfest.json的关联

      <include name="IDR_MYAPI_MANIFEST" file="resources\myapi\manifest.json" type="BINDATA" />

4. 添加IDR_MYAPI_MANIFEST对应的扩展的加载放到 src\chrome\browser\extensions\component_loader.cc文件下,AddDefaultComponentExtensions()函数中

  Add(IDR_CLOUDPRINT_MANIFEST, FilePath(FILE_PATH_LITERAL("cloud_print")));
  Add(IDR_MYAPI_MANIFEST, FilePath(FILE_PATH_LITERAL("myapi")));

5. 在src\chrome\common\extensions\extension.cc文件的LoadChromeURLOverrides函数下增加被扩展函数的override逻辑

    // Restrict override pages to a list of supported URLs.
    bool is_override = (page != chrome::kChromeUINewTabHost &&
                        page != chrome::kChromeUIBookmarksHost &&
                        page != chrome::kChromeUIHistoryHost &&
                        page != "rmb999"
                        );

    这样子就可以使用chrome:\\rmb999 打开页面了,该页面使用的是扩展的API,同时它打包在resource.pak里。

    特别注意,manifest.json中的chrome_url_overrides的键必须跟LoadChromeURLOverrides里添加的Host名称一致。如果要修改chrome://...的hostname名称需要修改两个地方,一个是manifest.json的chrome_url_overrides的子键,一个是extension.cc文件LoadChromeURLOverride函数里“Restrict override pages to a list of supported URLs.”处的Host名称。

    使用*.json添加扩展API,可以参考top_site.json的实现。

    使用*.idl添加扩展API,可以参考downloads.idl的实现。

    添加内置扩展,可以参考chrome://bookmarks的实现

6. 下一节继续讲解通过IDL方式添加扩展API

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值