[webkit-dev] Pushing data to plugin

Jack Wootton jackwootton at gmail.com
Tue Mar 24 02:36:09 PDT 2009


Hi all,

Just to try and bring this thread to a sensible conclusion.  I found a
line of code that stored the Netscape function pointer in some global
static data.  I could then read this value inside my plugin instance
objects and use it to call the Netscape functions such as NPN_GetURL.

But I have one question. Looking at the following structure:

typedef struct _NPP
{
    void*    pdata;            /* plug-in private data */
    void*    ndata;            /* netscape private data */
} NPP_t;


>From reading the documentation ndata points to the Browers and pdata
points to the Plugin Instance Object, then why can I not use ndata to
call Netscape functions?  Mugdha Jain had previously said in this
thread that it won't work, but not why.

Cheers,
Jack


On Fri, Mar 20, 2009 at 5:09 PM, Eric Carlson <eric.carlson at mac.com> wrote:
> Jack -
>
> On Mar 20, 2009, at 9:24 AM, Jack Wootton wrote:
>
>> Yes, but the problem is that program control is in the plugin instance
>> object and not the Plugin itself.  Plugin instance objects are created
>> after the plugin is created.
>>
>> 1. Plugin created (have reference to Browser via NPNetscapeFuncs.
>> 2. Plugin object returned to Browser.
>>
>> /* Some time later */
>>
>> 3. Browser parses an instance of the <object> tag with a MIME type
>> matching the plugin.
>> 4. Browser creates a plugin instance object, but does not provide a
>> reference to to NPNetscapeFuncs.
>>
>
>  There is only one browser, so stash the table of function pointers in a
> static variable:
>
> enum
> {
>        kUserAgent_WebKit       = 'webk',
>        kUserAgent_Opera        = 'opra',
>        kUserAgent_Gecko        = 'geko',
>        kUserAgent_Camino       = 'simn',
>        kUserAgent_Firefox      = 'ffox',
>        kUserAgent_MSIE = 'msie',
> };
>
> static NPNetscapeFuncs *gBrowser  = NULL;
> static uint32 gUserAgent = 0;
>
> NPError OSCALL NP_Initialize(NPNetscapeFuncs* browserFuncs)
> {
>    gBrowser = browserFuncs;
>    return NPERR_NO_ERROR;
> }
>
> NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16
> argc, char* argn[], char* argv[], NPSavedData* saved)
> {
>        const char *userAgent = gBrowser->uagent(instance);
>
>        if ( userAgent )
>        {
>                if ( strstr(userAgent, "AppleWebKit") )
>                        gUserAgent = kUserAgent_WebKit;
>                else if ( strstr(userAgent, "Opera") )
>                        gUserAgent = kUserAgent_Opera;
>                else if ( strstr(userAgent, "Gecko") )
>                {
>                        gUserAgent = kUserAgent_Gecko;
>                        if ( strstr(userAgent, "Camino") )
>                                gUserAgent = kUserAgent_Camino;
>                        else if ( strstr(userAgent, "Firefox") )
>                                gUserAgent = kUserAgent_Firefox;
>                }
>                else if ( strstr(userAgent, "MSIE") )
>                        gUserAgent = kUserAgent_MSIE;
>        }
>
>    return NPERR_NO_ERROR;
> }
>
>  Or have I misunderstood what you are trying to do?
>
> eric
>
>
>>
>>
>> On Fri, Mar 20, 2009 at 4:11 PM, Mugdha Jain <MugdhaJain at smarttech.com>
>> wrote:
>>>
>>> No that won't work. What you need to do is store the function pointer
>>> passed
>>> by the browser and use that to call the required function. That would
>>> mean
>>> you have to do the following:
>>>
>>> g_NPNFuncs.geturl
>>>
>>> Where g_NPNFuncs is: g_NPNFuncs = browser below.
>>>
>>> // Mach-o entry points
>>> NPError NP_Initialize(NPNetscapeFuncs *browserFuncs)
>>> {
>>>    browser = browserFuncs;
>>>    return NPERR_NO_ERROR;
>>> }
>>>
>>> Browser would call this function on the plugin when it loads the plugin
>>> for
>>> the first time.
>>>
>>> Hope that helps.
>>> Mugdha
>>>
>>> -----Original Message-----
>>> From: webkit-dev-bounces at lists.webkit.org on behalf of Jack Wootton
>>> Sent: Fri 3/20/2009 9:35 AM
>>> To: Alexey Proskuryakov
>>> Cc: webkit-dev at lists.webkit.org
>>> Subject: Re: [webkit-dev] Pushing data to plugin
>>>
>>> So I would have thought this would work inside the plugin instance
>>> object method New (aInstance is of type NPP)
>>>
>>>
>>> NPNetscapeFuncs* browser =
>>> static_cast<NPNetscapeFuncs*>(aInstance.ndata);
>>>
>>> But it doesn't :P
>>>
>>>
>>> 2009/3/20 Alexey Proskuryakov <ap at webkit.org>:
>>>>
>>>> 20.03.2009, ? 18:15, Jack Wootton ???????(?):
>>>>
>>>>> I'm unsure about how I can access the Browser functions.
>>>>
>>>>
>>>> You can see how this works in one of our example plug-ins. E.g., form
>>>> TestNetscapePlugin:
>>>>
>>>> NPNetscapeFuncs *browser;
>>>>
>>>> // Mach-o entry points
>>>> extern "C" {
>>>>   NPError NP_Initialize(NPNetscapeFuncs *browserFuncs);
>>>>   NPError NP_GetEntryPoints(NPPluginFuncs *pluginFuncs);
>>>>   void NP_Shutdown(void);
>>>> }
>>>>
>>>> // Mach-o entry points
>>>> NPError NP_Initialize(NPNetscapeFuncs *browserFuncs)
>>>> {
>>>>   browser = browserFuncs;
>>>>   return NPERR_NO_ERROR;
>>>> }
>>>>
>>>> - WBR, Alexey Proskuryakov
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Regards
>>> Jack
>>> _______________________________________________
>>> webkit-dev mailing list
>>> webkit-dev at lists.webkit.org
>>> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
>>>
>>>
>>
>>
>>
>> --
>> Regards
>> Jack
>> _______________________________________________
>> webkit-dev mailing list
>> webkit-dev at lists.webkit.org
>> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
>
>



-- 
Regards
Jack


More information about the webkit-dev mailing list