2012-10-18 128 views
2

我正在註冊從JS的偵聽器到NPAPI插件。 爲了不多次註冊相同的偵聽器,我需要一種方法來比較傳遞的NPVariant對象與已經在列表中的對象。如何比較NPVariant對象?

這是怎麼了,我從JS註冊監聽器:

PluginObject.registerListener("event", listener); 

,然後在插件的源:

for (l=head; l!=NULL; l=l->next) { 
     // somehow compare the listeners 
     // l->listener holds NPVariant object 
     if (l->listener-> ??? == new_lle->listener-> ???) 
     { 
     found = 1; 
     DBG("listener is a duplicate, not adding."); 
     NPN_MemFree(new_lle->listener); 
     free(new_lle); 
     break; 
     } 
    } 

回答

0

當你談論一個JavaScript函數NPVariant只是一個NPObject 。

typedef struct _NPVariant { 
    NPVariantType type; 
    union { 
    bool boolValue; 
    int32_t intValue; 
    double_t doubleValue; 
    NPString stringValue; 
    NPObject *objectValue; 
    } value; 
} NPVariant; 

比較val.type和val.objectValue。這通常會起作用,但如果沒有其他辦法,那麼你最好還是試一試。我猜想另外一種可能性是創建一個javascript函數來比較它們,用NPN_Evaluate注入並用兩個對象調用它。

0

我不認爲你可以依靠objectValue。例如,如果你做到以下幾點:

foo={}; bar=foo; x={};
x.f=foo; x.b=bar;

現在,如果你打電話NPN_Enumerate並通過x作爲NPObject,你會得到兩個標識符。爲每個返回NPVariants調用GetProperty,但variant->value.objectValue的值將各不相同,並在隨後調用NPN_Enumerate時再次改變。

taxilian:是否存在與兩個NPObject調用NPN_Invoke相當大的開銷,僅用於測試是否相等?這也涉及到GetProperty的一些調用和創建標識符並調用NPVARIANT宏來測試結果等。我想知道我應該注入多少的邏輯並在Javascript中進行評估..此代碼注入似乎是作爲一次又一次的解決方案。這是否昂貴?