Страницы: 1
(Внимание, это черновая версия инструкции!)
Хотя другой и не предвидится...
E4X в ближайшее время будет сначала отключен по умолчанию, а затем удален:
Warning: E4X is deprecated. It will be disabled by default for content in Firefox 16, disabled by default for chrome in Firefox 17, and removed in Firefox 18.
На данный момент в Nightly (Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/18.0 Firefox/18.0) E4X уже отключен для страниц:
javascript.options.xml.chrome = true
javascript.options.xml.content = false
Для проверки работоспособности кнопок надо установить Nightly и выставить обе настройки в false.
Обсуждение и подробности:
на этом форуме
на custombuttons.sf.net
Что перестанет работать:
1. Конструкции вида
var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ... </menupopup>;
var menu = cbu.makeXML( <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ... </menupopup> );
Характерный признак – наличие в коде вызовов cbu.makeXML() или custombuttonsUtils.makeXML(). Или реализация аналога:
var elt = new DOMParser().parseFromString(xml.toXMLString(), "application/xml").documentElement;
То есть в коде таких кнопок обязательно есть makeXML() или toXMLString().
2. Конструкции вида
Характерный признак – наличие в коде "<![CDATA[" не внутри "строки" или 'строки'.
3. Нельзя будет работать с глобальным объектом XML – он будет удален.
Перестанут работать записи вида
Характерный признак – наличие "XML.". Впрочем, с XML потом обычно надо что-то сделать, так что все равно будет еще и toXMLString().
4. Нельзя будет работать с xml-объектами.
Выглядит это так:
var xml = <menu />; xml.@attr = "..."; // Установить атрибут var val = xml.@attr; // Получить атрибут
Характерный признак – наличие ".@" (см. пример выше).
Исправление
Внимание, в данный момент в Custom Buttons нет API для преобразования строк в XUL-узлы, когда он будет добавлен, лучше использовать его.
Для примера приведен наиболее простой и короткий вариант, возможно, он не будет работать в некоторых сложных случаях.
1. Было:
var xul = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ... </menupopup>; var menu = cbu.makeXML(xul);
var menu = cbu.makeXML( <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ... </menupopup> );
Стало:
var xul = '<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">\n\ ...\n\ </menupopup>'; var menu = parseXULFromString(xul);
var menu = parseXULFromString('\ <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">\n\ ...\n\ </menupopup>' );
Плюс надо добавить функцию:
function parseXULFromString(xul) { xul = xul.replace(/>\s+</g, "><"); return new DOMParser().parseFromString(xul, "application/xml").documentElement; }
То есть нужно привести код к строкам вида
или
Таким образом, нужно экранировать каждый перевод строки внутри ' ... ' или " ... ".
\n\ нужно для получения настоящего перевода строки. Это удобнее – при ошибках в коде в консоли ошибок будет указан нормальный номер строки.
При этом внутри строк при конвертировании из XML формата надо экранировать специальные символы:
\ -> \\
' -> \'
(и " -> \", если для создания строки используются двойные кавычки)
Далее E4X позволяет использовать выражения (в фигурных скобках):
С ними немного сложнее. В общем случае нужно еще преобразовывать специальные XML/HTML-символы.
Было:
Без преобразования:
var xul = '<menupopup xmlns="' + xulns + '">\n\ <menuitem label="' + getLabel() + '" />\n\ </menupopup>';
С преобразованием:
var xul = '<menupopup xmlns="' + encodeHTML(xulns) + '">\n\ <menuitem label="' + encodeHTML(getLabel()) + '" />\n\ </menupopup>'; function encodeHTML(s) { return String(s) .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """); }
И нужно иметь в виду, что при работе со строками будет другой приоритет выполнения операций:
Было:
Стало:
или
Для надежности лучше всегда конвертировать специальные символы.
Переводы строк в многострочных выражениях экранировать не надо.
2. Аналогично с CDATA, только тут не нужно парсить строку в DOM-дерево:
Было:
Стало:
3. Использование объекта XML надо просто удалить.
В основном, он нужен для удаления пробелов между тэгами и разрешения использования инструкций вида <? ... ?> вроде такой:
В строках это не требуется, а пробелы должна будет удалять функция-парсер.
4. С атрибутами немного сложнее – нужно сначала откорректировать код, чтобы перед установкой/чтением атрибутов было конвертирование строки в DOM-узлы (в данном случае – вызов parseXULFromString()).
Было:
Стало:
var str = "<menu />"; // То есть str – сконвертированное в строку старое объявление node. var node = parseXULFromString(str); node.setAttribute("attr", val); ... // Больше не требуется: //var domNode = cbu.makeXML(node);
Было:
Стало:
var str = "<menu />"; var node = parseXULFromString(str); var val = node.getAttribute("attr"); ... // Больше не требуется: //var domNode = cbu.makeXML(node);
И, разумеется, в код должна быть добавлена функция parseXULFromString().
Автоматическое конвертирование:
Convert E4X
Установить | код для секции «код» кнопки
Надо нажать на кнопку, а затем кликнуть по другой кнопке или по открытому во вкладке *.js файлу.
Работа полученных после конвертирования кодов не гарантируется.
Отредактировано Infocatcher (27-06-2013 13:50:26)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Ну все, в Nightly 20.0a1 (2012-12-12) javascript.options.xml.chrome по умолчанию false.
https://bugzilla.mozilla.org/show_bug.cgi?id=788290
Отредактировано Infocatcher (13-12-2012 12:40:19)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Отсутствует
даже твой Attributes Inspector.
А в жестах FireGestures он работает.
Добавлено 13-12-2012 17:06:38
Во всех кнопках весь код в одну строку
У меня такого не наблюдается, всё как обычно.
Отредактировано voqabuhe (13-12-2012 17:06:38)
Отсутствует
даже твой Attributes Inspector
Тестовая версия должна работать. У меня так быстро не получается релизы выпускать, как у некоторых.
Во всех кнопках весь код в одну строку
В установленных ранее у меня с Custom Buttons 0.0.5.6pre3 все нормально.
Или надо новую добавить? Там еще один баг есть с открытием custombutton:// ссылок. Он только тут пока исправлен.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Я установил чистый(без старого профиля) Nightly20.0а1 и custombuttons-0.0.5.6pre3-20111120 и последний Attributes Inspector. Inspector работает и другие кнопки тоже, но не все. И в кнопках также весь код в одну строку. Как теперь их исправлять. Караул!!!!
Добавлено 13-12-2012 17:55:16
Отредактировано bunda1 (13-12-2012 17:55:16)
Отсутствует
И в кнопках также весь код в одну строку.
А, увидел.
custombuttons-0.0.5.6pre3-20111120.xpi\components\CustomButtonsService.js
saveOverlayToProfile: function () { var serializer = Components. classes ["@mozilla.org/xmlextras/xmlserializer;1"]. createInstance (Components. interfaces. nsIDOMSerializer); var data = serializer. serializeToString (this. overlayDocument); //beautifull output try { var oldPrettyPrinting = XML. prettyPrinting; XML. prettyPrinting = true; data = (new XML (data)). toXMLString (); XML. prettyPrinting = oldPrettyPrinting; } catch (e) {}
А вот объекта XML больше нет.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Кривая распорка:
--- a/components/CustomButtonsService.js +++ b/components/CustomButtonsService.js @@ -362,11 +362,19 @@ var oldPrettyPrinting = XML. prettyPrinting; XML. prettyPrinting = true; data = (new XML (data)). toXMLString (); XML. prettyPrinting = oldPrettyPrinting; } - catch (e) {} + catch (e) { + data = data + .replace(/ xmlns=""/g, "") + .replace(/="[^"]+"/g, function(s) { + return s.replace(/[\x00-\x19]/g, function(chr) { + return "&#x" + chr.charCodeAt(0).toString(16).toUpperCase() + ";"; + }); + }); + } var uniConv = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); uniConv. charset = "utf-8"; data = uniConv. ConvertFromUnicode (data);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Кривая распорка:
Timestamp: 13.12.2012 21:33:59 Error: catch after unconditional catch Source File: ...... extensions/custombuttons@xsms.org/components/CustomButtonsService.js Line: 368, Column: 6 Source Code: catch (e) {
Отредактировано bunda1 (13-12-2012 23:33:21)
Отсутствует
bunda1
saveOverlayToProfile: function () { var serializer = Components. classes ["@mozilla.org/xmlextras/xmlserializer;1"]. createInstance (Components. interfaces. nsIDOMSerializer); var data = serializer. serializeToString (this. overlayDocument); //beautifull output try { var oldPrettyPrinting = XML. prettyPrinting; XML. prettyPrinting = true; data = (new XML (data)). toXMLString (); XML. prettyPrinting = oldPrettyPrinting; } catch (e) { data = data .replace(/ xmlns=""/g, "") .replace(/="[^"]+"/g, function(s) { return s.replace(/[\x00-\x19]/g, function(chr) { return "&#x" + chr.charCodeAt(0).toString(16).toUpperCase() + ";"; }); }); } var uniConv = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); ...
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Отсутствует
bunda1
Уже сломанное не починется.
А вот нормальные кнопки у меня, вроде бы, после сохранения не ломаются после патча.
Добавлено 13-12-2012 23:59:35
вот это
Это от xmlns="" у кнопки в %профиль%\custombuttons\buttonsoverlay.xul, что-то там отваливается – стили, наверное.
Отредактировано Infocatcher (13-12-2012 23:59:52)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Там еще один баг есть с открытием custombutton:// ссылок. Он только тут пока исправлен.
Речь идет об ошибке
Security Error: Content at http://example.com/ may not load data from custombutton://...
при клике по custombutton:// ссылке.
Я там не совсем на ту строку сослался.
--- a/components/CustomButtonProtocol.js +++ b/components/CustomButtonProtocol.js @@ -43,14 +43,15 @@ function CustombuttonProtocol (sProtocolName) { - this. scheme = sProtocolName; - this. protocolFlags = 1 | 2 | 64 | - 1024; - if (sProtocolName == "custombutton") - this. protocolFlags |= 2048; - if (sProtocolName == "custombuttons") - this. protocolFlags |= 4096; - return this; + // Updated from http://custombuttons.hg.sourceforge.net/hgweb/custombuttons/custombuttons/file/44f7f813da89/components/CustomButtonProtocol.js#l44 + this. scheme = sProtocolName; + this. protocolFlags = Components. interfaces. nsIProtocolHandler. URI_NORELATIVE | Components. interfaces. nsIProtocolHandler. URI_NOAUTH | Components. interfaces. nsIProtocolHandler. URI_LOADABLE_BY_ANYONE | + Components. interfaces. nsIProtocolHandler. URI_NON_PERSISTABLE; + if (sProtocolName == "custombutton") + this. protocolFlags |= Components. interfaces. nsIProtocolHandler. URI_DOES_NOT_RETURN_DATA; + if (sProtocolName == "custombuttons") + this. protocolFlags |= Components. interfaces. nsIProtocolHandler. URI_IS_LOCAL_RESOURCE; + return this; } CustombuttonProtocol. prototype = {
Фокус в том, что то ли дока врет, то ли кто-то там так наоптимизировал.
Дока:
URI_LOADABLE_BY_SUBSUMERS 1<<14
URI_NON_PERSISTABLE 1<<10
На самом деле:
JSON.stringify(Components.interfaces.nsIProtocolHandler, null, " ");
"URI_LOADABLE_BY_SUBSUMERS": 1024,
"URI_NON_PERSISTABLE": 16384,
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
А им вообще кто-то занимается? А то всякие беты годичной давности как-то не радуют.
С учетом открытого исходного кода заниматься может кто угодно. Только что-то желающих не видать.
http://custombuttons.hg.sourceforge.net … ombuttons/
changes
6 weeks ago
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Как правильно собрать из исходников.Нет ... один долгий и муторный способ я знаю (copy&paste по содержимому file)
Отсутствует
lokiju
Там убого очень, без клиента для Mercurial и правда только по одному файлу.
Вот из последней обновленной ветки «bug24045» (rev. 1028) + кривая распорка + синхронизация локалей:
custombuttons-0.0.5.6pre3-20121031-e4xsave+locales.xpi
И еще надо знать, какой версией xpidl.exe надо собирать *.idl. Видимо, под Gecko 1.8. Но если не менять параметры функций в соответствующих компонентах, то это не нужно.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Исправление сломанных кнопок после сохранения в Nightly с javascript.options.xml.chrome = false: cb_repair_broken_overlay.js
Использование:
выставить devtools.chrome.enabled = true и запустить из Инструменты - Веб-разработка - Простой редактор JavaScript (Scratchpad), предварительно выбрав Окружение – Браузер
или удалить все комментарии и запустить из консоли ошибок.
Использовать на свой страх и риск.
Предварительно сделать резервную копию всей папки %профиль%/custombuttons/.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
А вот объекта XML больше нет.
toXMLString () хоть в каком-нибудь виде сохранили бы
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Довольно безболезненно обновился до 20-й авроры, отвалились кнопки User-agent change, Save и Simple Session Manager, первые две исправил с помощью кнопки Infocatcher'а, третью другим способом, но там и причина другая была
Отредактировано Kamui (13-01-2013 01:31:03)
Отсутствует
Страницы: 1