Я работал над простым представлением браузера с помощью XULRunner 1.9.2.
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
<window
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml">
<hbox equalsize="always" flex="2">
<browser flex="1" type="content-primary"/>
<html:canvas flex="1"/>
</hbox>
</window>
Я написал некоторый Javascript, который обрабатывает MozAfterPaint
события из <browser>
, помещает их в <canvas>
с помощью drawWindow
, а затем творит чудеса. Все работает довольно хорошо. (Что ж, полосы прокрутки и курсоры немного шаткие, но я могу их игнорировать.)
Я действительно хочу, чтобы холст был единственным видимым элементом, но прямо сейчас я могу взаимодействовать только с элементом браузера.
В чем я добился частичного успеха:
Захватывайте события на
<canvas>
и повторно вводите их в<browser>
.Я могу использовать
clientX
иclientY
каждого события на холсте, искать соответствующийdocument.elementFromPoint(x, y)
в браузере и соответственноcreateEvent
initEvent
dispatchEvent
.Однако это хорошо работает только для
key(down/press/up)
,click
иmouse(down/move/up)
. Я не понимаю, как разумно синтезироватьmouse(over/out)
события, аDOMMouseScroll
здесь не срабатывает, поэтому я не могу фиксировать события колеса прокрутки.
В чем я не добился успеха:
Укладка холста над браузером.
<stack flex="2"> <browser flex="1" type="content-primary"/> <html:canvas flex="1"/> </stack>
Для этого требуется какой-то способ разрешить событиям проходить через холст и вместо этого в браузер, чего я еще не пробовал, потому что есть более насущная проблема:
Несмотря на то, что холст должен быть расположен над браузером, браузер виден над холстом.
Разместите браузер над холстом, сделав его прозрачным.
<stack flex="2"> <html:canvas flex="1"/> <browser flex="1" type="content-primary" style="opacity: 0;"/> </stack>
По идее, мне вообще не следовало так связываться с событиями. Однако настройка
opacity
, похоже, не приносит никакой пользы, и, опять же, браузер по-прежнему закрывает холст.
Как мне скрыть браузер, но при этом разрешить нормальное взаимодействие с ним?
(Я не против написания собственного кода, и ответы WebKit тоже хороши. Но, насколько я могу судить, ни у Gecko, ни у WebKit нет API-интерфейсов визуализации вне экрана, и нет эквивалентов WebKit для MozAfterPaint
и drawWindow
.)