Advertisement
flassari

SwfWheel with Chrome Pepper Fix

Oct 11th, 2012
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * SWFWheel - remove dependencies of mouse wheel on each browser.
  3.  *
  4.  * Copyright (c) 2008 - 2010 Spark project (www.libspark.org)
  5.  *
  6.  * Dual licensed under the MIT (MIT-LICENSE.txt)
  7.  * and GPL (GPL-LICENSE.txt) licenses.
  8.  */
  9. (function ()
  10. {
  11.     // do nothing if already defined `SWFWheel`.
  12.     if (window.SWFWheel) return;
  13.  
  14.     var win = window,
  15.         doc = document,
  16.         nav = navigator;
  17.  
  18.     var SWFWheel = window.SWFWheel = function (id)
  19.     {
  20.         this.setUp(id);
  21.         if (SWFWheel.browser.msie)
  22.             this.bind4msie();
  23.         else
  24.             this.bind();
  25.     };
  26.  
  27.     SWFWheel.prototype = {
  28.         setUp: function (id)
  29.         {
  30.             var el = SWFWheel.retrieveObject(id);
  31.             if (el.nodeName.toLowerCase() == 'embed' || SWFWheel.browser.safari)
  32.                 el = el.parentNode;
  33.             this.target = el;
  34.             this.eventType = SWFWheel.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel';
  35.         },
  36.  
  37.         bind: function ()
  38.         {
  39.             this.target.addEventListener(this.eventType, function (evt)
  40.             {
  41.                 var target,
  42.                     name,
  43.                     delta = 0;
  44.                 // retrieve real node from XPCNativeWrapper.
  45.                 if (/XPCNativeWrapper/.test(evt.toString()))
  46.                 {
  47.                     // FIXME: embed element has no id attributes on `AC_RunContent`.
  48.                     var k = evt.target.getAttribute('id') || evt.target.getAttribute('name');
  49.                     if (!k) return;
  50.                     target = SWFWheel.retrieveObject(k);
  51.                 }
  52.                 else
  53.                 {
  54.                     target = evt.target;
  55.                 }
  56.                 name = target.nodeName.toLowerCase();
  57.                 // check target node.
  58.                 if (name != 'object' && name != 'embed') return;
  59.                 // kill process.
  60.                 if (!target.checkBrowserScroll())
  61.                 {
  62.                     evt.preventDefault();
  63.                     evt.returnValue = false;
  64.                 }
  65.                 // execute wheel event if exists.
  66.                 if (!target.triggerMouseEvent) return;
  67.                 // fix delta value.
  68.                 switch (true)
  69.                 {
  70.                     case SWFWheel.browser.mozilla:
  71.                         delta = -evt.detail;
  72.                         break;
  73.  
  74.                     case SWFWheel.browser.opera:
  75.                         delta = evt.wheelDelta / 40;
  76.                         break;
  77.  
  78.                     default:
  79.                         //  safari, stainless, opera and chrome.
  80.                         delta = evt.wheelDelta / 80;
  81.                         break;
  82.                 }
  83.                 target.triggerMouseEvent(delta, evt.ctrlKey, evt.altKey, evt.shiftKey);
  84.             }, false);
  85.         },
  86.  
  87.         bind4msie: function ()
  88.         {
  89.             var _wheel,
  90.                 _unload,
  91.                 target = this.target;
  92.  
  93.             _wheel = function ()
  94.             {
  95.                 var evt = win.event,
  96.                     delta = 0,
  97.                     name = evt.srcElement.nodeName.toLowerCase();
  98.  
  99.                 if (name != 'object' && name != 'embed') return;
  100.                 if (!target.checkBrowserScroll())
  101.                     evt.returnValue = false;
  102.                 //  will trigger when wmode is `opaque` or `transparent`.
  103.                 if (!target.triggerMouseEvent) return;
  104.                 delta = evt.wheelDelta / 40;
  105.                 target.triggerMouseEvent(delta, evt.ctrlKey, evt.altKey, evt.shiftKey);
  106.             };
  107.             _unload = function ()
  108.             {
  109.                 target.detachEvent('onmousewheel', _wheel);
  110.                 win.detachEvent('onunload', _unload);
  111.             };
  112.             target.attachEvent('onmousewheel', _wheel);
  113.             win.attachEvent('onunload', _unload);
  114.         }
  115.     };
  116.  
  117.     //  utilities. ------------------------------------------------------------
  118.     SWFWheel.browser = (function ()
  119.     {
  120.         var ua = nav.userAgent.toLowerCase(),
  121.             pl = nav.platform.toLowerCase(),
  122.             version,
  123.             pv = [0, 0, 0];
  124.  
  125.         if (nav.plugins && nav.plugins['Shockwave Flash'])
  126.         {
  127.             version = nav.plugins['Shockwave Flash']
  128.                          .description
  129.                          .replace(/^.*\\s+(\\S+\\s+\\S+$)/, '$1');
  130.             pv[0] = parseInt(version.replace(/^(.*)\\..*$/, '$1'), 10);
  131.             pv[1] = parseInt(version.replace(/^.*\\.(.*)\\s.*$/, '$1'), 10);
  132.             pv[2] = /[a-z-A-Z]/.test(version) ?
  133.                     parseInt(version.replace(/^.*[a-zA-Z]+(.*)$/, '$1'), 10) : 0;
  134.         }
  135.         else if (win.ActiveXObject)
  136.         {
  137.             try
  138.             {
  139.                 var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
  140.                 if (axo)
  141.                 {
  142.                     version = axo.GetVariable('$version');
  143.                     if (version)
  144.                     {
  145.                         version = version.split(' ')[1].split(',');
  146.                         pv[0] = parseInt(version[0], 10);
  147.                         pv[1] = parseInt(version[1], 10);
  148.                         pv[2] = parseInt(version[2], 10);
  149.                     }
  150.                 }
  151.             }
  152.             catch (e) {}
  153.         }
  154.        
  155.         return {
  156.             win: pl ? /win/.test(pl) : /win/.test(ua),
  157.             mac: pl ? /mac/.test(pl) : /mac/.test(ua),
  158.             playerVersion: pv,
  159.             version: (ua.match(/.+(?:rv|it|ra|ie)[\/:\\s]([\\d.]+)/)||[0,'0'])[1],
  160.             chrome: /chrome/.test(ua),
  161.             stainless: /stainless/.test(ua),
  162.             safari: /webkit/.test(ua) && !/(chrome|stainless)/.test(ua),
  163.             opera: /opera/.test(ua),
  164.             msie: /msie/.test(ua) && !/opera/.test(ua),
  165.             mozilla: /mozilla/.test(ua) && !/(compatible|webkit)/.test(ua)
  166.         }
  167.     })();
  168.  
  169.     SWFWheel.join = function (id)
  170.     {
  171.         var t = setInterval(function ()
  172.         {
  173.             if (SWFWheel.retrieveObject(id))
  174.             {
  175.                 clearInterval(t);
  176.                 new SWFWheel(id);
  177.             }
  178.         }, 0);
  179.     };
  180.  
  181.     /**
  182.      *  0: always triggered with naitive event.
  183.      *  1: if prevent default event process, will need hack.
  184.      *  2: always triggered with hacked event.
  185.      */
  186.     SWFWheel.getState = function (id)
  187.     {
  188.         var STATE_HACKED = 2,
  189.             STATE_IF_NEEDED = 1,
  190.             STATE_NATIVE = 0,
  191.             br = SWFWheel.browser,
  192.             fp = br.playerVersion;
  193.    
  194.         // The new pepper plugin requires chrome to always be hacked.
  195.         if (br.chrome)
  196.         {
  197.             return STATE_HACKED;
  198.         }
  199.  
  200.         if (br.mac)
  201.         {
  202.             if (fp[0]>=10 && fp[1]>=1)
  203.             {
  204.                 if (br.safari||br.stainless) return STATE_NATIVE;
  205.                 else if (br.chrome) return STATE_IF_NEEDED;
  206.                 else return STATE_HACKED;
  207.             }
  208.             else
  209.             {
  210.                 return STATE_HACKED;
  211.             }
  212.         }
  213.         // always needs hack on windows safari under fp 10.0
  214.         if (!(fp[0]>=10 && fp[1]>=1) && SWFWheel.browser.safari) return STATE_HACKED;
  215.  
  216.         var el = SWFWheel.retrieveObject(id),
  217.             name = el.nodeName.toLowerCase(),
  218.             wmode = '';
  219.  
  220.         if (name == 'object')
  221.         {
  222.             var k,
  223.                 param,
  224.                 params = el.getElementsByTagName('param'),
  225.                 len = params.length;
  226.  
  227.             for (var i=0; i<len; i++)
  228.             {
  229.                 param = params[i];
  230.                 //  FIXME: getElementsByTagName is broken on IE?
  231.                 if (param.parentNode != el) continue;
  232.  
  233.                 k = param.getAttribute('name');
  234.                 wmode = param.getAttribute('value') || '';
  235.                 if (/wmode/i.test(k)) break;
  236.             }
  237.         }
  238.         else if (name == 'embed')
  239.         {
  240.             wmode = el.getAttribute('wmode') || '';
  241.         }
  242.         //
  243.         if (br.msie)
  244.         {
  245.             if (/transparent/i.test(wmode)) return STATE_HACKED;
  246.             else if (/opaque/i.test(wmode)) return STATE_IF_NEEDED;
  247.             else return STATE_NATIVE;
  248.         }
  249.         else
  250.         {
  251.             if (/opaque|transparent/i.test(wmode)) return STATE_HACKED;
  252.             else return STATE_NATIVE;
  253.         }
  254.     };
  255.  
  256.     SWFWheel.retrieveObject = function (id)
  257.     {
  258.         var el = doc.getElementById(id);
  259.         //  FIXME: fallback for `AC_FL_RunContent`.
  260.         if (!el)
  261.         {
  262.             var nodes = doc.getElementsByTagName('embed'),
  263.                 len = nodes.length;
  264.  
  265.             for (var i=0; i<len; i++)
  266.             {
  267.                 if (nodes[i].getAttribute('name') == id)
  268.                 {
  269.                     el = nodes[i];
  270.                     break;
  271.                 }
  272.             }
  273.         }
  274.         return el;
  275.     };
  276.  
  277. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement