Ошибка в реализации Chrome localStorage?

В дополнение к этому вопросу, я получаю любопытный результат при привязке функции к событию изменения объекта Storage в Chrome 8.0.552.224.

Тест:

<!DOCTYPE html>
<html>
  <head>
    <title>Chrome localStorage Test</title>
    <script type="text/javascript" >

      var handle_storage = function () {
        alert('storage event');
      };

      window.addEventListener("storage", handle_storage, false);

    </script>
  </head>
  <body>
    <button id="add" onclick="localStorage.setItem('a','test')">Add</button>
    <button id="clear" onclick="localStorage.clear()">Clear</button>
  </body>
</html>
  • Откройте страницу в двух окнах Chrome, одно окно с двумя вкладками,
  • Нажмите кнопку "Добавить"

Когда я делаю это, я получаю окно предупреждения, отображаемое на второй вкладке и во втором окне, но не на вкладке, которая вызвала событие (я нажал на). Насколько я понимаю, я должен увидеть три окна предупреждений (по одному на каждую открытую вкладку).

Это ошибка? Кто-нибудь еще получает такое поведение? Если нет, то какую версию вы используете? Или я просто все понял неправильно?

2 ответа

Решение

Обновление и окончательное заключение

Оказывается, спецификация фактически говорит, что это желаемое поведение, поэтому реализация IE9 не работает.

4.2 Атрибут sessionStorage

Когда методы setItem(), removeItem() и clear() вызываются для объекта Storage x... если методы что-то сделали, то в каждом HTMLDocument ... [то есть], связанном с той же областью хранения, другие чем х, событие хранения должно быть запущено....

Итак, как мы видим, спецификация действительно плохо справляется с разъяснением, что это заданное поведение. Это было причиной того, что реализация Opera 10 была нарушена, и это, скорее всего, также причина, почему реализация IE9 не работает.

Что мы узнаем из этого? Всегда читайте каждое отдельное слово спецификации (особенно, если вы реализуете материал...).

Старый ответ

Как вы сказали, основное поведение здесь - "вызывать все, кроме текущей страницы".

Есть старый Chrome Bug Report за прошлый июль.

Как можно там прочитать, Firefox имеет ту же "проблему". Я проверял это с последней ночной, все еще ведет себя так же, как в Chrome.

Другой тест в Opera 11 показывает, что это должно быть некое заданное поведение, поскольку Opera 11 делает то же самое, но Opera 10 запускает события во всех окнах / вкладках. К сожалению, официальные журналы изменений для Opera 11 не содержат никаких изменений для этого поведения.

Читая спецификацию, ничего не говорится об этом поведении. Единственное, что я смог найти:

Событие хранилища возникает при изменении области хранилища, как описано в предыдущих двух разделах (для хранилища сеансов, для локального хранилища).

Когда это происходит, пользовательский агент должен поставить задачу в очередь, чтобы запустить событие с хранилищем имен, которое не всплывает и не подлежит отмене, и которое использует интерфейс StorageEvent для каждого объекта Window, чей объект Document имеет объект Storage, на который влияют,

Примечание. Сюда входят объекты документа, которые не являются полностью активными, но события, срабатывающие на них, игнорируются циклом событий до тех пор, пока документ снова не станет полностью активным.

Ну, что означает примечание?

Из другой спецификации:

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

Не имеет смысла? Да. Это помогает нам в любом случае? Нет.

Таким образом, мы (в чате JavaScript) нажали на #whatwg, чтобы увидеть, что все это значит, до сих пор не было никакого ответа. Я обновлю свой ответ, как только мы получим ответ.

Для завершения на данный момент

Firefox, Chrome, Safari и Opera ведут себя одинаково. То есть, они не открываются на вкладке / окне, которые сделали возможным локальное хранение.

Но IE9 Beta ведет себя как Opera 10, поэтому она запускается на всех вкладках / окнах.

Поскольку автор спецификации localStorage работает в Google в области исследований и разработок, я не сомневаюсь, что Chrome ошибется. И поскольку в Bugzilla нет ошибок по этому поводу, а Opera изменила поведение в 11, похоже, именно так оно и должно работать. До сих пор нет ответа, почему он работает таким образом и почему IE9 ведет себя по-другому, но мы все еще ждем ответа от #whatwg.

Ответ Иво Ветцела о том, что идет не так, правильный.

У меня возникла та же проблема, но мне удалось обойти это ограничение в спецификации, вручную создав и запустив StorageEvent на вкладке, которая инициировала изменение хранилища (см. StorageEvent # initStorageEvent).

Другие вопросы по тегам