4

Chromeの一部のフレーバーにあるPepperバージョンのFlashではあまりうまく機能しない独自のドキュメントビューアを使用しているので、それを検出して同じコンテンツに別の形式でリダイレクトできるようにしたいと思います。

このバージョンはNPAPIバージョンより遅れているように見えるので、FlashDetectを使用してバージョン番号を探していますが、これには毎日更新する必要があります。ブラウザではなくフラッシュアーキテクチャが問題を引き起こしているので、UserAgentを見たくありませんが、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/

(申し訳ありませんが、このURLはアドレスバーに直接貼り付ける必要があります。)


UPD№3:

調査を行ったところ、クロスプラットフォームソリューションの実装に役立つ興味深い記事が見つかりました。このコードはすべてのOSで機能するはずだと思います。

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

他の例を機能させることはできませんでしたが、次のコードは、ChromePPAPIが有効または無効になっている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を実行していますか?true

>>>テストケースプラグインは一致しましたか?pepflashplayer.dll:true

>>>テストケースプラグインは一致しましたか?PepperFlashPlayer.plugin:true

>>>テストケースプラグインは一致しましたか?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();​
于 2012-12-06T20:59:30.243 に答える
1

あなたがJavascriptを要求したことは知っていますが、これはFlashでも(より簡単に)実行できます。チェックするだけ

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

ソース

于 2014-05-21T16:36:28.883 に答える