我们正在使用专有的文档查看器,它在某些版本的Chrome中找不到与Pepper版本相同的Flash版本,所以我希望能够检测到它并重定向到不同的相同内容格式。
由于此版本似乎落后于NPAPI,我一直在使用FlashDetect来查找版本号,但这需要每日更新。我不想看看UserAgent,因为它是导致麻烦而不是浏览器的Flash架构,但有没有任何方法可以用Javascript来做到这一点?
答案 0 :(得分: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:
我做了一些调查,发现了一个有趣的article,帮助我实现了跨平台的解决方案。我认为这段代码适用于所有操作系统:
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;
查看更新的 fiddle 。
UPD№4:
略微更改了代码以满足当今的现实。现在条件看起来像这样:
if (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin &&
(mimeTypes[type].enabledPlugin.filename.match(/pepflashplayer|Pepper/gi))) isPPAPI = true;
查看 jsFiddle 。
答案 1 :(得分: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。小提琴here。
答案 2 :(得分:4)
Darren的支票版本,不需要Underscore.js
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;
}
答案 3 :(得分:2)
我使用regexp制作了此方法的更干净版本。包括测试。
&GT;&GT;&GT;目前跑胡椒?真
&GT;&GT;&GT;测试用例插件匹配? pepflashplayer.dll:true
&GT;&GT;&GT;测试用例插件匹配? PepperFlashPlayer.plugin:true
&GT;&GT;&GT;测试用例插件匹配? 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();
答案 4 :(得分:1)
我知道你要求使用Javascript,但这也可以在Flash中(更容易)完成。请检查
if (Capabilities.manufacturer === "Google Pepper") {
Alert.show("Using PPAPI");
}