Ошибка с использованием 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, в одном окне с двумя вкладками,
  • Нажмите кнопку "Добавить"

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

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

Ответ 1

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

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

4.2 Атрибут sessionStorage

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

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

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

Старый ответ

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

В июле прошлого года появился старый Chrome Отчет об ошибках.

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

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

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

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

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

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

Что означает примечание?

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

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

Не имеет смысла? Да. Помогает ли это нам каким-либо образом? Нет.

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

Завершить сейчас

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

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

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

Ответ 2

Иво Ветцель отвечает за ошибочные ошибки.

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