Как я могу передать события в скрытый ‹browser›?

Я работал над простым представлением браузера с помощью 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.)


person ephemient    schedule 22.02.2011    source источник


Ответы (1)


Насколько я помню, вы можете сделать это с помощью атрибута mousethrough="always", но я не уверен что вы можете установить его непосредственно в самом элементе <canvas>, поэтому вам может потребоваться обернуть его в какую-то коробку. В противном случае, поскольку вы используете XULRunner 1.9.2, я считаю, что указатель-события: нет; CSS.

person Neil    schedule 22.02.2011