由于阳炎引擎考虑到了运行时是和页面直接衔接,所以相比 BSE 的 Flash 运行时,产生了诸多安全区别。 比如:如果直接在页面运行代码,则代码弹幕可以偷去用户cookie、代替用户发弹幕、伪造站点信息等。 因此,KagerouEngine被设计成在沙箱内运行的引擎,但是因此也产生了一些兼容性问题。
沙箱并不是完美的,它在很多方面提供了更多的可控性,其中之一就是可以直接派发 XMLHttpRequest 请求。由于这种请求依然被同域策略限制,请求只能访问 Scripting 的载体服务器。为了保证安全, 你可以在一个子域或者另一个根域名下放置脚本代码引擎,避免你的主服务器被请求。不过值得注意的是, 代码依然可以访问外部的开放资源,同时也可以借此把需要的信息向外部传递。当然,可以获得的信息仅 限于通过 OOAPI 派发来的信息而已。
由于沙箱是建立在 信息传递(Messaging API) 基础上的,我们只能可靠的进行单向信息汇报。我们 无法在这个API下实现可靠的阻塞式双向信息传递,所以在沙箱内的许多功能將依赖沙箱外界发来的状态报告。
我们举例如下:
Player开放了许多可以用来读取播放器状态的接口,比如 Player.time
, Player.state
等。
由于我们无法在脚本读取这些属性是现去请求外部,所以我们必须使用缓存的数据。即,外部定期会同步
状态到沙箱内而更细的信息则会被沙箱脑补。比如当播放器传来 Play/Timeupdate信息时,Player
会更新内部的状态信息而在第二个消息到来前,读取各种状态则会被Player
脑补。
如果 Player.state
在播放中状态,那么在两个 timeupdate
之间,读取Player.time
则会
返回上次的playtime + 从上次timeupdate 到现在所经过的时差
。
同样, 由于无法高效获取外部的刷新率,enterFrame
事件的广播则会完全由沙箱内部接管。不过这个
广播的派发频率可以由 $.frameRate
调整。更加详细的区别会在各个API接口处表示出来。