前言: Chromium浏览器采用的是V8引擎解析javascript代码, V8引擎相对于传统的JS引擎效率上有很大的提高,主要是因为它将js代码直接编译成了目标机器代码. V8引擎的编译过程主要是 js代码->抽象代码树->目标机器代码. 而传统的js编译过程是 js代码->抽象代码树->中间代码->解释执行.  V8引擎在执行需要重复调用函数的js代码中效率有显著提升,但是在执行代码量庞大,函数一般是单次调用的JS代码效率上却并不明显,原因是重复调用的函数只需要被编译成一次机器码就能重复执行,而传统的解释执行方式却需要每次都去解释执行.

在做Chromium浏览器定制化需求时常常需要扩展JS对象以增加js的功能. 在javascript这门编程语言的概念里,一切皆为对象,变量,函数等等一切皆为对象,没有类的概念,javascript是一门动态语言,它的主要特点是对象的类型和内容是在运行时决定的,是可以不断变化的. 在javascript的世界里,根对象是global对象,所有的一切对象皆为global的子孙对象.在浏览器中,这个global对象的表现为window对象. 在webkit中已实现的对象称为javascript内部对象,内部对象又分为本地对象和内置对象. 本地对象需要由用户在js代码中使用new方法初化始对象之后才能使用,内置对象是在webkit中已初始化好了可以直接使用. 例如

Test为js本地对象,使用方法为:  Test test = new Test(); alert(test.value);

Test为js内置对象,使用方法为:  alert(Test.value);

一: 现在以扩展一个javascript Test本地对象为例子说明如何扩展webkit js对象(本方法试验的chorium版本为53):

实现目标:  以下js代码能够顺利执行

var test = new Test(“aaa”,”bbb”,”ccc”);

test.setValue(“value”);

alert(“ip = “ + test.address  + “,mask = “ + test.mask + “,gateway =”+test.gateway + “,value =  “ + test.value);

实现步骤:

1.在webkit 的core目录(浏览器根目录/src/wibkit/Source/core)相应的位置分别新建Test.idl,Test.h,Test.cpp文件.并在core.gypi中相应的位置将.idl和c文件包含进去.

2..idl文件是连接js对象和c++对象的媒介,首先根据你要设计的js对象的属性和方法来确定.idl对象,再根据.idl文件来写相应的.h 和 .cpp文件.

现在要新增一个 本地js对象,对象名称为Test,它的构造方法是传入三个字符串参数,它有三个可读写字符串属性adress,mask,gateway,一个只读字符串属性value,一个方法为setValue.

那么Test.idl文件的内容为.

[

Constructor(DOMString ip,DOMString mask,DOMString gateway),

] interface Test {

readonly  attribute DOMString value;

attribute DOMString address;

attribute DOMString mask;

attribute DOMString gateway;

void setValue(DOMString value);

};

在window.idl中加上:

attribute TestConstructor Test;   //注意这里的Test对应的javascript中的Test,如果这里是myTest,那么js代码就是 new myTest(...)

现在写Test 对应的c++类,它需要实现 static Test * create(String & str1,String &str2,String& str3)供外部调用. 只读属性 value 对应的方法 String  value() const;  可读写属性对应的方法 String address() const; void setAddress(const String& ip); //(注意这里的函数名要与前面.idl文件声明的属性名称一致,设置属性的函数需要在前面加set并将第一个字母大写,如setAdress函数名一致),mask , gateway属性如上.  .idl中声明的方法在c++类中的方法一致,只需要照旧声明一个方法 void setValue(String &value);就行.  好了,只需要把这些接口实现所有工作就完成了. 接下来就可以编译运行测试了.

类的实现代码如下所示:

#ifndef TEST_H

#define TEST_H

#include "wtf/PassRefPtr.h"

#include "core/CoreExport.h"

#include "bindings/core/v8/ScriptWrappable.h"

#include "wtf/RefCounted.h"

#include "wtf/text/WTFString.h"

namespace blink {

class Test  :  public RefCountedWillBeGarbageCollectedFinalized<Test>,public ScriptWrappable{

DEFINE_WRAPPERTYPEINFO();

public:

virtual ~Test();

static PassRefPtrWillBeRawPtr<Test> create(){

return  create( String(""), String(""), String(""));

}

static PassRefPtrWillBeRawPtr<Test> create(String ip,String mask,String gateway );

String address() const;

String mask() const;

String gateway() const;

void setAddress(const String& ip){mIp=ip;}

void setMask(const String& mask){mMask=mask;}

void setGateway(const String& gateway){mGateWay=gateway;}

String value() const;

void setValue(const String& value){mValue=value;}

private:

explicit Test(String,String,String);

String mValue;

String mIp;

String mMask;

String mGateWay;

};

}

#endif

二 webkit扩展js内置对象的方法

还是以上面的 Test为例:

1.在Test.idl中将[

Constructor(DOMString ip,DOMString mask,DOMString gateway),

] 去除.

2. 在 window.idl 将原来的声明改为 [Replaceable] readonly attribute Test Test;

3. DomWindow.h中增加Test的虚函数构造方法声明 virtual Test* test() const {return NULL;}

4.在LocalDOMWindow.h中声明方法 Test* test() const  override,新增变量mutable PersistentWillBeMember<Test> m_test;

5.在LocalDomWindow.cpp中对 test方法做实现

Test* LocalDOMWindow::test() const

{

if (!m_test)

m_test = Test::create();

return m_test.get();

}

