>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Сustom Buttons http://forum.mozilla-russia.org/viewforum.php?id=34 >Конвертирование старых кнопок с XML (E4X) http://forum.mozilla-russia.org/viewtopic.php?id=56442 |
Infocatcher > 20-09-2012 11:20:57 |
E4X в ближайшее время будет сначала отключен по умолчанию, а затем удален:
На данный момент в Nightly (Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/18.0 Firefox/18.0) E4X уже отключен для страниц: Для проверки работоспособности кнопок надо установить Nightly и выставить обе настройки в false. Обсуждение и подробности: Что перестанет работать: Выделить код Код: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;
2. Конструкции вида
3. Нельзя будет работать с глобальным объектом XML – он будет удален.
4. Нельзя будет работать с xml-объектами. Выделить код Код:var xml = <menu />; xml.@attr = "..."; // Установить атрибут var val = xml.@attr; // Получить атрибут
Исправление Выделить код Код: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; } То есть нужно привести код к строкам вида или
При этом внутри строк при конвертировании из XML формата надо экранировать специальные символы: Далее E4X позволяет использовать выражения (в фигурных скобках):
Выделить код Код: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);
Автоматическое конвертирование: |
Infocatcher > 13-12-2012 11:16:51 |
Ну все, в Nightly 20.0a1 (2012-12-12) javascript.options.xml.chrome по умолчанию false. |
bunda1 > 13-12-2012 16:54:48 |
Мне кажется они еще что то сделали. Также отвалились кнопки в которых проблем про которые ты пишешь нет, даже твой Attributes Inspector. 13-12-2012 16:57:49 |
voqabuhe > 13-12-2012 17:04:26 |
bunda1 пишет
А в жестах FireGestures он работает. 13-12-2012 17:06:38 bunda1 пишет
У меня такого не наблюдается, всё как обычно. |
bunda1 > 13-12-2012 17:24:49 |
Ну сейчас поставлю чистый Nightly и проверю. |
Infocatcher > 13-12-2012 17:30:01 |
bunda1 пишет
Тестовая версия должна работать. У меня так быстро не получается релизы выпускать, как у некоторых. bunda1 пишет
В установленных ранее у меня с Custom Buttons 0.0.5.6pre3 все нормально. |
bunda1 > 13-12-2012 17:46:41 |
Я установил чистый(без старого профиля) Nightly20.0а1 и custombuttons-0.0.5.6pre3-20111120 и последний Attributes Inspector. Inspector работает и другие кнопки тоже, но не все. И в кнопках также весь код в одну строку. Как теперь их исправлять. Караул!!!! 13-12-2012 17:55:16 скрытый текст |
Infocatcher > 13-12-2012 22:26:47 |
bunda1 пишет
А, увидел. 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 больше нет. |
Infocatcher > 13-12-2012 23:19:21 |
Кривая распорка: Выделить код Код:--- 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); |
bunda1 > 13-12-2012 23:31:29 |
Выделить код Код: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) { |
Infocatcher > 13-12-2012 23:35:42 |
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:46:00 |
Извиняюсь, я не тот код поменял. Теперь ошибка пропала. |
Infocatcher > 13-12-2012 23:57:20 |
bunda1 13-12-2012 23:59:35 bunda1 пишет
Это от xmlns="" у кнопки в %профиль%\custombuttons\buttonsoverlay.xul, что-то там отваливается – стили, наверное. |
bunda1 > 14-12-2012 00:10:51 |
Да патч помог, теперь кнопки вроде работают. Спасибо |
voqabuhe > 14-12-2012 01:01:11 |
Infocatcher пишет
А можно немного подробнее, куды его вставить? |
bunda1 > 14-12-2012 01:11:29 |
voqabuhe пишет
в .....\extensions\custombuttons@xsms.org\components\CustomButtonsService.js |
Infocatcher > 14-12-2012 09:53:59 |
Infocatcher пишет
Речь идет об ошибке
при клике по 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 = { Фокус в том, что то ли дока врет, то ли кто-то там так наоптимизировал. |
pohunohi > 16-12-2012 12:35:44 |
Infocatcher пишет
А им вообще кто-то занимается? А то всякие беты годичной давности как-то не радуют. |
Infocatcher > 16-12-2012 20:06:48 |
pohunohi пишет
С учетом открытого исходного кода заниматься может кто угодно. Только что-то желающих не видать.
|
lokiju > 16-12-2012 22:49:36 |
Infocatcher пишет Как правильно собрать из исходников.Нет ... один долгий и муторный способ я знаю (copy&paste по содержимому file) |
Infocatcher > 16-12-2012 23:18:38 |
lokiju Вот из последней обновленной ветки «bug24045» (rev. 1028) + кривая распорка + синхронизация локалей: И еще надо знать, какой версией xpidl.exe надо собирать *.idl. Видимо, под Gecko 1.8. Но если не менять параметры функций в соответствующих компонентах, то это не нужно. |
lokiju > 17-12-2012 00:39:02 |
Infocatcher |
Infocatcher > 20-12-2012 12:34:06 |
Исправление сломанных кнопок после сохранения в Nightly с javascript.options.xml.chrome = false: cb_repair_broken_overlay.js Использовать на свой страх и риск. |
Anton > 23-12-2012 18:06:47 |
Infocatcher пишет
toXMLString () хоть в каком-нибудь виде сохранили бы |
Kamui > 13-01-2013 01:30:46 |
Довольно безболезненно обновился до 20-й авроры, отвалились кнопки User-agent change, Save и Simple Session Manager, первые две исправил с помощью кнопки Infocatcher'а, третью другим способом, но там и причина другая была |