Tag Archives: Android WebKit插件

[repost ]解析Android WebKit插件基本结构

original:http://mobile.51cto.com/widget-290455.htm

Android WebKit插件基本结构是本文要介绍的内容,主要是来了解并学习Android WebKit插件的应用,具体内容的实现来看本文详解。

1、插件

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

插件=>引擎:NPNetscapeFuncs

引擎=>插件:NPPluginFuncs

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

  1. typedef struct _NPPluginFuncs {
  2.     uint16_t size;
  3.     uint16_t version;
  4.     NPP_NewUPP newp;
  5.     NPP_DestroyUPP destroy;
  6.     NPP_SetWindowUPP setwindow;
  7.     NPP_NewStreamUPP newstream;
  8.     NPP_DestroyStreamUPP destroystream;
  9.     NPP_StreamAsFileUPP asfile;
  10.     NPP_WriteReadyUPP writeready;
  11.     NPP_WriteUPP write;
  12.     NPP_PrintUPP print;
  13.     NPP_HandleEventUPP event;
  14.     NPP_URLNotifyUPP urlnotify;
  15.     // The type of this used to be JRIGlobalRef, which was a void *.
  16.     // Use void * here directly now that we don’t expose any Java
  17.     // specific things in the plugin API.
  18.     void* javaClass;
  19.     NPP_GetValueUPP getvalue;
  20.     NPP_SetValueUPP setvalue;
  21. } NPPluginFuncs;

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

2、Android WebKit插件

接口的初始化:

NPNetscapeFuncs的初始化:

  1. initializeExtraBrowserFuncs

事件处理:

  1. HTMLPlugInElement::defaultEventHandler
  2. PluginView::handleEvent
  3. PluginView::handleTouchEvent
  4. PluginWidgetAndroid::sendEvent
  5. NPPluginFuncs::event

进入具体插件的NPP_HandleEvent

创建Surface:

  1. PluginView::setFrameRect
  2. PluginView::setNPWindowIfNeeded
  3. PluginWidgetAndroid::setWindow
  4. PluginWidgetAndroid::layoutSurface
  5. NPPluginFuncs::getvalue,kJavaSurface_ANPGetValue

进入插件NPP_GetValue

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

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

设置窗口并刷新:

  1. PluginView::setParent|PluginView::paint
  2. PluginView::updatePluginWidget|PluginView::setFrameRect
  3. PluginView::setNPWindowIfNeeded(!!!)
  4. m_plugin->pluginFuncs()->setwindow
  5. NPP_SetWindow(NPPluginFuncs::setwindow)
  6. NPNetscapeFuncs::invalidaterect
  7. NPN_InvalidateRect
  8. PluginView::invalidateRect

刷新界面:

  1. PluginView::invalidateRect
  2. PluginWidgetAndroid::inval
  3. WebViewCore::invalPlugin
  4. WebViewCore::pluginInvalTimerFired
  5. WebViewCore::drawPlugins
  6. PluginWidgetAndroid::draw,发出kDraw_ANPEventType事件,
  7. NPPluginFuncs::event

插件的加载:

  1. HTMLObjectElement::attach
  2. HTMLPlugInElement::updateWidgetCallback
  3. HTMLObjectElement::updateWidget|HTMLEmbedElement::updateWidget|FrameView::updateWidgets|
  4. RenderEmbeddedObject::updateWidget
  5. FrameLoader::requestObject
  6. FrameLoader::loadPlugin
  7. FrameLoaderClientAndroid::createPlugin
  8. PluginView::create
  9. PluginView::platformInit
  10. PluginView::PluginView
  11. PluginView::platformInit
  12. {
  13. setPlatformWidget(new PluginViewBridgeAndroid());
  14. new PluginWidgetAndroid
  15. }

小结:解析Android WebKit插件基本结构的内容介绍完了,希望通过Android WebKit插件内容的学习能对你有所帮助!

【编辑推荐】