使用Javascript检测Pepper(PPAPI)Flash

4
我们正在使用一种专有的文档查看器,它与某些Chrome浏览器中的Pepper版本Flash不兼容。因此,我希望能够检测到并重定向到以不同格式呈现相同内容的页面。
由于这个版本似乎落后于NPAPI版本,因此我一直在使用FlashDetect来查找版本号,但这需要每天更新。我不想通过查看UserAgent来解决问题,因为是Flash架构引起的问题,而不是浏览器。但是,是否有任何用Javascript实现的方法来解决这个问题呢?

也许你需要一个更好的文档查看器 :-P - gen_Eric
用户代理在这里可能不是一个可怕的选择,因为Chrome是唯一使用Pepper Flash的浏览器。 - gen_Eric
5个回答

16

我认为应该这样做:

var isPPAPI = false;
var type = 'application/x-shockwave-flash';
var mimeTypes = navigator.mimeTypes;

if (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin &&
    mimeTypes[type].enabledPlugin.filename == 'pepflashplayer.dll') isPPAPI = true;

jsFiddle上的演示。


更新1:不确定是否需要,但我写了一个小解释:

如果我们的浏览器有MIME类型枚举,我们可以获取与指定类型相关联的插件。因此,我们获取与'application/x-shockwave-flash'相关联的插件,并检查其文件名是否为'pepflashplayer.dll'。我认为这个名称是恒定的,不会在将来改变。


更新2:

要在Google Chrome中启用/禁用PPAPI,您应该转到这个页面:chrome://plugins/

(抱歉,这个URL需要直接粘贴到地址栏中。)


更新3:

我进行了一些调查,并发现了一篇有趣的文章,帮助我实现了一个跨平台的解决方案。我认为这段代码应该适用于所有操作系统:

var isPPAPI = false;
var type = 'application/x-shockwave-flash';
var mimeTypes = navigator.mimeTypes;

var endsWith = function(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

if (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin &&
   (mimeTypes[type].enabledPlugin.filename == "pepflashplayer.dll" ||
    mimeTypes[type].enabledPlugin.filename == "libpepflashplayer.so" ||
    endsWith(mimeTypes[type].enabledPlugin.filename, "Chrome.plugin"))) isPPAPI = true;

请查看更新后的代码示例


更新4:

根据现今情况略微修改了代码。现在条件代码如下:

if (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin &&
   (mimeTypes[type].enabledPlugin.filename.match(/pepflashplayer|Pepper/gi))) isPPAPI = true;

请查看 jsFiddle


2
请注意,查找 dll 意味着您只关心 Windows。PPAPI Flash 已经在 Linux 上使用,并且在 OS X 上是金丝雀版。 - smorgan
@smorgan 好的,稍微修改了一下。如果有人能在Linux和OS X上检查一下就好了。 - Igor Shastin
这个程序在Mac OS X上错误地将NPAPI的“Chrome浏览器Flash播放器插件”识别为PPAPI。此外,Chrome Canary中加载的胡椒闪存插件名为“PepperFlashPlayer.plugin”。 - Jacob Fike
@JacobFike 请随意改进我的代码并在此问题中添加另一个答案。我没有Mac来检查它。 - Igor Shastin

4

我无法使其他示例运行,但是以下代码适用于启用或禁用Chrome PPAPI的Mac和PC,并在其他浏览器上正常工作。

function checkForPepper() {
  return navigator.plugins && _.any(navigator.plugins, function(plugin) {
    return plugin.filename === 'pepflashplayer.dll' || plugin.filename === 'PepperFlashPlayer.plugin';
  });
}
alert ('Pepper enabled: '+ checkForPepper());

注意:需要underscore.js。 这里有一个Fiddle示例链接

4
一种不需要Underscore.js的Darren检查版本。
var checkForPepper = function() {
if (navigator.plugins) {
    for (var i=0, count = navigator.plugins.length; i < count; i++) {
        var filename = navigator.plugins[i].filename;
        if (filename === 'pepflashplayer.dll' || filename === 'PepperFlashPlayer.plugin') return true;
    }
}
return false;

}


2
我使用正则表达式制作了一个更干净的方法,包括测试。 http://jsfiddle.net/YNCVh/ >>> 当前运行的Pepper? true >>> 测试用例插件匹配? pepflashplayer.dll : true >>> 测试用例插件匹配? PepperFlashPlayer.plugin : true >>> 测试用例插件匹配? libpepflashplayer.so : true
/**
 * Regular expression to test for pepper PPAPI plugins
 */
var PPAPI_REGEX = /^(lib)?pep(per)?flashplayer/i;

/**
 * Returns true if the current agent is running PPAPI version of flash
 */
function runningPepperFlash() {
  if (navigator.plugins) {
    for (var i = 0, count = navigator.plugins.length; i < count; i++) {
      var plugin = navigator.plugins[i].filename;
      var has_pepper = PPAPI_REGEX.test(plugin);
      if (has_pepper) {
        return true;
      }
    }
    return false;
  }
}

// ----------------------------------------------------------
// test cases:

/**
 * Test case against the three (3) known plugin file types (win,mac,linux)
 */
function executeTestCases() {
  var plugins = ['pepflashplayer.dll', 'PepperFlashPlayer.plugin', 'libpepflashplayer.so'];
  for (var i = 0; i < plugins.length; i++) {
    var has_pepper = PPAPI_REGEX.test(plugins[i]);
    console.log('Test Case Plugin Matched? ', plugins[i], ': ', has_pepper);
  }

}

console.log('Currently Running Pepper?', runningPepperFlash());

executeTestCases();​

1

我知道你要求 JavaScript,但这也可以更容易地在 Flash 中完成。只需检查。

if (Capabilities.manufacturer === "Google Pepper") {
    Alert.show("Using PPAPI");
}

源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接