如何检测 Chrome 的 "click-to-play" Flash 阻止功能当前处于活动状态

How to detect when Chrome's "click-to-play" Flash blocking feature is currently active

Chrome 的点击播放功能的跟踪状态

您如何检测 Flash 插件已被暂时禁用,或者相反,检测它已因 Chrome 的 "click-to-play" 功能而启用?

背景

Chrome 的新 "click-to-play" 功能可检测不明显的插件并暂停它们。 Chrome 在插件上显示一个 "play" 按钮,用户可以单击 "play" 按钮来激活插件。 (参考:https://productforums.google.com/forum/#!topic/chrome/xPcpRBzyPcc

这是它的实际截图(注意白色播放按钮):

您可以在此屏幕截图中看到它已暂停视频播放器(右栏)。该视频播放器具有基于 HTML5 的控件,可覆盖基于 Flash 的视频播放器。因此,用户无法单击播放按钮,因为整个 SWF 被基于 HTML5 的 play/pause 控件有意覆盖。

我需要的是检测 SWF 何时被 "click-to-play" 功能暂停,以便我可以禁用控件并使 SWF 交互。

我试过的

  1. 在 JavaScript 中 - 尽管 SWF 已暂停,但通过 ExternalInterface 公开的所有方法仍然可用。它实际上像在播放一样响应并且没有 return 错误。
  2. In JavaScript - 将嵌入的 <object> 的大小更新为 > 700x400px。 "Click-to-play" 不会暂停这种大小的 SWF。因此,我尝试使用 -webkit-transfor: scale(0.5) 来使用 CSS 将其缩小到所需的大小。 Chrome 计算最终呈现的大小并暂停 SWF。
  3. 在 Flash 中 - stage.frameRate returns 正确的值(例如,它没有设置为 0 来暂停 SWF)

在写下这个问题时,我找到了答案,决定在这里 post 以防其他人需要帮助解决这个问题。

要规避 Chrome 点击播放限制,请从与您的网站相同的域和协议加载您的 SWF。


您可以使用 AS3 ThrottleEvent 检测 SWF 何时被限制。

// AS3 code
import flash.events.ThrottleEvent;
import flash.external.ExternalInterface;

stage.addEventListener(ThrottleEvent.THROTTLE, onThrottleEvent);

private function onThrottleEvent(e:ThrottleEvent) {
    ExternalInterface.call("onThrottleEvent", e.state); // call javascript function 
}

您可以设置一个 ExternalInterface 调用以在 JavaScript 中跟踪此状态,在 JavaScript 中根据它是否被限制来管理您的 SWF z-index .

// JS Code
var IS_THROTTLED = false;

window.onThrottleEvent = function (throttleState) {
  IS_THROTTLED = (throttleState === "throttle");
}

在页面底部添加一个大于 398x298 的空 Flash 文件。我发现一旦你有至少一个 Flash 文件超过他们的最小 Chrome 将不会暂停你的任何 Flash。您不能使用 CSS 隐藏这个额外的 Flash 文件。可以选择使用 javascript 超时(3 秒)来隐藏空的 Flash 文件,以防它扰乱您的页面布局。我正在使用 swfObject 进行嵌入。

为了其他正在寻找有关 Flash 阻止规则的人的利益,请参阅下面的内容:

  • Flash 内容和页面是从同一个域加载的。
    Flash 对象的未知宽度和高度,即当 Chrome 获取 宽度和高度为 0 或小于 0。
  • Flash 内容是 用户在 Chrome 设置中列入白名单。
  • 的宽度和高度 每个 Flash 对象都小于或等于 5,考虑到 内容要小而重要。
  • 的宽度和高度 Flash 对象等于或大于 398x298。
  • 纵横比 的内容是 16:9,(允许偏差为 0.01)并且 宽*高区域至少120K.

至少需要满足上述条件之一,才能将内容标记为基本内容而不是自动暂停。虽然,我发现很少有偏差,而且 Chrome 还没有对规则做出任何 public 公告。