diff --git a/platform/chromium/vapi-background.js b/platform/chromium/vapi-background.js index 3a745bc..d3bbe38 100644 --- a/platform/chromium/vapi-background.js +++ b/platform/chromium/vapi-background.js @@ -473,6 +473,7 @@ vAPI.setIcon = function(tabId, iconId, badge) { chrome.browserAction.setIcon({ tabId: tabId, path: iconPaths }, onIconReady); }; +/******************************************************************************/ /******************************************************************************/ vAPI.messaging = { @@ -625,6 +626,7 @@ CallbackWrapper.prototype.proxy = function(response) { CallbackWrapper.junkyard.push(this); }; +/******************************************************************************/ /******************************************************************************/ vAPI.net = {}; @@ -812,6 +814,7 @@ vAPI.net.registerListeners = function() { // End of: Network event handlers }; +/******************************************************************************/ /******************************************************************************/ vAPI.contextMenu = { @@ -833,6 +836,7 @@ vAPI.lastError = function() { return chrome.runtime.lastError; }; +/******************************************************************************/ /******************************************************************************/ // This is called only once, when everything has been loaded in memory after @@ -843,6 +847,7 @@ vAPI.lastError = function() { vAPI.onLoadAllCompleted = function() { }; +/******************************************************************************/ /******************************************************************************/ vAPI.punycodeHostname = function(hostname) { @@ -853,30 +858,48 @@ vAPI.punycodeURL = function(url) { return url; }; +/******************************************************************************/ /******************************************************************************/ -vAPI.browserCache = {}; +vAPI.browserData = {}; /******************************************************************************/ -vAPI.browserCache.clearByTime = function(since) { - chrome.browsingData.removeCache({ since: 0 }); +// https://developer.chrome.com/extensions/browsingData + +vAPI.browserData.clearCache = function(callback) { + chrome.browsingData.removeCache({ since: 0 }, callback); }; -vAPI.browserCache.clearByOrigin = function(/* domain */) { +/******************************************************************************/ + +// Not supported on Chromium + +vAPI.browserData.clearOrigin = function(domain, callback) { // unsupported on Chromium + if ( typeof callback === 'function' ) { + callback(undefined); + } }; /******************************************************************************/ +/******************************************************************************/ + +// https://developer.chrome.com/extensions/cookies vAPI.cookies = {}; /******************************************************************************/ -vAPI.cookies.registerListeners = function() { - if ( typeof this.onChanged === 'function' ) { - chrome.cookies.onChanged.addListener(this.onChanged); - } +vAPI.cookies.start = function() { + var onChanged = function(changeInfo) { + var handler = changeInfo.removed ? this.onRemoved : this.onChanged; + if ( typeof handler !== 'function' ) { + return; + } + handler(changeInfo.cookie); + }; + chrome.cookies.onChanged.addListener(onChanged.bind(this)); }; /******************************************************************************/ @@ -890,6 +913,8 @@ vAPI.cookies.getAll = function(callback) { vAPI.cookies.remove = function(details, callback) { chrome.cookies.remove(details, callback || noopFunc); }; + +/******************************************************************************/ /******************************************************************************/ })(); diff --git a/platform/firefox/vapi-background.js b/platform/firefox/vapi-background.js index eb13d41..e7e1870 100644 --- a/platform/firefox/vapi-background.js +++ b/platform/firefox/vapi-background.js @@ -35,6 +35,7 @@ // Useful links // // https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface +// https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Services.jsm /******************************************************************************/ @@ -84,7 +85,7 @@ var cleanupTasks = []; // Fixed by github.com/AlexVallat: // https://github.com/AlexVallat/uBlock/commit/7b781248f00cbe3d61b1cc367c440db80fa06049 // 7 instances of cleanupTasks.push, but one is unique to fennec, and one to desktop. -var expectedNumberOfCleanups = 6; +var expectedNumberOfCleanups = 7; window.addEventListener('unload', function() { for ( var cleanup of cleanupTasks ) { @@ -1684,6 +1685,7 @@ vAPI.toolbarButton.updateState = function(win, tabId) { vAPI.toolbarButton.init(); +/******************************************************************************/ /******************************************************************************/ vAPI.contextMenu = { @@ -1843,6 +1845,7 @@ vAPI.contextMenu.remove = function() { this.onCommand = null; }; +/******************************************************************************/ /******************************************************************************/ var optionsObserver = { @@ -1885,12 +1888,14 @@ var optionsObserver = { optionsObserver.register(); +/******************************************************************************/ /******************************************************************************/ vAPI.lastError = function() { return null; }; +/******************************************************************************/ /******************************************************************************/ // This is called only once, when everything has been loaded in memory after @@ -1899,19 +1904,15 @@ vAPI.lastError = function() { // the web pages before uBlock was ready. vAPI.onLoadAllCompleted = function() { - var µb = µBlock; for ( var tab of this.tabs.getAllSync() ) { // We're insterested in only the tabs that were already loaded - var tabId = this.tabs.getTabId(tab); - var browser = getBrowserForTab(tab); - µb.tabContextManager.commit(tabId, browser.currentURI.asciiSpec); - µb.bindTabToPageStats(tabId, browser.currentURI.asciiSpec); - browser.messageManager.sendAsyncMessage( + getBrowserForTab(tab).messageManager.sendAsyncMessage( location.host + '-load-completed' ); } }; +/******************************************************************************/ /******************************************************************************/ // Likelihood is that we do not have to punycode: given punycode overhead, @@ -1932,48 +1933,113 @@ vAPI.punycodeURL = function(url) { }; /******************************************************************************/ - /******************************************************************************/ -vAPI.browserCache = {}; +vAPI.browserData = {}; /******************************************************************************/ -vAPI.browserCache.clearByTime = function(since) { - // TODO +// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsICacheService +// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsICache + +vAPI.browserData.clearCache = function(callback) { + // PURGE_DISK_DATA_ONLY:1 + // PURGE_DISK_ALL:2 + // PURGE_EVERYTHING:3 + // However I verified that not argument does clear the cache data. + Services.cache2.clear(); + if ( typeof callback === 'function' ) { + callback(); + } }; -vAPI.browserCache.clearByOrigin = function(/* domain */) { +/******************************************************************************/ + +vAPI.browserData.clearOrigin = function(/* domain */) { // TODO }; +/******************************************************************************/ /******************************************************************************/ +// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsICookie2 +// https://developer.mozilla.org/en-US/docs/Observer_Notifications#Cookies + vAPI.cookies = {}; /******************************************************************************/ -vAPI.cookies.registerListeners = function() { - // TODO +vAPI.cookies.CookieEntry = function(ffCookie) { + this.domain = ffCookie.host; + this.name = ffCookie.name; + this.path = ffCookie.path; + this.secure = ffCookie.isSecure === true; + this.session = ffCookie.expires === 0; + this.value = ffCookie.value; }; /******************************************************************************/ +vAPI.cookies.start = function() { + Services.obs.addObserver(this, 'cookie-changed', false); + cleanupTasks.push(this.stop.bind(this)); +}; + +/******************************************************************************/ + +vAPI.cookies.stop = function() { + Services.obs.removeObserver(this, 'cookie-changed'); +}; + +/******************************************************************************/ + +vAPI.cookies.observe = function(subject, topic, reason) { + if ( topic !== 'cookie-changed' ) { + return; + } + var handler = reason === 'deleted' ? this.onRemoved : this.onChanged; + if ( typeof handler !== 'function' ) { + return; + } + handler(new this.CookieEntry(subject.QueryInterface(Ci.nsICookie))); +}; + +/******************************************************************************/ + +// Meant and expected to be asynchronous. + vAPI.cookies.getAll = function(callback) { - // TODO - if ( typeof callback === 'function' ) { - callback([]); + if ( typeof callback !== 'function' ) { + return; } + var onAsync = function() { + var out = []; + var enumerator = Services.cookies.enumerator; + while ( enumerator.hasMoreElements() ) { + out.push(new this.CookieEntry(enumerator.getNext().QueryInterface(Ci.nsICookie))); + } + callback(out); + }; + setTimeout(onAsync.bind(this), 0); }; /******************************************************************************/ vAPI.cookies.remove = function(details, callback) { - // TODO + var uri = Services.io.newURI(details.url, null, null); + var cookies = Services.cookies; + cookies.remove(uri.asciiHost, details.name, uri.path, false); + cookies.remove( '.' + uri.asciiHost, details.name, uri.path, false); if ( typeof callback === 'function' ) { - callback(null); + callback({ + domain: uri.asciiHost, + name: details.name, + path: uri.path + }); } }; + +/******************************************************************************/ /******************************************************************************/ })(); diff --git a/src/background.html b/src/background.html index 9722274..6e126ca 100644 --- a/src/background.html +++ b/src/background.html @@ -21,13 +21,13 @@ + - diff --git a/src/js/browsercache.js b/src/js/browsercache.js index 2929fc9..e02c8fe 100644 --- a/src/js/browsercache.js +++ b/src/js/browsercache.js @@ -44,14 +44,15 @@ var clearCache = function() { return; } + vAPI.browserData.clearCache(); + µm.clearBrowserCacheCycle = µm.userSettings.clearBrowserCacheAfter; µm.browserCacheClearedCounter++; - vAPI.browserCache.clearByTime(0); - + // TODO: i18n µm.logger.writeOne('', 'info', 'browser cache cleared'); - //console.debug('clearBrowserCacheCallback()> vAPI.browserCache.clearByTime() called'); + //console.debug('clearBrowserCacheCallback()> vAPI.browserData.clearCache() called'); }; setTimeout(clearCache, 15 * 60 * 1000); diff --git a/src/js/cookies.js b/src/js/cookies.js index 50c3220..efbd482 100644 --- a/src/js/cookies.js +++ b/src/js/cookies.js @@ -496,13 +496,7 @@ var canRemoveCookie = function(cookieKey, srcHostnames) { // Listen to any change in cookieland, we will update page stats accordingly. -vAPI.cookies.onChanged = function(changeInfo) { - if ( changeInfo.removed ) { - return; - } - - var cookie = changeInfo.cookie; - +vAPI.cookies.onChanged = function(cookie) { // rhill 2013-12-11: If cookie value didn't change, no need to record. // https://github.com/gorhill/httpswitchboard/issues/79 var cookieKey = cookieKeyFromCookie(cookie); @@ -536,7 +530,7 @@ vAPI.cookies.onChanged = function(changeInfo) { /******************************************************************************/ vAPI.cookies.getAll(addCookiesToDict); -vAPI.cookies.registerListeners(); +vAPI.cookies.start(); µm.asyncJobs.add('cookieHunterRemove', null, processRemoveQueue, 2 * 60 * 1000, true); µm.asyncJobs.add('cookieHunterClean', null, processClean, 10 * 60 * 1000, true);