Файл нех. Все, что вам нужно знать о предстоящем ICO NEX, как и когда? Скрипты содержимого работают в изолированном режиме

Разработчики из Opera Software представили NEX - формат расширений, созданный на базе хромовского CRX, но более нейтральный в плане поддержки конкретных вендоров. А если простыми словами, то они взяли CRX и на его базе создают свой формат NEX, который будет поддерживать не только API от Google, но и как минимум еще и от Opera. А теперь немного подробнее...

Когда разработчики решали вопрос перехода на Chromium, они очень внимательно изучили все аспекты этого шага. В том числе обратили свое внимание на формат расширений CRX. Поскольку формат этот признает только те API, которые Google захотел увидеть в своем Chrome, а браузер Opera, несмотря на хромовскую природу, имеет свой интерфейс и свой функционал, то возникает проблема: как позволить разработчикам расширений использовать API от Opera?

В конце концов, поскольку внести поддержку API Оперы в формат CRX весьма проблематично, было решено создать на его основе свой NEX (образован от N avigator Ex tension). Причем в Opera решили, что если уж создавать новый формат расширений, то нужно сделать его открытым, чтобы и команды других браузеров смогли принять участие в его разработке. А в перспективе планируют сделать его стандартом, протолкнув через организацию W3C.

Что представляет из себя NEX сегодня?

На данный момент расширения NEX имеют расширение.nex (логично, кто бы спорил) и передаются с типом application/x-navigator-extension . NEX сейчас это CRX минус некоторые хромовские API и плюс API для работы с экспресс-панелью Оперы. При этом браузер Opera, а также их магазин дополнений продолжат поддерживать параллельно и CRX.

Как NEX будет поддерживать API разных браузеров?

Заявлено, что в формате NEX могут быть описаны специфические API всех браузеров, принимающих участие в разработке. Например, формат поддерживает API Хрома через chrome.* , а API Оперы через opr.* . При этом разработчики могут создавать универсальные расширения за счет проверок типа if(opr.speeddial){...} .

Мысли вслух от Хром.рф

Если уж они решили делать свой интерфейс, то выхода у них особо и не было. Вот только все равно остаются две проблемы.

Многие радиолюбители, пытаясь по журнальной публикации повторить то или иное устройство на микроконтроллере, нередко сталкиваются с необъяснимыми, на первый взгляд, трудностями. Казалось бы, и исправность микроконтроллера сомнений не вызывает, и программатор в полном порядке, и устройство собрано точно по схеме, но работать, как следует, отказывается. В такой ситуации нередки нарекания в адрес автора разработки - представил, дескать, неработоспособную программу!

На самом деле в подавляющем большинстве случаев все обстоит иначе. Виноваты ошибки, допущенные при ручном вводе в компьютер НЕХ-файла программы по его "распечатке" на страницах печатного издания. Значительно реже бывают сбои при копировании файлов с дискет или "скачивании" их из Интернета. Как проверить НЕХ-файл? Ответ на этот вопрос - в публикуемой статье.

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

Остается очень тщательно и многократно сверять НЕХ-файл с оригиналом. Особенность нашей психики в том, что, проверив что-либо однажды, мы подсознательно убеждены в собственной непогрешимости и при повторных проверках нередко пропускаем то, чего не заметили в первый раз. Поэтому полезно иметь помощника, который, даже не вникая в суть работы, осуществит "независимый контроль".

Ни в коем случае не следует оставлять без проверки тексты программ, считанные сканером с последующим распознаванием с помощью программы FineReader и ей подобных. Практика показывает, что ошибки распознавания символов неизбежны даже при очень высоком качестве печатного текста.

При вводе НЕХ-файлов вручную (с клавиатуры) или их электронных версий, полученных сканированием, чаще всего случается следующее:

  • вместо латинских букв А, В, С, Е введены похожие на них русские;
  • вместо цифры 0 введена буква О (латинская или русская);
  • перепутаны буква В и цифра 8;
  • вместо цифры 1 введена буква I (лат. "и" прописная) или I (лат. "эль" строчная). В шрифтах некоторых гарнитур эти знаки очень похожи;
  • нарушен порядок следования символов;
  • в строке недостает нескольких символов или имеются лишние;
  • пропущены целые строки;
  • некоторые строки введены дважды.

