henry_flower (
henry_flower) wrote2012-09-24 11:53 pm
Entry tags:
Часть extensions API в Chrome это какое-то издевательство. Как и
Часть extensions API в Chrome это какое-то издевательство.
Как и в Opera, в Chrome каждое extension, когда хочет иметь пользовательские настройки, рисует html как хочет из-за чего все смирно пишут гору джаваскрипта, для выковыривания и сохранения данных из html форм.
Для Opera мне пришлось писать генератор джавоскрипта, который генерировался из json спецификации. Я злился, но блеймил необходимость той писанины скромным положением Opera.
Так вот в Chrome, в этом смысле, все еще хуже.
Несколько лет они обещают дать какие-то гайдланс для options.html. Пока гоогловцы заняты, народ нарожал генераторов, на которые если посмотреть, то авторам хочется запретить подходить к компьютерам ближе чем на 1 км.
Но самое интересное, как в Chome мудро сделан API для хранения данных из options.html.
Opera просто дает объект widget.preferences, который есть обычный webstorage. В Chome (и Firefox) он имеет имя localStorage. widget.preferences доступен отовсюду. Из background скриптов, из included скриптов и, разумеется, в options.html.
В Chrome сделано значительно умнее. localStorage для background страницы и content скриптов--это 2 разных объекта. То есть, вы честно сохраняете ваши данные в localStorage в options.html, а в инджектнутом на страничке скрипте, пытаясь прочесть их, получаете хуй.
Чтобы выковырять информацию, нужно послать в background page асинхронное сообщение и робко в колбэке подождать ответ.
То есть из простого
localStorage['foo'] = 'bar'
в options.html
и
localStorage['foo']
в content скриптах, мы имеем
chrome.extension.sendMessage {'msg': 'lstorage', 'data': 'foo'}, (res) ->
console.log res # ответ
в content скриптах, а в background page:
chrome.extension.onMessage.addListener (req, sender, sendRes) ->
sendRes localStorage[req.data] if req.msg == 'lstorage'
Невозможность синхронным образом прочесть содержимое localStorage и необходимость городить тучу колбеков на каждый чих, доставляет конечно большое удовольствие.
В качестве разнообразия, у Chrome еще есть chrome.storage объект, доступный отовсюду, но обладающий похожим прекрасным асинхронном интерфейсом, не считая ограничения на размер данных.
Хотелось еще написать гадость про отсутствие встроенной поддержки кофискрипта, но нет сил.
Как и в Opera, в Chrome каждое extension, когда хочет иметь пользовательские настройки, рисует html как хочет из-за чего все смирно пишут гору джаваскрипта, для выковыривания и сохранения данных из html форм.
Для Opera мне пришлось писать генератор джавоскрипта, который генерировался из json спецификации. Я злился, но блеймил необходимость той писанины скромным положением Opera.
Так вот в Chrome, в этом смысле, все еще хуже.
Несколько лет они обещают дать какие-то гайдланс для options.html. Пока гоогловцы заняты, народ нарожал генераторов, на которые если посмотреть, то авторам хочется запретить подходить к компьютерам ближе чем на 1 км.
Но самое интересное, как в Chome мудро сделан API для хранения данных из options.html.
Opera просто дает объект widget.preferences, который есть обычный webstorage. В Chome (и Firefox) он имеет имя localStorage. widget.preferences доступен отовсюду. Из background скриптов, из included скриптов и, разумеется, в options.html.
В Chrome сделано значительно умнее. localStorage для background страницы и content скриптов--это 2 разных объекта. То есть, вы честно сохраняете ваши данные в localStorage в options.html, а в инджектнутом на страничке скрипте, пытаясь прочесть их, получаете хуй.
Чтобы выковырять информацию, нужно послать в background page асинхронное сообщение и робко в колбэке подождать ответ.
То есть из простого
localStorage['foo'] = 'bar'
в options.html
и
localStorage['foo']
в content скриптах, мы имеем
chrome.extension.sendMessage {'msg': 'lstorage', 'data': 'foo'}, (res) ->
console.log res # ответ
в content скриптах, а в background page:
chrome.extension.onMessage.addListener (req, sender, sendRes) ->
sendRes localStorage[req.data] if req.msg == 'lstorage'
Невозможность синхронным образом прочесть содержимое localStorage и необходимость городить тучу колбеков на каждый чих, доставляет конечно большое удовольствие.
В качестве разнообразия, у Chrome еще есть chrome.storage объект, доступный отовсюду, но обладающий похожим прекрасным асинхронном интерфейсом, не считая ограничения на размер данных.
Хотелось еще написать гадость про отсутствие встроенной поддержки кофискрипта, но нет сил.
Permalink: https://plus.google.com/115290581164606462017/posts/D6uwxuST4D6
