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 / fil95E029A31AE0265FB15844C634571029 < prev    next >
Text File  |  2010-07-12  |  15KB  |  488 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Google Suggest Autocomplete Implementation for Firefox.
  15.  *
  16.  * The Initial Developer of the Original Code is Google Inc.
  17.  * Portions created by the Initial Developer are Copyright (C) 2006
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Ben Goodger <beng@google.com>
  22.  *   Mike Connor <mconnor@mozilla.com>
  23.  *   Joe Hughes  <joe@retrovirus.com>
  24.  *   Pamela Greene <pamg.bugs@gmail.com>
  25.  *
  26.  * Alternatively, the contents of this file may be used under the terms of
  27.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  28.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  29.  * in which case the provisions of the GPL or the LGPL are applicable instead
  30.  * of those above. If you wish to allow use of your version of this file only
  31.  * under the terms of either the GPL or the LGPL, and not to allow others to
  32.  * use your version of this file under the terms of the MPL, indicate your
  33.  * decision by deleting the provisions above and replace them with the notice
  34.  * and other provisions required by the GPL or the LGPL. If you do not delete
  35.  * the provisions above, a recipient may use your version of this file under
  36.  * the terms of any one of the MPL, the GPL or the LGPL.
  37.  *
  38.  * ***** END LICENSE BLOCK ***** */
  39.  
  40. const SEARCH_RESPONSE_SUGGESTION_JSON = "application/x-suggestions+json";
  41.  
  42. const BROWSER_SUGGEST_PREF = "browser.search.suggest.enabled";
  43. const XPCOM_SHUTDOWN_TOPIC              = "xpcom-shutdown";
  44. const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
  45.  
  46. const SEARCH_SUGGEST_CONTRACTID =
  47.   "@mozilla.org/autocomplete/search;1?name=yasearch-autocomplete";
  48. const SEARCH_SUGGEST_CLASSNAME = "Remote Search Suggestions (yandex mod)";
  49. const SEARCH_SUGGEST_CLASSID =
  50.   Components.ID("{79AF2508-6216-44e0-A28E-275DC7878BD7}");
  51.  
  52. const SEARCH_BUNDLE = "chrome://yasearch/locale/searchbox/searchbox.properties";
  53.  
  54. const Cc = Components.classes;
  55. const Ci = Components.interfaces;
  56. const Cr = Components.results;
  57.  
  58. const HTTP_OK                    = 200;
  59. const HTTP_INTERNAL_SERVER_ERROR = 500;
  60. const HTTP_BAD_GATEWAY           = 502;
  61. const HTTP_SERVICE_UNAVAILABLE   = 503;
  62.  
  63. function SuggestAutoCompleteResult(searchString,
  64.                                    searchResult,
  65.                                    defaultIndex,
  66.                                    errorDescription,
  67.                                    results,
  68.                                    comments,
  69.                                    formHistoryResult) {
  70.   this._searchString = searchString;
  71.   this._searchResult = searchResult;
  72.   this._defaultIndex = defaultIndex;
  73.   this._errorDescription = errorDescription;
  74.   this._results = results;
  75.   this._comments = comments;
  76.   this._formHistoryResult = formHistoryResult;
  77. }
  78. SuggestAutoCompleteResult.prototype = {
  79.   _searchString: "",
  80.   _searchResult: 0,
  81.   _defaultIndex: 0,
  82.   _errorDescription: "",
  83.   _results: [],
  84.   _comments: [],
  85.   _formHistoryResult: null,
  86.   get searchString() {
  87.     return this._searchString;
  88.   },
  89.   get searchResult() {
  90.     return this._searchResult;
  91.   },
  92.   get defaultIndex() {
  93.     return this._defaultIndex;
  94.   },
  95.   get errorDescription() {
  96.     return this._errorDescription;
  97.   },
  98.   get matchCount() {
  99.     return this._results.length;
  100.   },
  101.   getValueAt: function(index) {
  102.     return this._results[index];
  103.   },
  104.   getCommentAt: function(index) {
  105.     return this._comments[index];
  106.   },
  107.   getStyleAt: function(index) {
  108.     if (!this._comments[index])
  109.       return null;
  110.  
  111.     if (index == 0)
  112.       return "suggestfirst";
  113.  
  114.     return "suggesthint";
  115.   },
  116.   getImageAt: function(index) {
  117.     return "";
  118.   },
  119.   removeValueAt: function(index, removeFromDatabase) {
  120.     if (removeFromDatabase && this._formHistoryResult &&
  121.         index < this._formHistoryResult.matchCount) {
  122.       this._formHistoryResult.removeValueAt(index, true);
  123.     }
  124.     this._results.splice(index, 1);
  125.     this._comments.splice(index, 1);
  126.   },
  127.   QueryInterface: function(iid) {
  128.     if (!iid.equals(Ci.nsIAutoCompleteResult) &&
  129.         !iid.equals(Ci.nsISupports))
  130.       throw Cr.NS_ERROR_NO_INTERFACE;
  131.     return this;
  132.   }
  133. };
  134.  
  135. function SuggestAutoComplete() {
  136.   this._init();
  137. }
  138.  
  139. SuggestAutoComplete.prototype = {
  140.   _init: function() {
  141.     Components.utils.import("resource://yasearch/JSON.jsm");
  142.     this._addObservers();
  143.     this._loadSuggestPref();
  144.   },
  145.   
  146.   get _strings() {
  147.     if (!this.__strings) {
  148.       var sbs = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService);
  149.       this.__strings = sbs.createBundle(SEARCH_BUNDLE);
  150.     }
  151.     return this.__strings;
  152.   },
  153.   
  154.   __strings: null,
  155.  
  156.   _loadSuggestPref: function SAC_loadSuggestPref() {
  157.     var prefService = Cc["@mozilla.org/preferences-service;1"].
  158.                       getService(Ci.nsIPrefBranch);
  159.     this._suggestEnabled = prefService.getBoolPref(BROWSER_SUGGEST_PREF);
  160.   },
  161.   
  162.   _suggestEnabled: null,
  163.   _serverErrorLog: [],
  164.   _maxErrorsBeforeBackoff: 3,
  165.   _serverErrorPeriod: 600000,
  166.   _serverErrorTimeoutIncrement: 600000,
  167.   _serverErrorTimeout: 0,
  168.   _nextRequestTime: 0,
  169.   _serverErrorEngine: null,
  170.   _request: null,
  171.   _listener: null,
  172.   _includeFormHistory: true,
  173.   _sentSuggestRequest: false,
  174.   
  175.   notify: function SAC_notify(timer) {
  176.     this._formHistoryTimer = null;
  177.     
  178.     if (!this._listener)
  179.       return;
  180.     
  181.     this._listener.onSearchResult(this, this._formHistoryResult);
  182.     this._reset();
  183.   },
  184.   
  185.   _suggestionTimeout: 500,
  186.   
  187.   onSearchResult: function SAC_onSearchResult(search, result) {
  188.     this._formHistoryResult = result;
  189.     
  190.     if (this._request) {
  191.       this._formHistoryTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
  192.       this._formHistoryTimer.initWithCallback(this, this._suggestionTimeout, Ci.nsITimer.TYPE_ONE_SHOT);
  193.     } else if (!this._sentSuggestRequest) {
  194.       this._listener.onSearchResult(this, this._formHistoryResult);
  195.       this._reset();
  196.     }
  197.   },
  198.   
  199.   _suggestURI: null,
  200.   _formHistoryResult: null,
  201.   _formHistoryTimer: null,
  202.   
  203.   _reset: function SAC_reset() {
  204.     if (!this._formHistoryTimer) {
  205.       this._listener = null;
  206.       this._formHistoryResult = null;
  207.     }
  208.     this._request = null;
  209.   },
  210.   
  211.   _startHistorySearch: function SAC_SHSearch(searchString, searchParam) {
  212.     var formHistory = Cc["@mozilla.org/autocomplete/search;1?name=form-history"].createInstance(Ci.nsIAutoCompleteSearch);
  213.     formHistory.startSearch(searchString, searchParam, this._formHistoryResult, this);
  214.   },
  215.   
  216.   _noteServerError: function SAC__noteServeError() {
  217.     var currentTime = Date.now();
  218.  
  219.     this._serverErrorLog.push(currentTime);
  220.     if (this._serverErrorLog.length > this._maxErrorsBeforeBackoff)
  221.       this._serverErrorLog.shift();
  222.  
  223.     if ((this._serverErrorLog.length == this._maxErrorsBeforeBackoff) &&
  224.         ((currentTime - this._serverErrorLog[0]) < this._serverErrorPeriod)) {
  225.       this._serverErrorTimeout = (this._serverErrorTimeout * 2) +
  226.                                  this._serverErrorTimeoutIncrement;
  227.       this._nextRequestTime = currentTime + this._serverErrorTimeout;
  228.     }
  229.   },
  230.   
  231.   _clearServerErrors: function SAC__clearServerErrors() {
  232.     this._serverErrorLog = [];
  233.     this._serverErrorTimeout = 0;
  234.     this._nextRequestTime = 0;
  235.   },
  236.   
  237.   _okToRequest: function SAC__okToRequest() {
  238.     return Date.now() > this._nextRequestTime;
  239.   },
  240.   
  241.   _checkForEngineSwitch: function SAC__checkForEngineSwitch(engine) {
  242.     if (engine == this._serverErrorEngine)
  243.       return;
  244.  
  245.     this._serverErrorEngine = engine;
  246.     this._clearServerErrors();
  247.   },
  248.  
  249.   _isBackoffError: function SAC__isBackoffError(status) {
  250.     return ((status == HTTP_INTERNAL_SERVER_ERROR) ||
  251.             (status == HTTP_BAD_GATEWAY) ||
  252.             (status == HTTP_SERVICE_UNAVAILABLE));
  253.   },
  254.  
  255.   onReadyStateChange: function() {
  256.     if (!this._request || this._request.readyState != 4)
  257.       return;
  258.  
  259.     try {
  260.       var status = this._request.status;
  261.     } catch (e) {
  262.       return;
  263.     }
  264.  
  265.     if (this._isBackoffError(status)) {
  266.       this._noteServerError();
  267.       return;
  268.     }
  269.  
  270.     var responseText = this._request.responseText;
  271.     
  272.     if (status != HTTP_OK || responseText == "")
  273.       return;
  274.  
  275.     this._clearServerErrors();
  276.     
  277.     var serverResults = JSON.parse(responseText);
  278.     var searchString = serverResults[0] || "";
  279.     var results = serverResults[1] || [];
  280.  
  281.     var comments = [];
  282.     var historyResults = [];
  283.     var historyComments = [];
  284.  
  285.     if (this._includeFormHistory && this._formHistoryResult &&
  286.         (this._formHistoryResult.searchResult == Ci.nsIAutoCompleteResult.RESULT_SUCCESS)) {
  287.       for (var i = 0; i < this._formHistoryResult.matchCount; ++i) {
  288.         var term = this._formHistoryResult.getValueAt(i);
  289.  
  290.         var dupIndex = results.indexOf(term);
  291.         if (dupIndex != -1)
  292.           results.splice(dupIndex, 1);
  293.         
  294.         historyResults.push(term);
  295.         historyComments.push("");
  296.       }
  297.       
  298.       if (historyComments.length > 0)
  299.         historyComments[0] = this._strings.GetStringFromName("history_label");
  300.     }
  301.  
  302.     for (var i = 0; i < results.length; ++i)
  303.       comments.push("");
  304.  
  305.     if (comments.length > 0)
  306.       comments[0] = this._strings.GetStringFromName("suggestion_label");
  307.  
  308.     var finalResults = historyResults.concat(results);
  309.     var finalComments = historyComments.concat(comments);
  310.  
  311.     this.onResultsReady(searchString, finalResults, finalComments,
  312.                         this._formHistoryResult);
  313.  
  314.     this._reset();
  315.   },
  316.  
  317.   onResultsReady: function(searchString, results, comments,
  318.                            formHistoryResult) {
  319.     
  320.     if (this._listener) {
  321.       var result = new SuggestAutoCompleteResult(
  322.           searchString,
  323.           Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
  324.           0,
  325.           "",
  326.           results,
  327.           comments,
  328.           formHistoryResult);
  329.  
  330.       this._listener.onSearchResult(this, result);
  331.       this._listener = null;
  332.     }
  333.   },
  334.   
  335.   startSearch: function(searchString, searchParam, previousResult, listener) {
  336.     if (!previousResult)
  337.       this._formHistoryResult = null;
  338.     
  339.     this.stopSearch();
  340.     
  341.     this._listener = listener;
  342.     
  343.     var engine;
  344.     
  345.     if (/yasearch\-history2/.test(searchParam)) {
  346.       engine = Cc["@yandex.ru/yasearch;1"].getService(Ci.nsIYaSearch).wrappedJSObject.defaultYandexSearchEngine;
  347.       searchParam = "yasearch-history";
  348.     } else {
  349.       engine = Cc["@yandex.ru/yasearch;1"].getService(Ci.nsIYaSearch).wrappedJSObject.currentSearchEngine;
  350.     }
  351.     
  352.     if (!searchString ||
  353.         !this._suggestEnabled ||
  354.         !engine.supportsResponseType(SEARCH_RESPONSE_SUGGESTION_JSON) ||
  355.         !this._okToRequest()) {
  356.       this._sentSuggestRequest = false;
  357.       this._startHistorySearch(searchString, searchParam, previousResult);
  358.       
  359.       return;
  360.     }
  361.  
  362.     this._request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
  363.                     createInstance(Ci.nsIXMLHttpRequest);
  364.     var submission = engine.getSubmission(searchString,
  365.                                           SEARCH_RESPONSE_SUGGESTION_JSON);
  366.     this._suggestURI = submission.uri;
  367.     var method = (submission.postData ? "POST" : "GET");
  368.     this._request.open(method, this._suggestURI.spec, true);
  369.     
  370.     var self = this;
  371.     function onReadyStateChange() {
  372.       self.onReadyStateChange();
  373.     }
  374.     
  375.     this._request.onreadystatechange = onReadyStateChange;
  376.     this._request.send(submission.postData);
  377.  
  378.     if (this._includeFormHistory) {
  379.       this._sentSuggestRequest = true;
  380.       this._startHistorySearch(searchString, searchParam, previousResult);
  381.     }
  382.   },
  383.  
  384.   stopSearch: function() {
  385.     if (this._request) {
  386.       this._request.abort();
  387.       this._reset();
  388.     }
  389.   },
  390.  
  391.   observe: function SAC_observe(aSubject, aTopic, aData) {
  392.     switch (aTopic) {
  393.       case NS_PREFBRANCH_PREFCHANGE_TOPIC_ID:
  394.         this._loadSuggestPref();
  395.         break;
  396.       case XPCOM_SHUTDOWN_TOPIC:
  397.         this._removeObservers();
  398.         break;
  399.     }
  400.   },
  401.  
  402.   _addObservers: function SAC_addObservers() {
  403.     var prefService2 = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
  404.     prefService2.addObserver(BROWSER_SUGGEST_PREF, this, false);
  405.  
  406.     var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  407.     os.addObserver(this, XPCOM_SHUTDOWN_TOPIC, false);
  408.   },
  409.  
  410.   _removeObservers: function SAC_removeObservers() {
  411.     var prefService2 = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
  412.     prefService2.removeObserver(BROWSER_SUGGEST_PREF, this);
  413.  
  414.     var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  415.     os.removeObserver(this, XPCOM_SHUTDOWN_TOPIC);
  416.   },
  417.  
  418.   QueryInterface: function(iid) {
  419.     if (!iid.equals(Ci.nsIAutoCompleteSearch) &&
  420.         !iid.equals(Ci.nsIAutoCompleteObserver) &&
  421.         !iid.equals(Ci.nsISupports))
  422.       throw Cr.NS_ERROR_NO_INTERFACE;
  423.     return this;
  424.   }
  425. };
  426.  
  427. function SearchSuggestAutoComplete() {
  428.   this._init();
  429. }
  430.  
  431. SearchSuggestAutoComplete.prototype = {
  432.   __proto__: SuggestAutoComplete.prototype,
  433.   serviceURL: ""
  434. };
  435.  
  436. var gModule = {
  437.   registerSelf: function(componentManager, location, loaderString, type) {
  438.     if (this._firstTime) {
  439.       this._firstTime = false;
  440.       throw Cr.NS_ERROR_FACTORY_REGISTER_AGAIN;
  441.     }
  442.     componentManager =
  443.       componentManager.QueryInterface(Ci.nsIComponentRegistrar);
  444.  
  445.     for (var key in this.objects) {
  446.       var obj = this.objects[key];
  447.       componentManager.registerFactoryLocation(obj.CID, obj.className, obj.contractID,
  448.                                                location, loaderString, type);
  449.     }
  450.   },
  451.  
  452.   getClassObject: function(componentManager, cid, iid) {
  453.     if (!iid.equals(Ci.nsIFactory))
  454.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  455.  
  456.     for (var key in this.objects) {
  457.       if (cid.equals(this.objects[key].CID))
  458.         return this.objects[key].factory;
  459.     }
  460.  
  461.     throw Cr.NS_ERROR_NO_INTERFACE;
  462.   },
  463.  
  464.   _makeFactory: function(constructor) {
  465.     function createInstance(outer, iid) {
  466.       if (outer != null)
  467.         throw Cr.NS_ERROR_NO_AGGREGATION;
  468.       return (new constructor()).QueryInterface(iid);
  469.     }
  470.     return { createInstance: createInstance };
  471.   },
  472.  
  473.   canUnload: function(componentManager) {
  474.     return true;
  475.   }
  476. };
  477.  
  478. function NSGetModule(componentManager, location) {
  479.   gModule.objects = {
  480.     search: {
  481.       CID: SEARCH_SUGGEST_CLASSID,
  482.       contractID: SEARCH_SUGGEST_CONTRACTID,
  483.       className: SEARCH_SUGGEST_CLASSNAME,
  484.       factory: gModule._makeFactory(SearchSuggestAutoComplete)
  485.     },
  486.   };
  487.   return gModule;
  488. }