Цель: инкапсулированный виджет
Предположим, что я разработчик виджета друзей для 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 ненужное ограничение.