Detecting Pepper (PPAPI) Flash with Javascript

后端 未结 5 1284
悲&欢浪女
悲&欢浪女 2021-02-10 21:14

We are using a proprietary document viewer which doesn\'t play terribly nice with the Pepper version of Flash found in some flavors of Chrome, so I\'d like to be able to detect

相关标签:
5条回答
  • 2021-02-10 21:55

    I think it should be done this way:

    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;
    

    Demo on jsFiddle.


    UPD №1: Not sure if needed, but I wrote a little explanation:

    If our browser has a MIME types enumeration, we can get a plugin associated with a specified type. So we're getting plugin which associated with 'application/x-shockwave-flash' and check if its filename is 'pepflashplayer.dll'. I think that this name is constant and will not be changed in future.


    UPD №2:

    To enable/disable PPAPI in Google Chrome, you should go to this page: chrome://plugins/

    (Sorry, this URL needs to be pasted directly into the address bar.)


    UPD №3:

    I did some investigation and found an interesting article that helped me to implement a cross-platform solution. I think that this code should work on all 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;
    

    Check out an updated fiddle.


    UPD №4:

    Slightly changed the code to meet today's realities. Now condition looks like this:

    if (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin &&
       (mimeTypes[type].enabledPlugin.filename.match(/pepflashplayer|Pepper/gi))) isPPAPI = true;
    

    Check out jsFiddle.

    0 讨论(0)
  • 2021-02-10 21:57

    I made a cleaner version of this method using regexp. Includes tests.

    http://jsfiddle.net/YNCVh/

    >>> Currently Running Pepper? true

    >>> Test Case Plugin Matched? pepflashplayer.dll : true

    >>> Test Case Plugin Matched? PepperFlashPlayer.plugin : true

    >>> Test Case Plugin Matched? 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();​
    
    0 讨论(0)
  • 2021-02-10 21:59

    I know you asked for Javascript, but this can also be done (more easily) in Flash. Just check

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

    Source

    0 讨论(0)
  • 2021-02-10 22:16

    I couldn't get the other examples to work, but the following code works for me on both Mac and PC with Chrome PPAPI enabled or disabled. Also works correctly on other browsers.

    function checkForPepper() {
      return navigator.plugins && _.any(navigator.plugins, function(plugin) {
        return plugin.filename === 'pepflashplayer.dll' || plugin.filename === 'PepperFlashPlayer.plugin';
      });
    }
    alert ('Pepper enabled: '+ checkForPepper());
    

    Note: Requires underscore.js. Fiddle here.

    0 讨论(0)
  • 2021-02-10 22:18

    A version of Darren's check that doesn't require 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;
    

    }

    0 讨论(0)
提交回复
热议问题