]> source.dussan.org Git - vaadin-framework.git/commitdiff
Added loop and preload attributes for media elements, fixed null poster (#9161)
authorKrassimir Valev <krassimir_valev@yahoo.com>
Tue, 8 Aug 2017 12:21:15 +0000 (14:21 +0200)
committerHenri Sara <henri.sara@gmail.com>
Tue, 8 Aug 2017 12:21:15 +0000 (15:21 +0300)
Fixes #7261
Fixes #5178
Fixes #4409

client/src/main/java/com/vaadin/client/ui/MediaBaseConnector.java
client/src/main/java/com/vaadin/client/ui/VMediaBase.java
client/src/main/java/com/vaadin/client/ui/video/VideoConnector.java
server/src/main/java/com/vaadin/ui/AbstractMedia.java
shared/src/main/java/com/vaadin/shared/ui/AbstractMediaState.java
shared/src/main/java/com/vaadin/shared/ui/PreloadMode.java [new file with mode: 0644]
uitest/src/main/java/com/vaadin/tests/components/media/Media.java

index c2300de671b2eb83db202346d75984366eb749e6..17918ca3c3197511b0686e42bd9744bc295aa364 100644 (file)
@@ -20,6 +20,7 @@ import com.vaadin.client.communication.StateChangeEvent;
 import com.vaadin.shared.communication.URLReference;
 import com.vaadin.shared.ui.AbstractMediaState;
 import com.vaadin.shared.ui.MediaControl;
+import com.vaadin.shared.ui.PreloadMode;
 
 public abstract class MediaBaseConnector extends AbstractComponentConnector {
 
@@ -53,6 +54,8 @@ public abstract class MediaBaseConnector extends AbstractComponentConnector {
         final AbstractMediaState state = getState();
 
         setAltText(state.altText); // must do before loading sources
+        setPreload(state.preload);
+        widget.setLoop(state.loop);
         widget.setAutoplay(state.autoplay);
         widget.setMuted(state.muted);
         widget.setControls(state.showControls);
@@ -83,6 +86,12 @@ public abstract class MediaBaseConnector extends AbstractComponentConnector {
         getWidget().setAltText(altText);
     }
 
+    private void setPreload(final PreloadMode preload) {
+        if (preload != null) {
+            getWidget().setPreload(preload.getValue());
+        }
+    }
+
     /**
      * @return the default HTML to show users with browsers that do not support
      *         HTML5 media markup.
index 8a6cd1af29410e9f8482f25bbd67c6f072b8db97..8760971fc842f06cdb21a92e69dcc0d5ab9f49ec 100644 (file)
@@ -68,6 +68,31 @@ public abstract class VMediaBase extends Widget {
         media.setMuted(mediaMuted);
     }
 
+    /**
+     * Sets the preload attribute that is intended to provide a hint to the
+     * browser how the media should be preloaded. See
+     * AbstractMedia.setPreload(PreloadMode) and PreloadMode for more
+     * information.
+     *
+     * @param preload
+     *            preload mode
+     * @since 7.7.11
+     */
+    public void setPreload(final String preload) {
+        media.setPreload(preload);
+    }
+
+    /**
+     * Enables or disables looping.
+     *
+     * @param loop
+     *            if true, enable looping
+     * @since 7.7.11
+     */
+    public void setLoop(final boolean loop) {
+        media.setLoop(loop);
+    }
+
     public void removeAllSources() {
         NodeList<com.google.gwt.dom.client.Element> l = media
                 .getElementsByTagName(SourceElement.TAG);
index ee9fba950f625c3ab07f3ac57e4f6e42e62e3b7f..8f708f201bea9e9db265c13c1f0a5878b96ac1dd 100644 (file)
@@ -34,7 +34,11 @@ public class VideoConnector extends MediaBaseConnector {
     @Override
     public void onStateChanged(StateChangeEvent stateChangeEvent) {
         super.onStateChanged(stateChangeEvent);
-        getWidget().setPoster(getResourceUrl(VideoConstants.POSTER_RESOURCE));
+
+        String resourceUrl = getResourceUrl(VideoConstants.POSTER_RESOURCE);
+        if (resourceUrl != null) {
+            getWidget().setPoster(resourceUrl);
+        }
     }
 
     @Override
index a2f2c74d260fd674994f87908173f03c1fe42554..3bafa07dcbd955256ebfa6bc7088e20b29b74478 100644 (file)
@@ -39,6 +39,7 @@ import com.vaadin.server.VaadinSession;
 import com.vaadin.shared.communication.URLReference;
 import com.vaadin.shared.ui.AbstractMediaState;
 import com.vaadin.shared.ui.MediaControl;
+import com.vaadin.shared.ui.PreloadMode;
 import com.vaadin.ui.declarative.DesignAttributeHandler;
 import com.vaadin.ui.declarative.DesignContext;
 
@@ -198,6 +199,48 @@ public abstract class AbstractMedia extends AbstractComponent {
         return getState(false).altText;
     }
 
+    /**
+     * Sets the preload attribute that is intended to provide a hint to the
+     * browser how the media should be preloaded. Valid values are 'none',
+     * 'metadata', 'preload', see the <a href=
+     * "https://developer.mozilla.org/en/docs/Web/HTML/Element/video#attr-preload">
+     * Mozilla Developer Network</a> for details.
+     *
+     * @param preload
+     *            preload mode
+     * @since 7.7.11
+     */
+    public void setPreload(final PreloadMode preload) {
+        getState().preload = preload;
+    }
+
+    /**
+     * @return the configured media preload value
+     * @since 7.7.11
+     */
+    public PreloadMode getPreload() {
+        return getState(false).preload;
+    }
+
+    /**
+     * Enables or disables looping.
+     *
+     * @param loop
+     *            if true, enable looping
+     * @since 7.7.11
+     */
+    public void setLoop(final boolean loop) {
+        getState().loop = loop;
+    }
+
+    /**
+     * @return true if looping is enabled
+     * @since 7.7.11
+     */
+    public boolean isLoop() {
+        return getState(false).loop;
+    }
+
     /**
      * Set whether the alternative text ({@link #setAltText(String)}) is
      * rendered as HTML or not.
index 17a7cff1f1a85169fb1a2e3a6d6ca5519259ba52..359d181824d2b239d645cd6b9fa3d741836f2d7b 100644 (file)
@@ -36,6 +36,22 @@ public class AbstractMediaState extends AbstractComponentState {
     @NoLayout
     public boolean muted;
 
+    /**
+     * Preload mode for the media.
+     *
+     * @since 7.7.11
+     */
+    @NoLayout
+    public PreloadMode preload;
+
+    /**
+     * Looping of media active (true) or not.
+     *
+     * @since 7.7.11
+     */
+    @NoLayout
+    public boolean loop;
+
     public List<URLReference> sources = new ArrayList<URLReference>();
 
     public List<String> sourceTypes = new ArrayList<String>();
diff --git a/shared/src/main/java/com/vaadin/shared/ui/PreloadMode.java b/shared/src/main/java/com/vaadin/shared/ui/PreloadMode.java
new file mode 100644 (file)
index 0000000..7e2a231
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * 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.vaadin.shared.ui;
+
+/**
+ * Enumeration that provides a hint to the browser how media should be
+ * preloaded.
+ *
+ * @since 7.7.11
+ */
+public enum PreloadMode {
+    /**
+     * Indicates that the whole video/audio file could be downloaded, even if
+     * the user is not expected to use it. This is the default value.
+     */
+    AUTO,
+
+    /**
+     * Indicates that only media metadata (e.g. length) should be preloaded.
+     */
+    METADATA,
+
+    /**
+     * Indicates that the video/audio should not be preloaded.
+     */
+    NONE;
+
+    /**
+     * Returns the preload mode string used by the browser.
+     * 
+     * @return corresponding preload attribute value string
+     */
+    public String getValue() {
+        return name().toLowerCase();
+    }
+}
index ec4f7abd47c9686d65ed9e2a9b916f6543029d94..6fa5ac4ed6631337bd7156001db2d959aeea26a2 100644 (file)
 
 package com.vaadin.tests.components.media;
 
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
 import com.vaadin.server.ExternalResource;
+import com.vaadin.shared.ui.PreloadMode;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.ui.Audio;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.Video;
 
 public class Media extends TestBase {
@@ -31,11 +35,9 @@ public class Media extends TestBase {
         final Video v = new Video("video");
         v.setSources(
                 new ExternalResource(
-                        "http://jonatan.virtuallypreinstalled.com/media/big_buck_bunny.mp4"),
-                new ExternalResource(
-                        "http://jonatan.virtuallypreinstalled.com/media/big_buck_bunny.ogv"));
-        v.setWidth("640px");
-        v.setHeight("360px");
+                        "http://techslides.com/demos/sample-videos/small.ogv"));
+        v.setWidth("560px");
+        v.setHeight("320px");
         addComponent(v);
         addComponent(new Button("Play video", new ClickListener() {
 
@@ -53,13 +55,20 @@ public class Media extends TestBase {
             }
 
         }));
+        final CheckBox loop = new CheckBox("Loop");
+        loop.addValueChangeListener(new ValueChangeListener() {
+            @Override
+            public void valueChange(ValueChangeEvent event) {
+                v.setLoop(loop.booleanValue());
+            }
+        });
+        addComponent(loop);
+        v.setPreload(PreloadMode.METADATA);
 
         final Audio a = new Audio("audio");
         a.setSources(
                 new ExternalResource(
-                        "http://jonatan.virtuallypreinstalled.com/media/audio.mp3"),
-                new ExternalResource(
-                        "http://jonatan.virtuallypreinstalled.com/media/audio.ogg"));
+                        "http://www.sample-videos.com/audio/mp3/crowd-cheering.mp3"));
         addComponent(a);
 
         addComponent(new Button("Play audio", new ClickListener() {
@@ -83,7 +92,7 @@ public class Media extends TestBase {
     @Override
     protected String getDescription() {
         return "Video and audio files should play using the HTML5 elements. "
-                + "(Movie is (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org)";
+                + "(Movie is from http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5)";
     }
 
     @Override