Building a firefox plugin – part one

March 1, 2009 104 Comments by Richard

Note: For a better way to create a Browser Plugin (that will work on all browsers, not just NPAPI), check out the FireBreath project.

Getting help: For a better place to ask NPAPI-related questions, go to StackOverflow and make sure to use the “npapi” and/or “firebreath” tags.

Introduction

I have now been researching and working on a cross-platform browser plugin for several months.  By far my greatest frustration throughout this process has been the significant lack of documentation on the subject.  So, with the creation of this site, I wish to create a small series that will hopefully provide assistance to other poor developers who are trying to break into this strangely secretive field =]

I’m not going to be able to cover everything in one post (for time reasons if nothing else).  How fast I get the rest of the posts done may depend in large part on whether or not anyone seems to be reading them and what requests are made in the comments =]

Plugin architecture

In these articles I plan to focus on the basic requirements for creating an NPAPI (Netscape Plugin) style plugin, which is used by most (if not all) plugin-supporting open browsers, including: Apple Internet Plugins on Mac (Firefox, Safari, probably others); Firefox (and all other gecko-based browsers), Opera, Safari, and Chrome on windows, and at least firefox on linux.  I haven’t yet implemented a plugin on linux, but most of the same principles should apply.

Because of the minor differences between platforms, I will first cover the architecture as it is used in Windows, and then in a later post I will cover the differences between windows and other platforms, such as Mac and Linux.

Plugin API vs Scripting API

When I first began developing browser plugins, I failed to understand the difference between the scripting API and the plugin API.  They are closely related, of course, but they serve different purposes.

The Scripting API is used to provide methods callable from javascript, while the Browser API provides the interface for hosting the plugin itself in the browser.

NPAPI

You can find the Mozilla documentation for plugins here:

https://developer.mozilla.org/en/Gecko_Plugin_API_Reference

For history of the NPAPI (Netscape Plugin API), see the Wikipedia page: http://en.wikipedia.org/wiki/NPAPI

What makes up an NPAPI browser plugin?

A NPAPI browser plugin is, at it’s core, simply a DLL with a few specific entry points.  Each of these entry points is only called once by the browser for all instances of your plugin on a given page.  They are listed here in the order they should be called:

  • NP_GetEntryPoints – Called immediately after the plugin is loaded and is used by the browser (no longer just netscape) to get pointers to all of the API functions that the browser might need to call.
  • NP_Initialize – Provides global initialization of your plugin.
  • NP_Shutdown – Provides global deinitialization of your plug-in.

It is important to note that since these entrypoints are specific to NPAPI, there is no reason you can’t have a NPAPI plugin inside a DLL that also provides other services (like, for example, an ActiveX plugin).

Since these three entrypoints provide the core of the NPAPI architecture, it is worth our time to look at them a little more closely.

NP_GetEntryPoints

NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pFuncs)

This is undoubtedly the most important of the three to understand.  Because of this, it shocks me that the only actual useful documentation I have found for this method so far is found in an old, but still mostly accurate web-book written who-knows-when by Zan Oliphant.

While not as straightforward as the other two entrypoint functions, NP_GetEntryPoints is nonetheless relatively straightforward.  As you can see from the above function prototype, NP_GetEntryPoints takes a pointer to the NPPluginFuncs structure:

typedef struct _NPPluginFuncs {
    uint16 size;
    uint16 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;
    JRIGlobalRef javaClass;
    NPP_GetValueUPP getvalue;
    NPP_SetValueUPP setvalue;
} NPPluginFuncs;

UPP in each of these type names stands for “Universal Proc Pointer”, which is essentially just a function pointer that the Gecko SDK uses in conjunction with a CallUniversalProc macro for all of its function pointer needs.  For more information, grep the Gecko SDK.

These function pointers basically tell the browser how to interact with your plugin.  Notice the naming convention here: NPP_* for all plugin functions.  There are also NPN_* functions that we will see later, and these are functions that the plugin can call on the browser.  They will be given to us in the NP_Initialize call.

So, the primary purpose of the NP_GetEntryPoints function is to give the browser pointers to all of the functions that it needs to call when creating or interacting with your plugin.

Here is a quick overview of the NPP plugin functions that your plugin must provide (and give addresses to when NP_GetEntryPoints is called).  This table is copied from Zan Oliphant’s book and updated to reflect the current practices and Gecko SDK 1.8:

