home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / fil9BBD58FF04E9E3DE7E618ABFAF965F0F < prev    next >
Text File  |  2010-07-12  |  12KB  |  414 lines

  1. var YaProgressListener =  (function() {
  2.   function tabHandler(aBrowser) {
  3.     this._browser = aBrowser;
  4.     this.actionValue = null;
  5.     
  6.     this.location = null;
  7.     
  8.     this.times = null;
  9.     this.clearTimes();
  10.     
  11.     this.inProgress = false;
  12.     this.isFromCache = false;
  13.     this.data = {};
  14.     
  15.     this._tabData = {};
  16.     
  17.     this._setListeners(true);
  18.   }
  19.   
  20.   tabHandler.prototype = {
  21.     _events: [
  22.       ["DOMContentLoaded", false],
  23.       ["load", true],
  24.       ["pageshow", true],
  25.       ["pagehide", true]
  26.     ],
  27.     
  28.     _setListeners: function(aAdd) {
  29.       let fn = (aAdd ? "add" : "remove") + "EventListener";
  30.       
  31.       this._events.forEach(function(ev) {
  32.         this._browser[fn](ev[0], this, ev[1], true);
  33.       }, this);
  34.     },
  35.     
  36.     VERSION: 3,
  37.     
  38.     get tabData() {
  39.       return this._tabData;
  40.     },
  41.     
  42.     getRequestName: function(aRequest) {
  43.       let name = null;
  44.       
  45.       try {
  46.         name = aRequest.name;
  47.         name = /^https?/.test(name) ? name : null;
  48.       } catch(e) {}
  49.       
  50.       return name;
  51.     },
  52.     
  53.     handleEvent: function(aEvent) {
  54.       if (!(aEvent.isTrusted && this._isTargetEqTopWindow(aEvent)))
  55.         return;
  56.       
  57.       switch (aEvent.type) {
  58.         case "DOMContentLoaded":
  59.           this.times.documentLoaded = this.timeNow;
  60.           
  61.           YaProgressListener.notifyListeners("DOMContentLoaded", this._browser);
  62.           
  63.           break;
  64.         
  65.         case "load":
  66.           this.times.windowLoaded = this.timeNow;
  67.           
  68.           this.onNavigationStopped();
  69.           
  70.           YaProgressListener.notifyListeners("load", this._browser);
  71.           
  72.           break;
  73.         
  74.         case "pagehide":
  75.           YaProgressListener.notifyListeners("pagehide", this._browser);
  76.           
  77.           break;
  78.         
  79.         case "pageshow":
  80.           YaProgressListener.notifyListeners("pageshow", this._browser);
  81.           
  82.           if (this._browser !== gBrowser.mCurrentBrowser)
  83.             Ya.nsIYa.webProgressListener.onPageShowInBackground(this._browser.webProgress, Ya.buttonsObject);
  84.           
  85.           break;
  86.       }
  87.     },
  88.     
  89.     _isTargetEqTopWindow: function(aEvent) {
  90.       let target = aEvent.originalTarget;
  91.       
  92.       if (!(target && (target instanceof Ci.nsIDOMHTMLDocument)))
  93.         return false;
  94.       
  95.       let targetDefView = (new XPCNativeWrapper(target, "defaultView")).defaultView;
  96.       let topDefView = (new XPCNativeWrapper(this._browser.contentDocument, "defaultView")).defaultView;
  97.       
  98.       return !!(targetDefView === topDefView);
  99.     },
  100.     
  101.     destroy: function() {
  102.       this._setListeners(false);
  103.       
  104.       this._browser = null;
  105.       this.actionValue = null;
  106.       this.times = null;
  107.     },
  108.     
  109.     get timeNow() {
  110.       return Date.now();
  111.     },
  112.     
  113.     clearTimes: function() {
  114.       this.times = {
  115.         transferStart:   -1,
  116.         transferStop:    -1,
  117.         documentLoaded:  -1,
  118.         windowLoaded:    -1
  119.       }
  120.     },
  121.     
  122.     onTransferStart: function(aURL) {
  123.       this.clearTimes();
  124.       this.times.transferStart = this.timeNow;
  125.       
  126.       this.location = aURL || null;
  127.       this.inProgress = true;
  128.       this.isFromCache = false;
  129.     },
  130.     
  131.     onTransferStop: function() {
  132.       if (this.times.transferStart > 0)
  133.         this.times.transferStop = this.timeNow;
  134.     },
  135.     
  136.     onNavigationStopped: function() {
  137.       this.inProgress = false;
  138.       
  139.       let data = {};
  140.       for each (var prop in ["location", "isFromCache", "actionValue"])
  141.         data[prop] = this[prop];
  142.       
  143.       let times = this.times;
  144.       if (times.transferStart > 0 && times.transferStop > 0 &&
  145.           times.documentLoaded > 0 && times.windowLoaded > 0) {
  146.         
  147.         let t1 = times.transferStop - times.transferStart;
  148.         let t2 = times.documentLoaded - times.transferStop;
  149.         let t3 = times.windowLoaded - times.documentLoaded;
  150.         
  151.         if (t1 > 0 && t2 > 0 && t3 >= 0)
  152.           data.times = [t1,t2,t3];
  153.       }
  154.       
  155.       this.data = data;
  156.       this.actionValue = null;
  157.       
  158.       this.clearTimes();
  159.     },
  160.     
  161.     hostQuickRe: /(^|\.)((yandex|ya|moikrug)\.(ru|com|ua|by|kz)|(google)\.(com|ru)|(mail|rambler)\.ru)$/i,
  162.     hostYaRe: new RegExp("(^|\\.)(yandex\\.([A-Za-z]{2,4})|(ya|moikrug)\\.ru)$", "i"),
  163.     hostOnlyRe: new RegExp("(^|www\\.)(yandex|ya|moikrug|google|mail|rambler)\\.", "i"),
  164.     hostReS: new RegExp("(^|(nova|www|go)\\.)(yandex|google|mail|rambler)\\.(?:com|ru|ua|by|kz)$", "i"),
  165.     pathReS: new RegExp("^((yand)?search|srch)\\?", "i"),
  166.     hostReM: new RegExp("^((web)?mail\\.yandex\\.(ru|ua|by|kz)|win\\.mail\\.ru|mail\\.rambler\\.ru)$", "i"),
  167.     urlReM:  new RegExp("^http:\/\/([^\/]+\/(cgi\\-bin\/sendmsg\\?)?compose|webmail\\.yandex\\.(ru|ua|by|kz)\/messages|mail\\.yandex\\.(ru|ua|by|kz)\/((classic|modern|neo)/)?(messages|compose)|win\\.mail\\.ru\/cgi\\-bin\/(sentmsg\\?compose|msglist\\?folder=0&))|mail\\.rambler\\.ru\/mail\/(startpage\\?|mail\.cgi\\?(r|mode=(startpage|compose|mailbox;mbox=INBOX)))", "i"),
  168.     
  169.     checkConditions: function(aURL) {
  170.       if (aURL && aURL.match(/^http:\/\/([^\/]+)\/?(.*)/)) {
  171.         let host = RegExp.$1,
  172.             path = RegExp.$2;
  173.         
  174.         if (this.hostQuickRe.test(host)) {
  175.           if (!path && this.hostOnlyRe.test(host))
  176.             return true;
  177.           
  178.           if (this.hostReM.test(host) && aURL.match(this.urlReM))
  179.             return true;
  180.           
  181.           if (this.pathReS.test(path) && host.match(this.hostReS)) {
  182.             let q = "text";
  183.             switch (RegExp.$3) {
  184.               case "google":  q = "(as_)?q";         break;
  185.               case "mail":    q = "q";               break;
  186.               case "rambler": q = "(query|words)";   break;
  187.             }
  188.             
  189.             let re = new RegExp("[\?&](?:" + q + ")=([^#&\?]*)");
  190.             if (re.test(path))
  191.               return true;
  192.           }
  193.           
  194.           if (this.hostYaRe.test(host))
  195.             return true;
  196.         }
  197.       }
  198.       
  199.       return false;
  200.     },
  201.     
  202.     isYandexHost: function(aURL) {
  203.       if (aURL && aURL.match(/^http:\/\/([^\/]+)\/?(.*)/)) {
  204.         if (this.hostYaRe.test(RegExp.$1))
  205.           return true;
  206.       }
  207.       
  208.       return false;
  209.     },
  210.     
  211.     get dataSumm() {
  212.       let res = {};
  213.       
  214.       if (this._browser && !this.inProgress) {
  215.         let d = this.data;
  216.         
  217.         if (!d.isFromCache && d.times && d.location && 
  218.             this._browser.currentURI.spec == d.location &&
  219.             this.checkConditions(d.location)) {
  220.           
  221.           let t = [];
  222.           d.times.forEach(function(aTime) {
  223.             t.push(parseInt(aTime/10, 10));
  224.           });
  225.           
  226.           let yamm = null;
  227.           
  228.           if (this.isYandexHost(d.location)) {
  229.             let doc = this._browser.contentDocument;
  230.             let metaNodes = doc.getElementsByTagName("meta");
  231.             for (let i = 0, len = metaNodes.length; i < len; i++) {
  232.               let metaName = (metaNodes[i].name || "").toLowerCase();
  233.               if (metaName == "yamm" && metaNodes[i].content) {
  234.                 yamm = ("" + metaNodes[i].content).substr(0,10);
  235.                 break;
  236.               }
  237.             }
  238.           }
  239.           
  240.           res.time = {
  241.             tv: this.VERSION,
  242.             t: t.join("-"),
  243.             yamm: yamm
  244.           };
  245.         }
  246.         
  247.         res.action = d.actionValue;
  248.         
  249.         this.data = {};
  250.       }
  251.       
  252.       return res;
  253.     }
  254.   };
  255.   
  256.   var winProgressListener = {
  257.     QueryInterface: function(aIID) {
  258.       if (aIID.equals(Ci.nsIWebProgressListener) ||
  259.           aIID.equals(Ci.nsISupportsWeakReference) ||
  260.           aIID.equals(Ci.nsISupports))
  261.         return this;
  262.       
  263.       throw Components.results.NS_NOINTERFACE;
  264.     },
  265.     
  266.     get nsIYaListener() {
  267.       delete this.nsIYaListener;
  268.       return this.nsIYaListener = Cc["@yandex.ru/yasearch;1"].getService(Ci.nsIYaSearch)
  269.                                                              .wrappedJSObject
  270.                                                              .webProgressListener;
  271.     },
  272.     
  273.     onLocationChange: function(aWebProgress, aRequest, aLocation) {
  274.       let top;
  275.       try {
  276.         let reqWindow = aWebProgress.DOMWindow;
  277.         top = reqWindow === reqWindow.top;
  278.       } catch(e) {}
  279.       
  280.       if (!top)
  281.         return;
  282.       
  283.       aWebProgress.QueryInterface(Ci.nsIWebNavigation);
  284.       aWebProgress.QueryInterface(Ci.nsIDocShell);
  285.       
  286.       YaProgressListener.notifyListeners("onWindowLocationChange", aWebProgress, aRequest, aLocation);
  287.       
  288.       this.nsIYaListener.onLocationChange(aWebProgress, Ya.buttonsObject);
  289.     },
  290.     
  291.     onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
  292.       if (!aRequest || !(aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK))
  293.         return;
  294.       
  295.       aWebProgress.QueryInterface(Ci.nsIWebNavigation);
  296.       aWebProgress.QueryInterface(Ci.nsIDocShell);
  297.       
  298.       if (aStateFlags & Ci.nsIWebProgressListener.STATE_START)
  299.         this.nsIYaListener.onPageStateStart(aWebProgress, aRequest);
  300.       
  301.       if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)
  302.         this.nsIYaListener.onPageStateStop(aWebProgress, aRequest);
  303.     },
  304.     
  305.     onProgressChange:    function(a,b,c,d,e,f){},
  306.     onStatusChange:      function(a,b,c,d){},
  307.     onSecurityChange:    function(a,b,c){},
  308.     onLinkIconAvailable: function(a){}
  309.   };
  310.   
  311.   return {
  312.     handleEvent: function(aEvent) {
  313.       let browser,
  314.           eventType = aEvent.type;
  315.       
  316.       switch (eventType) {
  317.         case "TabOpen":
  318.         case "TabClose":
  319.           browser = aEvent.target.linkedBrowser;
  320.           break;
  321.       }
  322.       
  323.       if (!browser)
  324.         return;
  325.       
  326.       switch (eventType) {
  327.         case "TabOpen":
  328.           this.addTabListener(browser);
  329.           break;
  330.         
  331.         case "TabClose":
  332.           this.removeTabListener(browser);
  333.           break;
  334.       }
  335.     },
  336.     
  337.     init: function() {
  338.       gBrowser.addProgressListener(winProgressListener, Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
  339.       
  340.       let panelsLen = gBrowser.mPanelContainer.childNodes.length;
  341.       for (var i = 0; i < panelsLen; i++) {
  342.         try {
  343.           this.addTabListener(gBrowser.getBrowserAtIndex(i));
  344.         } catch(e) {}
  345.       }
  346.       
  347.       let container = gBrowser.tabContainer;
  348.       container.addEventListener("TabOpen", this, false);
  349.       container.addEventListener("TabClose", this, false);
  350.     },
  351.     
  352.     destroy: function() {
  353.       let panelsLen = gBrowser.mPanelContainer.childNodes.length;
  354.       for (var i = 0; i < panelsLen; i++) {
  355.         try {
  356.           this.removeTabListener(gBrowser.getBrowserAtIndex(i));
  357.         } catch(e) {}
  358.       }
  359.       
  360.       let container = gBrowser.tabContainer;
  361.       container.removeEventListener("TabOpen", this, false);
  362.       container.removeEventListener("TabClose", this, false);
  363.       
  364.       gBrowser.removeProgressListener(winProgressListener);
  365.     },
  366.     
  367.     addTabListener: function(aBrowser) {
  368.       if (!("yaSearchTHandler" in aBrowser)) {
  369.         aBrowser.yaSearchTHandler = new tabHandler(aBrowser);
  370.       }
  371.     },
  372.     
  373.     removeTabListener: function(aBrowser) {
  374.       if ("yaSearchTHandler" in aBrowser) {
  375.         aBrowser.yaSearchTHandler.destroy();
  376.         aBrowser.yaSearchTHandler = null;
  377.       }
  378.     },
  379.     
  380.     _listeners: [],
  381.     
  382.     addListener: function(aHandler) {
  383.       if (!this._listeners.some(function(aListener) { return aListener === aHandler; }))
  384.         this._listeners.push(aHandler);
  385.     },
  386.     
  387.     removeListener: function(aHandler) {
  388.       this._listeners = this._listeners.filter(function(aListener){ return aListener !== aHandler; });
  389.     },
  390.     
  391.     notifyListeners: function() {
  392.       var _args = arguments;
  393.       
  394.       this._listeners.forEach(function(aListener) {
  395.         try {
  396.           aListener.observe.apply(aListener, _args);
  397.         } catch(e) {
  398.           Ya.log(e);
  399.         }
  400.       });
  401.     }
  402.   }
  403. })();
  404.  
  405. window.addEventListener("load", function(aLoadEvent) {
  406.   aLoadEvent.currentTarget.removeEventListener("load", arguments.callee, false);
  407.   
  408.   aLoadEvent.currentTarget.addEventListener("unload", function(aUnloadEvent) {
  409.     aUnloadEvent.currentTarget.removeEventListener("unload", arguments.callee, false);
  410.     YaProgressListener.destroy();
  411.   }, false);
  412.   
  413.   YaProgressListener.init();
  414. }, false);