Обнаружение Pepper (PPAPI) Flash с помощью Javascript

Мы используем проприетарное средство просмотра документов, которое не очень хорошо работает с версией Flash для Pepper, которая есть в некоторых разновидностях Chrome, поэтому я хотел бы иметь возможность обнаруживать его и перенаправлять на тот же контент в другом формате.

Поскольку эта версия отстает от версии NPAPI, я использовал FlashDetect искать номер версии, но это требует ежедневного обновления. Я бы предпочел не смотреть на UserAgent, так как проблемы вызывает архитектура flash, а не браузер, но есть ли способ сделать это с помощью Javascript?


person Andy H-D    schedule 12.10.2012    source источник
comment
Возможно, вам нужен лучший просмотрщик документов :-P   -  person Rocket Hazmat    schedule 12.10.2012
comment
Пользовательские агенты не могут быть здесь ужасным выбором, поскольку Chrome — единственный браузер, использующий Pepper Flash.   -  person Rocket Hazmat    schedule 12.10.2012


Ответы (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.

person Igor Shastin    schedule 12.10.2012
comment
Обратите внимание, что поиск dll предполагает, что вас интересует только Windows. PPAPI Flash уже используется в Linux и в Canary на OS X. - person smorgan; 13.10.2012
comment
@smorgan Хорошо, немного изменил. Я буду рад, если кто-нибудь сможет проверить это на Linux и OS X. - person Igor Shastin; 14.10.2012
comment
Этот плагин неправильно определяет плагин NPAPI Flash Player для Chrome как PPAPI в Mac OS X. Кроме того, в Chrome Canary плагин перец flash загружается как PepperFlashPlayer.plugin - person Jacob Fike; 16.10.2012
comment
@JacobFike Не стесняйтесь улучшить мой код и добавить еще один ответ на этот вопрос. У меня нет Mac, чтобы проверить это. - person Igor Shastin; 16.10.2012

Я не смог заставить работать другие примеры, но следующий код работает для меня как на 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. Поиграйте здесь.

person Darren    schedule 24.11.2012

Версия проверки Даррена, не требующая 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;

}

person Adam Ullman    schedule 30.11.2012

Я сделал более чистую версию этого метода, используя регулярное выражение. Включает тесты.

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();​
person Scott Paradis    schedule 06.12.2012

Я знаю, что вы просили Javascript, но это также можно сделать (проще) во Flash. Просто проверьте

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

Источник

person BlueRaja - Danny Pflughoeft    schedule 21.05.2014