解析Android WebKit插件基本結(jié)構(gòu)
Android WebKit插件基本結(jié)構(gòu)是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)Android WebKit插件的應(yīng)用,具體內(nèi)容的實(shí)現(xiàn)來看本文詳解。
1、插件
WebKit插件在和引擎交互時(shí),主要涉及到兩個(gè)接口:
插件=>引擎:NPNetscapeFuncs
引擎=>插件:NPPluginFuncs
其中,插件到引擎的接口WebKit已經(jīng)實(shí)現(xiàn)了。插件要做的事情就是實(shí)現(xiàn)引擎=>插件的接口。
- typedef struct _NPPluginFuncs {
- uint16_t size;
- uint16_t version;
- NPP_NewUPP newp;
- NPP_DestroyUPP destroy;
- NPP_SetWindowUPP setwindow;
- NPP_NewStreamUPP newstream;
- NPP_DestroyStreamUPP destroystream;
- NPP_StreamAsFileUPP asfile;
- NPP_WriteReadyUPP writeready;
- NPP_WriteUPP write;
- NPP_PrintUPP print;
- NPP_HandleEventUPP event;
- NPP_URLNotifyUPP urlnotify;
- // The type of this used to be JRIGlobalRef, which was a void *.
- // Use void * here directly now that we don't expose any Java
- // specific things in the plugin API.
- void* javaClass;
- NPP_GetValueUPP getvalue;
- NPP_SetValueUPP setvalue;
- } NPPluginFuncs;
本文將參考Android的插件例子來進(jìn)行講解插件的基本原理。
2、Android WebKit插件
接口的初始化:
NPNetscapeFuncs的初始化:
- initializeExtraBrowserFuncs
事件處理:
- HTMLPlugInElement::defaultEventHandler
- PluginView::handleEvent
- PluginView::handleTouchEvent
- PluginWidgetAndroid::sendEvent
- NPPluginFuncs::event
進(jìn)入具體插件的NPP_HandleEvent
創(chuàng)建Surface:
- PluginView::setFrameRect
- PluginView::setNPWindowIfNeeded
- PluginWidgetAndroid::setWindow
- PluginWidgetAndroid::layoutSurface
- NPPluginFuncs::getvalue,kJavaSurface_ANPGetValue
進(jìn)入插件NPP_GetValue
所謂Surface,其實(shí)就是一塊內(nèi)存區(qū)域。對(duì)于BackgroundPlugin,就是繼承自TextView。
也有可能是SurfaceView的子類,取決于具體應(yīng)用情境。
設(shè)置窗口并刷新:
- 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,發(fā)出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(new PluginViewBridgeAndroid());
- new PluginWidgetAndroid
- }
小結(jié):解析Android WebKit插件基本結(jié)構(gòu)的內(nèi)容介紹完了,希望通過Android WebKit插件內(nèi)容的學(xué)習(xí)能對(duì)你有所幫助!