blob: cb76d68a214f398d8575268cef1b337a4bc98678 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.user.client.impl;
import com.google.gwt.dom.client.Element;
/**
* Mozilla implementation of StandardBrowser.
*/
class DOMImplMozilla extends DOMImplStandard {
static {
addMozillaCaptureEventDispatchers();
}
private static native void addMozillaCaptureEventDispatchers() /*-{
@com.google.gwt.user.client.impl.DOMImplStandard::captureEventDispatchers['DOMMouseScroll'] =
@com.google.gwt.user.client.impl.DOMImplStandard::dispatchCapturedMouseEvent(*);
}-*/;
@Override
public void sinkEvents(Element elem, int bits) {
super.sinkEvents(elem, bits);
sinkEventsMozilla(elem, bits);
}
public native void sinkEventsMozilla(Element elem, int bits) /*-{
if (bits & 0x20000) {
elem.addEventListener('DOMMouseScroll', @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false);
}
}-*/;
@Override
protected void initEventSystem() {
super.initEventSystem();
initSyntheticMouseUpEvents();
}
private native void initSyntheticMouseUpEvents() /*-{
$wnd.addEventListener(
'mouseout',
$entry(function(evt) {
var cap = @com.google.gwt.user.client.impl.DOMImplStandard::captureElem;
if (cap && !evt.relatedTarget) {
// Mozilla has the interesting habit of sending a mouseout event
// with an 'html' element as the target when the mouse is released
// outside of the browser window.
if ('html' == evt.target.tagName.toLowerCase()) {
// When this occurs, we synthesize a mouseup event, which is
// useful for all sorts of dragging code (like in DialogBox).
var muEvent = $doc.createEvent('MouseEvents');
muEvent.initMouseEvent('mouseup', true, true, $wnd, 0,
evt.screenX, evt.screenY, evt.clientX, evt.clientY, evt.ctrlKey,
evt.altKey, evt.shiftKey, evt.metaKey, evt.button, null);
cap.dispatchEvent(muEvent);
}
}
}),
true
);
}-*/;
}