Previous Entry Share Next Entry
Custom DOM object for WebKit
and_cesbo
Ранее писал, как добавить собственный JavaScript DOM объект в фаерфокс : тут
Там же описано зачем всё это может пригодиться.
Сделал тоже самое для WebKit-a, легче портировать на различные платформы (использовать вместе с Qt, можно без иксов только на фрэймбуфере запустить полноценный браузер).
В отличии от фаерфокса времени затратил на много меньше.

Также как и в случае с фаерфоксом, объект будет называться BoxAPI.
Создадим три файла для описания методов/переменных объекта. (в кталоге ./WebCore/page/)

BoxAPI.idl
module window {
 
    interface [OmitConstructor] BoxAPI {
        readonly attribute unsigned long date;
    };
 
}


BoxAPI.h
#ifndef BoxAPI_h
#define BoxAPI_h
 
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
 
namespace WebCore {
 
    class Frame;
 
    class BoxAPI : public RefCounted<BoxAPI> {
    public:
        static PassRefPtr<BoxAPI> create(Frame *frame) { return adoptRef(new BoxAPI(frame)); }
 
        Frame* frame() const;
        void disconnectFrame();
 
        unsigned date() const;
 
    private:
        BoxAPI(Frame*);
 
        Frame* m_frame;
    };
 
} // namespace WebCore
 
#endif // BoxAPI_h


BoxAPI.cpp
#include "config.h"
#include "BoxAPI.h"
 
#include "FloatRect.h"
#include "Frame.h"
#include "FrameView.h"
#include "Widget.h"
 
namespace WebCore {
 
BoxAPI::BoxAPI(Frame* frame)
    : m_frame(frame)
{
}
 
Frame* BoxAPI::frame() const
{
    return m_frame;
}
 
void BoxAPI::disconnectFrame()
{
    m_frame = 0;
}
 
unsigned BoxAPI::date() const
{
    return static_cast<unsigned>(1984);
}
 
} // namespace WebCore


Теперь необходимо включить исходники объекта в проект, для этого правим несколько файлов:
./WebCore/page/DOMWindow.idl
после объявления интерфейсов идёт список "начинки" класса, в самое начало, перед "// DOM Level 0" добавляем:
readonly attribute BoxAPI boxapi;

./WebCore/page/DOMWindow.h
в начале namespace, где идёт список классов, в начале добавляем class BoxAPI;
в public класса DOMWindow, перед "// DOM Level 0", добавляем BoxAPI* boxapi() const;
ниже в этом же классе идёт список методов для JSDOMWindowCustom.cpp, добавляем BoxAPI* optionalBoxAPI() const { return m_boxapi.get(); }
в private класса DOMWindow, добавляем mutable RefPtr<BoxAPI> m_boxapi;

./WebCore/page/DOMWindow.cpp
в начале: #include "BoxAPI.h"
в коде, я добавил перед "Screen* DOMWindow::screen...", добавляем:
BoxAPI* DOMWindow::boxapi() const
{
    if (!m_boxapi)
        m_boxapi = BoxAPI::create(m_frame);
    return m_boxapi.get();
}


./WebCore/bindings/js/JSDOMWindowCustom.cpp
в функцию markChildren, добавляем: markDOMObjectWrapper(markStack, globalData, impl()->optionalBoxAPI());

./WebCore/WebCore.pro
добавляем в списки по алфавиту
переменная SOURCES : page/BoxAPI.cpp \
переменная HEADERS : page/BoxAPI.h \

./WebCore/WebCore.gypi
также по алфавиту
в раздел webcore_bindings_idl_files : 'page/BoxAPI.idl',
в раздел webcore_files : 'page/BoxAPI.cpp', 'page/BoxAPI.h',

./WebCore/WebCore.pri
переменная IDL_BINDINGS : page/BoxAPI.idl \

?

Log in

No account? Create an account