为WebKit扩展JavaScript对象
我们知道在W3C标准中, 已经定义了一套标准的JavaScript对象集合. 当今主流的浏览器都对这套标准支持的很好. 那如果我们的浏览器想要个性一些, 是否可以在这套标准外, 定义属于我们自己的特定JavaScript对象呢, 在webkit中当然是可以的.
下面我们就在android平台的webkit中, 新添加一个JS对象, AndroidObject, 并让这个对象有一个description属性.
1. 在webcore/page/下新添加3个文件, 加AndroidObject.h, AndroidObject.cpp, AndroidObject.idl.
每个文件的内容如下:
AndroidObject.h
#ifndef AndroidObject_h
#define AndroidObject_h
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include "PlatformString.h"
namespace WebCore {
class AndroidObject : public RefCounted<AndroidObject> {
public:
static PassRefPtr<AndroidObject> create() { return adoptRef(new AndroidObject()); }
String description() const;
private:
AndroidObject();
};
}
#endif
AndroidObject.cpp
#include "config.h"
#include "AndroidObject.h"
namespace WebCore {
AndroidObject::AndroidObject()
{
}
String AndroidObject::description() const
{
return "this is specific Android Object";
}
}
AndroidObject.idl
module window {
interface [OmitConstructor] AndroidObject {
readonly attribute DOMString description;
};
}
2. 在webcore/page/DOMWindow.h中, 新加如下声明:
class AndroidObject;
…
public:
AndroidObject* AndroidObject() const;
AndroidObject* optionalAndroidObject() const { return m_androidObject.get(); }
private:
mutable RefPtr<AndroidObject> m_androidObject;
3. 在DOMWindow.cpp文件中添加接口实现:
AndroidObject* DOMWindow::androidObject() const
{
if (!m_helloObject)
m_androidObject = AndroidObject::create();
return m_androidObject.get();
}
在DOMWindow::clear()函数中添加:
m_androidObject = 0;
4. 修改DOMWindow.idl文件添加:
attribute [Replaceable] AndroidObject androidObject;
为Widnow对象新加一个属性AndroidObject
5. 最后就是修改编译文件, 把我们新加的文件编译进webkit:
首先修改Source/WebCore/Android.mk,增加page/AndroidObject.cpp到LOCAL_SRC_FILES变量.
然后因为默认使用的是V8 engine, 修改Source/WebCore/Android.derived.v8bindings.mk,增加$(intermediates)/bindings/V8AndroidObject.h到GEN变量, 目的是让脚本根据AndroidObject.idl生成V8AndroidObject.h文件.
最后我们就可以用如下网页进行验证了:
<html>
<body>
<script type="text/javascript">
document.write(AndroidObject.description + "</p>");
</script>
</body>
</html>
在规范js对象集合外扩展新的js对象, 在特定场合是有意义的, 比如运营商或特定网络商想要推自己网页只能在特定的浏览器下可以正常工作, 就可以做这部分扩展. 因为用别的浏览器访问这个特定页面会直接报js错误. 比如我们的春运铁路订票系统是不是可以用这个特性达到某种意义上的公平呢?