Chrome で現在有効となっている Flash Player が PPAPI(Pepper) Plugin かどうかを判断する


追記(7/11): 以下のような面倒なことしなくても Javascript だけでできました。 -> isPepperFlashPlayer (davidortinau / gist:4039375)

Google Chrome 標準の Flash Player Plugin (PPAPI Plugin) にはいろいろな問題がある。

そのため、もしユーザが Pepper Plugin が有効になっている状態でサイトを訪れた場合、Adobe謹製の Flash Player Plugin をインストールしてなおかつブラウザの設定で有効にしてもらうように誘導したい。

そのような動機から、Flash Player のタイプが Pepper Plugin かどうかを判別する swf を作成してみた。

SWF のソースコードとコンパイル

以下の ActionScriptコードを保存し mxmlcコマンドでコンパイルする。

CheckPepperFlashPlugin.as
package {
  import flash.display.Sprite;
  import flash.system.Capabilities;
  import flash.external.ExternalInterface;

  /**
   *  Check Flash Player type is PPAPI Plugin (Google Chrome)
   */
  public class CheckPepperFlashPlugin extends Sprite {
    public function CheckPepperFlashPlugin() {
      ExternalInterface.addCallback( "isPepper", isPepper );
    }

    private function isPepper():Boolean {
      return Capabilities.manufacturer.toUpperCase().indexOf("PEPPER") > 0;
    }
  }
}

以下のようにコンパイル(要 Flex SDK )

$ mxmlc CheckPepperFlashPlugin.as 

すると、 CheckPepperFlashPlugin.swf が作成される。

使ってみる

http サーバ で前述の swf ファイルと以下の HTML ソースコードをホストする。

test.html
<html>
  <body>
    Check Flash Player Type: <span id="plugin-type">(unknown)</span>
    <object id="checkPepper" data="CheckPepperFlashPlugin.swf" type="application/x-shockwave-flash" width="0" height="0">
      <param name="movie" value="CheckPepperFlashPlugin.swf"/>
      <param name="AllowScriptAccess" value="always"/>
    </object>
    <script>
      (function(){
        // SWFの初期化が完了するのを待って渡された関数を実行
        function waitForInitializingSWF(func) {
          if (checkPepper && checkPepper.isPepper) {
            func();
          } else {
            setTimeout(function() { waitForInitializingSWF(func); }, 100);
          }
        }

        // ドキュメントの読み込み完了したら以下のコードを実行
        window.onload = function() {
          waitForInitializingSWF(function() {
            var type = document.getElementById("plugin-type");
            type.textContent = checkPepper.isPepper() ? "Google Chrome Pepper Plugin" : "Adobe Plugin";
          });
        };
      })();
    </script>
  </body>
</html>

実行結果

FireFox

Google Chrome (PPAPI Plugin が有効の状態)

Google Chrome (PPAPI Plugin が無効の状態)