API Name Description
NPP_New Creates a new instance of a plug-in.
NPP_Destroy Deletes an instance of a plug-in.
NPP_SetWindow Tells the plug-in when a window is created, moved, sized, or destroyed.
NPP_NewStream Notifies a plug-in instance of a new data stream.
NPP_DestroyStream Tells the plug-in that a stream is about to be closed or destroyed.
NPP_StreamAsFile Provides a local file name for the data from a stream.
NPP_WriteReady Determines whether a plug-in is ready for data (and the maximum number of bytes it is prepared to accept).
NPP_Write Called to write/deliver data to a plug-in.  The docs note that this might be better named “NPP_DataArrived”.
NPP_Print Requests a platform-specific print operation for an embedded or full-screen plug-in.
NPP_HandleEvent Event handler, currently only used by Windowed plugins on Mac OS; windowless plugins on all platforms use this.
NPP_URLNotify Notifies the completion of a URL request.
NPP_GetJavaClass Deprecated / No longer used. Set to NULL
NPP_GetValue Called to query the plugin for information (also used to get an instance of a NPObject/Scriptable Plugin)
NPP_SetValue This call is used to inform plugins of variable information controlled by the browser.

We will talk more about the specifics of how each of these functions works later.

NP_Initialize

NPError WINAPI NP_Initialize(NPNetscapeFuncs *aNPNFuncs) // Windows
// -or-
NPError NP_Initialize(NPNetscapeFuncs *aNPNFuncs, NPPluginFuncs *aNPPFuncs) // Linux

As noted in the documentation, NP_Initialize provides global initialization for a plug-in.  The API reference is a little confusing in that it claims that NP_Initialize is actually the first function called by the browser.  The reason for this is that on linux, there aparently is no NP_GetEntryPoints call; instead, the NPPluginFuncs struct is passed into the NP_Initialize function to be filled out.

Since this isn’t confusing enough, on Mac they have replaced both of these functions with a single “main” function that not only gets passed both function pointer structures (one with the browser functions and one to be filled out with plugin functions) but also is given a shutdown function pointer to be filled out with the address to the NP_Shutdown function.

Because of these discrepancies, I recommend that you write a separate function for filling out the NPPluginFuncs structure so that it can be called from any of the various init functions.

The NPNetscapeFuncs structure that is passed in is the complement to the NPPluginFuncs structure that we have discussed previously.  As might be guessed from the name, the NPNetscapeFuncs structure contains pointers to browser functions that can be called by the plugin.  There are a lot more of these, and we will discuss more about how to use them next time.

For now, take a look at the structure to get a general idea of what is there.  I’ve added comments on some of the more common function calls.

typedef struct _NPNetscapeFuncs {
    uint16 size;
    uint16 version; // Newer versions may have additional fields added to the end
    NPN_GetURLUPP geturl; // Make a GET request for a URL either to the window or another stream
    NPN_PostURLUPP posturl; // Make a POST request for a URL either to the window or another stream
    NPN_RequestReadUPP requestread;
    NPN_NewStreamUPP newstream;
    NPN_WriteUPP write;
    NPN_DestroyStreamUPP destroystream;
    NPN_StatusUPP status;
    NPN_UserAgentUPP uagent;
    NPN_MemAllocUPP memalloc; // Allocates memory from the browser's memory space
    NPN_MemFreeUPP memfree; // Frees memory from the browser's memory space
    NPN_MemFlushUPP memflush;
    NPN_ReloadPluginsUPP reloadplugins;
    NPN_GetJavaEnvUPP getJavaEnv;
    NPN_GetJavaPeerUPP getJavaPeer;
    NPN_GetURLNotifyUPP geturlnotify; // Async call to get a URL
    NPN_PostURLNotifyUPP posturlnotify; // Async call to post a URL
    NPN_GetValueUPP getvalue; // Get information from the browser
    NPN_SetValueUPP setvalue; // Set information about the plugin that the browser controls
    NPN_InvalidateRectUPP invalidaterect;
    NPN_InvalidateRegionUPP invalidateregion;
    NPN_ForceRedrawUPP forceredraw;
    NPN_GetStringIdentifierUPP getstringidentifier; // Get a NPIdentifier for a given string
    NPN_GetStringIdentifiersUPP getstringidentifiers;
    NPN_GetIntIdentifierUPP getintidentifier;
    NPN_IdentifierIsStringUPP identifierisstring;
    NPN_UTF8FromIdentifierUPP utf8fromidentifier; // Get a string from a NPIdentifier
    NPN_IntFromIdentifierUPP intfromidentifier;
    NPN_CreateObjectUPP createobject; // Create an instance of a NPObject
    NPN_RetainObjectUPP retainobject; // Increment the reference count of a NPObject
    NPN_ReleaseObjectUPP releaseobject; // Decrement the reference count of a NPObject
    NPN_InvokeUPP invoke; // Invoke a method on a NPObject
    NPN_InvokeDefaultUPP invokeDefault; // Invoke the default method on a NPObject
    NPN_EvaluateUPP evaluate; // Evaluate javascript in the scope of a NPObject
    NPN_GetPropertyUPP getproperty; // Get a property on a NPObject
    NPN_SetPropertyUPP setproperty; // Set a property on a NPObject
    NPN_RemovePropertyUPP removeproperty; // Remove a property from a NPObject
    NPN_HasPropertyUPP hasproperty; // Returns true if the given NPObject has the given property
    NPN_HasMethodUPP hasmethod; // Returns true if the given NPObject has the given Method
    NPN_ReleaseVariantValueUPP releasevariantvalue; // Release a MNVariant (free memory)
    NPN_SetExceptionUPP setexception;
    NPN_PushPopupsEnabledStateUPP pushpopupsenabledstate;
    NPN_PopPopupsEnabledStateUPP poppopupsenabledstate;
} NPNetscapeFuncs;

