4

我们正在使用专有的文档查看器,它与某些 Chrome 中的 Pepper 版本的 Flash 播放效果不太好,所以我希望能够检测到它并重定向到不同格式的相同内容。

由于这个版本似乎落后于 NPAPI 版本,我一直在使用FlashDetect来查找版本号,但这需要每天更新。我宁愿不看 UserAgent,因为它是导致问题的 Flash 架构而不是浏览器,但是有什么方法可以用 Javascript 做到这一点吗?

4

5 回答 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上的演示。


UPD №1:不确定是否需要,但我写了一点解释:

如果我们的浏览器有一个 MIME 类型枚举,我们可以得到一个与指定类型关联的插件。所以我们得到了与之关联的插件,'application/x-shockwave-flash'并检查它的文件名是否为'pepflashplayer.dll'. 我认为这个名字是不变的,以后不会改变。


UPD №2:

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

(对不起,这个网址需要直接粘贴到地址栏中。)


UPD №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;

查看更新的小提琴


UPD №4:

稍微更改了代码以满足当今的现实。现在条件如下所示:

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

退房jsFiddle

于 2012-10-12T20:07:09.317 回答
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;

}

于 2012-11-30T02:30:11.833 回答
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。在这里拉小提琴。

于 2012-11-24T01:28:55.623 回答
2

我使用正则表达式制作了这个方法的更简洁的版本。包括测试。

http://jsfiddle.net/YNCVh/

>>> 目前正在运行 Pepper?真的

>>> 测试用例插件匹配?pepflashplayer.dll:是的

>>> 测试用例插件匹配?PepperFlashPlayer.plugin:真

>>> 测试用例插件匹配?libpepflashplayer.so:真

/**
 * 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();​
于 2012-12-06T20:59:30.243 回答
1

我知道您要求使用 Javascript,但这也可以(更容易)在 Flash 中完成。只需检查

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

资源

于 2014-05-21T16:36:28.883 回答