1

我正在为基于 WebKit 的嵌入式浏览器编写一个 NPAPI 插件。这个插件处理的对象之一是一个视频帧,我想通过它的 javascript 属性调整它的大小,width并且height.

因此,在插件的 C++ 实现中,我通过 NPAPI NP_Class函数指针(在我的例子中映射到HasProperty / GetProperty / SetProperty方法)公开了这两个属性( widthheight )。

现在,困扰我的是,当网页中的 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()函数调用我,返回视频对象的原始尺寸(在本例中为 150 像素高度)。

由于这NPP_setWindow也是直接映射到视频驱动程序的,所以我只在眨眼的时候就看到了我的 250px 高度的视频。我怀疑这完全是因为浏览器只将原始的“样式”属性作为重要的属性。

所以,问题:

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

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

4

2 回答 2

2

<object>s 和其他元素一样是 HTML 元素;element.style.width您可以使用和更改它们的宽度和高度element.style.height。一旦尺寸发生变化,您应该立即获得 NPP_SetWindow 调用,因此您不需要手动滚动您自己的可设置宽度和高度属性。

于 2012-03-22T21:38:34.307 回答
1

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

  1. 我在绝对值(object.style.width = 150;)中设置宽度,而不是使用长度值(如此处所述:http: //www.w3.org/TR/css3-values/)。正确的 javascript 代码需要是这样的:object.style.width = 150 + "px"; // or "150px" directly

  2. 总的来说,我真正的问题是我不知道如何通过插件 C++ 代码影响对象的 CSS属性。我在这里找到了解决方案:您必须使用 NPN_GetValue(my object) / NPN_GetProperty( "style" on my object) / NPN_SetProperty( "width" on the style property) 来做到这一点。

于 2012-03-23T11:53:26.980 回答