WebKit -- qt javascript

在 QT 目录中打开下面的文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/runtime.cpp

有下面几行:

  1. #ifPLATFORM(QT)
  2. caseInstance::QtLanguage:{
  3. newInstance=Bindings::QtInstance::getQtInstance((QObject*)nativeInstance,rootObject);
  4. break;
  5. }
  6. #endif
#if PLATFORM(QT) case Instance::QtLanguage: { newInstance = Bindings::QtInstance::getQtInstance((QObject *)nativeInstance, rootObject); break; }#endif

这就表明,可以用 QtLanguage 来编写自定义的 javascript 对象。这里也有几个别的 Language,也就是说可以用它们来编写扩展 javascript 对象,应该也能自定义自己的 Language。既然是用 qt 的 GUI,使用 QtLanguage 应该是最合适的。

先打开它的例子文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/testqtbindings.cpp

可以看到其中有这样几行:

  1. staticcharcode[]=
  2. "myInterface.foo();/n"
  3. "myInterface.testString=/"Hello/";/n"
  4. "str=myInterface.testString;/n"
  5. "myInterface.testInt=10;/n"
  6. "i=myInterface.testInt;/n";
static char code[] = "myInterface.foo();/n" "myInterface.testString = /"Hello/";/n" "str = myInterface.testString;/n" "myInterface.testInt = 10;/n" "i = myInterface.testInt;/n";

这就是说,testqtbindings.cpp 的内容可以对下面的 javascript 进行解析:

  1. myInterface.foo();
  2. myInterface.testString="Hello";
  3. varstr=myInterface.testString;
  4. myInterface.testInt=10;
  5. vari=myInterface.testInt;
myInterface.foo();myInterface.testString = "Hello";var str = myInterface.testString;myInterface.testInt = 10;var i = myInterface.testInt;

我想定义自己的 javascript,比如在 myInterface 对象前面加上一个 优快云 对象:

  1. 优快云.myInterface.foo();
  2. 优快云.myInterface.testString="Hello";
  3. varstr=优快云.myInterface.testString;
优快云.myInterface.foo();优快云.myInterface.testString = "Hello";var str = 优快云.myInterface.testString;

这件事情本来很简单,可是就象 优快云.myInterface.foo() 这样,连接 优快云 和 myInterface 两个对象的事情,在网上(中文和英文网站)找了半天没找着,结果还是我自己想到的。

1. 在原来的文件中再添加一个 My优快云Object 对象:

  1. classMy优快云Object:publicQObject
  2. {
  3. Q_OBJECT
  4. Q_PROPERTY(QStringtestStringREADtestStringWRITEsetTestString)
  5. Q_PROPERTY(inttestIntREADtestIntWRITEsetTestInt)
  6. //添加QObject成员作为优快云对象的属性,映射到testMyInterface函数上
  7. Q_PROPERTY(QObject*myInterfaceREADtestMyInterface)
  8. public:
  9. My优快云Object():QObject(0),integer(0),m_myObject(NULL){}
  10. voidsetTestString(constQString&str){
  11. qDebug()<<"calledsetTestString"<<str;
  12. string=str;
  13. }
  14. voidsetTestInt(inti){
  15. qDebug()<<"calledsetTestInt"<<i;
  16. integer=i;
  17. }
  18. QStringtestString()const{
  19. qDebug()<<"calledtestString"<<string;
  20. returnstring;
  21. }
  22. inttestInt()const{
  23. qDebug()<<"calledtestInt"<<integer;
  24. returninteger;
  25. }
  26. //在这里返回一个QObject对象
  27. QObject*testMyInterface()
  28. {
  29. if(m_myObject==NULL)
  30. m_myObject=newMyObject();
  31. returnm_myObject;
  32. }
  33. QStringstring;
  34. intinteger;
  35. //声名一个QObject对象
  36. MyObject*m_myObject;
  37. publicslots:
  38. voidfoo(){qDebug()<<"fooinvoked";}
  39. };
