Уважаемые форумчане !

Не знаю что и делать, надеюсь на вашу помощь. История такая: я, если кто не знает, занимаюсь разработкой оригинальной ветки расширения Custom Buttons. До версии 0.0.2.7 проблем особых не было. Но в 0.0.2.7 я решил реализовать несколько дополнительных нововведений, в числе которых поддержка API CB2 и расширенное контекстное меню. В той версии был баг с неработоспособностью "горячих" клавиш, я это заметил и выпустил 0.0.2.8. Но, кроме прочего там ещё были проблемы с контекстным меню, которые я не сразу заметил - мне просто не попадались кнопки, которые подменяют атрибут "context".

Сейчас я выложил 0.0.2.9 на AMO - ожидает рецензирования. Эта версия учитывает, что некоторые кнопки могут подменять атрибут context. Но, возникла такая проблема: заявился ко мне на форум на mozdev товарищ кнопкописатель, потестировал новую версию со своими кнопками и опять обнаружил "проблему" с контекстным меню. Тут-то я понял, почему жаловались пользователи на 0.0.2.7/0.0.2.8, и понимаю, они будут жаловаться и на 0.0.2.9.

Но. Дело всё в том, что его кнопки "бажные". Вкратце: они копируют контекстное меню расширения один-в-один, не заменяя даже идентификаторов, после чего контекстное меню ломается. В 0.0.2.6 и младших версиях этой проблемы не было видно, потому что расширения этих версий не работают с контекстным меню.

Что мне теперь делать ? Делать даунгрейд из-за того что есть какие-то старые, криво написанные, не учитывающие возможное влияние на чужой код кнопки ? Но, возможно, этими кнопками пользуется много людей.

Прошу помощи в этом вопросе.

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

Благодарю за внимание, надеюсь на помощь.

В 0.0.2.6 и младших версиях этой проблемы не было видно, потому что расширения этих версий не работают с контекстным меню.

Т.е. document.getElementById("custombuttons-contextpopup") возвращает не тот popup – я правильно понял?
Бредовая идея: сделать что-нибудь с .cloneNode(true);
Начиная от грубого

Выделить код

Код:

Object.prototype._cloneNode = Object.prototype.cloneNode; // Object ли?
Object.prototype.cloneNode = function(param) {
  if(this.id == "custombuttons-contextpopup") { ... }
  else { this._cloneNode(param); }
}

и заканчивая

#custombuttons-contextpopup { -moz-binding: url( что-то там ); }
и
кодом, похожим на предыдущий.

А вообще лучше надо написать FAQ для кнопкоделателей на тему. :)

P.S. Кстати, а что будет, если до загрузки кнопок сохранить в какую-нибудь переменную document.getElementById("custombuttons-contextpopup") и работать потом уже с ней?

ну по-моему выход логичный: пуст переписывают свои глючные кнопки или работают со старыми версиями расширения.

Anton

А с английским я тебе помогу. Какая помощь тебе нужна?

Infocatcher

Т.е. document.getElementById("custombuttons-contextpopup") возвращает не тот popup – я правильно понял?

id'ы тут не причём, xml-всё таки. Это я не разобрался.
Однако, код этих кнопок основан на двух предположениях: 1) контекстное меню расширения всегда находится в актуальном состоянии и 2) контекстное меню расширения не содержит тега <menu>. Эти кнопки строят своё меню, в конце которого помещают <menu> с <menupopup>, на последний "вешают" обработчик onpopupshowing, который удаляет содержимое <menupopup>, а затем наполняет его клонами элементов меню расширения. Некоторые из пунктов меню расширения отображаются только при необходимости (например, если кнопка не имеет справки, то пункт меню "Справка" не отображается). Кроме того, кнопки CB2 помещают свои элементы в общее меню и обработчик расширения отображает нужные в зависимости от того, на какой кнопке контекстное меню "всплывает". Код кнопок эти моменты не учитывает. Это во-первых. Во-вторых, начиная с версии 0.0.2.7 в контекстном меню расширения есть вложенное подменю. Кнопки копируют и его тоже, и, ничего не зная о нём, обрабатывают событие popupshowing также и от него - то есть, меню кнопки уже давно открыто, а обработчик начинает удалять своё содержимое. После этого в приложении перестают работать вообще все popup'ы и не открываются новые окна.

Shutnik

ну по-моему выход логичный: пуст переписывают свои глючные кнопки или работают со старыми версиями расширения.

Был бы я волшебник, сказал "пусть будет так:...". А они считают, что их код не глючный - он ведь когда-то работал и баги не проявлялись. Они - гениусы, а я задумал угробить хороший проект.

TLemur
Я хочу разместить предупреждение на AMO: "Будьте внимательны! Некоторые старые кнопки содержат ошибки, которые не проявлялись в ранних версиях расширения. Если какие-либо из ваших кнопок не работают с новой версией, создайте баг (http://custombuttons.mozdev.org/bugs.html) или обратитесь на форум (http://custombuttons.mozdev.org/drupal/forum), чтобы исправить эти ошибки. Пожалуйста, не забудьте указать код неработающей кнопки или место, где её можно найти."

Боюсь, правда, там только писатели отмечаются.

Anton
Attention! Some old buttons contain bugs that only appear in the new version of extension [тут бы указать >=0.0.2.7]. If some of your buttons don't work with the new version, submit the bug-report on http://custombuttons.mozdev.org/bugs.html or post about it on http://custombuttons.mozdev.org/drupal/forum to make them work. Don't forget to specify the code of non-working button or the place, where it can be found.

PS Исправил Warning на Attention.

Anton пишет

Был бы я волшебник, сказал "пусть будет так:...". А они считают, что их код не глючный - он ведь когда-то работал и баги не проявлялись. Они - гениусы, а я задумал угробить хороший проект.

ну тогда можно сделать режим совместимости со старыми кнопками :D

memini
Спасибо.

Shutnik
Поддержка кнопок с кривой реализацией, я думаю, потребует добавления кода соответствующей кривизны. Тогда расширение превратится в что-то подобное CB2. Согласен, пусть разработчики переделывают свои кнопки, но как их заставить ?

Anton
Новая версия заставит (-%Е

Anton

Согласен, пусть разработчики переделывают свои кнопки, но как их заставить ?

А расширение не может определить наличие глючной кнопки и выдать соответствующее предупреждение пользователю?

А расширение не может определить наличие глючной кнопки и выдать соответствующее предупреждение пользователю?

Простая проверка будет ненадёжной, сложная потребует ресурсов (хотя бы: таскаем правильную реализацию в пакете, если обнаружили - заменяем, но, это неправильно). И, боюсь, пользователям может не понравиться. Хотя, вопрос натолкнул на мысль использовать контроль версий целевого приложения/расширения - надо будет обдумать.

К следующей версии попробую реализовать содержание контекстного меню всегда в актуальном состоянии.

Спасибо за поддержку.