]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix for audio component starting new playback on each client poll when in Window...
authorSergey Budkin <sergey@vaadin.com>
Wed, 17 Sep 2014 12:00:15 +0000 (15:00 +0300)
committerSauli Tähkäpää <sauli@vaadin.com>
Wed, 24 Sep 2014 18:04:29 +0000 (21:04 +0300)
Every poll triggers cloning of Window contents at postLayout phase, so media components
are cleared of autoplay attribute.

Change-Id: I0d81cc1bcfd1da1f7c9f1813fb91930139232737

client/src/com/vaadin/client/ui/window/WindowConnector.java

index 2a2f031144ad10a9a1570e54d9bf3ab37ee1088e..4ee9f0c7327aa6b5a92a07f73069de054a3cbf1f 100644 (file)
@@ -20,6 +20,7 @@ import java.util.logging.Logger;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.dom.client.Node;
+import com.google.gwt.dom.client.NodeList;
 import com.google.gwt.dom.client.Style;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.dom.client.Style.Unit;
@@ -289,8 +290,37 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
             // emptied during the following hierarchy update (we need to keep
             // the contents visible for the duration of a possible
             // 'out-animation')
-            windowClone = getWidget().getElement().getFirstChild()
-                    .cloneNode(true);
+
+            // Fix for #14645 - as soon as we clone audio and video tags with
+            // autoplay attribute, they start playing immediately in background,
+            // so we have to clear them before cloning. And we can't just erase
+            // them, because there are corresponding player widgets to animate
+            Node content = getWidget().getElement().getFirstChild();
+            toggleAutoPlay(content);
+            windowClone = content.cloneNode(true);
+            toggleAutoPlay(content);
+        }
+    }
+
+    private void toggleAutoPlay(Node node) {
+        if (node instanceof Element) {
+            Element el = (Element) node;
+            if ("audio".equalsIgnoreCase(el.getTagName())
+                    || "video".equalsIgnoreCase(el.getTagName())) {
+                if (el.hasAttribute("autoplay")) {
+                    el.removeAttribute("autoplay");
+                    el.setAttribute("_autoplay", "");
+                } else if (el.hasAttribute("_autoplay")) {
+                    el.removeAttribute("_autoplay");
+                    el.setAttribute("autoplay", "");
+                }
+            }
+        }
+        if (node.hasChildNodes()) {
+            NodeList<Node> nl = node.getChildNodes();
+            for (int i = 0; i < nl.getLength(); i++) {
+                toggleAutoPlay(nl.getItem(i));
+            }
         }
     }