从Chrome扩展程序清除特定域的会话和本地存储

时间:2016-03-25 08:07:30

标签: javascript jquery google-chrome google-chrome-extension session-storage

是否可以从 Chrome扩展程序清除特定域的会话和本地存储?

假设我想针对sessionStorage定位localStoragesomedomain.com。我现在这样做的方式是:

function clearSessionSotorage(key) {
  /**
   * Clears the session storage value for the given key
   * @param string key The key whose value should be cleared, if not provided, all keys are cleared for the current domain
   */
   var code = key ? 'window.sessionStorage.clear(' + key + ')' : 'window.sessionStorage.clear()';
   chrome.tabs.executeScript(null, { code: code });
}

function clearLocalStorage(key) {
  /**
   * Clears the local storage value for the given key
   * @param string key The key whose value should be cleared, if not provided, all keys are cleared for the current domain
   */
  var code = key ? 'window.localStorage.clear(' + key + ')' : 'window.localStorage.clear()';
  chrome.tabs.executeScript(null, { code: code });
}

只要活动标签somedomain.com上的页面开放,就可以使用此功能。

但是,我希望定位特定的域名,而无需在活动标签页中添加该域名。

如果有可能,我该怎么做?

我已经考虑过在所有标签中循环寻找目标网址,这会有所改进,但实际上,我更喜欢一个可以避免必须让域名处于活动状态的选项。

4 个答案:

答案 0 :(得分:2)

正如已经指出的那样,有一种方法可以使用选项卡打开选项卡并在其中运行代码。但是打开/关闭标签并不是一个好的解决方案......

经过一些调查后,我有一个小而且非常有效的解决方案,使用IFRAME而不是标签。将此代码添加到background.js

// create a URL suffix to make it unique and make nearly impossible to hit the existing page
var suffix = 'chrome-run-on-domain-' + chrome.runtime.id;

// if the domain is blocking displaying pages in IFRAME, remove the restriction
chrome.webRequest.onHeadersReceived.addListener(function(details) {
  return {
    responseHeaders: details.responseHeaders.filter(function(e) {
      return e.name.toUpperCase() !== 'X-FRAME-OPTIONS';
    })
  };
}, { urls: [ '*://*/' + suffix ] }, ["blocking", "responseHeaders"]);

// finally the function which does the job: it adds an IFRAME to the background page
function injectScript(protocol, domain) {
  var iframe = document.createElement("iframe");

  iframe.src = protocol + '://' + domain + '/' + suffix;

  document.body.appendChild(iframe);
}

// run the code
injectScript('https', 'www.google.de');

此代码已经占据了很大一部分工作。它会在您的背景页面上创建一个iframe,可以安全地进入您的愿望范围。

然后,您需要创建一个包含要在页面上运行的更改的文件:

// actually any action to do with a session/localStorage
sessionStorage.clear();
localStorage.clear();

// important, stops the page loading
// this prevents unnecessary images / css / js calls on that page
// and prevents js redirects
window.stop();

现在是时候在清单文件中设置引用和权限了:

"background": {
  "scripts": [
    "background.js"
  ]
},
"content_scripts": [{
  "all_frames": true,
  "js": ["injectable.js"],
  "matches": ["*://*/chrome-run-on-domain-*"],
  "run_at": "document_start"
}],
"permissions": [
  "<all_urls>",
  "webRequest",
  "webRequestBlocking"
]

您最终拥有的内容:您可以清除localStorage,而不仅仅是window.stop()。您没有为此打开新标签,因此它非常顺利。仍有缺点(选项卡解决方案仍然存在相同的问题):

  1. 没有服务器端重定向(301/302 / etc)保护。如果服务器将使用重定向进行响应,则无法真正截获它。
  2. 仍然有服务器调用。我试图取消请求(如果这样可行,根本没有任何缺点)但不幸的是,chrome不允许将脚本注入已取消的请求中。 defined在这里帮助但仍然......
  3. 使用您的初始方法效果会更好:您只需首先检查您的标签是否有来自您网域的网页,如果没有,请使用上述方法。

答案 1 :(得分:1)

我认为唯一的方法是循环所有选项卡并查找目标网址,然后删除该域的sessionStorage,或者如果需要,可以插入特定域的内容脚本,这样可以清除sessionStorage逻辑。 / p>

当你说

  

我更喜欢一种避免让域名全部活跃的选项

根据Window.sessionStorage,您似乎忘记了sessionStorage的生命周期,会在标签/浏览器关闭时清除sessionStorage,并且不会在标签之间共享。

  

在新标签页或新窗口中打开页面会导致启动新会话

答案 2 :(得分:1)

如果您希望清除当前在浏览器窗口中打开但未激活的特定域的sessionStorage / localStorage,则需要在该域的上下文中执行某些脚本。

我认为您可以使用chrome.tabs.query()link1)和chrome.tabs.executeJavaScript()link2)的组合使用代码作为字符串或使用内容脚本文件的名称来执行此操作

chrome.tabs.query({
  'url' : 'target-domain.com'
});

chrome.tabs.executeScript({
    code: 'sessionStorage.clear()'
  });

(or)

chrome.tabs.executeScript(null, {file: "content_script.js"});

对于tabs.query()中的url属性,您可以使用提到的模式here;

答案 3 :(得分:-2)

如果您的localStorage来自iFrame,您可以通过在控制台上摩擦此代码来清除它。

$('.my_iframe')[0].contentWindow.localStorage.clear();