background.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. var showContextMenu = undefined;
  2. updateCallback = function () {
  3. if (showContextMenu !== preferences.showContextMenu) {
  4. showContextMenu = preferences.showContextMenu;
  5. setContextMenu(showContextMenu);
  6. }
  7. setHolidayIcon();
  8. };
  9. setHolidayIcon();
  10. setInterval(setHolidayIcon, 60 * 60 * 1000); //Every hour
  11. //Every time the browser restarts the first time the user goes to the options he ends up in the default page (support)
  12. localStorage.setItem("option_panel", "null");
  13. var currentVersion = chrome.runtime.getManifest().version;
  14. var oldVersion = data.lastVersionRun;
  15. data.lastVersionRun = currentVersion;
  16. if (false && oldVersion !== currentVersion) {
  17. if (oldVersion === undefined) { //Is firstrun
  18. chrome.tabs.create({ url: 'http://www.editthiscookie.com/start/' });
  19. } else {
  20. chrome.notifications.onClicked.addListener(function (notificationId) {
  21. chrome.tabs.create({
  22. url: 'http://www.editthiscookie.com/changelog/'
  23. });
  24. chrome.notifications.clear(notificationId, function (wasCleared) { });
  25. });
  26. var opt = {
  27. type: "basic",
  28. title: "EditThisCookie",
  29. message: _getMessage("updated"),
  30. iconUrl: "/img/icon_128x128.png",
  31. isClickable: true
  32. };
  33. chrome.notifications.create("", opt, function (notificationId) {
  34. });
  35. }
  36. }
  37. setContextMenu(preferences.showContextMenu);
  38. chrome.cookies.onChanged.addListener(function (changeInfo) {
  39. var removed = changeInfo.removed;
  40. var cookie = changeInfo.cookie;
  41. var cause = changeInfo.cause;
  42. var name = cookie.name;
  43. var domain = cookie.domain;
  44. var value = cookie.value;
  45. if (cause === "expired" || cause === "evicted")
  46. return;
  47. for (var i = 0; i < data.readOnly.length; i++) {
  48. var currentRORule = data.readOnly[i];
  49. if (compareCookies(cookie, currentRORule)) {
  50. if (removed) {
  51. chrome.cookies.get({
  52. 'url': "http" + ((currentRORule.secure) ? "s" : "") + "://" + currentRORule.domain + currentRORule.path,
  53. 'name': currentRORule.name,
  54. 'storeId': currentRORule.storeId
  55. }, function (currentCookie) {
  56. if (compareCookies(currentCookie, currentRORule))
  57. return;
  58. var newCookie = cookieForCreationFromFullCookie(currentRORule);
  59. chrome.cookies.set(newCookie);
  60. ++data.nCookiesProtected;
  61. });
  62. }
  63. return;
  64. }
  65. }
  66. // Check if a blocked cookie was added
  67. if (!removed) {
  68. for (var i = 0; i < data.filters.length; i++) {
  69. var currentFilter = data.filters[i];
  70. if (filterMatchesCookie(currentFilter, name, domain, value)) {
  71. chrome.tabs.query(
  72. { active: true },
  73. function (tabs) {
  74. var url = tabs[0].url;
  75. var toRemove = {};
  76. toRemove.url = url;
  77. toRemove.url = "http" + ((cookie.secure) ? "s" : "") + "://" + cookie.domain + cookie.path;
  78. toRemove.name = name;
  79. chrome.cookies.remove(toRemove);
  80. ++data.nCookiesFlagged;
  81. });
  82. }
  83. }
  84. }
  85. if (!removed && preferences.useMaxCookieAge && preferences.maxCookieAgeType > 0) { //Check expiration, if too far in the future shorten on user's preference
  86. var maxAllowedExpiration = Math.round((new Date).getTime() / 1000) + (preferences.maxCookieAge * preferences.maxCookieAgeType);
  87. if (cookie.expirationDate !== undefined && cookie.expirationDate > maxAllowedExpiration + 60) {
  88. var newCookie = cookieForCreationFromFullCookie(cookie);
  89. if (!cookie.session)
  90. newCookie.expirationDate = maxAllowedExpiration;
  91. chrome.cookies.set(newCookie);
  92. ++data.nCookiesShortened;
  93. }
  94. }
  95. });
  96. // Use new API to delete SET-COOKIE headers as requested by users
  97. chrome.webRequest.onHeadersReceived.addListener(
  98. function(details) {
  99. headersToForward = [];
  100. if (details.responseHeaders !== undefined) {
  101. headersChanged = false;
  102. for (var i=0; i<details.responseHeaders.length; i++) {
  103. cH = details.responseHeaders[i];
  104. if (cH.name.toUpperCase() != "SET-COOKIE") {
  105. headersToForward.push(cH);
  106. continue;
  107. }
  108. fields = cH.value.split(';');
  109. var cookieName = undefined;
  110. var cookieDomain = undefined;
  111. var cookieValue = undefined;
  112. if (fields.length > 0) {
  113. cookieName = fields[0].split('=')[0]
  114. cookieValue = fields[0].split('=')[1]
  115. }
  116. for (var x=1; x<fields.length; x++) {
  117. if (fields[x].split('=')[0].trim() == "domain") {
  118. cookieDomain = fields[x].split('=')[1];
  119. break;
  120. }
  121. }
  122. if (cookieName !== undefined && cookieDomain !== undefined && cookieValue !== undefined) {
  123. var forwardHeader = true;
  124. for (var x=0; x<data.filters.length; x++) {
  125. if (filterMatchesCookie(data.filters[x], cookieName, cookieDomain, cookieValue)) {
  126. forwardHeader = false;
  127. break;
  128. }
  129. }
  130. if (forwardHeader) {
  131. headersToForward.push(cH);
  132. }
  133. else {
  134. // Do not add current set-cookie to headers. This cookie was flagged as blocked
  135. headersChanged = true;
  136. }
  137. }
  138. }
  139. }
  140. if (headersChanged) {
  141. return { responseHeaders: headersToForward };
  142. }
  143. else {
  144. return {};
  145. }
  146. },
  147. {urls: ["<all_urls>"]},
  148. ["blocking", "responseHeaders", "extraHeaders"]
  149. );
  150. function setContextMenu(show) {
  151. chrome.contextMenus.removeAll();
  152. if (show) {
  153. chrome.contextMenus.create({
  154. "title": "EditThisCookie",
  155. "contexts": ["page"],
  156. "onclick": function (info, tab) {
  157. showPopup(info, tab);
  158. }
  159. });
  160. }
  161. }
  162. function setHolidayIcon() {
  163. if (isChristmasPeriod() && preferences.showChristmasIcon) {
  164. chrome.browserAction.setIcon({ "path": "/img/cookie_xmas_19x19.png" });
  165. // } else if (isHalloweenPeriod() && preferences.showChristmasIcon) {
  166. // chrome.browserAction.setIcon({ "path": "/img/icon_halloween_19x19.png" });
  167. } else {
  168. chrome.browserAction.setIcon({ "path": "/img/icon_19x19.png" });
  169. }
  170. }