三: 实现原理

Chromium编译系统会首先去解析test.idl,通过python脚本解析.idl文件生成相应的v8test.cpp,v8test.h. v8test对象 会调用到我们手动写的test对象. v8test.cpp对象绑定了js对象相应的属性和方法,所以在运行时V8解析javascript代码时能够找到找到关联的c++对象上. 运行Test 的js代码相应的调用步骤是: V8引擎解析js代码-> v8Test类->Test类.

四: 总结

在webkit中扩展js对象的方法比较简单,实现过程中出现出错一般也能通过参照原有的代码找到解决方法. 本文是对chorium浏览器如何扩展js对象作了大体概述,但是对于 python脚本如何解析.idl文件生成对应代码,v8引擎如何解析javascript代码这些内部原理本文未涉及.

Chromium浏览器扩展JS对象方法相关推荐

  1. 火狐中怎么把xml转换为html,创建兼容IE、火狐、chrome、oprea浏览器的xmlDom对象方法...

    在IE和火狐下,可以直接创建xmlDom对象来载入xml文件,但是在chrome和opera等webkit内核的浏览器下,则只能通过xmlhttp方式进行获取. 在IE和火狐下,直接创建的xmlDom ...

  2. 小程序-调用公共js对象方法/ app.js

    在小程序中,如果在子页面想调用共公js的方法,需先在子页面js中先实例化app:具体过程如下 子页面js: 1 2 3 4 5 6 7 8 //调用公共js对象以便调用其方法 var app = ge ...

  3. replace为undefined_手写 XML 转化为 JS对象 方法

    function xml(str, is = true){ //解析XML/* 定义返回的对象 */let result = { //解析成功返回的对象(标签名,属性集合对象[属性名:属性值...], ...

  4. 扩展js对象数组的OrderByAsc和OrderByDesc方法

    看了一段时间关于js原型的知识,js的扩展方法是基于原型的,如Array.prototype.XXXX就是给Array扩展XXX方法,然后数组都能使用这个方法了. 在对象数组里面经常有根据属性来进行排 ...

  5. 扩展js string 方法

    eg : //扩展strWith方法 String.prototype.startWith = function (str) {     if (str == null || str == " ...

  6. 前后端整合---js对象方法---异步组件

    a={b:function(){console.log("b")}} {b: ƒ} a.b ƒ (){console.log("b")} a.b() b a={ ...

  7. java与jquery的选择器区别_java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...

    第一章JQuery 基础 1. 概念: 一个JavaScript框架.简化JS开发 * jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScrip ...

  8. 【jQuery笔记Part1】06-jQuery对象与js对象转换

    jQuery对象与js对象转换 概念 为什么要转换 转化方法 JS对象 -> jQuery对象 jQuery对象 -> JS对象 原理图 jQuery笔记目录 概念 jQuery对象 是通 ...

  9. java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...

    第一章  JQuery 基础 1. 概念: 一个JavaScript框架.简化JS开发 * jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScr ...

  10. day43 JavaWen阶段——JQuery 基础(JQuery相关开发文档,JQuery对象和JS对象区别与转换,JQuery选择器,JQuery中DOM操作,案列【QQ表情选择】【左右移动】)

    今日内容 1. JQuery 基础: 概念 快速入门 JQuery对象和JS对象区别与转换 选择器 DOM操作 案例 今日源码: 链接:https://pan.baidu.com/s/1KiG0c_V ...

最新文章

  1. BZOJ 3241: [Noi2013]书法家
  2. 小孩学python有意义吗-世界冠军教练告诉你:少儿编程这些坑,能不踩就别踩!...
  3. FlexRay车载网络标准
  4. 变种 背包问题_【朝夕的ACM笔记】动态规划-背包问题
  5. H5移动端页面设计心得分享
  6. scikit-learn决策树算法类库使用小结及可视化方法
  7. 使用Apache JMeter负载测试Web应用程序
  8. 3. 无重复字符的最长子串 golang
  9. C语言的整型溢出问题
  10. 重构知识的供给模式 ——《数据平台》从思考到落地
  11. Python os.system(command),这样执行的command命令,和主程序是异步的吗?
  12. 基于channel的goroutine
  13. Qt学习之路(54): 自定义拖放数据对象
  14. 图片滚动js 实现图片无缝滚动
  15. clover更新驱动 后不能开机_MAC 10.14 安装教程-CLOVER的简单操作说明
  16. dell服务器监控中起什么作用,Dell服务器管理软件 | 戴尔服务器监控 - ManageEngine OpManager...
  17. MTI Further
  18. 手机通过笔记本上网~
  19. 蛮荒搜神记服务器在维护,蛮荒搜神记法宝洗练图文教程 蛮荒搜神记如何提升战斗力?-游侠网...
  20. zlib简单使用说明(转)

热门文章

  1. win10怎么共享打印机_win10怎么连接局域网打印机
  2. 面试题——红黑树,B树、B+树
  3. 计算机桌面有阴影,电脑桌面图标有蓝色阴影 怎么去除桌面图标阴影
  4. 从cocos2d-x到unity看游戏研发、设计中一些要点
  5. 读书随笔《36岁, 半熟人生》
  6. Qt程序无响应 原因总结
  7. CDH集群更换ip,主机名
  8. 基于深度学习目标检测的人工智能玩游戏
  9. ##C语言学习的感悟
  10. 修改Window的hosts文件提示“该文件被其他程序占用,无法修改问题”解决方案