2

Возможно ли очистить сеанс и локальное хранилище для определенного домена с chrome extension?Очистить сеанс и локальное хранилище для определенного домена с помощью расширения хрома

Предположим, что я хочу нацелить sessionStorage или localStorage на somedomain.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.

Тем не менее, я хочу настроить таргетинг на определенные домены, не требуя, чтобы этот домен находился на активной вкладке.

Если возможно, как я могу это сделать?

Я рассмотрел возможность перехода по всем вкладкам в поисках целевого URL-адреса, что было бы улучшением, но на самом деле я бы предпочел вариант, который позволяет избежать необходимости иметь активный домен.

+0

Я не думаю, что вы можете это сделать, поскольку вы заблокированы одной и той же политикой происхождения. Скрипты на страницах, загруженных из домена1, не могут получить доступ к объектам хранилища из домена2. – Arkantos

+1

@Arkantos это расширение хром, у него нет этого ограничения ... – smnbbrv

+0

@smnbbrv точно, в этом контексте возможно много вещей, которые не находятся на нормальной странице. Я надеюсь, что это один из тех, хороший улов на редактировании BTW – DelightedD0D

ответ

1

Я считаю, что единственный способ - перебрать все вкладки и искать целевой URL-адрес, а затем удалить sessionStorage для этого домена или, если хотите, вы можете вставить скрипты содержимого для определенного домена, что позволит очистить логику sessionStorage.

Когда вы сказали

Я предпочел бы вариант, который избавляет от необходимости иметь домен активной на всех

Кажется, вы забыли жизненный цикл sessionStorage, согласно Window.sessionStorage, sessionStorage будет очищен, когда вкладка/браузер будет закрыта и не будет использоваться между вкладками.

Открытие страницы в новой вкладке или окне вызовет новый сеанс будет инициирован

+0

А, хороший улов. Я действительно ошибся sessionStorage с тем, как работают cookie сеанса. На самом деле, мне нужно очистить как сессионное, так и локальное хранилище.Мои извинения, я оставил его изначально, потому что он не казался relavent, учитывая, что они используют один и тот же API. Но я не рассматривал этот момент. +1 хотя :) – DelightedD0D

+0

@ DelightedD0D, я вижу ... Что касается как localStorage, так и sessionStorage, я считаю, что единственный способ - перебрать все вкладки или вставить сценарии содержания для определенных доменов. Тем не менее, мы могли бы ждать кого-то еще, если у них будут лучшие идеи :) –

+0

Согласен, я думаю, что использовать цикл для sessionStorage, и для localStorage возможно открыть новое окно на целевой URL без фокуса, ввести код, затем закрыть window – DelightedD0D

1

Если вы хотите очистить sessionStorage/LocalStorage для конкретного домена, который в настоящее время открыт, но не активно в вашем окне браузера, тогда вам нужно выполнить какой-то скрипт в контексте этого домена.

Я думаю, что вы можете сделать это, используя comibination из 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"}); 

Для url собственности в tabs.query(), вы можете использовать шаблоны, как указано here;

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, и не только. Вы не открываете для этого новые вкладки, так что это происходит довольно гладко. Все еще есть недостатки (все же те же проблемы будут существовать при решении табуляции):

  1. нет защиты на стороне сервера (301/302/и т.д.). Если сервер будет реагировать с перенаправлением, он не может быть перехвачен.
  2. все еще есть вызов сервера. Я попытался отменить запрос (если это сработает, не было никаких недостатков), но, к сожалению, хром не позволяет вставлять скрипт в отмененный запрос. window.stop() помогает здесь, но все-таки ...

Он работает еще лучше с начальным методом: вы просто проверить первые вкладки, есть ли страница вашего домена, и если есть никто не использовать метод выше.

-1

Если ваш localStorage поступает из iFrame, вы можете очистить его, протерев этот код на консоли.

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

Этот вопрос не имеет ничего общего с iframe, поэтому этот ответ действительно не подходит – DelightedD0D

 Смежные вопросы

  • Нет связанных вопросов^_^