我们正在使用专有的文档查看器,它与某些 Chrome 中的 Pepper 版本的 Flash 播放效果不太好,所以我希望能够检测到它并重定向到不同格式的相同内容。
由于这个版本似乎落后于 NPAPI 版本,我一直在使用FlashDetect来查找版本号,但这需要每天更新。我宁愿不看 UserAgent,因为它是导致问题的 Flash 架构而不是浏览器,但是有什么方法可以用 Javascript 做到这一点吗?
我们正在使用专有的文档查看器,它与某些 Chrome 中的 Pepper 版本的 Flash 播放效果不太好,所以我希望能够检测到它并重定向到不同格式的相同内容。
由于这个版本似乎落后于 NPAPI 版本,我一直在使用FlashDetect来查找版本号,但这需要每天更新。我宁愿不看 UserAgent,因为它是导致问题的 Flash 架构而不是浏览器,但是有什么方法可以用 Javascript 做到这一点吗?
我认为应该这样做:
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。
不需要 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;
}
我无法让其他示例正常工作,但以下代码适用于我在启用或禁用 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。在这里拉小提琴。
我使用正则表达式制作了这个方法的更简洁的版本。包括测试。
>>> 目前正在运行 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();
我知道您要求使用 Javascript,但这也可以(更容易)在 Flash 中完成。只需检查
if (Capabilities.manufacturer === "Google Pepper") {
Alert.show("Using PPAPI");
}