Самый безобидный из этих дефектов - последний. В отличие от других, он не сказывается на работоспособности программы. То же самое в большинстве случаев можно сказать и о нарушении порядка следования строк. Однако программаторы, в которых предусмотрен строгий контроль правильности вводимых данных, могут файл с такими ошибками все-таки забраковать.

Нужно сказать, что контроль правильности структуры HEX-файла в процессе его чтения с диска выполняет программное обеспечение очень многих программаторов. Определенные возможности для этого заложены в самой структуре подобного файла, о которой можно прочитать, например, в статье автора "Разработка и отладка устройств на МК" ("Радио", 2001, № 5, с. 19). Беда в том, что программатор зачастую сообщает лишь о факте обнаружения ошибки без каких-либо подробностей, предоставляя пользователю разбираться самому. При этом дефектный файл нередко оказывается полностью или частично загруженным в программатор и, если неосторожно подать команду "Программирование", ошибочные данные будут перенесены в память МК. После этого будет успешно выполнена верификация (сверка содержимого памяти МК и программатора) и у пользователя создастся впечатление, что все в порядке.

В этом отношении очень опасно ведет себя программа РоnуРrоg (версии 2.05 и более ранних). Кроме HEX, здесь предусмотрено несколько других форматов входных файлов, и при загрузке она пытается самостоятельно выбрать нужный. Не распознав правильно формат файла с ошибками, она все-таки вводит его как двоичный. На рис. 1 показан вид окна программатора РоnуРrоg после такого ввода.

В памяти находятся не машинные коды команд, а ASCI-коды букв и цифр, из которых состоит текстовый НЕХ-файл. Естественно, по такой "программе" МК работать не будет. Вид того же окна после ввода идентичного первому безошибочного файла представлен на рис. 2. Заметим, что никаких сообщений об ошибках или об автоматически определенном формате файла программатор в обоих случаях не давал.

Помочь найти и исправить ошибки в НЕХ-файле до ввода его в программатор сможет программа CheckHEX . С ее же помощью можно создать новый НЕХ-файл, набрав его содержимое на клавиатуре компьютера. В последнем случае проверка идет одновременно с вводом данных.

Окно данных программы CheckHEX после ввода НЕХ-файла, содержащего несколько ошибок, изображено на рис. 3. В его верхней части слева выведены текущие координаты курсора, показывающего, куда будет введен символ при нажатии клавиши.

Справа имеется окошко, щелкнув по которому "мышью", можно в любой момент отменить или вновь разрешить проверку ошибок. Заблокировать контроль бывает полезно на время ручного ввода данных, иначе каждую незавершенную строку сопровождает множество сообщений, только отвлекающих внимание-Окно предупреждений и сообщений об ошибках (рис. 4) находится ниже основного. Сообщения, начинающиеся словом "Информация", лишь свидетельствуют об особом статусе тех или иных строк НЕХ-файла. В данном случае таких строк две. Первая из них необязательна, так как и в ее отсутствие отсчет адресов начнется с нуля. Подобные строки (их может быть несколько в разных местах файла) позволяют адресовать более 64 Кбайт (32 Кслов) памяти. Именно их присутствие отличает НЕХ-файлы формата INX32 от аналогичных формата INX8M.

Строка 25 служит признаком конца НЕХ-файла. Если какие-нибудь данные находятся после нее (строка 26), они не будут восприняты программатором. Этим можно воспользоваться, например, чтобы поместить в НЕХ-файл текстовый комментарий. В примере сюда была просто перемещена строка 20 исходного файла, оставшаяся пустой. В принципе, наличие пустых строк в НЕХ-фаиле допустимо, но некоторые программаторы все-таки могут счесть их ошибками. Программа CheckHEX, на всякий случай, предупреждает об этом.

Обратите внимание на сообщение об ошибке контрольной суммы в строке 3. Она может быть результатом неправильного ввода любого (кроме двоеточия) символа строки, которую следует проверить особенно внимательно. Приведенная в скобках "правильная" контрольная сумма полезна, если один или несколько символов строки изменены преднамеренно (например, чтобы исправить действительно имевшую место ошибку в программе). В рассматриваемом случае ошибка - результат ввода цифры 8 вместо буквы В.