class My优快云Object : public QObject{ Q_OBJECT Q_PROPERTY(QString testString READ testString WRITE setTestString) Q_PROPERTY(int testInt READ testInt WRITE setTestInt) // 添加 QObject 成员作为 优快云 对象的属性,映射到 testMyInterface 函数上 Q_PROPERTY(QObject* myInterface READ testMyInterface)public: My优快云Object() : QObject(0), integer(0), m_myObject(NULL){} void setTestString(const QString &str) { qDebug() << "called setTestString" << str; string = str; } void setTestInt(int i) { qDebug() << "called setTestInt" << i; integer = i; } QString testString() const { qDebug() << "called testString" << string; return string; } int testInt() const { qDebug() << "called testInt" << integer; return integer; } // 在这里返回一个 QObject 对象 QObject *testMyInterface() { if (m_myObject == NULL) m_myObject = new MyObject(); return m_myObject; } QString string; int integer; // 声名一个 QObject 对象 MyObject *m_myObject;public slots: void foo() { qDebug() << "foo invoked"; }};


这样 My优快云Object 和 MyObject 这样两个对象就可以连起来了,成为 优快云.testMyInterface


2. 修改一下创建的根对象的名字

  1. global->put(exec,Identifier("优快云"),Instance::createRuntimeObject(Instance::QtLanguage,(void*)myObject));
global->put(exec, Identifier("优快云"), Instance::createRuntimeObject(Instance::QtLanguage, (void*)myObject));


这样就可以了。这是个测试程序,需要把这些测试代码添加到 WebKit 浏览器中。打开文件:
./src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
把刚才的 MyObject 类和 My优快云Object 类在其中声名一下,然后添加优快云 根对象作为QWebFrame 类的私有成员,如下所示:

  1. classMyObject:publicQObject
  2. {
  3. Q_OBJECT
  4. //省略...
  5. };
  6. classMy优快云Object:publicQObject
  7. {
  8. Q_OBJECT
  9. //省略...
  10. };
  11. classQWEBKIT_EXPORTQWebFrame:publicQObject
  12. {
  13. Q_OBJECT
  14. Q_PROPERTY(qrealtextSizeMultiplierREADtextSizeMultiplierWRITEsetTextSizeMultiplier)
  15. Q_PROPERTY(QStringtitleREADtitle)
  16. Q_PROPERTY(QUrlurlREADurlWRITEsetUrl)
  17. Q_PROPERTY(QIconiconREADicon)
  18. Q_PROPERTY(QSizecontentsSizeREADcontentsSize)
  19. private:
  20. QWebFrame(QWebPage*parent,QWebFrameData*frameData);
  21. QWebFrame(QWebFrame*parent,QWebFrameData*frameData);
  22. ~QWebFrame();
  23. //声名优快云根对象
  24. My优快云Object*m_csdn;
  25. public:
  26. //以下省略...
  27. };
class MyObject : public QObject{ Q_OBJECT // 省略 ...};class My优快云Object : public QObject{ Q_OBJECT // 省略 ...};class QWEBKIT_EXPORT QWebFrame : public QObject{ Q_OBJECT Q_PROPERTY(qreal textSizeMultiplier READ textSizeMultiplier WRITE setTextSizeMultiplier) Q_PROPERTY(QString title READ title) Q_PROPERTY(QUrl url READ url WRITE setUrl) Q_PROPERTY(QIcon icon READ icon) Q_PROPERTY(QSize contentsSize READ contentsSize)private: QWebFrame(QWebPage *parent, QWebFrameData *frameData); QWebFrame(QWebFrame *parent, QWebFrameData *frameData); ~QWebFrame(); // 声名 优快云 根对象 My优快云Object *m_csdn; public: // 以下省略 ...};


打开 qwebframe.cpp 文件,在 QWebFrame 的构造函数中创建 优快云 根对象。

