解析Android WebKit插件基本結構
Android WebKit插件基本結構是本文要介紹的內容,主要是來了解并學習Android WebKit插件的應用,具體內容的實現來看本文詳解。
1、插件
WebKit插件在和引擎交互時,主要涉及到兩個接口:
插件=>引擎:NPNetscapeFuncs
引擎=>插件:NPPluginFuncs
其中,插件到引擎的接口WebKit已經實現了。插件要做的事情就是實現引擎=>插件的接口。
- 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的插件例子來進行講解插件的基本原理。
2、Android WebKit插件
接口的初始化:
NPNetscapeFuncs的初始化:
- initializeExtraBrowserFuncs
事件處理:
- HTMLPlugInElement::defaultEventHandler
- PluginView::handleEvent
- PluginView::handleTouchEvent
- PluginWidgetAndroid::sendEvent
- NPPluginFuncs::event
進入具體插件的NPP_HandleEvent
創建Surface:
- PluginView::setFrameRect
- PluginView::setNPWindowIfNeeded
- PluginWidgetAndroid::setWindow
- PluginWidgetAndroid::layoutSurface
- NPPluginFuncs::getvalue,kJavaSurface_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(new PluginViewBridgeAndroid());
- new PluginWidgetAndroid
- }
小結:解析Android WebKit插件基本結構的內容介紹完了,希望通過Android WebKit插件內容的學習能對你有所幫助!