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插件内容的学习能对你有所帮助!