  1. QWebFrame::QWebFrame(QWebPage*parent,QWebFrameData*frameData)
  2. :QObject(parent)
  3. ,d(newQWebFramePrivate)
  4. {
  5. d->page=parent;
  6. d->init(this,parent->d->page,frameData);
  7. //在这里创建优快云根对象
  8. {
  9. KJS::Bindings::RootObject*root=d->frame->bindingRootObject();
  10. KJS::ExecState*exec=root->interpreter()->globalExec();
  11. KJS::JSObject*global=root->interpreter()->globalObject();
  12. m_csdn=newMy优快云Object();
  13. global->put(exec,KJS::Identifier("优快云"),KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage,(void*)m_csdn,root));
  14. }
  15. if(!frameData->url.isEmpty()){
  16. ResourceRequestrequest(frameData->url,frameData->referrer);
  17. d->frame->loader()->load(request,frameData->name);
  18. }
  19. }
QWebFrame::QWebFrame(QWebPage *parent, QWebFrameData *frameData) : QObject(parent) , d(new QWebFramePrivate){ d->page = parent; d->init(this, parent->d->page, frameData); // 在这里创建 优快云 根对象 { KJS::Bindings::RootObject *root = d->frame->bindingRootObject(); KJS::ExecState *exec = root->interpreter()->globalExec(); KJS::JSObject *global = root->interpreter()->globalObject(); m_csdn = new My优快云Object(); global->put(exec, KJS::Identifier("优快云"), KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage, (void *)m_csdn, root)); } if (!frameData->url.isEmpty()) { ResourceRequest request(frameData->url, frameData->referrer); d->frame->loader()->load(request, frameData->name); }}

在 QWebFrame 的析构函数中删除 优快云 根对象

  1. QWebFrame::~QWebFrame()
  2. {
  3. if(d->frame&&d->frame->loader()&&d->frame->loader()->client())
  4. static_cast(d->frame->loader()->client())->m_webFrame=0;
  5. if(m_csdn)
  6. {
  7. deletem_csdn;
  8. m_csdn=NULL;
  9. }
  10. deleted;
  11. }
QWebFrame::~QWebFrame(){ if (d->frame && d->frame->loader() && d->frame->loader()->client()) static_cast(d->frame->loader()->client())->m_webFrame = 0;if (m_csdn){delete m_csdn;m_csdn = NULL;} delete d;}

再手工编写一个 HTML 测试页 csdn1.htm,内容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script language="JavaScript">
<!--
function test()
{
优快云.myInterface.foo();
优快云.myInterface.testString = "Hello QtWebKit JavaScript";
var str = 优快云.myInterface.testString;
document.getElementById("txtMessage").innerHTML = str;
}
//-->
</script>
</head>

<body>
<p><a href="javascript:test();">test qt-webkit javascript</a></p>
<p id="txtMessage"></p>
</body>
</html>

编译并运行WebKit 浏览器,让它打开刚才的测试页 csdn1.htm,点击上面的 test qt-webkit javascript 链接,可以得到下面的效果:

上面的 Hello QtWebKit JavaScript 就是 javascript 设置的 优快云.myInterface.testString内容。

在 QT 目录中打开下面的文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/runtime.cpp

有下面几行:

  1. #ifPLATFORM(QT)
  2. caseInstance::QtLanguage:{
  3. newInstance=Bindings::QtInstance::getQtInstance((QObject*)nativeInstance,rootObject);
  4. break;
  5. }
  6. #endif
#if PLATFORM(QT) case Instance::QtLanguage: { newInstance = Bindings::QtInstance::getQtInstance((QObject *)nativeInstance, rootObject); break; }#endif

这就表明,可以用 QtLanguage 来编写自定义的 javascript 对象。这里也有几个别的 Language,也就是说可以用它们来编写扩展 javascript 对象,应该也能自定义自己的 Language。既然是用 qt 的 GUI,使用 QtLanguage 应该是最合适的。

先打开它的例子文件:
/src/3rdparty/webkit/JavaScriptCore/bindings/testqtbindings.cpp

可以看到其中有这样几行:

  1. staticcharcode[]=
  2. "myInterface.foo();/n"
  3. "myInterface.testString=/"Hello/";/n"
  4. "str=myInterface.testString;/n"
  5. "myInterface.testInt=10;/n"
  6. "i=myInterface.testInt;/n";
static char code[] = "myInterface.foo();/n" "myInterface.testString = /"Hello/";/n" "str = myInterface.testString;/n" "myInterface.testInt = 10;/n" "i = myInterface.testInt;/n";

这就是说,testqtbindings.cpp 的内容可以对下面的 javascript 进行解析:

  1. myInterface.foo();
  2. myInterface.testString="Hello";
  3. varstr=myInterface.testString;
  4. myInterface.testInt=10;
  5. vari=myInterface.testInt;
myInterface.foo();myInterface.testString = "Hello";var str = myInterface.testString;myInterface.testInt = 10;var i = myInterface.testInt;

我想定义自己的 javascript,比如在 myInterface 对象前面加上一个 优快云 对象:

  1. 优快云.myInterface.foo();
  2. 优快云.myInterface.testString="Hello";
  3. varstr=优快云.myInterface.testString;
优快云.myInterface.foo();优快云.myInterface.testString = "Hello";var str = 优快云.myInterface.testString;

这件事情本来很简单,可是就象 优快云.myInterface.foo() 这样,连接 优快云 和 myInterface 两个对象的事情,在网上(中文和英文网站)找了半天没找着,结果还是我自己想到的。

1. 在原来的文件中再添加一个 My优快云Object 对象:

  1. classMy优快云Object:publicQObject
  2. {
  3. Q_OBJECT
  4. Q_PROPERTY(QStringtestStringREADtestStringWRITEsetTestString)
  5. Q_PROPERTY(inttestIntREADtestIntWRITEsetTestInt)
  6. //添加QObject成员作为优快云对象的属性,映射到testMyInterface函数上
  7. Q_PROPERTY(QObject*myInterfaceREADtestMyInterface)
  8. public:
  9. My优快云Object():QObject(0),integer(0),m_myObject(NULL){}
  10. voidsetTestString(constQString&str){
  11. qDebug()<<"calledsetTestString"<<str;
  12. string=str;
  13. }
  14. voidsetTestInt(inti){
  15. qDebug()<<"calledsetTestInt"<<i;
  16. integer=i;
  17. }
  18. QStringtestString()const{
  19. qDebug()<<"calledtestString"<<string;
  20. returnstring;
  21. }
  22. inttestInt()const{
  23. qDebug()<<"calledtestInt"<<integer;
  24. returninteger;
  25. }
  26. //在这里返回一个QObject对象
  27. QObject*testMyInterface()
  28. {
  29. if(m_myObject==NULL)
  30. m_myObject=newMyObject();
  31. returnm_myObject;
  32. }
  33. QStringstring;
  34. intinteger;
  35. //声名一个QObject对象
  36. MyObject*m_myObject;
  37. publicslots:
  38. voidfoo(){qDebug()<<"fooinvoked";}
  39. };
class My优快云Object : public QObject{ Q_OBJECT Q_PROPERTY(QString testString READ testString WRITE setTestString) Q_PROPERTY(int testInt READ testInt WRITE setTestInt) // 添加 QObject 成员作为 优快云 对象的属性,映射到 testMyInterface 函数上 Q_PROPERTY(QObject* myInterface READ testMyInterface)public: My优快云Object() : QObject(0), integer(0), m_myObject(NULL){} void setTestString(const QString &str) { qDebug() << "called setTestString" << str; string = str; } void setTestInt(int i) { qDebug() << "called setTestInt" << i; integer = i; } QString testString() const { qDebug() << "called testString" << string; return string; } int testInt() const { qDebug() << "called testInt" << integer; return integer; } // 在这里返回一个 QObject 对象 QObject *testMyInterface() { if (m_myObject == NULL) m_myObject = new MyObject(); return m_myObject; } QString string; int integer; // 声名一个 QObject 对象 MyObject *m_myObject;public slots: void foo() { qDebug() << "foo invoked"; }};


这样 My优快云Object 和 MyObject 这样两个对象就可以连起来了,成为 优快云.testMyInterface


2. 修改一下创建的根对象的名字

  1. global->put(exec,Identifier("优快云"),Instance::createRuntimeObject(Instance::QtLanguage,(void*)myObject));
global->put(exec, Identifier("优快云"), Instance::createRuntimeObject(Instance::QtLanguage, (void*)myObject));


这样就可以了。这是个测试程序,需要把这些测试代码添加到 WebKit 浏览器中。打开文件:
./src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h
把刚才的 MyObject 类和 My优快云Object 类在其中声名一下,然后添加优快云 根对象作为QWebFrame 类的私有成员,如下所示:

  1. classMyObject:publicQObject
  2. {
  3. Q_OBJECT
  4. //省略...
  5. };
  6. classMy优快云Object:publicQObject
  7. {
  8. Q_OBJECT
  9. //省略...
  10. };
  11. classQWEBKIT_EXPORTQWebFrame:publicQObject
  12. {
  13. Q_OBJECT
  14. Q_PROPERTY(qrealtextSizeMultiplierREADtextSizeMultiplierWRITEsetTextSizeMultiplier)
  15. Q_PROPERTY(QStringtitleREADtitle)
  16. Q_PROPERTY(QUrlurlREADurlWRITEsetUrl)
  17. Q_PROPERTY(QIconiconREADicon)
  18. Q_PROPERTY(QSizecontentsSizeREADcontentsSize)
  19. private:
  20. QWebFrame(QWebPage*parent,QWebFrameData*frameData);
  21. QWebFrame(QWebFrame*parent,QWebFrameData*frameData);
  22. ~QWebFrame();
  23. //声名优快云根对象
  24. My优快云Object*m_csdn;
  25. public:
  26. //以下省略...
  27. };
class MyObject : public QObject{ Q_OBJECT // 省略 ...};class My优快云Object : public QObject{ Q_OBJECT // 省略 ...};class QWEBKIT_EXPORT QWebFrame : public QObject{ Q_OBJECT Q_PROPERTY(qreal textSizeMultiplier READ textSizeMultiplier WRITE setTextSizeMultiplier) Q_PROPERTY(QString title READ title) Q_PROPERTY(QUrl url READ url WRITE setUrl) Q_PROPERTY(QIcon icon READ icon) Q_PROPERTY(QSize contentsSize READ contentsSize)private: QWebFrame(QWebPage *parent, QWebFrameData *frameData); QWebFrame(QWebFrame *parent, QWebFrameData *frameData); ~QWebFrame(); // 声名 优快云 根对象 My优快云Object *m_csdn; public: // 以下省略 ...};


打开 qwebframe.cpp 文件,在 QWebFrame 的构造函数中创建 优快云 根对象。

  1. QWebFrame::QWebFrame(QWebPage*parent,QWebFrameData*frameData)
  2. :QObject(parent)
  3. ,d(newQWebFramePrivate)
  4. {
  5. d->page=parent;
  6. d->init(this,parent->d->page,frameData);
  7. //在这里创建优快云根对象
  8. {
  9. KJS::Bindings::RootObject*root=d->frame->bindingRootObject();
  10. KJS::ExecState*exec=root->interpreter()->globalExec();
  11. KJS::JSObject*global=root->interpreter()->globalObject();
  12. m_csdn=newMy优快云Object();
  13. global->put(exec,KJS::Identifier("优快云"),KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage,(void*)m_csdn,root));
  14. }
  15. if(!frameData->url.isEmpty()){
  16. ResourceRequestrequest(frameData->url,frameData->referrer);
  17. d->frame->loader()->load(request,frameData->name);
  18. }
  19. }
QWebFrame::QWebFrame(QWebPage *parent, QWebFrameData *frameData) : QObject(parent) , d(new QWebFramePrivate){ d->page = parent; d->init(this, parent->d->page, frameData); // 在这里创建 优快云 根对象 { KJS::Bindings::RootObject *root = d->frame->bindingRootObject(); KJS::ExecState *exec = root->interpreter()->globalExec(); KJS::JSObject *global = root->interpreter()->globalObject(); m_csdn = new My优快云Object(); global->put(exec, KJS::Identifier("优快云"), KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage, (void *)m_csdn, root)); } if (!frameData->url.isEmpty()) { ResourceRequest request(frameData->url, frameData->referrer); d->frame->loader()->load(request, frameData->name); }}

在 QWebFrame 的析构函数中删除 优快云 根对象

  1. QWebFrame::~QWebFrame()
  2. {
  3. if(d->frame&&d->frame->loader()&&d->frame->loader()->client())
  4. static_cast(d->frame->loader()->client())->m_webFrame=0;
  5. if(m_csdn)
  6. {
  7. deletem_csdn;
  8. m_csdn=NULL;
  9. }
  10. deleted;
  11. }
QWebFrame::~QWebFrame(){ if (d->frame && d->frame->loader() && d->frame->loader()->client()) static_cast(d->frame->loader()->client())->m_webFrame = 0;if (m_csdn){delete m_csdn;m_csdn = NULL;} delete d;}

再手工编写一个 HTML 测试页 csdn1.htm,内容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script language="JavaScript">
<!--
function test()
{
优快云.myInterface.foo();
优快云.myInterface.testString = "Hello QtWebKit JavaScript";
var str = 优快云.myInterface.testString;
document.getElementById("txtMessage").innerHTML = str;
}
//-->
</script>
</head>

<body>
<p><a href="javascript:test();">test qt-webkit javascript</a></p>
<p id="txtMessage"></p>
</body>
</html>

编译并运行WebKit 浏览器,让它打开刚才的测试页 csdn1.htm,点击上面的 test qt-webkit javascript 链接,可以得到下面的效果:

上面的 Hello QtWebKit JavaScript 就是 javascript 设置的 优快云.myInterface.testString内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值