webkit的js对象扩展(二)——binding方式创建自定义对象(多实例)

今天刚好有时间,把创建多实例对象的方法写一下,也就是可以像new Date()一样。关于new操作符有一篇讲的很详细,大家可以先看下http://www.pushiming.com/blog/2009/10/the-new-operator/

了解new操作符后大家应该已经知道,必须有一个构造器才能执行new操作。所以比单实例要多了一个过程,就是要创建构造器,下面我把步骤给贴出来。

以MultiObject为例。

1.添加MultiObject.h文件

view plain
  1. #ifndef MultiObject_h    
  2. #define MultiObject_h    
  3. #include <wtf/PassRefPtr.h>    
  4. #include <wtf/RefCounted.h>    
  5. #include <wtf/RefPtr.h>    
  6.     
  7. namespace WebCore {    
  8.     
  9. class Frame;    
  10. class String;    
  11.     
  12. class MultiObject : public RefCounted<MultiObject> {    
  13.     
  14.     public:    
  15.         static PassRefPtr<MultiObject> create(Frame* frame)    
  16.         {    
  17.             return adoptRef(new MultiObject(frame));    
  18.         }    
  19.     
  20.         ~MultiObject();    
  21.     
  22.         void disconnectFrame();    
  23.         Frame* frame() const { return m_frame; }    
  24.     
  25.         String description() const;    
  26.     private:    
  27.         MultiObject(Frame*);    
  28.         Frame* m_frame;    
  29. };    
  30. }    
  31.     
  32. #endif   

2.添加MultiObject.cpp文件

view plain
  1. #include "MultiObject.h"    
  2.     
  3. #include "PlatformString.h"  
  4.   
  5. #include "Frame.h"  
  6. #include "Page.h"  
  7. #include "RangerIFrameWidget.h"  
  8. #include "config.h"  
  9.   
  10. namespace WebCore {    
  11.     
  12.     MultiObject::MultiObject(Frame* frame)    
  13.         : m_frame(frame)    
  14.     {    
  15.     }    
  16.     
  17.     MultiObject::~MultiObject()    
  18.     {    
  19.         disconnectFrame();    
  20.     }    
  21.     
  22.     void MultiObject::disconnectFrame()    
  23.     {    
  24.         m_frame = 0;    
  25.     }    
  26.     
  27.     String MultiObject::description() const    //对象的属性    
  28.     {    
  29.         return "Hello World!";    
  30.     }    
  31. }  
3.添加MultiObject.idl文件

view plain
  1. module window {    
  2.     interface [  
  3. CustomConstructor  
  4. ] MultiObject{    
  5.         readonly attribute DOMString description;    
  6.     };    
  7. }  

4.修改DOMWindow.h文件

添加声明如下:

view plain
  1. attribute [JSCCustomGetter] MultiObjectConstructor MultiObject;  


WebCore/bindings/js

5.添加JSMultiObjectConstructor.h

view plain
  1. #ifndef __JSMultiObjectConstructor_h__  
  2. #define __JSMultiObjectConstructor_h__  
  3.   
  4. #include "JSDOMBinding.h"  
  5.   
  6. namespace WebCore {  
  7.   
  8. class JSMultiObjectConstructor : public DOMConstructorObject {  
  9. public:  
  10.     JSMultiObjectConstructor(JSC::ExecState*, JSDOMGlobalObject*);  
  11.     static const JSC::ClassInfo s_info;  
  12. private:  
  13.     virtual JSC::ConstructType getConstructData(JSC::ConstructData&);  
  14.     virtual const JSC::ClassInfo* classInfo() const { return &s_info; }  
  15. };  
  16.   
  17. // namespace WebCore  
  18.   
  19. #endif//__JSMultiObjectConstructor_h__  
6.添加JSMultiObjectConstructor.cpp
view plain
  1. #include "config.h"  
  2. #include "JSMultiObjectConstructor.h"  
  3. #include "JSMultiObject.h"  
  4. #include "ScriptExecutionContext.h"  
  5. #include "MultiObject.h"  
  6. #include <runtime/Error.h>  
  7. #include "JSDOMWindowBase.h"  
  8.   
  9. using namespace JSC;  
  10.   
  11. namespace WebCore {  
  12.   
  13. ASSERT_CLASS_FITS_IN_CELL(JSMultiObjectConstructor);  
  14.   
  15. const ClassInfo JSMultiObjectConstructor::s_info = { "MultiObjectConstructor", 0, 0, 0 };  
  16.   
  17. JSMultiObjectConstructor::JSMultiObjectConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)  
  18.     : DOMConstructorObject(JSMultiObjectConstructor::createStructure(globalObject->objectPrototype()), globalObject)  
  19. {  
  20.     putDirect(exec->propertyNames().prototype, JSMultiObjectPrototype::self(exec, globalObject), None);  
  21. }  
  22.   
  23. static JSObject* constructMultiObject(ExecState* exec, JSObject* constructor, const ArgList&)  
  24. {  
  25.     JSMultiObjectConstructor* jsConstructor = static_cast<JSMultiObjectConstructor*>(constructor);  
  26.     JSDOMWindowBase* window = static_cast<JSDOMWindowBase*>(jsConstructor->globalObject());  
  27.     if (!window || !window->impl() || !window->impl()->frame())  
  28.         return Error::create(exec, ReferenceError, "Can not create MultiObject...", -1, -1, UString());  
  29.     RefPtr<MultiObject> MultiObject = MultiObject::create(window->impl()->frame());  
  30.     if (!MultiObject.get())  
  31.         return Error::create(exec, ReferenceError, "Not support MultiObject...", -1, -1, UString());  
  32.     return CREATE_DOM_OBJECT_WRAPPER(exec, jsConstructor->globalObject(), MultiObject, MultiObject.get());  
  33. }  
  34.   
  35. ConstructType JSMultiObjectConstructor::getConstructData(ConstructData& constructData)  
  36. {  
  37.     constructData.native.function = constructMultiObject;  
  38.     return ConstructTypeHost;  
  39. }  
  40.   
  41. // namespace WebCore  
7.修改JSDOMWindowCustom.cpp

view plain
  1. #include "JSMultiObjectConstructor.h"  
  2.   
  3.   
  4. JSValue JSDOMWindow::multiObject(ExecState* exec) const  
  5. {  
  6.     return getDOMConstructor<JSMultiObjectConstructor>(exec, this);  
  7. }  

OK,再修改相应的CMakeLists.txt就行了。

注意:头文件包含依据自己的项目。

你可能感兴趣的:(扩展,webkit,interface,Constructor,wrapper,binding)