Making media events bitless, freeing up a few event bits, since modern, implementing browsers don't leak the way old ones did. The following constants, marked as 'experimental', have been removed: - com.google.gwt.user.client.Event.MEDIAEVENTS - com.google.gwt.user.client.Event.ONCANPLAYTHROUGH - com.google.gwt.user.client.Event.ONENDED - com.google.gwt.user.client.Event.ONPROGRESS Review at http://gwt-code-reviews.appspot.com/1447816 Review by: jlabanca@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10274 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/tools/api-checker/config/gwt23_24userApi.conf b/tools/api-checker/config/gwt23_24userApi.conf index bceabcc..4f061ad 100644 --- a/tools/api-checker/config/gwt23_24userApi.conf +++ b/tools/api-checker/config/gwt23_24userApi.conf
@@ -142,3 +142,8 @@ # Overloading AbstractHasData constructor to allow a widget or element as the root. com.google.gwt.user.cellview.client.AbstractHasData::AbstractHasData(Lcom/google/gwt/dom/client/Element;ILcom/google/gwt/view/client/ProvidesKey;) OVERLOADED_METHOD_CALL +# Bitless media events no longer these experimental API constants +com.google.gwt.user.client.Event::MEDIAEVENTS MISSING +com.google.gwt.user.client.Event::ONCANPLAYTHROUGH MISSING +com.google.gwt.user.client.Event::ONENDED MISSING +com.google.gwt.user.client.Event::ONPROGRESS MISSING
diff --git a/user/src/com/google/gwt/media/client/MediaBase.java b/user/src/com/google/gwt/media/client/MediaBase.java index 3bca63a..0de2450 100644 --- a/user/src/com/google/gwt/media/client/MediaBase.java +++ b/user/src/com/google/gwt/media/client/MediaBase.java
@@ -49,17 +49,20 @@ setElement(element); } + @Override public HandlerRegistration addCanPlayThroughHandler( CanPlayThroughHandler handler) { - return addDomHandler(handler, CanPlayThroughEvent.getType()); + return addBitlessDomHandler(handler, CanPlayThroughEvent.getType()); } + @Override public HandlerRegistration addEndedHandler(EndedHandler handler) { - return addDomHandler(handler, EndedEvent.getType()); + return addBitlessDomHandler(handler, EndedEvent.getType()); } + @Override public HandlerRegistration addProgressHandler(ProgressHandler handler) { - return addDomHandler(handler, ProgressEvent.getType()); + return addBitlessDomHandler(handler, ProgressEvent.getType()); } /**
diff --git a/user/src/com/google/gwt/user/client/Event.java b/user/src/com/google/gwt/user/client/Event.java index 317ff7e..f1e646e 100644 --- a/user/src/com/google/gwt/user/client/Event.java +++ b/user/src/com/google/gwt/user/client/Event.java
@@ -399,50 +399,6 @@ public static final int GESTUREEVENTS = ONGESTURESTART | ONGESTURECHANGE | ONGESTUREEND; /** - * Fired when media is fully buffered and can be played through to the end. - * - * <p> - * <span style="color:red">Experimental API: This API is still under development - * and is subject to change. - * </span> - * </p> - */ - public static final int ONCANPLAYTHROUGH = 0x20000000; - - /** - * Fired when media stops playing. - * - * <p> - * <span style="color:red">Experimental API: This API is still under development - * and is subject to change. - * </span> - * </p> - */ - public static final int ONENDED = 0x8000000; - - /** - * Fired when progress is made downloading media. - * - * <p> - * <span style="color:red">Experimental API: This API is still under development - * and is subject to change. - * </span> - * </p> - */ - public static final int ONPROGRESS = 0x10000000; - - /** - * A bit-mask covering all media events. - * - * <p> - * <span style="color:red">Experimental API: This API is still under development - * and is subject to change. - * </span> - * </p> - */ - public static final int MEDIAEVENTS = ONCANPLAYTHROUGH | ONENDED | ONPROGRESS; - - /** * Value returned by accessors when the actual integer value is undefined. In * Development Mode, most accessors assert that the requested attribute is * reliable across all supported browsers.
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImpl.java b/user/src/com/google/gwt/user/client/impl/DOMImpl.java index 9493730..c0bdbf9 100644 --- a/user/src/com/google/gwt/user/client/impl/DOMImpl.java +++ b/user/src/com/google/gwt/user/client/impl/DOMImpl.java
@@ -92,9 +92,6 @@ case "gesturestart": return 0x1000000; case "gesturechange": return 0x2000000; case "gestureend": return 0x4000000; - case "ended": return 0x8000000; - case "progress": return 0x10000000; - case "canplaythrough": return 0x20000000; default: return -1; } }-*/;
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java index d573da6..8c6f7fc 100644 --- a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java +++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
@@ -220,20 +220,39 @@ }-*/; protected native void sinkBitlessEventImpl(Element elem, String eventTypeName) /*-{ - if (eventTypeName == "drag") - elem.ondrag = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; - else if (eventTypeName == "dragend") - elem.ondragend = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; - else if (eventTypeName == "dragenter") - elem.ondragenter = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchDragEvent; - else if (eventTypeName == "dragleave") - elem.ondragleave = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; - else if (eventTypeName == "dragover") - elem.ondragover = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchDragEvent; - else if (eventTypeName == "dragstart") - elem.ondragstart = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; - else if (eventTypeName == "drop") - elem.ondrop = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; + switch(eventTypeName) { + case "drag": + elem.ondrag = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; + break; + case "dragend": + elem.ondragend = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; + break; + case "dragenter": + elem.ondragenter = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchDragEvent; + break; + case "dragleave": + elem.ondragleave = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; + break; + case "dragover": + elem.ondragover = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchDragEvent; + break; + case "dragstart": + elem.ondragstart = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; + break; + case "drop": + elem.ondrop = @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent; + break; + case "canplaythrough": + case "ended": + case "progress": + // First call removeEventListener, so as not to add the same event listener more than once + elem.removeEventListener(eventTypeName, @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false); + elem.addEventListener(eventTypeName, @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false); + break; + default: + // catch missing cases + throw "Trying to sink unknown event type " + eventTypeName; + } }-*/; protected native void sinkEventsImpl(Element elem, int bits) /*-{ @@ -295,17 +314,6 @@ @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent : null; if (chMask & 0x4000000) elem.ongestureend = (bits & 0x4000000) ? @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent : null; - - if (bits & 0x8000000) { - elem.addEventListener('ended', @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false); - } else { - elem.removeEventListener('ended', @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false); - } - if (bits & 0x10000000) { - elem.addEventListener('progress', @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false); - } else { - elem.removeEventListener('progress', @com.google.gwt.user.client.impl.DOMImplStandard::dispatchEvent, false); - } }-*/; private native void releaseCaptureImpl(Element elem) /*-{
diff --git a/user/test/com/google/gwt/user/client/MediaEventsSinkTest.java b/user/test/com/google/gwt/user/client/MediaEventsSinkTest.java index b457d91..44c7927 100644 --- a/user/test/com/google/gwt/user/client/MediaEventsSinkTest.java +++ b/user/test/com/google/gwt/user/client/MediaEventsSinkTest.java
@@ -34,33 +34,92 @@ */ public class MediaEventsSinkTest extends GWTTestCase { + private static class CanPlayThroughHandlerImpl extends HandlerImpl implements + CanPlayThroughHandler { + @Override + public void onCanPlayThrough(CanPlayThroughEvent event) { + eventFired(); + } + } + + private static class EndedHandlerImpl extends HandlerImpl implements EndedHandler { + @Override + public void onEnded(EndedEvent event) { + eventFired(); + } + } + + private static class HandlerImpl { + private boolean fired = false; + + public void eventFired() { + fired = true; + } + + boolean hasEventFired() { + return fired; + } + } + + private static class ProgressHandlerImpl extends HandlerImpl implements ProgressHandler { + @Override + public void onProgress(ProgressEvent event) { + eventFired(); + } + } + + /** + * Interface to create a widget. + * + * @param <W> the widget type + */ + private interface WidgetCreator<W extends Widget & HasAllMediaHandlers> { + /** + * Create a widget to test. + * + * @return the new widget + */ + W createWidget(); + } + @Override public String getModuleName() { return "com.google.gwt.user.User"; } - public void testAudioMediaEventsSinkByAddingHandler() { + public void testAudioEventSink() { + // skip tests on browsers that do not support audio if (!Audio.isSupported()) { return; } - verifyProgressEventSinkOnAddHandler(Audio.createIfSupported()); - verifyEndedEventSinkOnAddHandler(Audio.createIfSupported()); - verifyCanPlayThroughEventSinkOnAddHandler(Audio.createIfSupported()); + + verifyMediaEventSink(new WidgetCreator<Audio>() { + @Override + public Audio createWidget() { + return Audio.createIfSupported(); + } + }); } - public void testVideoMediaEventsSinkByAddingHandler() { - if (!Audio.isSupported()) { + public void testEventBitsUnmapped() throws Exception { + ProgressEvent.getType(); + assertEquals(-1, Event.getTypeInt("progress")); + assertEquals(-1, Event.getTypeInt("ended")); + assertEquals(-1, Event.getTypeInt("canplaythrough")); + } + + public void testVideoEventSink() { + // skip tests on browsers that do not support video + if (!Video.isSupported()) { return; } - verifyProgressEventSinkOnAddHandler(Video.createIfSupported()); - verifyEndedEventSinkOnAddHandler(Video.createIfSupported()); - verifyCanPlayThroughEventSinkOnAddHandler(Video.createIfSupported()); - } - public void testMediaEventBitFieldsNotTriviallyZero() { - assertNotSame(0, Event.ONCANPLAYTHROUGH); - assertNotSame(0, Event.ONPROGRESS); - assertNotSame(0, Event.ONENDED); + verifyMediaEventSink(new WidgetCreator<Video>() { + @Override + public Video createWidget() { + return Video.createIfSupported(); + } + }); } @Override @@ -70,91 +129,41 @@ super.gwtTearDown(); } - private <W extends Widget & HasAllMediaHandlers> void assertNotSunkAfterAttach( - W w, String eventName, boolean isSunk) { - assertFalse("Event should not be sunk on " + w.getClass().getName() - + " until a " + eventName + " handler has been added", isSunk); - } + private <W extends Widget & HasAllMediaHandlers> void verifyCanPlayThroughEventSink(W w) { + CanPlayThroughHandlerImpl handler = new CanPlayThroughHandlerImpl(); + w.addCanPlayThroughHandler(handler); - private <W extends Widget & HasAllMediaHandlers> void assertSunkAfterAddHandler( - W w, String eventName, boolean isSunk) { - assertTrue("Event should have been sunk on " + w.getClass().getName() - + " once the widget has been attached and a " + eventName - + " handler has been added", isSunk); - } - - private boolean isCanPlayThroughEventSunk(Element e) { - return (DOM.getEventsSunk(e) & Event.ONCANPLAYTHROUGH) != 0; - } - - private boolean isEndedEventSunk(Element e) { - return (DOM.getEventsSunk(e) & Event.ONENDED) != 0; - } - - private boolean isProgressEventSunk(Element e) { - return (DOM.getEventsSunk(e) & Event.ONPROGRESS) != 0; - } - - private <W extends Widget & HasAllMediaHandlers> void verifyCanPlayThroughEventSinkOnAddHandler( - W w) { - verifyCanPlayThroughEventSinkOnAddHandler(w, w.getElement()); - } - - private <W extends Widget & HasAllMediaHandlers> void verifyCanPlayThroughEventSinkOnAddHandler( - W w, Element e) { - RootPanel.get().add(w); - - assertNotSunkAfterAttach(w, CanPlayThroughEvent.getType().getName(), - isCanPlayThroughEventSunk(e)); - - w.addCanPlayThroughHandler(new CanPlayThroughHandler() { - public void onCanPlayThrough(CanPlayThroughEvent event) { - } + assertFalse(handler.hasEventFired()); + w.fireEvent(new CanPlayThroughEvent() { }); - - assertSunkAfterAddHandler(w, CanPlayThroughEvent.getType().getName(), - isCanPlayThroughEventSunk(e)); + assertTrue(handler.hasEventFired()); } - private <W extends Widget & HasAllMediaHandlers> void verifyEndedEventSinkOnAddHandler( - W w) { - verifyEndedEventSinkOnAddHandler(w, w.getElement()); - } + private <W extends Widget & HasAllMediaHandlers> void verifyEndedEventSink(W w) { + EndedHandlerImpl handler = new EndedHandlerImpl(); + w.addEndedHandler(handler); - private <W extends Widget & HasAllMediaHandlers> void verifyEndedEventSinkOnAddHandler( - W w, Element e) { - RootPanel.get().add(w); - - assertNotSunkAfterAttach(w, EndedEvent.getType().getName(), - isEndedEventSunk(e)); - - w.addEndedHandler(new EndedHandler() { - public void onEnded(EndedEvent event) { - } + assertFalse(handler.hasEventFired()); + w.fireEvent(new EndedEvent() { }); - - assertSunkAfterAddHandler(w, EndedEvent.getType().getName(), - isEndedEventSunk(e)); + assertTrue(handler.hasEventFired()); } - private <W extends Widget & HasAllMediaHandlers> void verifyProgressEventSinkOnAddHandler( - W w) { - verifyProgressEventSinkOnAddHandler(w, w.getElement()); + private void verifyMediaEventSink(WidgetCreator<?>... creators) { + for (WidgetCreator<?> creator : creators) { + verifyProgressEventSink(creator.createWidget()); + verifyCanPlayThroughEventSink(creator.createWidget()); + verifyEndedEventSink(creator.createWidget()); + } } - private <W extends Widget & HasAllMediaHandlers> void verifyProgressEventSinkOnAddHandler( - W w, Element e) { - RootPanel.get().add(w); + private <W extends Widget & HasAllMediaHandlers> void verifyProgressEventSink(W w) { + ProgressHandlerImpl handler = new ProgressHandlerImpl(); + w.addProgressHandler(handler); - assertNotSunkAfterAttach(w, ProgressEvent.getType().getName(), - isProgressEventSunk(e)); - - w.addProgressHandler(new ProgressHandler() { - public void onProgress(ProgressEvent event) { - } + assertFalse(handler.hasEventFired()); + w.fireEvent(new ProgressEvent() { }); - - assertSunkAfterAddHandler(w, ProgressEvent.getType().getName(), - isProgressEventSunk(e)); + assertTrue(handler.hasEventFired()); } } \ No newline at end of file