здраствуйте, моё расширение добавляет пару пунктов в контекстное меню. В обработчике выпадания контекстного меню я  меняю видимость моих пунктов меню в зависимомти от того есть ли выделение. Выделение определяю по gContextMenu.isTextSelected. С задизабливанием всё ок.
Также, по долгу службы расширение меняет innerHTML для body на отображаемой в браузере странице. По прошествии нескольких операций замены innerHTML, у меня начинают неправильно дизаблится пункты меню, а точнее при выделенном тексте gContextMenu.isTextSelected даёт false, причём иногда после какого-то времени снова начинает работать, а иногда не начинает.....
вообщем никакой закономерности я не выявил.
у меня есть подозрение что при замене innerHTML у всего body ФФ не парсит новый код для постоения DOM(может его нужно попросить это сделать??) или может я ему такой HTML даю, что у него планка съезжает?????... :dumb:

есть идеи?

спасибо.

Может, перед изменением innerHTML попробовать удалять выделение:

Выделить код

Код:

window. getSelection (). removeAllRanges ();

?

или проверять наличие выделения через

Выделить код

Код:

window. getBrowser (). contentDocument. defaultView. getSelection () != ""
Anton пишет

Может, перед изменением innerHTML попробовать удалять выделение:

Выделить код

Код:

window. getSelection (). removeAllRanges ();

?

или проверять наличие выделения через

Выделить код

Код:

window. getBrowser (). contentDocument. defaultView. getSelection () != ""

честно говоря я не очень понял идею.. что даёт window. getSelection (). removeAllRanges ();? попробовал, ничего не поменялось :(
нашёл некоторые закономерности, пожалуй распишу поподробнее чего творю, может и сам лучше пойму :)

я пишу расширение-перводчик страниц в браузере (не TransBar :), работает на локальном ядре промта). Страницы я перевожу так: беру

Выделить код

Код:

content.document.body.innerHTML

, передаю его в свою компоненту(XPCOM), оттуда получаю переведённый текст и строкой

Выделить код

Код:

content.document.body.innerHTML = str

запихиваю его обратно. В контекстном меню у меня команда "перевести выделенный фрагмент", которую я хотел показывать или скрывать в зависимости от наличия выделенного текста. Если ничего не переводить(то бишь не менять innerHTML), то gContextMenu.isTextSelected и getSelection() всегда возвращают то что есть на самом деле, если же начать переводить проявляются глюки, вот мои наблюдения:

-) Вариант 1.
перевожу простую (без фреймсетов) страницу, то есть меняю innerHTML только у content.document.body, после чего выделяю текст на этой же странице (с изменённым innerHTML) - gContextMenu.isTextSelected возвращает true. Загружаю исходную страницу, gContextMenu.isTextSelected продолжает работать нормально. Загружаю страницу с фреймсетом, выделяю текст - gContextMenu.isTextSelected даёт false при выделенном тексте, document.commandDispatcher.focusedWindow.getSelection().toString() даёт пустую строку.

-) Вариант 2.
перевожу фреймсетовую страницу(рекурсивно прохожусь по коллекции content.frames и у каждого фрейма заменяю content.frames[i].document.body.innerHTML  на переведённыйй) - gContextMenu.isTextSelected - и getSelection() перестают работать (то есть возвращают false и "" при реально выделенном тексте) на любых страницах.

самый прикол, что я нашёл как это "лечить" :) - достаточно переключится на другое окно (не ФФ) и вернуться обратно, всё сразу начинает работать нормально.

вообщем нифига не понимаю, пойду покурю :)

cesspit пишет

...
честно говоря я не очень понял идею...

После замены innerHTML выделение сохраняется, хотя его и не видно; может, в связи с этим и глючит gContexMenu.isTextSelected.

... что даёт window. getSelection (). removeAllRanges ();? попробовал, ничего не поменялось :(...

Удаляет все области выделения из окна.

А других идей у меня нет.

самый прикол, что я нашёл как это "лечить"  - достаточно переключится на другое окно (не ФФ) и вернуться обратно, всё сразу начинает работать нормально.

А там компонента (или чего-там-ещё) сама не влияет на фокус окна? Я к тому, что в gContextMenu::isTextSelection вызывается gContextMenu::searchSelected, а там есть focusedWindow. М.б. где-то фокус сбивается? Попробуйте посмотреть в эту сторону. Правда, к вечеру уже башня не варит, но как вариант...

ну да, я тоже по browser.js прошёлся и у меня такое же подозрение возникло. В компоненте происходит смена фокуса. При старте перевода я дизаблю окно ФФ (хендл получаю через виндовую GetActiveWindow), создаю на фоне задизабленного ФФ диалог прогресса по закрытии которого раздизабливаю ФФ и устананавливаю фокус на полученный ранее хендл. Сейчас уже не на работе, не проверить, завтра напишу чё вышло.

гы, всё было из-за фокуса :)
заменил GetActiveWindow/SetFocus на Get\SetForegroundWindow и всё вылечилось
только хотел спросить, а focusedWindow - это фрейм HTML-документа в котором фокус ввода? я правильно допёр? :)

p.s. спасибо всем огромное! :)