Может ли Shadow DOM защитить мои элементы?
Цель: инкапсулированный виджет
Предположим, что я разработчик виджета друзей для FakeBook ™. Я предоставляю виджет владельцам веб-сайтов, который добавляет на свои персонализированные сообщения:
Ваши друзья Майкл, Анна и Ширли любят эту веб-страницу!
Первый подход: script, который создает span
Наивно, создаю script, который помещает эту информацию в span
на веб-сайт. Однако владельцы ExampleSite теперь могут получить доступ к именам ваших друзей с помощью простых операций DOM!
Это большая проблема конфиденциальности/безопасности.
Второй подход: a iframe
Я не хочу, чтобы ExampleSite имел доступ к именам своих друзей. Поэтому вместо этого я позволяю владельцам веб-сайтов добавлять виджет с iframe
:
<iframe src="http://fakebook.com/friends?page=http%3A%2F%2Fexample.org%2F"></iframe>
Это работает, потому что владельцы ExampleSite не могут очистить содержимое iframe
. Однако вся эта вещь iframe
довольно уродлива, потому что она не интегрирует в стиль веб-сайта, а span
делает.
Желаемый подход: Shadow DOM
Когда я читал о Shadow Dom вчера, я задавался вопросом, может ли это быть решением обеих проблем. Это позволит мне иметь script, который создает span
, к которому не может получить исходный веб-сайт:
var host = document.querySelector('#friends');
var root = host.webkitCreateShadowRoot();
root.textContent = 'Your friends Michael, Anna and Shirley love this webpage!';
Тем не менее, скрывает ли теневой объект DOM его содержимое со своей страницы?
Предполагается, что никто, кроме моего script, не может получить доступ к root
, но верно ли это?
Shadow DOM spec после того, как все говорят, что он предлагает функциональную инкапсуляцию, но мне действительно нужна инкапсуляция доверия. И хотя в примерах использования моделей компонентов перечислены этот прецедент, я не уверен, реализует ли Shadow DOM ненужное ограничение.
Ответы
Ответ 1
Это не так, но это в работе: https://www.w3.org/Bugs/Public/show_bug.cgi?id=20144
Инкапсуляция доверия будет включать создание нового контекста сценариев для каждого дерева теней, что является чрезмерным для большинства сценариев. Однако, как говорит ошибка, мы добавим флаг (подробности TBD), который позволит это.