Index: chrome/common/extensions/docs/examples/api/cookies/manager.html |
diff --git a/chrome/common/extensions/docs/examples/api/cookies/manager.html b/chrome/common/extensions/docs/examples/api/cookies/manager.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8c644c92edbbb734f059ae473f1cab87f7ed2825 |
--- /dev/null |
+++ b/chrome/common/extensions/docs/examples/api/cookies/manager.html |
@@ -0,0 +1,297 @@ |
+<html> |
+<head> |
+<style> |
+table { |
+ border-collapse:collapse; |
+} |
+ |
+td { |
+ border: 1px solid black; |
+ padding-left: 5px; |
+} |
+ |
+td.button { |
+ border: none; |
+} |
+ |
+td.cookie_count { |
+ text-align: right; |
+} |
+ |
+</style> |
+ |
+<script> |
+ |
+if (!chrome.cookies) { |
+ chrome.cookies = chrome.experimental.cookies; |
+} |
+ |
+// A simple Timer class. |
+function Timer() { |
+ this.start_ = new Date(); |
+ |
+ this.elapsed = function() { |
+ return (new Date()) - this.start_; |
+ } |
+ |
+ this.reset = function() { |
+ this.start_ = new Date(); |
+ } |
+} |
+ |
+// Compares cookies for "key" (name, domain, etc.) equality, but not "value" |
+// equality. |
+function cookieMatch(c1, c2) { |
+ return (c1.name == c2.name) && (c1.domain == c2.domain) && |
+ (c1.hostOnly == c2.hostOnly) && (c1.path == c2.path) && |
+ (c1.secure == c2.secure) && (c1.httpOnly == c2.httpOnly) && |
+ (c1.session == c2.session) && (c1.storeId == c2.storeId); |
+} |
+ |
+// Returns an array of sorted keys from an associative array. |
+function sortedKeys(array) { |
+ var keys = []; |
+ for (var i in array) { |
+ keys.push(i); |
+ } |
+ keys.sort(); |
+ return keys; |
+} |
+ |
+// Shorthand for document.querySelector. |
+function select(selector) { |
+ return document.querySelector(selector); |
+} |
+ |
+// An object used for caching data about the browser's cookies, which we update |
+// as notifications come in. |
+function CookieCache() { |
+ this.cookies_ = {}; |
+ |
+ this.reset = function() { |
+ this.cookies_ = {}; |
+ } |
+ |
+ this.add = function(cookie) { |
+ var domain = cookie.domain; |
+ if (!this.cookies_[domain]) { |
+ this.cookies_[domain] = []; |
+ } |
+ this.cookies_[domain].push(cookie); |
+ }; |
+ |
+ this.remove = function(cookie) { |
+ var domain = cookie.domain; |
+ if (this.cookies_[domain]) { |
+ var i = 0; |
+ while (i < this.cookies_[domain].length) { |
+ if (cookieMatch(this.cookies_[domain][i], cookie)) { |
+ this.cookies_[domain].splice(i, 1); |
+ } else { |
+ i++; |
+ } |
+ } |
+ if (this.cookies_[domain].length == 0) { |
+ delete this.cookies_[domain]; |
+ } |
+ } |
+ }; |
+ |
+ // Returns a sorted list of cookie domains that match |filter|. If |filter| is |
+ // null, returns all domains. |
+ this.getDomains = function(filter) { |
+ var result = []; |
+ sortedKeys(this.cookies_).forEach(function(domain) { |
+ if (!filter || domain.indexOf(filter) != -1) { |
+ result.push(domain); |
+ } |
+ }); |
+ return result; |
+ } |
+ |
+ this.getCookies = function(domain) { |
+ return this.cookies_[domain]; |
+ }; |
+} |
+ |
+ |
+var cache = new CookieCache(); |
+ |
+ |
+function removeAllForFilter() { |
+ var filter = select("#filter").value; |
+ var timer = new Timer(); |
+ cache.getDomains(filter).forEach(function(domain) { |
+ removeCookiesForDomain(domain); |
+ }); |
+} |
+ |
+function removeAll() { |
+ var all_cookies = []; |
+ cache.getDomains().forEach(function(domain) { |
+ cache.getCookies(domain).forEach(function(cookie) { |
+ all_cookies.push(cookie); |
+ }); |
+ }); |
+ cache.reset(); |
+ var count = all_cookies.length; |
+ var timer = new Timer(); |
+ for (var i = 0; i < count; i++) { |
+ removeCookie(all_cookies[i]); |
+ } |
+ timer.reset(); |
+ chrome.cookies.getAll({}, function(cookies) { |
+ for (var i in cookies) { |
+ cache.add(cookies[i]); |
+ removeCookie(cookies[i]); |
+ } |
+ }); |
+} |
+ |
+function removeCookie(cookie) { |
+ var url = "http" + (cookie.secure ? "s" : "") + "://" + cookie.domain + |
+ cookie.path; |
+ chrome.cookies.remove({"url": url, "name": cookie.name}); |
+} |
+ |
+function removeCookiesForDomain(domain) { |
+ var timer = new Timer(); |
+ cache.getCookies(domain).forEach(function(cookie) { |
+ removeCookie(cookie); |
+ }); |
+} |
+ |
+function resetTable() { |
+ var table = select("#cookies"); |
+ while (table.rows.length > 1) { |
+ table.deleteRow(table.rows.length - 1); |
+ } |
+} |
+ |
+var reload_scheduled = false; |
+ |
+function scheduleReloadCookieTable() { |
+ if (!reload_scheduled) { |
+ reload_scheduled = true; |
+ setTimeout(reloadCookieTable, 250); |
+ } |
+} |
+ |
+function reloadCookieTable() { |
+ reload_scheduled = false; |
+ |
+ var filter = select("#filter").value; |
+ |
+ var domains = cache.getDomains(filter); |
+ |
+ select("#filter_count").innerText = domains.length; |
+ select("#total_count").innerText = cache.getDomains().length; |
+ |
+ select("#delete_all_button").innerHTML = ""; |
+ if (domains.length) { |
+ var button = document.createElement("button"); |
+ button.onclick = removeAllForFilter; |
+ button.innerText = "delete all " + domains.length; |
+ select("#delete_all_button").appendChild(button); |
+ } |
+ |
+ resetTable(); |
+ var table = select("#cookies"); |
+ |
+ domains.forEach(function(domain) { |
+ var cookies = cache.getCookies(domain); |
+ var row = table.insertRow(-1); |
+ row.insertCell(-1).innerText = domain; |
+ var cell = row.insertCell(-1); |
+ cell.innerText = cookies.length; |
+ cell.setAttribute("class", "cookie_count"); |
+ |
+ var button = document.createElement("button"); |
+ button.innerText = "delete"; |
+ button.onclick = (function(dom){ |
+ return function() { |
+ removeCookiesForDomain(dom); |
+ }; |
+ }(domain)); |
+ var cell = row.insertCell(-1); |
+ cell.appendChild(button); |
+ cell.setAttribute("class", "button"); |
+ }); |
+} |
+ |
+function focusFilter() { |
+ select("#filter").focus(); |
+} |
+ |
+function resetFilter() { |
+ var filter = select("#filter"); |
+ filter.focus(); |
+ if (filter.value.length > 0) { |
+ filter.value = ""; |
+ reloadCookieTable(); |
+ } |
+} |
+ |
+var ESCAPE_KEY = 27; |
+window.onkeydown = function(event) { |
+ if (event.keyCode == ESCAPE_KEY) { |
+ resetFilter(); |
+ } |
+} |
+ |
+function listener(info) { |
+ cache.remove(info.cookie); |
+ if (!info.removed) { |
+ cache.add(info.cookie); |
+ } |
+ scheduleReloadCookieTable(); |
+} |
+ |
+function startListening() { |
+ chrome.cookies.onChanged.addListener(listener); |
+} |
+ |
+function stopListening() { |
+ chrome.cookies.onChanged.removeListener(listener); |
+} |
+ |
+function onload() { |
+ focusFilter(); |
+ var timer = new Timer(); |
+ chrome.cookies.getAll({}, function(cookies) { |
+ startListening(); |
+ start = new Date(); |
+ for (var i in cookies) { |
+ cache.add(cookies[i]); |
+ } |
+ timer.reset(); |
+ reloadCookieTable(); |
+ }); |
+} |
+ |
+ |
+</script> |
+</head> |
+ |
+<body onload="onload()" onclick="focusFilter()"> |
+<h2>Cookies! ... Nom Nom Nom...</h2> |
+<button onclick="removeAll()">DELETE ALL!</button> |
+<div id="filter_div"> |
+Filter: <input id="filter" type="text" oninput="reloadCookieTable()"> |
+<button onclick="resetFilter()">x</button> |
+</div> |
+<br> |
+<div id="summary_div"> |
+Showing <span id="filter_count"></span> of <span id="total_count"></span> cookie domains. |
+<span id="delete_all_button"></span> |
+</div> |
+<br> |
+<table id="cookies"> |
+<tr class="header"> |
+<th>Name</th> |
+<th>#Cookies</th> |
+</tr> |
+</table> |
+ |
+</body> |
+</html> |