Обнаружение перца (PPAPI) Flash с Javascript
Мы используем проприетарную программу просмотра документов, которая не очень хорошо работает с версией Flash для Pepper, которую можно найти в некоторых версиях Chrome, поэтому я хотел бы иметь возможность обнаружить ее и перенаправить на тот же контент в другом формате.
Поскольку эта версия, похоже, отстает от NPAPI, я использую FlashDetect для поиска номера версии, но для этого требуется ежедневное обновление. Я бы предпочел не смотреть на UserAgent, поскольку именно проблема связана с архитектурой flash, а не с браузером, но есть ли способ сделать это с помощью Javascript?
5 ответов
Я думаю, что это должно быть сделано так:
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:
Чтобы включить / отключить PPAPI в Google Chrome, перейдите на эту страницу: chrome://plugins/
(Извините, этот URL нужно вставить прямо в адресную строку.)
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.
Я не смог заставить другие примеры работать, но следующий код работает для меня как на Mac, так и на ПК с включенным или отключенным Chrome PPAPI. Также корректно работает в других браузерах.
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. Скрипка здесь
Версия чека Даррена, которая не требует 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;
}
Я сделал более чистую версию этого метода, используя регулярные выражения. Включает тесты.
>>> В настоящее время работает Pepper? правда
>>> Тестовый плагин соответствует? pepflashplayer.dll: правда
>>> Тестовый плагин соответствует? PepperFlashPlayer.plugin: true
>>> Тестовый плагин соответствует? 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");
}