Характер ошибки, допущенной в пятом символе четвертой строки, понятен. Заметим лишь, что для облегчения визуального поиска ошибок шрифт текста в основном окне не содержит символов кириллицы, их место занимают символы, не имеющие ничего общего с правильными. Однако в сообщениях об ошибках русские буквы представлены.

Справа от окна данных расположено окно, отображающее картину заполнения памяти МК кодами из анализируемого файла. Фрагмент этого окна - на рис. 5. Белый цвет соответствует свободным ячейкам, синий или красный - занятым. Имеющиеся на рисунке пояснительные надписи (в реальном окне их нет) относятся к типовому для РIС-контроллеров распределению памяти, для других МК и РПЗУ оно может быть совершенно иным. Перемещая курсор "мыши" внутри окна, можно определить адрес любой из отображенных там ячеек. В данном случае курсор (перекрестие в правой верхней части окна) указывает на байт по адресу ООСОН - младший в двубайтном слове по адресу 0060Н.

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

Отрезок красного цвета говорит о том, что коды, заносимые по этим адресам, встретились в файле неоднократно. В примере (см. рис. 3) идентичны седьмая и восьмая строки. Если дублирующая строка - результат невнимательности при ручном вводе данных, ее можно удалить. Но чаще виновата ошибка, допущенная в адресной части строки (символы с четвертого по седьмой). В подобном случае не только коды по ошибочным адресам будут искажены, но и останется неопределенной область памяти, к которой данная строка относилась исходно. Все это необходимо еще и еще раз проверить.

В заключение отметим, что в окне программы CheckHEX имеются три управляющие кнопки: - создать новый НЕХ-фаил; - открыть и проверить существующий; - сохранить созданный или отредактированный файл. При попытке загрузить или создать еще один файл, предварительно не сохранив измененный вариант старого, программа всегда напоминает о необходимости это сделать. То же самое происходит перед завершением работы программы.

API из проекта Chromium, поддерживаемые в NEX-расширениях (например, вкладки) доступны в chrome.\* , а специфичные для Opera (например, для экспресс-панели) доступны в объекте opr.\* .

Стоит заметить, что Opera поддерживает расширения в CRX-формате, если Opera поддерживает используемые в нём API.

Если охота просмотреть код расширения, его можно переименовать, изменив расширение на zip, и распаковать.

Виды расширений

Существует несколько видов расширений для Opera.

1. Расширения, подразумевающие действия браузера (и действия страницы)

You can use Browser Actions or Page Actions to put UI elements in the browser window. Browser Actions are used to put UI elements in the top right side of the browser next to the address bar. This is different from Page Actions which are used to place a UI element inside the address bar.

Page actions are used to put a UI element specific to just a page or a limited set of pages fitting a certain criteria. If you would like the UI element to be there for all pages, then you should use Browser Actions for that purpose. The UI elements you can use are buttons, badges and popups. To know more on how to create and use these in extensions, please read the article on creating buttons, badges and popups .

Note: There can only be a maximum of 6 extensions installed at a time in the toolbar using browser actions, and only up to 4 which are based on page actions.

2. Расширения контекстного меню

Как следует из названия, они расширяют контекстное меню страницы, вызываемое нажатием право кнопки мыши. Подробнее о создании расширения для контекстного меню: https://dev.opera.com/extensions/context-menus/ .

3. Расширения экспресс-панели 4. Расширения без интерфейса

Возможно создание расширения, не имеющего интерфейса.

Примером является расширение, обрабатывающее ввод с клавиатуры и, например, открывающее вкладку с сайтом.

Составные части расширения Манифест

Манифест является обязательной частью любого расширения. Этот файл содержит основную информацию о расширении, как то: название расширения, его автора, разрешения, версию и пр. Если файл манифеста содержит ошибку, расширение просто не запустится. Подробнее о манифесте можно прочесть .

Фоновый скрипт

Обычно требуется иметь процесс, работающий в фоновом режиме для выполнения каких-либо задач или поддержания какого-либо состояния. Есть два вариант реализации этого: фоновый скрипт или страница событий.

Можно использовать HTML-страницу и вставить внутрь JavaScript-код внутри блока , но лучше просто использовать.js-файл и указать его в манифесте. Браузер автоматически сгенерирует соответствующую страницу для него. Например,

