阅读理解FireFox浏览器插件开发文档(二)

    xiaoxiao2021-04-11  31

    三、创建实例 初始化之后就可以创建多个实例了。创建实例的时候通过NPN_SetValue 设置有窗口(默认)或没有窗口。 插件实例通过NPP_New 和 NPP_Destroy创建和销毁

    NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char *argn[], char *argv[], NPSavedData *saved);

    NPP_New创建一个MIMEType类型的插件实例,你可以分配一些私有数据。可以将多个 MIME 类型指派给插件, 这可能允许插件响应不同类型的数据流, 具有不同的接口和行为。 参数mode有两个可选值,NP_EMBED或NP_FULL,NP_EMBED和其他内容共享浏览器窗口,NP_FULL看似是一个新窗口。 接下来三个参数可以用一个例子理解:

    <embed src="movie.avi" height="100" width="100" loop="true"> argc = 4 argn = { "src", "height", "width", "loop" } argv = { "movie.avi", "100", "100", "true" }

    保存参数允许插件的实例保存其数据, 并且当实例被销毁时, 将数据传递到该插件的下一个 url 实例。数据保存在历史记录列表中。只要该插件仍显示在该列表中, 则保存的数据将与该页关联;任何新实例都接收此数据。(必应翻译厉害)

    四、销毁实例 当删除插件实例时, 浏览器调用 NPP_Destroy, 通常是因为用户已经离开了包含实例的页面, 关闭了窗口, 或者退出了应用程序。如果这是由插件创建的最后一个实例, 则调用 NP_Shutdown。(必应翻译) 请务必删除插件实例中存储的任何私有实例特定信息-> pdata。

    NPError NPP_Destroy(NPP instance, NPSavedData **save);

    该插件可以使用可选的 save 参数来保存数据以供使用相同 url 的新实例重用。数据通过其保存的参数传递给 NPP_New。例如, 视频播放器可以保存要显示的最后一个帧数。当用户返回到该页时, 上一个帧号将传递给插件的新实例, 因此它可以最初显示相同的帧。

    请注意, 您不能指望通过这种方式保存数据。如果浏览器重新启动或清除内存, 数据可能会丢失。当 NPP_Destroy 返回时, NPSavedData 结构的 buf 字段的所有权从插件传递到浏览器。

    在 NPP_New 中, 保存的参数包含先前保存的该插件实例的数据 (由 NPP_Destroy 保存)。插件必须释放 NPSavedData 的内存和它包含的缓冲区。 在 NPP_Destroy 中, save 参数指定要保存的状态或其他信息, 以便由具有相同 url 的新实例重用。

    为了确保在丢弃保存的数据时浏览器不会崩溃或泄漏内存, buf 字段应该是一个分配给 NPN_MemAlloc 的扁平结构 (一个没有分配的子结构的简单构造), 如下面的示例所示:

    char* myData = "Here is some saved data.\n"; int32 myLength = strlen(myData) + 1; *save = (NPSavedData*) NPN_MemAlloc(sizeof(NPSavedData)); (*save)->len = myLength; (*save)->buf = (void*) NPN_MemAlloc(myLength); strcpy((*save)->buf, myData);

    如果在 NPP_Destroy 中分配已保存的实例数据, 请务必使用此函数分配内存, 因为浏览器可以随时删除与 NPN_MemAlloc 等效的保存数据。(以后就靠必应翻译了!强无敌)

    转载请注明原文地址: https://ju.6miu.com/read-666583.html

    最新回复(0)