[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