home *** CD-ROM | disk | FTP | other *** search
/ Minami 81 / MINAMI81.ISO / Extra / DivXInstaller.exe / $PLUGINSDIR / GoogleToolbarFirefox.msi / xpi / components / gtbComponent.js < prev   
Text File  |  2006-05-15  |  15KB  |  497 lines

  1. const Cc = Components.classes;
  2. const Ci = Components.interfaces;
  3. var nsIComponentRegistrar = Ci.nsIComponentRegistrar;
  4. var UNINSTALLER_CID = Components.ID("{abf0defb-ad5c-4673-a8fe-edd64c22a441}");
  5. var UNINSTALLER_NAME = "Google Toolbar Uninstall Handler";
  6. var UNINSTALLER_CONTRACTID = "@google.com/uninstaller;1";
  7. function GTB_UninstallExtension(guid) {
  8. try {
  9. var manager = Cc["@mozilla.org/extensions/manager;1"]
  10. .getService(Ci.nsIExtensionManager);
  11. var dummy = manager.datasource;  // HACK: force datasource initialization
  12. if ("uninstallExtension" in manager) {
  13. manager.uninstallExtension('{' + guid + '}');
  14. } else if ("uninstallItem" in manager) {
  15. manager.uninstallItem('{' + guid + '}');
  16. } else {
  17. return false;
  18. }
  19. dummy = null;  // REHACK: don't leak any resources
  20. }
  21. catch(e) {
  22. }
  23. return true;
  24. }
  25. function insertCommas(number) {
  26. var s = number.toString();
  27. var result = "";
  28. while(s.length > 3) {
  29. result = "," + s.substring(s.length-3, s.length);
  30. s = s.substring(0, s.length-3);
  31. }
  32. result = s + result;
  33. return result;
  34. }
  35. var SEARCH_SUGGEST_CONTRACTID = "@mozilla.org/autocomplete/search;1?name=google-search-suggest";
  36. var SEARCH_SUGGEST_CLASSNAME = "Google Search Suggest";
  37. var SEARCH_SUGGEST_CLASSID = Components.ID("{71631a52-b676-4628-8831-f777932b82ec}");
  38. var SEARCH_SUGGEST_SERVICEURL = "google.suggest.serviceURL.search";
  39. var USERAGENT_LOCALE_PREF = "general.useragent.locale";
  40. function SuggestAutoCompleteResult(searchString,
  41. searchResult,
  42. defaultIndex,
  43. errorDescription,
  44. suggestResults,
  45. suggestComments,
  46. historyResults,
  47. historyComments) {
  48. this._searchString = searchString;
  49. this._searchResult = searchResult;
  50. this._defaultIndex = defaultIndex;
  51. this._errorDescription = errorDescription;
  52. for (var i in historyResults) {
  53. for (var j in suggestResults) {
  54. if (historyResults[i] == suggestResults[j]) {
  55. suggestResults.splice(j, 1);
  56. suggestComments.splice(j, 1);
  57. break;
  58. }
  59. }
  60. }
  61. var results = [];
  62. results = results.concat(historyResults);
  63. results = results.concat(suggestResults);
  64. this._results = results;
  65. var comments = [];
  66. comments = comments.concat(historyComments);
  67. comments = comments.concat(suggestComments);
  68. this._comments = comments;
  69. }
  70. SuggestAutoCompleteResult.prototype = {
  71. _resultString: "",
  72. _resultsString: "",
  73. _didYouMeanString: "",
  74. _historyString: "",
  75. _searchString: "",
  76. _searchResult: 0,
  77. _defaultIndex: 0,
  78. _errorDescription: "",
  79. _results: [],
  80. _comments: [],
  81. getValueAt: function(index) {
  82. return this._results[index];
  83. },
  84. getCommentAt: function(index) {
  85. return this._comments[index];
  86. },
  87. getStyleAt: function(index) {
  88. return null;
  89. },
  90. removeValueAt: function(index, removeFromDatabase) {
  91. this._results.splice(index, 1);
  92. this._comments.splice(index, 1);
  93. },
  94. QueryInterface: function(iid) {
  95. if (!iid.equals(Ci.nsIAutoCompleteResult) &&
  96. !iid.equals(Ci.nsISupports)) {
  97. throw Components.results.NS_ERROR_NO_INTERFACE;
  98. }
  99. return this;
  100. }
  101. };
  102. SuggestAutoCompleteResult.prototype.__defineGetter__("searchString", function() {
  103. return this._searchString;
  104. });
  105. SuggestAutoCompleteResult.prototype.__defineGetter__("searchResult", function() {
  106. return this._searchResult;
  107. });
  108. SuggestAutoCompleteResult.prototype.__defineGetter__("defaultIndex", function() {
  109. return this._defaultIndex;
  110. });
  111. SuggestAutoCompleteResult.prototype.__defineGetter__("errorDescription", function() {
  112. return this._errorDescription;
  113. });
  114. SuggestAutoCompleteResult.prototype.__defineGetter__("matchCount", function() {
  115. return this._results.length;
  116. });
  117. function SuggestAutoComplete() { }
  118. SuggestAutoComplete.prototype = {
  119. _requestSuggest: null,
  120. _listener: null,
  121. onSuggestReadyStateChange: function() {
  122. if (this._requestSuggest && this._requestSuggest.readyState == 4) {
  123. try {
  124. var status = this._requestSuggest.status;
  125. }
  126. catch (e) {
  127. return;
  128. }
  129. var suggestResults = [];
  130. var suggestComments = [];
  131. var spellingResults = [];
  132. var spellingComments = [];
  133. var responseText = this._requestSuggest.responseText;
  134. if (status == 200 && responseText != "") {
  135. var parser = Cc["@mozilla.org/xmlextras/domparser;1"]
  136. .createInstance(Ci.nsIDOMParser);
  137. var xmlDoc = parser.parseFromString(responseText, "text/xml");
  138. if (xmlDoc != null) {
  139. var topLevelNode = xmlDoc.documentElement;
  140. if (topLevelNode.hasChildNodes()) {
  141. var children = topLevelNode.childNodes;
  142. for(var i=0 ; i < children.length ; i++) {
  143. var child = children[i];
  144. if (child.nodeName == "CompleteSuggestion" &&
  145. child.hasChildNodes()) {
  146. var suggestionText = null;
  147. var resultCount = null;
  148. var suggestion = child.childNodes;
  149. for(var j=0 ; j < suggestion.length ; j++) {
  150. if (suggestion[j].nodeName == "suggestion") {
  151. suggestionText = suggestion[j].getAttribute("data");
  152. } else if (suggestion[j].nodeName == "num_queries") {
  153. resultCount = parseInt(suggestion[j].getAttribute("int"));
  154. }
  155. }
  156. if (suggestionText != null && resultCount != null) {
  157. suggestResults[suggestResults.length] = suggestionText;
  158. suggestComments[suggestComments.length] =
  159. insertCommas(resultCount) + " " +
  160. (resultCount == 1 ?
  161. this._resultString :
  162. this._resultsString);
  163. }
  164. } else if (child.nodeName == "spelling_suggestion") {
  165. var spellingText = child.getAttribute("data");
  166. spellingText = spellingText.replace(/<\/{0,1}[a-z]+\/{0,1}>/gi,"");
  167. spellingResults[spellingResults.length] = spellingText;
  168. spellingComments[spellingComments.length] = this._didYouMeanString;
  169. }
  170. }
  171. }
  172. }
  173. }
  174. var results = [];
  175. var comments = [];
  176. results = results.concat(spellingResults);
  177. results = results.concat(suggestResults);
  178. comments = comments.concat(spellingComments);
  179. comments = comments.concat(suggestComments);
  180. this.onSuggestResultsReady(this._searchString, results, comments);
  181. this._requestSuggest = null;
  182. }
  183. },
  184. onSuggestResultsReady: function(searchString, results, comments) {
  185. if (this._listener) {
  186. this._suggestResults = results;
  187. this._suggestComments = comments;
  188. if (this._suggestResults != null  && this._suggestComments != null &&
  189. this._historyResults != null  && this._historyComments != null) {
  190. var result = new SuggestAutoCompleteResult(searchString,
  191. Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
  192. 0, "",
  193. this._suggestResults, this._suggestComments,
  194. this._historyResults, this._historyComments);
  195. this._listener.onSearchResult(this, result);
  196. }
  197. }
  198. },
  199. onSuggestError: function() {
  200. if (this._listener) {
  201. this._suggestResults = [];
  202. this._suggestComments = [];
  203. if (this._suggestResults != null  && this._suggestComments != null &&
  204. this._historyResults != null  && this._historyComments != null) {
  205. var result = new SuggestAutoCompleteResult("",
  206. Ci.nsIAutoCompleteResult.RESULT_FAILURE,
  207. 0, "",
  208. this._suggestResults, this._suggestComments,
  209. this._historyResults, this._historyComments);
  210. this._listener.onSearchResult(this, result);
  211. }
  212. }
  213. },
  214. startSearch: function(searchString, searchParam, previousResult, listener) {
  215. if (this._requestSuggest) {
  216. this.stopSuggestSearch();
  217. }
  218. this._historyResults = null;
  219. this._historyComments = null;
  220. this._suggestResults = null;
  221. this._suggestComments = null;
  222. this._listener = listener;
  223. this._searchString = searchString;
  224. this._requestSuggest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
  225. .createInstance(Ci.nsIXMLHttpRequest);
  226. this._requestSuggest.open("GET", this.serviceURL + searchString, true);
  227. var self = this;
  228. function onSuggestReadyStateChange() {
  229. self.onSuggestReadyStateChange();
  230. }
  231. function onSuggestError() {
  232. self.onSuggestError();
  233. }
  234. this._requestSuggest.onreadystatechange = onSuggestReadyStateChange;
  235. this._requestSuggest.onerror = onSuggestError;
  236. this._requestSuggest.send(null);
  237. var history = getMatchingHistory(this._searchString);
  238. this._historyResults = [];
  239. this._historyComments = [];
  240. for(var j=0 ; j < history.length ; j++) {
  241. this._historyResults[this._historyResults.length] = history[j];
  242. this._historyComments[this._historyComments.length] = this._historyString;
  243. }
  244. },
  245. stopSuggestSearch: function() {
  246. if (this._requestSuggest) {
  247. this._requestSuggest.abort();
  248. this._requestSuggest = null;
  249. }
  250. },
  251. stopSearch: function() {
  252. this.stopSuggestSearch();
  253. this._listener = null;
  254. },
  255. QueryInterface: function(iid) {
  256. if (!iid.equals(Ci.nsIAutoCompleteSearch) &&
  257. !iid.equals(Ci.nsIAutoCompleteObserver) &&
  258. !iid.equals(Ci.nsISupports)) {
  259. throw Components.results.NS_ERROR_NO_INTERFACE;
  260. }
  261. return this;
  262. }
  263. };
  264. function getMatchingHistory(query) {
  265. var psvc = Cc["@mozilla.org/preferences;1"]
  266. .getService(Ci.nsIPrefBranch);
  267. var result = [];
  268. if (psvc != null) {
  269. var pref = psvc.getComplexValue("google.toolbar.search_box_history",
  270. Ci.nsISupportsString).data;
  271. if (pref != null) {
  272. var temp = pref.split("\n");
  273. for(var i=0 ; i < temp.length ; i++) {
  274. if(temp[i].indexOf(query) == 0) {
  275. result[result.length] = temp[i];
  276. }
  277. }
  278. }
  279. }
  280. return result;
  281. }
  282. function getServiceURL(serviceURLPref) {
  283. var psvc = Cc["@mozilla.org/preferences;1"]
  284. .getService(Ci.nsIPrefBranch);
  285. var locale = psvc.getCharPref(USERAGENT_LOCALE_PREF);
  286. var langCode = locale.substr(0, locale.indexOf("-"));
  287. var serviceURL = "http://toolbarqueries.google.com/complete/search?hl=%LANG%&client=firetools&output=toolbar&q=";
  288. return serviceURL.replace(/%LANG%/, langCode);
  289. }
  290. function SearchSuggestAutoComplete() {
  291. this.serviceURL = getServiceURL(SEARCH_SUGGEST_SERVICEURL);
  292. var bundle_service = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService);
  293. var stringBundle = bundle_service.createBundle("chrome://google-toolbar/locale/google-toolbar.properties");
  294. if(stringBundle){
  295. this._resultString = stringBundle.GetStringFromName("google-suggest.result");
  296. this._resultsString = stringBundle.GetStringFromName("google-suggest.results");
  297. this._didYouMeanString = stringBundle.GetStringFromName("google-suggest.didyoumean");
  298. this._historyString = stringBundle.GetStringFromName("google-suggest.history");
  299. }
  300. }
  301. SearchSuggestAutoComplete.prototype = {
  302. __proto__: SuggestAutoComplete.prototype,
  303. serviceURL: ""
  304. };
  305. function GetProperty(datasource, item, prop) {
  306. var service = Cc["@mozilla.org/rdf/rdf-service;1"]
  307. .getService(Ci.nsIRDFService);
  308. var resource = service.GetResource("http://www.mozilla.org/2004/em-rdf#" + prop);
  309. var valueNode = datasource.GetTarget(item, resource, true);
  310. if (valueNode) {
  311. if (valueNode instanceof Ci.nsIRDFLiteral)
  312. return valueNode.Value;
  313. else if (valueNode instanceof Ci.nsIRDFResource)
  314. return valueNode.Value
  315. }
  316. return null;
  317. }
  318. var gModule = {
  319. _firstTime: true,
  320. getClassObject: function(compMgr, cid, iid) {
  321. if (!iid.equals(Ci.nsIFactory))
  322. throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  323. for (var key in this.objects) {
  324. if (cid.equals(this.objects[key].CID)){
  325. return this.objects[key].factory;
  326. }
  327. }
  328. if (!cid.equals(UNINSTALLER_CID)) {
  329. throw Components.results.NS_ERROR_NO_INTERFACE;
  330. }
  331. return this.uninstallerFactory;
  332. },
  333. registerSelf: function(compMgr, location, loaderStr, type) {
  334. compMgr.QueryInterface(nsIComponentRegistrar);
  335. if (this._firstTime) {
  336. compMgr.registerFactoryLocation(
  337. UNINSTALLER_CID,
  338. UNINSTALLER_NAME,
  339. UNINSTALLER_CONTRACTID,
  340. location, loaderStr, type);
  341. this._firstTime = false;
  342. throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
  343. }
  344. for (var key in this.objects) {
  345. var obj = this.objects[key];
  346. compMgr.registerFactoryLocation(obj.CID, obj.className, obj.contractID,
  347. location, loaderStr, type);
  348. }
  349. },
  350. _makeFactory: function(constructor) {
  351. function createInstance(outer, iid) {
  352. if (outer != null)
  353. throw Components.results.NS_ERROR_NO_AGGREGATION;
  354. return (new constructor()).QueryInterface(iid);
  355. }
  356. return { createInstance: createInstance };
  357. },
  358. canUnload: function(compMgr) {
  359. return true;
  360. },
  361. QueryInterface: function(iid) {
  362. if (iid.equals(Ci.nsIModule) ||
  363. iid.equals(Ci.nsISupports))
  364. return this;
  365. throw Components.results.NS_ERROR_NO_INTERFACE;
  366. },
  367. uninstallerFactory: {
  368. QueryInterface: function(iid) {
  369. if (iid.equals(Ci.nsIFactory) ||
  370. iid.equals(Ci.nsISupports))
  371. return this;
  372. throw Components.results.NS_ERROR_NO_INTERFACE;
  373. },
  374. createInstance: function(outer, iid) {
  375. if (outer != null) {
  376. throw Components.results.NS_ERROR_NO_AGGREGATION;
  377. }
  378. if (!this.uninstaller) {
  379. this.uninstaller = {
  380. handleUninstall: function() {
  381. var prefService = Cc["@mozilla.org/preferences;1"]
  382. .getService(Ci.nsIPrefService);
  383. var prefBranch = prefService.getBranch('google.toolbar.');
  384. prefBranch.deleteBranch('');
  385. try {
  386. var regClass = Cc["@google.com/regutil;1"];
  387. if (regClass) {
  388. var regUtil = regClass.createInstance(Ci.GTBIRegUtil);
  389. if (regUtil) {
  390. var result = regUtil.deleteLocalMachineString("SOFTWARE\\Google\\Toolbar for Firefox", "id");
  391. }
  392. }
  393. } catch (e) {
  394. }
  395. try {
  396. prefService.savePrefFile(null);
  397. } catch (e) {
  398. dump('Error saving pref file:' + e);
  399. }
  400. },
  401. observe: function(subject, topic, data) {
  402. var GUID = '3112ca9c-de6d-4884-a869-9855de68056c';
  403. if (topic == "em-action-requested" && data == "item-uninstalled") {
  404. var item = subject.QueryInterface(Components.interfaces.nsIUpdateItem);
  405. var id = item.id.toLowerCase();
  406. if (id == "{" + GUID + "}") {
  407. var prefService = Cc["@mozilla.org/preferences;1"]
  408. .getService(Ci.nsIPrefService);
  409. var prefBranch = prefService.getBranch('google.toolbar.');
  410. prefBranch.setBoolPref("uninstall_pending", true);
  411. }
  412. }
  413. if (topic == "xpcom-shutdown") {
  414. var prefService = Cc["@mozilla.org/preferences;1"]
  415. .getService(Ci.nsIPrefService);
  416. var prefBranch = prefService.getBranch('google.toolbar.');
  417. if (prefBranch.prefHasUserValue("uninstall_pending")) {
  418. this.handleUninstall();
  419. return;
  420. }
  421. var service = Cc["@mozilla.org/rdf/rdf-service;1"]
  422. .getService(Ci.nsIRDFService);
  423. var container = Cc["@mozilla.org/rdf/container;1"]
  424. .createInstance(Ci.nsIRDFContainer);
  425. var datasource= Cc["@mozilla.org/extensions/manager;1"]
  426. .getService(Ci.nsIExtensionManager).datasource;
  427. var rootName = "urn:mozilla:extension:"
  428. var root = service.GetResource(rootName + "root");
  429. var nameResource = service
  430. .GetResource("http://www.mozilla.org/2004/em-rdf#name");
  431. var uninstallResource = service
  432. .GetResource("http://www.mozilla.org/2004/em-rdf#toBeUninstalled");
  433. var disableResource = service
  434. .GetResource("http://www.mozilla.org/2004/em-rdf#toBeDisabled");
  435. try {
  436. container.Init(datasource, root);
  437. } catch (e) {
  438. rootName = "urn:mozilla:item:";
  439. root = service.GetResource(rootName + "root");
  440. container.Init(datasource, root);
  441. }
  442. var elements = container.GetElements();
  443. while (elements.hasMoreElements()) {
  444. var elt = elements.getNext()
  445. .QueryInterface(Ci.nsIRDFResource);
  446. if (elt.Value != rootName + "{" + GUID + "}") {
  447. continue;
  448. }
  449. var found = false;
  450. var values = ["toBeUninstalled", "toBeDisabled"]; //, "userDisabled"];
  451. for (var i = 0, value = null; value = values[i]; ++i) {
  452. var rdfValue = GetProperty(datasource, elt, value);
  453. if ("true" == rdfValue) {
  454. found = true;
  455. }
  456. }
  457. var rdfValue = GetProperty(datasource, elt, "opType");
  458. if ("needs-uninstall" == rdfValue) {
  459. found = true;
  460. }
  461. if (found) {
  462. this.handleUninstall();
  463. GTB_UninstallExtension(GUID);
  464. }
  465. }
  466. }
  467. },
  468. QueryInterface: function(iid) {
  469. if (iid.equals(Ci.nsISupports) ||
  470. iid.equals(Ci.nsIObserver)) {
  471. return this;
  472. }
  473. throw Components.results.NS_ERROR_NO_INTERFACE;
  474. }
  475. };
  476. var obs = Cc["@mozilla.org/observer-service;1"]
  477. .getService(Ci.nsIObserverService);
  478. obs.addObserver(this.uninstaller, "xpcom-shutdown", false);
  479. obs.addObserver(this.uninstaller, "em-action-requested", false);
  480. }
  481. return this.uninstaller.QueryInterface(iid);
  482. },
  483. uninstaller: null
  484. }
  485. };
  486. function NSGetModule(compMgr, location) {
  487. gModule.objects = {
  488. search: {
  489. CID: SEARCH_SUGGEST_CLASSID,
  490. contractID: SEARCH_SUGGEST_CONTRACTID,
  491. className: SEARCH_SUGGEST_CLASSNAME,
  492. factory: gModule._makeFactory(SearchSuggestAutoComplete)
  493. }
  494. };
  495. return gModule;
  496. }
  497.