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 / fil915E25CF792D189091E41C1CD0D4CB51 < prev    next >
Text File  |  2010-07-12  |  12KB  |  411 lines

  1. (function() {
  2.   const FTAB_CHROME_URL = "chrome://yasearch/content/ftab/ftab.xul";
  3.   const ENABLED_PREF_NAME = "yasearch.general.ftab.enabled";
  4.   
  5.   var TabHooks = {
  6.     _hooked: null,
  7.     
  8.     _currentBrowserOpenTab: window.BrowserOpenTab,
  9.     _prevBrowserOpenTab: window.BrowserOpenTab,
  10.     
  11.     _browserOpenTabWatcher: function (id, oldval, newval) {
  12.       TabHooks._current = newval;
  13.       TabHooks._prev = oldval;
  14.       
  15.       if (!YaFTabGlobal.enabled)
  16.         return newval;
  17.       
  18.       TabHooks._hooked.BrowserOpenTab = null;
  19.       
  20.       let hookedFn;
  21.       if (oldval && TabHooks._getHBrowserOpenTab(newval)) {
  22.         hookedFn = function() {
  23.           if (YaFTabGlobal && YaFTabGlobal.enabled)
  24.             oldval.apply(this.arguments);
  25.           else
  26.             newval.apply(this.arguments);
  27.         }
  28.         
  29.         TabHooks._hooked.BrowserOpenTab = newval;
  30.       }
  31.       
  32.       return hookedFn || newval;
  33.     },
  34.     
  35.     _getHBrowserOpenTab: function(aFunction) {
  36.       return (typeof aFunction == "function" &&
  37.               "boundFn_" in aFunction &&
  38.               typeof aFunction.boundFn_ == "function" &&
  39.               aFunction.boundFn_.toSource().indexOf("PREF_NEWTAB") > -1) ? aFunction : null;
  40.     },
  41.     
  42.     startWatch: function() {
  43.       window.watch("BrowserOpenTab", this._browserOpenTabWatcher);
  44.     },
  45.     
  46.     stopWatch: function() {
  47.       window.unwatch("BrowserOpenTab", this._browserOpenTabWatcher);
  48.     },
  49.     
  50.     init: function() {
  51.       this.hookBrowser();
  52.     },
  53.     
  54.     destroy: function() {
  55.       this.unhookBrowser();
  56.     },
  57.     
  58.     hookURLBarSetURI: function() {
  59.       if (!(YaFTabGlobal.loaded && window.URLBarSetURI && this._hooked && !this._hooked.URLBarSetURI))
  60.         return;
  61.       
  62.       function makeURI(aURLSpec) {
  63.         let ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  64.         try {
  65.           return ios.newURI(aURLSpec, null, null);
  66.         } catch(e) {}
  67.         
  68.         return null;
  69.       }
  70.       
  71.       let FTAB_CHROME_FILE_URI = Cc["@mozilla.org/chrome/chrome-registry;1"]
  72.                                      .getService(Ci.nsIChromeRegistry)
  73.                                      .convertChromeURL(makeURI(FTAB_CHROME_URL));
  74.       
  75.       let FTAB_CHROME_FILE_URL = FTAB_CHROME_FILE_URI && FTAB_CHROME_FILE_URI.spec ? FTAB_CHROME_FILE_URI.spec : FTAB_CHROME_URL;
  76.       
  77.       if ("gInitialPages" in window && window.gInitialPages instanceof Array) {
  78.         this._hooked.URLBarSetURI = true;
  79.         
  80.         window.gInitialPages.push(FTAB_CHROME_URL);
  81.         window.gInitialPages.push(FTAB_CHROME_FILE_URL);
  82.         
  83.       } else {
  84.         this._hooked.URLBarSetURI = window.URLBarSetURI;
  85.         
  86.         let originalURLBarSetURI = window.URLBarSetURI;
  87.         
  88.         window.URLBarSetURI = function(aURI, aValid) {
  89.           let value = gBrowser.userTypedValue;
  90.           if (!value && aURI && (aURI.spec == FTAB_CHROME_URL || aURI.spec == FTAB_CHROME_FILE_URL)) {
  91.             arguments[0] = makeURI("about:blank");
  92.           }
  93.           
  94.           return originalURLBarSetURI.apply(this, arguments);
  95.         }
  96.       }
  97.     },
  98.     
  99.     hookBrowser: function() {
  100.       if (this._hooked)
  101.         return;
  102.       
  103.       this._hooked = {};
  104.       
  105.       if (this._getHBrowserOpenTab(window.BrowserOpenTab) && this._prevBrowserOpenTab) {
  106.         this._hooked.BrowserOpenTab = window.BrowserOpenTab;
  107.         window.BrowserOpenTab = this._prevBrowserOpenTab;
  108.       }
  109.       
  110.       if (gHomeButton && gHomeButton.getHomePage) {
  111.         let originalGetHomePage = gHomeButton.getHomePage;
  112.         this._hooked.getHomePage = originalGetHomePage;
  113.         
  114.         gHomeButton.getHomePage = function() {
  115.           let res = originalGetHomePage.apply(this, arguments);
  116.           
  117.           if (res === "about:blank")
  118.             res = FTAB_CHROME_URL;
  119.           
  120.           return res;
  121.         };
  122.       }
  123.       
  124.       this.setTabsListener();
  125.     },
  126.     
  127.     unhookBrowser: function() {
  128.       if (!this._hooked)
  129.         return;
  130.       
  131.       this.removeTabsListener();
  132.       
  133.       if (this._hooked.getHomePage && gHomeButton)
  134.         gHomeButton.getHomePage = this._hooked.getHomePage;
  135.       
  136.       if (this._hooked.URLBarSetURI && typeof(this._hooked.URLBarSetURI) == "function")
  137.         window.URLBarSetURI = this._hooked.URLBarSetURI;
  138.       
  139.       if (this._hooked.BrowserOpenTab && this._hooked.BrowserOpenTab === this._prevBrowserOpenTab)
  140.         window.BrowserOpenTab = this._prevBrowserOpenTab;
  141.       
  142.       this._hooked = null;
  143.     },
  144.     
  145.     _tabListenersSet: null,
  146.     
  147.     setTabsListener: function(aSetListeners) {
  148.       this.hookURLBarSetURI();
  149.       
  150.       if (this._tabListenersSet)
  151.         return;
  152.       
  153.       let tabContainer;
  154.       if (window.__lookupGetter__("gBrowser") || !(gBrowser && (tabContainer = gBrowser.tabContainer)))
  155.         return;
  156.       
  157.       tabContainer.addEventListener("TabOpen", this, false);
  158.       tabContainer.addEventListener("TabClose", this, false);
  159.       
  160.       this._tabListenersSet = true;
  161.     },
  162.     
  163.     removeTabsListener: function() {
  164.       let tabContainer;
  165.       
  166.       if (!(gBrowser && (tabContainer = gBrowser.tabContainer)))
  167.         return;
  168.       
  169.       tabContainer.removeEventListener("TabOpen", this, false);
  170.       tabContainer.removeEventListener("TabClose", this, false);
  171.       
  172.       this._tabListenersSet = false;
  173.     },
  174.     
  175.     compatibilityMode: Ya.nsIYa.yaFTab.compatibilityMode,
  176.     
  177.     _isBlankBrowser: function(aBrowser) {
  178.       if (aBrowser.currentURI.spec != "about:blank")
  179.         return false;
  180.       
  181.       let wp = aBrowser.webProgress;
  182.       if (!this.compatibilityMode && !(wp.busyFlags === 3 && wp.loadType === 1))
  183.         return false;
  184.       
  185.       if ((aBrowser.userTypedValue || "") !== "")
  186.         return false;
  187.       
  188.       let userTypedClear = aBrowser.userTypedClear;
  189.       if (userTypedClear > 0 && !this.compatibilityMode && typeof(aBrowser.feeds) != "undefined")
  190.         return false;
  191.       
  192.       if (!(userTypedClear == 0 || userTypedClear == 1))
  193.         return false;
  194.       
  195.       if (this.compatibilityMode &&
  196.           aBrowser.contentDocument &&
  197.           aBrowser.contentDocument.body &&
  198.           aBrowser.contentDocument.body.hasChildNodes())
  199.         return false;
  200.       
  201.       return true;
  202.     },
  203.     
  204.     _timedLoad: function(aBrowser) {
  205.       setTimeout(function(me, browser) {
  206.         me._loadFTabURI(browser);
  207.       }, 150, this, aBrowser);
  208.     },
  209.     
  210.     _loadFTabURI: function(aBrowser) {
  211.       if (this._isBlankBrowser(aBrowser) && !aBrowser.webProgress.isLoadingDocument)
  212.         aBrowser.loadURI(FTAB_CHROME_URL, null, null, false);
  213.     },
  214.     
  215.     handleEvent: function(aEvent) {
  216.       if (!aEvent.isTrusted)
  217.         return;
  218.       
  219.       switch (aEvent.type) {
  220.         case "load":
  221.           let browser = aEvent.target.linkedBrowser;
  222.           
  223.           if (this.compatibilityMode) {
  224.             if (browser.webProgress.busyFlags >= 3) {
  225.               if (this._isBlankBrowser(browser))
  226.                 this._timedLoad(browser);
  227.             } else if (browser.webProgress.isLoadingDocument == true) {
  228.               return;
  229.             }
  230.           } else {
  231.             if (this._isBlankBrowser(browser)) {
  232.               browser.loadURI(FTAB_CHROME_URL, null, null, false);
  233.             } else if (browser.webProgress.isLoadingDocument == true) {
  234.               return;
  235.             } 
  236.           }
  237.           
  238.           aEvent.target.removeEventListener("load", this, true);
  239.           
  240.           break;
  241.         
  242.         case "TabOpen":
  243.           aEvent.target.addEventListener("load", this, true);
  244.           break;
  245.         
  246.         case "TabClose":
  247.           aEvent.target.removeEventListener("load", this, true);
  248.           break;
  249.         
  250.         default:
  251.           break;
  252.       }
  253.     }
  254.   };
  255.   
  256.   var YaFTabGlobal = {
  257.     enabled: false,
  258.     
  259.     get prefBranch() {
  260.       return Components.classes["@mozilla.org/preferences-service;1"]
  261.                        .getService(Components.interfaces.nsIPrefBranchInternal);
  262.     },
  263.     
  264.     onBeforeLoad: function() {
  265.       this._checkEnabled();
  266.       this.prefBranch.addObserver(ENABLED_PREF_NAME, this, false);
  267.     },
  268.     
  269.     loaded: false,
  270.     
  271.     onLoad: function() {
  272.       this.loaded = true;
  273.       
  274.       if (this.enabled !== true)
  275.         return;
  276.       
  277.       TabHooks.setTabsListener();
  278.       
  279.       let tabs = gBrowser.tabContainer.childNodes;
  280.       if (tabs.length != 1)
  281.         return;
  282.       
  283.       let browser = tabs[0].linkedBrowser;
  284.       if (browser && browser.currentURI
  285.           && browser.currentURI.spec == "about:blank"
  286.           && browser.webProgress.isLoadingDocument == false
  287.           && !browser.userTypedValue) {
  288.         browser.loadURI(FTAB_CHROME_URL, null, null, false);
  289.       }
  290.     },
  291.     
  292.     onUnload: function() {
  293.       this.loaded = false;
  294.       this.prefBranch.removeObserver(ENABLED_PREF_NAME, this, false);
  295.       this._checkEnabled(false);
  296.     },
  297.     
  298.     _checkEnabled: function(aEnabledState) {
  299.       let enabled = typeof aEnabledState === "boolean" ? aEnabledState : Ya.nsIYa.getBoolPref(ENABLED_PREF_NAME);
  300.       
  301.       if (enabled === this.enabled)
  302.         return;
  303.       
  304.       this.enabled = enabled;
  305.       
  306.       if (enabled) {
  307.         TabHooks.init();
  308.         window.addEventListener("keydown", this, false);
  309.         window.addEventListener("keypress", this, false);
  310.       } else {
  311.         TabHooks.destroy();
  312.         window.removeEventListener("keydown", this, false);
  313.         window.removeEventListener("keypress", this, false);
  314.       }
  315.     },
  316.     
  317.     observe: function(aSubject, aTopic, aData) {
  318.       if (aTopic == "nsPref:changed" && aData == ENABLED_PREF_NAME)
  319.         this._checkEnabled();
  320.     },
  321.     
  322.     __lastKey: 0,
  323.     
  324.     get __keyModifier() {
  325.       delete this.__keyModifier;
  326.       
  327.       let isLinux = Ya.nsIYa.AppInfo.OS.isLinux;
  328.       
  329.       let incl = isLinux ? "ctrlKey" : "altKey",
  330.           excl = isLinux ? "altKey" : "ctrlKey";
  331.       
  332.       return this.__keyModifier = {include: incl, exclude: excl};
  333.     },
  334.     
  335.     handleEvent: function(aEvent) {
  336.       if (aEvent.shiftKey || aEvent.metaKey || aEvent[this.__keyModifier.exclude])
  337.         return;
  338.       
  339.       if (!aEvent[this.__keyModifier.include]) {
  340.         if (this.__lastKey) {
  341.           this.__lastKey = 0;
  342.           if (aEvent.type == "keypress" && !aEvent.keyCode) {
  343.             aEvent.preventDefault();
  344.             aEvent.stopPropagation();
  345.           }
  346.         }
  347.         return;
  348.       }
  349.       
  350.       if (!this.isYaFTabVisible)
  351.         return;
  352.       
  353.       switch (aEvent.type) {
  354.         case "keydown":
  355.           this.__lastKey = 0;
  356.           
  357.           let key = aEvent.keyCode ? aEvent.keyCode - (aEvent.keyCode > 96 ? 48 : 0) : 0;
  358.           let page = key - 48;
  359.           
  360.           if (page >= 1 && page <= 9) {
  361.             this.__lastKey = key;
  362.             
  363.             let doc = gBrowser.selectedBrowser.docShell.document;
  364.             
  365.             let event = doc.createEvent("KeyboardEvent");
  366.             event.initKeyEvent("keypress",false,true,null,false,true,false,false,key,0);
  367.             doc.defaultView.dispatchEvent(event);
  368.             
  369.             aEvent.stopPropagation();
  370.             aEvent.preventDefault();
  371.           }
  372.           break;
  373.         
  374.         case "keypress":
  375.           break;
  376.         
  377.         default:
  378.           break;
  379.       }
  380.     },
  381.     
  382.     get isYaFTabVisible() {
  383.       try {
  384.         return gBrowser.selectedBrowser.webNavigation.currentURI.spec === FTAB_CHROME_URL;
  385.       } catch(e) {}
  386.       
  387.       return false;
  388.     }
  389.   };
  390.   
  391.   window.addEventListener("load", function(aLoadEvent) {
  392.     aLoadEvent.currentTarget.removeEventListener("load", arguments.callee, false);
  393.     
  394.     let chromeHidden = window.document.documentElement.getAttribute("chromehidden");
  395.     if (chromeHidden && chromeHidden.indexOf("toolbar") != -1) {
  396.       YaFTabGlobal.onUnload();
  397.       TabHooks.stopWatch();
  398.     } else {
  399.       aLoadEvent.currentTarget.addEventListener("unload", function(aUnloadEvent) {
  400.         aUnloadEvent.currentTarget.removeEventListener("unload", arguments.callee, false);
  401.         YaFTabGlobal.onUnload();
  402.         TabHooks.stopWatch();
  403.       }, false);
  404.       
  405.       YaFTabGlobal.onLoad();
  406.     }
  407.   }, false);
  408.   
  409.   TabHooks.startWatch();
  410.   YaFTabGlobal.onBeforeLoad();
  411. })();