"background" : { "scripts" : ["background.js" ] }

Для того, чтобы указать страницу событий, в манифесте нужно установить false для поля persistent:

"background" : { "scripts" : ["eventPage.js" ], "persistent" : false }

Фоновый скрипт очень важен при работе с пользовательским интерфейсом. Любой участок кода, создающий элементы пользовательского интерфейса, должен быть определён здесь.

Страница событий похожа на фоновый скрипт , но только она загружается только тогда, когда необходимо. Таким образом, если страница не загружена, то не используется оперативная память, а ресурсы не загружаются, что положительно влияет на производительность. Рекомендуется использовать именно страницы событий.

Страницы событий загружаются в следующих случаях:

  • Во время установки, перезапуска, запуска или обновления до новой версии.
  • Когда возникает событие, которое прослушивалось страницей событий.
  • Когда другая часть расширения (например, всплывающее окно) вызывают их (например, используя runtime.getBackgroundPage).

    Когда другая часть расширения посылает сообщение (используя runtime.sendMessage() или долгоживущие соединения. Подробнее можно узнать в этой статье).

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

Скрипт содержимого

If you want to make any change to the web page itself, then you need to use a content script. The content script has access to the DOM of the web page, but access to variables and functions is confined to only itself. For example, content scripts cannot access variables defined in the web page, or even in other content scripts.

The content script does not have direct access to the variables and functions in the background scripts too. The same applies for access to API functions. However, you can use message passing to communicate between various parts of the extensions, be it background scripts or popups. So, you could call your functions in the background script and then communicate to the content script to do a certain task involving the host page’s DOM.

Страница всплывающего окна

Многие расширения имеют всплывающее окно, появляющееся при нажатии на кнопку расширения. Данное всплывающее окно является HTML-страницей и должно быть указано в манифесте. Прочтите , чтобы узнать больше.

Страница настроек

Расширение может иметь страницу настроек. Если страница настроек определена в манифесте, ссылка на неё будет доступна на странице управления расширениями. Определить страницу настроек в манифесте можно следующим образом:

"options_page" : "options_page.html"

Для хранения пользовательских настроек можно использовать локальное хранилище.

Иконки и другие ресурсы

Обычно расширению требуется иконка. Иконка 128x128 используется для страницы расширений и во время установки, 48x48 - для страницы управления расширениями, 16x16 - как favicon для страницы расширения, а 19x19 - для панели расширений. Помимо иконок можно хранить изображения, шрифты и пр. Всё это может быть расположено внутри расширения в произвольном месте.

Структура файлов и каталогов

На данном рисунке представлена структура файлов типичного расширения.

Разрешения и привилегии Необходимость разрешений

В манифесте перечислены API браузера, доступ к которым разрешён для расширения.

Разделение привилегий

Скрипт содержимого и другие составляющие расширения имеют разные роли и привилегии. Например, только скрипт содержимого может модифицировать веб-страницу, но он не имеет прав для изменения пользовательского интерфейса. Обратная ситуация наблюдается с фоновым скриптом и всплывающим окном.

Скрипты содержимого работают в изолированном режиме

Скрипт содержимого имеет доступ к веб-странице (DOM), но не имеет доступа к переменным и функциям, который имеет страница. Также скрипт содержимого не имеет доступа к переменным и функциям фонового скрипта, а фоновый скрипт - к переменным и функциям скрипта содержимого (хотя они могут общаться посредством сообщений). Это значит, что скрипт содержимого не имеет доступа к API расширения - доступ к ним есть только у фонового скрипта и страницы событий. Каждый скрипт содержимого изолирован от других.

Политика безопасности содержимого

Политика безопасности содержимого определена в манифесте, например, таким образом:

Запрет функций eval и иже с ними

Такие функции как eval и прочие (перечислено ниже) отключены, так как они могут быть использованы в XSS-атаках. Проще говоря, не используйте следующие функции:

  • eval()
  • setTimeout()
  • setInterval()
  • new Function(String)

Внедрённый JavaScript не будет работать

Внедрённый код на JavaScript также может быть использован в XSS-атаках, поэтому он тоже отключён. Это значит, что запрещены обработчики событий (например