Plugin Create

PluginView creation 

How is the plugin initialized?

it's begin with the PluginView's creation

 

1.PluginView.create()

  1. PassRefPtr<PluginView> PluginView::create(Frame* parentFrame, const IntSize& size,  
  2.         Element* element, const KURL& url, const Vector<String>& paramNames,  
  3.         const Vector<String>& paramValues,  
  4.         const String& mimeType, bool loadManually)  
  5.   
  6. {  
  7.     ....  
  8.     PluginPackage* plugin = PluginDatabase::installedPlugins()->  
  9.       findPlugin(url, mimeTypeCopy);  
  10.     if (!plugin && PluginDatabase::installedPlugins()->refresh()) {  
  11.         mimeTypeCopy = mimeType;  
  12.         plugin = PluginDatabase::installedPlugins()->findPlugin(url, mimeTypeCopy);  
  13.     }  
  14.     return adoptRef(new PluginView(parentFrame, size, plugin, element, url, paramNames,  
  15.     paramValues, mimeTypeCopy, loadManually));  
  16.   
  17. }  

find plugin and pass it to PluginView's constructor.

 

two vector, mpath and m_pluginDirectories 


in "installedPlugins"
use default dir and set to "m_pluginDirectories"
in "refresh"
call "getPluginPathsInDirectories"
get path from "m_pluginDirectories" to "mpath"
and then use "mpath" to create "PluginPackage"
add "PinginPack" to "m_plugins"

2. PluginView()

  1. PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* plugin,   
  2.             Element* element,const KURL& url,const Vector<String>& paramNames,  
  3.         const Vector<String>& paramValues, const String& mimeType, bool loadManually)  
  4.   
  5. ............  

 

3.PluginView.init()

  1. if (!m_plugin->load()) {  
  2.     m_plugin = 0;  
  3.     m_status = PluginStatusCanNotLoadPlugin;  
  4.     return;  
  5. }  
  1. RefPtr<PluginPackage> m_plugin;  

 

4.PluginPack.load()

// not defined in PluginPack.cpp, it's in PluginPackAndroid.cpp

  1.         // Open the library  
  2.         void *handle = dlopen(m_path.utf8().data(), RTLD_NOW);  
  3.         if(!handle) {  
  4.             PLUGIN_LOG("Couldn't load plugin library \"%s\": %s\n",  
  5.                        m_path.utf8().data(), dlerror());  
  6.             return false;  
  7.         }  
  8.         .....  
  9.         NP_InitializeFuncPtr NP_Initialize;  
  10.         if(!getEntryPoint(m_module, "NP_Initialize", (void **) &NP_Initialize) ||   
  11.                 !getEntryPoint(m_module, "NP_Shutdown", (void **) &m_NPP_Shutdown)) {  
  12.             PLUGIN_LOG("Couldn't find Initialize function\n");  
  13.             return false;  
  14.         }  

after that we got   the function "NP_Initialize" and "NP_Shutdown" frome the .so file

and value it to "NP_Initialize" and "m_NPP_Shutdown"    

 

5. initialize BrowserFunctions (also called in the PluginPack.load())

  1. void PluginPackage::initializeBrowserFuncs()  
  2. {  
  3.     memset(&m_browserFuncs, 0, sizeof(m_browserFuncs));  
  4.     m_browserFuncs.size = sizeof(m_browserFuncs);  
  5.     m_browserFuncs.version = NPVersion();   
  6.     .......  
  7.     m_browserFuncs.getvalueforurl = NPN_GetValueForURL;  
  8.     m_browserFuncs.setvalueforurl = NPN_SetValueForURL;  
  9.     m_browserFuncs.getauthenticationinfo = NPN_GetAuthenticationInfo;  
  10. }  

 give value to    "  NPNetscapeFuncs m_browserFuncs;" (this variable will be passed into the plugin.)

 

6. NP_Initialize

  1. if(NP_Initialize(&m_browserFuncs,  
  2.                  &m_pluginFuncs,  
  3.                  JSC::Bindings::getJNIEnv()) != NPERR_NO_ERROR) {  
  4.     PLUGIN_LOG("Couldn't initialize plugin\n");  
  5.     return false;  
  6. }  


use plugin's initialize function to initialize the plugin (pass the m_browserFunction in andget the m_pluginFuncs out)

 

7. Other

how is PluginPackage.fetchInfo  called

a in PluginView(){} PluginDatabase::installedPlugins()->refresh()

b.RefPtr<PluginPackage> package = PluginPackage::createPackage(*it, lastModified)

c.package->fetchInfo()

 

 

How is PluginView called

how is pluginview.load called?

1.

  1. void RenderFrameBase::layoutWithFlattening  
  2. void RenderFrame::layout()  
  3. void Document::updateLayout()  

2.

  1. FrameView.Layout()  
  2. performPostLayoutTasks();  

3.

  1. void FrameView::performPostLayoutTasks()  
  2. updateWidgets()  

4.

  1. bool FrameView::updateWidgets()  

5.

  1. void FrameView::updateWidget(RenderEmbeddedObject* object)  
  2.     if (ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag))  
  3.         static_cast<HTMLPlugInImageElement*>(ownerElement)->updateWidget(false);  
  4.     // FIXME: It is not clear that Media elements need or want this updateWidget() call.  
  5. #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)  
  6.     else if (ownerElement->hasTagName(videoTag) || ownerElement->hasTagName(audioTag))  
  7.         static_cast<HTMLMediaElement*>(ownerElement)->updateWidget(false);  
  8. #endif  

6.HTMLMediaElement.cpp

  1. HTMLMediaElement.updateWidget()  

7.HTMLMediaElement.cpp updateWidget()

  1. loader->requestObject(this, m_url, getAttribute(nameAttr),
    m_serviceType, paramNames, paramValues);  

8.SubframeLoader.cpp

  1. requestObject()  

9.SubframeLoader.cpp

  1. loadPlugin()  

10.FrameLoaderClientAndroid.cpp

  1. createPlugin().  

11.PluginView.create()

  1. .....  
  2. PluginView.setParent()  
  3. PluginView.init()  
  4. PluginPackage.load()//PluginPackageAndroid.cpp  

Plugin Display
1.SubframeLoader::loadPlugin(HTMLPlugInImageElement* pluginElement)
2.RenderEmbeddedObject.setWidget(PassRefPtr<Widget> widget)
RenderPart.setWidget(PassRefPtr<Widget> widget)
RenderWidget.setWidget(PassRefPtr<Widget> widget)
3.RenderWidget.moveWidgetToParentSoon(Widget* child, FrameView* parent)
4.FrameView(ScrollView)::addChild(PassRefPtr<Widget> prpChild(PluginView));
5.PluginView::setParent(ScrollView* parent)
6.PluginView::init()
7.PluginView::start()

pluginView
init()
start()
load()

example

take NPN_PluginThreadAsyncCall for example.
a.plugin call m_browserFunctions->pluginthreadasynccall
b.call PluginPackageAndroid.cpp,NPN_PluginThreadAsyncCall(instance,func,userData);
c.Npapi.cpp .void NPN_PluginThreadAsyncCall(NPP instance, void (*func) (void *), void *userData);
d.PluginMainThreadScheduler::scheduler().scheduleCall(instance, func, userData);
e.PluginMainThreadScheduler.scheduleCall((instance, func, userData);
f.PluginMainThreadScheduler.Call((MainThreadFunction* function, void* userData);

posted @ 2012-04-02 20:16  cascais  阅读(380)  评论(0编辑  收藏  举报