In addition to saving the function pointers given so that browser calls can be made, any memory that is to be shared by all instances of your browser plugin should be initialized here.

NP_Shutdown

This is the simplest of the three entrypoints.  Free any shared memory and release any shared resources.  This is called when the browser has already destroyed all instances of your plugin (by calling NPP_Destroy) and does not expect to create any more in the near future.

Next Time

Next time we will go into greater detail on implementing the NPP functions and also cover some of the most commonly used NPN functions.

Building a firefox plugin – part one

Building a firefox plugin – part two

Building a firefox plugin – part three

Building a firefox plugin – part four

Getting more help

Update May 14, 2011: Many people have been asking questions in the comments; while I don’t mind that, it would probably be more useful if you ask your question on the FireBreath forums. There is a forum there for those just using NPAPI as well!

48 Comments

  1. taxilian
    9 years ago

    Start with the npruntime sample from the mozilla source code. Create an NPObject. Implement the NPP_Invoke method. It'll take some research on your own.

    Check out the firebreath project to see some examples, but it's a little more complicated than your question requires. By the end of the year, there should be a release candidate of Firebreath for windows only.

  2. black spider
    9 years ago

    ok. thanks for your help.

  3. black spider
    9 years ago

    ok. thanks for your help.

  4. snehalp
    9 years ago

    hi,
    I liked your tutorial very much. I have a query on activeX support in mozilla. I want to know whether I can launch activeX control using npapi during initialising of np plugin. If not how can I extend np api to support activeX in mozilla. Please provide me nay reference for this or any suggestion.

    Thanks in advance

  5. snehalp
    9 years ago

    hi,
    I liked your tutorial very much. I have a query on activeX support in mozilla. I want to know whether I can launch activeX control using npapi during initialising of np plugin. If not how can I extend np api to support activeX in mozilla. Please provide me nay reference for this or any suggestion.

    Thanks in advance

  6. georg_fritzsche
    9 years ago

    Yes, there is nothing that prevents you from using ActiveX controls in NPAPI plugins. But if you want to write a browser plugin that works in IE as well as in Firefox etc. – thats exactly what we're providing a framework for with FireBreath: https://code.google.com/p/firebreath/

  7. gf
    9 years ago

    Yes, there is nothing that prevents you from using ActiveX controls in NPAPI plugins. But if you want to write a browser plugin that works in IE as well as in Firefox etc. – thats exactly what we're providing a framework for with FireBreath: https://code.google.com/p/firebreath/

  8. taxilian
    9 years ago

    Well, technically this isn't totally true. You can actually embed an activeX control inside an NPAPI plugin; there are a few different projects out there for doing this. For example, a quick google search turns up: http://code.google.com/p/ff-activex-host/

    However, in my experience, this tends to be more error prone than anything else; it's just kinda a pain to maintain. Still, if you already have the activex control and are totally ambivalent towards cross-platform compatibility, it's an option. As Georg mentioned, FireBreath is a much more flexible option, though it would require porting your code to the framework. After you've done so, however, porting it to other platforms is easier and it'll work as an NPAPI plugin or an ActiveX control

  9. taxilian
    9 years ago

    Well, technically this isn't totally true. You can actually embed an activeX control inside an NPAPI plugin; there are a few different projects out there for doing this. For example, a quick google search turns up: http://code.google.com/p/ff-activex-host/

    However, in my experience, this tends to be more error prone than anything else; it's just kinda a pain to maintain. Still, if you already have the activex control and are totally ambivalent towards cross-platform compatibility, it's an option. As Georg mentioned, FireBreath is a much more flexible option, though it would require porting your code to the framework. After you've done so, however, porting it to other platforms is easier and it'll work as an NPAPI plugin or an ActiveX control

  10. soluzione_ltda
    9 years ago

    Hello , I´m Daniel from Brazil and after 20 days with a problem I hope you can help-me.
    Well, I´m running Ubuntu 9.10 and Firefox 3.5 and started to research how to make a scriptable plugin. I found the Npruntime as solution and followed all the steps and finally got a build (libnprt.so).
    The problem is: I can run the test.html fine only on the Firefox that I build, but when I try to run the test in the Firefox that came in ubuntu it don´t work.
    The “Ubuntu Firefox” can see the plugin in 'about:plugins' like “my firefox” do but I don´t have response calling the functions from the built in one.
    I´ve tried to check any dependencies and made some links that appears to be missing on /usr/lib but I could not solve the problem.
    I could check that the difference is in the Firefox that I build because the plugin works from any location, I can link plugin in the ~/Desktop and still work on the firefox that I built, so it don´t depends of any lib in the original place, it´s something that the Firefox that I build have and the built in Ubuntu don´t, but I could not found what is.
    If you can help-me, I just don´t know what more can I do, I´m totally lost !!

    Thanks in advance.
    Daniel.

  11. soluzione_ltda
    9 years ago

    Hello , I´m Daniel from Brazil and after 20 days with a problem I hope you can help-me.
    Well, I´m running Ubuntu 9.10 and Firefox 3.5 and started to research how to make a scriptable plugin. I found the Npruntime as solution and followed all the steps and finally got a build (libnprt.so).
    The problem is: I can run the test.html fine only on the Firefox that I build, but when I try to run the test in the Firefox that came in ubuntu it don´t work.
    The “Ubuntu Firefox” can see the plugin in 'about:plugins' like “my firefox” do but I don´t have response calling the functions from the built in one.
    I´ve tried to check any dependencies and made some links that appears to be missing on /usr/lib but I could not solve the problem.
    I could check that the difference is in the Firefox that I build because the plugin works from any location, I can link plugin in the ~/Desktop and still work on the firefox that I built, so it don´t depends of any lib in the original place, it´s something that the Firefox that I build have and the built in Ubuntu don´t, but I could not found what is.
    If you can help-me, I just don´t know what more can I do, I´m totally lost !!

    Thanks in advance.
    Daniel.

  12. Navaid
    9 years ago

    Apologies, it does get picked. Firfox loads the DLL only when required not at startup. (You may delete these 2 comments if required).

  13. Navaid
    9 years ago

    I created a minimal plugin dll with a dllmain and the 3 functions you mention in this article (blank implementations) and placed it in the firefox plugin folder ( I can see that the 3 functions have been exported). However, I can see both from Firefox and VS debugger that this DLL is not picked up by Firefox. I expected that it would at least attempt to load the dll (and then may be reject it). However it didn't. What might be missing?

  14. Navaid
    9 years ago

    I created a minimal plugin dll with a dllmain and the 3 functions you mention in this article (blank implementations) and placed it in the firefox plugin folder ( I can see that the 3 functions have been exported). However, I can see both from Firefox and VS debugger that this DLL is not picked up by Firefox. I expected that it would at least attempt to load the dll (and then may be reject it). However it didn't. What might be missing?

    edit: Apologies, it does get picked. Firfox loads the DLL only when required not at startup. (You may delete this comment if required).

  15. Navaid
    9 years ago

    Apologies, it does get picked. Firfox loads the DLL only when required not at startup. (You may delete these 2 comments if required).

  16. taxilian
    9 years ago

    I strongly recommend against putting plugins in the plugins/ directory; install them in the registry instead. The reason for this is that it is considered extremely bad practice to clutter up the program directory of another program; also, npapi plugins can work on other browsers too if you install them right. Firefox 3.6 stopped honoring 3rd party additions to the components directory, and they were unclear as to whether or not this included the plugins dir; perhaps that will come later.

    https://developer.mozilla.org/devnews/index.php

    Glad you found your problem!

  17. taxilian
    9 years ago

    I strongly recommend against putting plugins in the plugins/ directory; install them in the registry instead. The reason for this is that it is considered extremely bad practice to clutter up the program directory of another program; also, npapi plugins can work on other browsers too if you install them right. Firefox 3.6 stopped honoring 3rd party additions to the components directory, and they were unclear as to whether or not this included the plugins dir; perhaps that will come later.

    https://developer.mozilla.org/devnews/index.php

    Glad you found your problem!

  18. Raja
    9 years ago

    Hi,

    I am trying to build a LInux plugin. Can you please let me know what all points I should keep in mind and things to do ?

    Thanks,

  19. Raja
    9 years ago

    Hi,

    I am trying to build a LInux plugin. Can you please let me know what all points I should keep in mind and things to do ?

    Thanks,

  20. taxilian
    9 years ago

    LOL. Well, I have not as of yet built a complete, functional linux plugin, so I'm not sure I can fully answer that question; also, to share what I do know would require another full post, which I do plan to do, but have been waiting to learn more about the specifics first.

    If you are just getting started, I recommend you try out FireBreath; when you run into problems, post to the firebreath-dev list and we'll help you find solutions to them that can be integrated into FireBreath so that the next person doesn't have to solve the same problem. It's not complete, but it's a good place to start.

    http://firebreath.googlecode.com
    see also later posts on this blog about FireBreath.

  21. taxilian
    9 years ago

    LOL. Well, I have not as of yet built a complete, functional linux plugin, so I'm not sure I can fully answer that question; also, to share what I do know would require another full post, which I do plan to do, but have been waiting to learn more about the specifics first.

    If you are just getting started, I recommend you try out FireBreath; when you run into problems, post to the firebreath-dev list and we'll help you find solutions to them that can be integrated into FireBreath so that the next person doesn't have to solve the same problem. It's not complete, but it's a good place to start.

    http://firebreath.googlecode.com
    see also later posts on this blog about FireBreath.

  22. Guybrush
    9 years ago

    http://docs.rinet.ru/Plugi/ch8.htm#NP_GetEntryP… is a broken link now but there is a copy here
    http://www.webbasedprogramming.com/Web-Programm

  23. taxilian
    9 years ago

    Thanks; I have updated the link on the post.

  24. rymeister
    9 years ago

    I'm having this exact same problem. Were you ever able to find a solution?

  25. Rams
    9 years ago

    Hi ,
    I have developed np plugin. I am new in this area .I have one doubt that can i communicate javascript function from plugin like event in ActiveX .

  26. taxilian
    9 years ago

    I don't understand what you are asking, but events work fine. Please read my other posts, and particularly look at using FireBreath, which simplifies a lot of things, particularly if you are new in the area.

  27. Rams
    9 years ago

    taxilian … thanks to reply … I have developed npruntime plugin for firefox .Actually i asked to u that ,how to call a JS method from the plugin .But after see your another post ,I have understood .

    Do you know how to package and add register entry for that dll in user machine ? If you have posted previous, can you give like ..

    Regards
    Rams

  28. taxilian
    9 years ago

    For install issues, see: https://developer.mozilla.org/en/Plugins/The_Fi

  29. Yuanjuzeng
    9 years ago

    hi,i am new to firefox plugin.I want to develop a plugin that can get the content of the website.How can i do?

  30. Rams
    9 years ago

    thanks taxilian … I could n`t create and fire event in my npruntime plugin .I did try to see your framework code that firebreat code.But i could n`t understand because i am new in this area .Your code is have a lot of line .I need just create one event and fire from firefox plugin.Can you explain or share that limit of code or your post link about event ?

    I saw your reply to sleepy about event.
    “When they call addEventListener, the parameter that is a function gets passed in as an NPObject *; NPN_RetainObject this and store it in a multimap or similar with the name of the event as the key.

    When they call removeEventListener, search through and see if you have a saved pointer to the passed-in npobject; if so, NPN_ReleaseObject it and delete your saved pointer.

    When you need to fire an event, marshall the arguments you want as an array of NPObjects and loop through all of the saved npobjects for that event and call NPN_InvokeDefault on each of them. ”

    I couldn`t understand ,function gets passed in as an NPObject *; NPN_RetainObject and invoke NPN function.

    Regards
    Rams

  31. taxilian
    9 years ago

    Keep in mind, this is not a simple topic. Make sure you have read part three of this series about NPObjects so that you understand how it works. You’re going to implement the addEventListener method on your NPObject that expects three parameters, just like any element. the function when it gets to you will be an NPObject*. Read up on the npapi memory management post on this site for information on how retainobject works. Save the NPObject* to the function, which is your event handler, and call NPN_Invoke when you want to “fire” the event. Make sure it’s on the main thread.

  32. Yuanjuzeng
    9 years ago

    Thank you for your reply.And the article you gave helps me a lot.

  33. Bill
    9 years ago

    Hi, I am a npapi plugin newbie and i want to implement an asynchronous call from js to the npapi plugin. for instance, i want to call a function that takes a long execution time and when the result is ready i want to send it back to the js code. this process should’nt block the MMI (web page) execution.

    thanks

  34. vzoran
    9 years ago

    Hi,

    I experienced an interesting behaviour of my npapi plugin. It works well on Firefox, Chrome and Safari for Win but Opera 11.01 does not load it. I tried it on Opera 11.10beta and everything is ok as well. I tried it with Gecko SDK 1.9.2 and 2.0.0.b12.

    Do you have any idea what’s wrong with that Opera release? What should I do different to make that brower to load this plugin?

    Thank you

    Zoran

  35. taxilian
    9 years ago

    You’ll have to marshall the call ot the main thread somehow; FireBreath (http://firebreath.org) takes care of this for you but one popular method is to use NPN_PluginThreadAsyncCall, though that doesn’t work well on Mac browsers for some reason.

  36. taxilian
    9 years ago

    The one issue I’ve seen wiht Opera 11 is that it requires the plugin to be registered in HKLM; plugins registered in HKCU didn’t show up.

  37. vzoran
    9 years ago

    Hi,

    I just copy my dll to Program Files (x86)Operaprogramplugins folder. I can see it on page about:plugins and my javascript can detect mime-type well. So I guess it is not installation problem.
    But I try to set up registry values just or sure.

    Thank you

  38. Trungkiena2
    9 years ago

    Thanks, it’s greate!

  39. hummer
    9 years ago

    I have developed DLL using VS 2008 with dllmain and three exported function as u said above.
    I have create plugin for google chrome version 14 browser and installed but no function get called or dll loaded.
    I am unable to figure out where problem lies.
    Please help me….

  40. Hummer
    9 years ago

    What is MIME type of DLL that required to to set in following tag.
    <embed type="application/” id=”pluginId”>Do I need to make changes in DLL to set MIME type of DLL?

  41. taxilian
    9 years ago

    Ask on stackoverflow or forum.firebreath.org.  This isn’t the right place for this question.

  42. taxilian
    9 years ago

    Ask on stackoverflow or forums.firebreath.org.  This isn’t the right place for this question.

  43. Hummer
    9 years ago

    I have opened .rc file in code mode and then added  VALUE “MIMEType”, “application/myapp” Now My NPAPI DLL is getting loaded in google chrome browser.

  44. Chengdu1113
    9 years ago

    Hi,

    I am trying to build a windows plugin.But I encounter the problem with IME. I can‘t chang IME in editbox of plugin. Can you tell me what to do in this situation?Thanks,

  45. escapitot
    9 years ago

    Hi,

    I am trying to build a Chrome Extension. I have read that you can bundle NPAPI to your extension. I just don’t know how to begin with. Can this be applicable?

  46. taxilian
    9 years ago

    Yes, you can bundle a NPAPI plugin in a chrome extension. This blog post is applicable to all npapi plugins. Do some searching, particularly on sites like stackoverflow.com; this is not the place to ask questions.

  47. Ram
    9 years ago

    is it possible to access browser key store using npapi
     

2 Trackbacks

  1. […] Compiling The npruntime Sample Plugin in Visual Studio Building a firefox plugin – part one […]

  2. By NPAPI Plugin (Must read) | Source Code Auditing on December 22, 2011 at 7:11 am

Post a Comment

Your email is never published or shared. Required fields are marked *