NPAPI:修改插件对象的CSS属性

时间:2012-03-22 16:21:14

标签: javascript c++ dom npapi browser-plugin

我正在为基于WebKit的嵌入式浏览器编写NPAPI插件。此插件处理的对象之一是我希望通过其javascript属性widthheight调整大小的视频帧。

所以,在我的插件的C ++实现中,我通过NPAPI NP_Class函数指针(映射)公开了这两个属性( width height )在我的案例中 HasProperty / GetProperty / SetProperty 方法。)

现在,困扰我的是,当网页中的Javascript不是这样的时候:

<object id="video" type="video/myPluginMimeType" style="height:150px;"></object>
<script>
var video = $('video');
video.height = 250; // all happens here
</script>

它成功地进入我的C ++代码并执行视频大小调整(在我的嵌入式平台中,它直接转到视频驱动程序)。
但是,在此之后,浏览器通过NPN_setWindow()函数调用,让我回到视频对象的原始尺寸(此示例中为150px高度)。

由于此NPP_setWindow也直接映射到视频驱动程序,因此我只会在眨眼间看到我的视频高度为250px。 我怀疑这都是因为浏览器只将原始的“样式”属性视为重要的属性。

所以,问题:

  • 我可以通过NPAPI以某种方式让浏览器更新其宽度/高度(甚至样式?)属性吗?
  • 我应该简单地忽略NPP_setWindow调用,并根据对NPN_New()的初始调用(它给出了对象的样式属性)以及后续通过NP API调用video.height来唯一地执行调整大小? / LI>

我承认我更喜欢第一个版本,因为它让浏览器决定何时重绘,这样我就可以拥有一个非常无状态的视频插件。
此外,第一个版本使网页能够更改插件DOM对象的CSS属性,该属性将自动通过NPP_setWindow调用反映出来。

2 个答案:

答案 0 :(得分:2)

<object>是HTML元素,与其他任何元素一样;您可以使用element.style.widthelement.style.height更改其宽度和高度。一旦尺寸发生变化,您应该立即进行NPP_SetWindow调用,因此您无需手动滚动自己的可设置宽度和高度属性。

答案 1 :(得分:1)

好的,我找到了解决方案,所以我会把这个留给其他人:

  1. 我将宽度设置为aboslut值(object.style.width = 150;),而不是使用长度值(如此处所述:http://www.w3.org/TR/css3-values/)。正确的javascript代码必须如下所示:object.style.width = 150 + "px"; // or "150px" directly

  2. 总的来说,我真正的问题是我不知道如何从插件C ++代码影响我的对象的CSS属性。 我找到了解决方案here:你必须使用NPN_GetValue(我的对象)/ NPN_GetProperty(我的对象上的“style”)/ NPN_SetProperty(样式属性上的“width”)才能做到这一点。