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

NPAPI: modify plugin object's CSS properties

本文关键字:CSS 属性 对象 插件 修改 NPAPI      更新时间:2023-10-16

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

因此,在我的C++插件实现中,我通过NPAPI NP_Class函数指针公开了这两个属性(widthheight)(在我的情况下,它们映射到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也直接映射到视频驱动程序,所以我在眨眼之间只看到250像素高的视频。我怀疑这一切都是由于浏览器只将原始的"样式"属性作为重要属性。

所以,问题:

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

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

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

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

  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属性。我在这里找到了解决方案:你必须使用NPN_GetValue(我的对象)/NPN_GetProperty(我对象上的"style")/NPN_SetProperty(style属性上的"width")才能做到这一点。