NPAPI指令碼化介面

2021-06-27 12:57:10 字數 1871 閱讀 7194

scriptable介面的實現,與屬性有關的函式為hasproperty、getproperty、setproperty。在js中設定屬性(以bar為例)用plugin.bar=barvalue;來設定,獲取屬性直接用plugin.bar;如果要為外掛程式建立屬性,必須要在hasproperty中返回true,在getproperty一般呼叫npn_getproperty(mnpp,swindowobj,name,result);即可,如果有特殊目的也可以自行編寫其實現**;設定屬性用npn_setproperty(mnpp,swindowobj,name,value);與method相關的函式為hasmethod和invoke,如果要為外掛程式建立乙個method,那麼必須在hasmethod中為該函式返回true,method的實現**應在invoke實現或者由invoke呼叫。如果既是method又是property,那麼在js中既可以plugin.foo=value;和plugin.foo進行設定或獲取屬性值,又可以用plugin.foo();呼叫相應的函式功能,但是使用plugin.foo()的時候是先呼叫getproperty再呼叫foo()方法的實現**的。

最簡單的乙個例子是:

bool scriptablepluginobject::hasmethod(npidentifier name)  

bool scriptablepluginobject::hasproperty(npidentifier name)  

bool scriptablepluginobject::getproperty(npidentifier name, npvariant *result)  

bool scriptablepluginobject::setproperty(npidentifier name, const npvariant *value)  

bool scriptablepluginobject::invoke(npidentifier name, const npvariant *args, uint32_t argcount, npvariant *result)  

這樣在js中用任意的字串代替前面的foo或者bar都會正常的呼叫前述相關**。有一點需要指出的是在js中任何object都可以設定屬性如:

var t=new object();  

t.anystr=val;  

alert(t.anystr);

這種方式與前面的不同點在於,這種方式只是js核心的操作,其設定的屬性在外掛程式**中是無法訪問的,外掛程式實現屬性設定的機制的目的也就是為了能夠方便的訪問通過js設定的屬性吧!

要設定幾個特定的屬性或者方法就需要結合npn_getstringidentifier來實現了。具體見例子程式。

在scriptable的外掛程式中,在plugin類和scriptableobject類之間共享資料是非常必要的,使用全域性變數當然是一種辦法,但是這樣會在乙個頁面中有多個外掛程式例項時產生嚴重的後果。因此不提倡這樣做。注意scriptableobject的成員mnpp是getscriptobject返回的,而這個mnpp就是plugin類中的npp結構,而這個npp結構的pdata指向的就是plugin類本身( 在npp_new中有instance->pdata = (void *)plugin;)。將mnpp->pdata強制轉換為plugin類的指標,然後就可以訪問其中的公有成員了。

設定或者獲取屬性一般也不需要呼叫npn的相關介面了,只需要在plugin中定義乙個公有成員變數,在setproperty中plugin* plugin=(plugin*)mnpp->pdata;

plugin->m_bar = npvariant_to_int32(*value);在getproperty中使用plugin* plugin=(plugin*)mnpp->pdata;int32_to_npvariant(plugin->m_bar,*result);就可以了。

Postman介面自動化3 前置指令碼 介面簽名加密

前置指令碼是在介面之前先執行,通常用於做一些引數的處理 常見操作 a.環境變數獲取 修改 具體見下方舉例,在前置請求指令碼中將資料定義為環境變數,在body中引用 b.全域性變數獲取 修改 沒有舉例 c.請求資料的處理 加密 邏輯處理等 具體見下方舉例,md5加密的引數,先在前置請求指令碼中定義,然...

python介面測試指令碼 執行緒 引數化

測試資料存放檔案路徑和檔案 peopleinfo c users ewang desktop infor.csv url c users ewang desktop urlinfo.csv 建立檔案控制代碼並賦予該檔案讀許可權 userinfo file peopleinfo,rb urlfile ...

Excel介面自動化(8)介面測試自動化指令碼

介面測試自動化指令碼 整個流程的邏輯基本都是在這裡面實現,所需要的資料都是通過呼叫前面的封裝來獲取 第一步 新建乙個解析excel工具類的例項物件並且獲取 api 的sheet物件 parsee parseexcel parsee.loadworkbook filepath sheetobj par...