[BlackBerry] Some media controls are mispositioned for dynamic live streams (HLS)
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Aug 2012 20:54:21 +0000 (20:54 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Aug 2012 20:54:21 +0000 (20:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=94176

Patch by Max Feil <mfeil@rim.com> on 2012-08-16
Reviewed by Antonio Gomes.

.:

An automated layout test is not possible for this patch because
dynamic live streams require a special dedicated web server.
Putting an external video URL into an automated test is not
correct either. So I have created a manual test that points to
an external HLS video that works today.

* ManualTests/blackberry/video-hls-controls.html: Added.

Source/WebCore:

The default HTML5 media controls for dynamic live streams have
no timeline or timeline container, which for BlackBerry results
in mispositioning of the buttons that are supposed to be to
the right of the timeline (fullscreen and mute). Instead of
being right justified they incorrectly appear on the left next
to the play button. The fix is to explicitly position these 2
buttons whenever the media duration is infinite (indicating a
live stream).

Manual test: ManualTests/blackberry/video-hls-controls.html

* platform/blackberry/RenderThemeBlackBerry.cpp:
(WebCore::RenderThemeBlackBerry::adjustMediaControlStyle):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@125811 268f45cc-cd09-0410-ab3c-d52691b4dbfc

ChangeLog
ManualTests/blackberry/video-hls-controls.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp

index 05bb33b..5d86623 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2012-08-16  Max Feil  <mfeil@rim.com>
+
+        [BlackBerry] Some media controls are mispositioned for dynamic live streams (HLS)
+        https://bugs.webkit.org/show_bug.cgi?id=94176
+
+        Reviewed by Antonio Gomes.
+
+        An automated layout test is not possible for this patch because
+        dynamic live streams require a special dedicated web server.
+        Putting an external video URL into an automated test is not
+        correct either. So I have created a manual test that points to
+        an external HLS video that works today.
+
+        * ManualTests/blackberry/video-hls-controls.html: Added.
+
 2012-08-16  Marja Hölttä  <marja@chromium.org>
 
         FormController, WebHistoryItem: Enable reading selected file names from document state
diff --git a/ManualTests/blackberry/video-hls-controls.html b/ManualTests/blackberry/video-hls-controls.html
new file mode 100644 (file)
index 0000000..b0fccdb
--- /dev/null
@@ -0,0 +1,22 @@
+<html>
+<head>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Dynamic Live Streaming controls</title>
+</head>
+<body>
+<h3>Dynamic Live Streaming controls</h3>
+<p>This page exists to test the hiding of the timeline container for
+dynamic live streams. Once metadata loads, the control bar below should
+contain only 3 buttons: "play" on the left, and "fullscreen" & "mute
+(volume)" on the right. No seek slider or media times should be shown.
+If only the "play" button shows, it means the link to the test video is
+out of date.
+</p>
+
+<video width="300" height="200" controls>
+  <source src="http://xteleantioquiawebsx.api.channel.livestream.com/3.0/playlist.m3u8">
+</video>
+
+<br> <br> <br>
+<a href="http://xteleantioquiawebsx.api.channel.livestream.com/3.0/playlist.m3u8">Link directly to video</a>
+</body></html>
index 811dc9a..1df3ea8 100644 (file)
@@ -1,3 +1,24 @@
+2012-08-16  Max Feil  <mfeil@rim.com>
+
+        [BlackBerry] Some media controls are mispositioned for dynamic live streams (HLS)
+        https://bugs.webkit.org/show_bug.cgi?id=94176
+
+        Reviewed by Antonio Gomes.
+
+        The default HTML5 media controls for dynamic live streams have
+        no timeline or timeline container, which for BlackBerry results
+        in mispositioning of the buttons that are supposed to be to
+        the right of the timeline (fullscreen and mute). Instead of
+        being right justified they incorrectly appear on the left next
+        to the play button. The fix is to explicitly position these 2
+        buttons whenever the media duration is infinite (indicating a
+        live stream).
+
+        Manual test: ManualTests/blackberry/video-hls-controls.html
+
+        * platform/blackberry/RenderThemeBlackBerry.cpp:
+        (WebCore::RenderThemeBlackBerry::adjustMediaControlStyle):
+
 2012-08-16  Abhishek Arya  <inferno@chromium.org>
 
         Regression(r118248): Replaced element not layout
index 26928ac..85b2e17 100644 (file)
@@ -763,8 +763,12 @@ bool RenderThemeBlackBerry::paintSliderThumb(RenderObject* object, const PaintIn
 void RenderThemeBlackBerry::adjustMediaControlStyle(StyleResolver*, RenderStyle* style, Element* element) const
 {
     float fullScreenMultiplier = determineFullScreenMultiplier(element);
+    HTMLMediaElement* mediaElement = toParentMediaElement(element);
+    if (!mediaElement)
+        return;
 
     // We use multiples of mediaControlsHeight to make all objects scale evenly
+    Length zero(0, Fixed);
     Length controlsHeight(mediaControlsHeight * fullScreenMultiplier, Fixed);
     Length timeWidth(mediaControlsHeight * 3 / 2 * fullScreenMultiplier, Fixed);
     Length volumeHeight(mediaControlsHeight * 4 * fullScreenMultiplier, Fixed);
@@ -794,6 +798,28 @@ void RenderThemeBlackBerry::adjustMediaControlStyle(StyleResolver*, RenderStyle*
     default:
         break;
     }
+
+    if (!isfinite(mediaElement->duration())) {
+        // Live streams have infinite duration with no timeline. Force the mute
+        // and fullscreen buttons to the right. This is needed when webkit does
+        // not render the timeline container because it has a webkit-box-flex
+        // of 1 and normally allows those buttons to be on the right.
+        switch (style->appearance()) {
+        case MediaEnterFullscreenButtonPart:
+        case MediaExitFullscreenButtonPart:
+            style->setPosition(AbsolutePosition);
+            style->setBottom(zero);
+            style->setRight(controlsHeight);
+            break;
+        case MediaMuteButtonPart:
+            style->setPosition(AbsolutePosition);
+            style->setBottom(zero);
+            style->setRight(zero);
+            break;
+        default:
+            break;
+        }
+    }
 }
 
 void RenderThemeBlackBerry::adjustSliderTrackStyle(StyleResolver*, RenderStyle* style, Element* element) const