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);