| Index: lib/typedItCollector.js | 
| =================================================================== | 
| --- a/lib/typedItCollector.js | 
| +++ b/lib/typedItCollector.js | 
| @@ -7,9 +7,12 @@ | 
| let {Prefs} = require("prefs"); | 
| let {WindowObserver} = require("windowObserver"); | 
| +let DOMAIN_TYPED = 1; | 
| +let DOMAIN_TYPO = 2; | 
| +let DOMAIN_CORRECTION = 3; | 
| +let DOMAIN_FALSE_POSITIVE = 4; | 
| + | 
| let domains = null; | 
| -let userCorrections = null; | 
| -let falsePositives = null; | 
| let timer = null; | 
| // Initialize and make sure to react to pref changes | 
| @@ -64,24 +67,36 @@ | 
| function processTypedDomain(domain) | 
| { | 
| if (domains && !privateBrowsingEnabled()) | 
| - domains.push(domain); | 
| + domains[domain] = DOMAIN_TYPED; | 
| +} | 
| + | 
| +exports.processDomainCorrection = processDomainCorrection; | 
| +function processDomainCorrection(domainFrom, domainTo) | 
| +{ | 
| + if (domains && !privateBrowsingEnabled()) | 
| + { | 
| + domains[domainFrom] = DOMAIN_TYPO; | 
| + domains[domainTo] = DOMAIN_CORRECTION; | 
| + } | 
| } | 
| exports.processFalsePositive = processFalsePositive; | 
| function processFalsePositive(domainFrom, domainTo) | 
| { | 
| - if (falsePositives && !privateBrowsingEnabled()) | 
| + if (domains && !privateBrowsingEnabled()) | 
| { | 
| - falsePositives.push([domainFrom, domainTo]); | 
| + domains[domainFrom] = DOMAIN_FALSE_POSITIVE; | 
| + domains[domainTo] = DOMAIN_TYPED; | 
| } | 
| } | 
| exports.processUserCorrection = processUserCorrection; | 
| function processUserCorrection(domainFrom, domainTo) | 
| { | 
| - if (userCorrections && !privateBrowsingEnabled()) | 
| + if (domains && !privateBrowsingEnabled()) | 
| { | 
| - userCorrections.push([domainFrom, domainTo]); | 
| + domains[domainFrom] = DOMAIN_TYPO; | 
| + domains[domainTo] = DOMAIN_CORRECTION; | 
| } | 
| } | 
| @@ -101,29 +116,25 @@ | 
| function startCollection() | 
| { | 
| - if (domains || falsePositives || userCorrections) | 
| + if (domains) | 
| return; | 
| onShutdown.add(stopCollection); | 
| - domains = []; | 
| - falsePositives = []; | 
| - userCorrections = []; | 
| + domains = {}; | 
| - // Send data every 15 minutes | 
| + // Send data every 60 minutes | 
| timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 
| - timer.initWithCallback(sendAnonymousData, 1000 * 60 * 15, Ci.nsITimer.TYPE_REPEATING_SLACK); | 
| + timer.initWithCallback(sendAnonymousData, 1000 * 60 * 60, Ci.nsITimer.TYPE_REPEATING_SLACK); | 
| } | 
| function stopCollection() | 
| { | 
| - if (!domains || !falsePositives || !userCorrections) | 
| + if (!domains) | 
| return; | 
| onShutdown.remove(stopCollection); | 
| domains = null; | 
| - falsePositives = null; | 
| - userCorrections = null; | 
| try | 
| { | 
| @@ -146,61 +157,25 @@ | 
| function sendAnonymousData() | 
| { | 
| - if (!Prefs.domainOptIn || (domains.length == 0 && falsePositives.length == 0 && userCorrections.length == 0) || privateBrowsingEnabled()) | 
| + if (!Prefs.domainOptIn || privateBrowsingEnabled()) | 
| return; | 
| - let args = []; | 
| + let postData = JSON.stringify(domains); | 
| + if (postData == JSON.stringify({})) | 
| + return; | 
| + | 
| let savedDomains = domains; | 
| - let savedFalsePositives = falsePositives; | 
| - let savedUserCorrections = userCorrections; | 
| - | 
| - if(domains.length > 0) | 
| - { | 
| - args.push(domains.map(function(d) "domains[]=" + encodeURIComponent(d)).join("&")); | 
| - domains = []; | 
| - } | 
| - if(falsePositives.length > 0) | 
| - { | 
| - args.push( | 
| - falsePositives.map( | 
| - function(fp) | 
| - { | 
| - return "falsePositives[]=" + encodeURIComponent( | 
| - encodeURIComponent(fp[0]) + ((fp[1]) ? "&" + encodeURIComponent(fp[1]) : "") | 
| - ); | 
| - } | 
| - ).join("&") | 
| - ); | 
| - falsePositives = []; | 
| - } | 
| - if(userCorrections.length > 0) | 
| - { | 
| - args.push( | 
| - userCorrections.map( | 
| - function(uc) | 
| - { | 
| - return "userCorrections[]=" + encodeURIComponent( | 
| - encodeURIComponent(uc[0]) + ((uc[1]) ? "&" + encodeURIComponent(uc[1]) : "") | 
| - ); | 
| - } | 
| - ).join("&") | 
| - ); | 
| - userCorrections = []; | 
| - } | 
| + domains = {}; | 
| let request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); | 
| request.open("POST", "http://typed.it/submitData"); | 
| - request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); | 
| + request.setRequestHeader("Content-Type", "application/json"); | 
| request.addEventListener("load", function(event) | 
| { | 
| if (event.target.status != 200) | 
| - { | 
| domains = domains.concat(savedDomains); | 
| - falsePositives = falsePositives.concat(savedFalsePositives); | 
| - userCorrections = userCorrections.concat(savedUserCorrections); | 
| - } | 
| }, false); | 
| - request.send(args.join("&")); | 
| + request.send(postData); | 
| } | 
| function initWebUI(event) |