webkit插件

来源:互联网 发布:怎样淘宝刷好评挣钱 编辑:程序博客网 时间:2024/05/17 13:45

1.        插件

WebKit插件在和引擎交互时,主要涉及到两个接口:

插件=>引擎:NPNetscapeFuncs

引擎=>插件:NPPluginFuncs

其中,插件到引擎的接口WebKit已经实现了。插件要做的事情就是实现引擎=>插件的接口。

typedef struct _NPPluginFuncs {

    uint16_t size;

    uint16_tversion;

    NPP_NewUPPnewp;

    NPP_DestroyUPPdestroy;

   NPP_SetWindowUPP setwindow;

   NPP_NewStreamUPP newstream;

   NPP_DestroyStreamUPP destroystream;

    NPP_StreamAsFileUPPasfile;

   NPP_WriteReadyUPP writeready;

    NPP_WriteUPPwrite;

    NPP_PrintUPPprint;

   NPP_HandleEventUPP event;

   NPP_URLNotifyUPP urlnotify;

    // The type ofthis used to be JRIGlobalRef, which was a void *.

    // Use void *here directly now that we don't expose any Java

    // specificthings in the plugin API.

    void*javaClass;

    NPP_GetValueUPPgetvalue;

    NPP_SetValueUPPsetvalue;

} NPPluginFuncs;

本文将参考Android的插件例子来进行讲解插件的基本原理。

2.        AndroidWebKit插件

接口的初始化:

NPNetscapeFuncs的初始化:

initializeExtraBrowserFuncs

 

事件处理:

HTMLPlugInElement::defaultEventHandler

PluginView::handleEvent

PluginView::handleTouchEvent

PluginWidgetAndroid::sendEvent

NPPluginFuncs::event

进入具体插件的NPP_HandleEvent

 

创建Surface

PluginView::setFrameRect

PluginView::setNPWindowIfNeeded

PluginWidgetAndroid::setWindow

PluginWidgetAndroid::layoutSurface

NPPluginFuncs::getvaluekJavaSurface_ANPGetValue

进入插件NPP_GetValue

所谓Surface,其实就是一块内存区域。对于BackgroundPlugin,就是继承自TextView

也有可能是SurfaceView的子类,取决于具体应用情境。

 

设置窗口并刷新:

PluginView::setParent|PluginView::paint

PluginView::updatePluginWidget|PluginView::setFrameRect

PluginView::setNPWindowIfNeeded(!!!)

m_plugin->pluginFuncs()->setwindow

NPP_SetWindow(NPPluginFuncs::setwindow)

NPNetscapeFuncs::invalidaterect

NPN_InvalidateRect

PluginView::invalidateRect

 

刷新界面:

PluginView::invalidateRect

PluginWidgetAndroid::inval

WebViewCore::invalPlugin

WebViewCore::pluginInvalTimerFired

WebViewCore::drawPlugins

PluginWidgetAndroid::draw,发出kDraw_ANPEventType事件,

NPPluginFuncs::event

 

插件的加载:

HTMLObjectElement::attach

HTMLPlugInElement::updateWidgetCallback

HTMLObjectElement::updateWidget|HTMLEmbedElement::updateWidget|FrameView::updateWidgets|

RenderEmbeddedObject::updateWidget

FrameLoader::requestObject

FrameLoader::loadPlugin

FrameLoaderClientAndroid::createPlugin

PluginView::create

PluginView::platformInit

PluginView::PluginView

PluginView::platformInit

{

 setPlatformWidget(newPluginViewBridgeAndroid());

 newPluginWidgetAndroid

}

原创粉丝点击