1/*
2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2012 Google Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "config.h"
29
30#if ENABLE(VIDEO)
31#include "RenderMediaControlElements.h"
32
33#include "MediaControlElements.h"
34#include "RenderLayoutState.h"
35#include "RenderTheme.h"
36#include "RenderView.h"
37#include <wtf/IsoMallocInlines.h>
38
39namespace WebCore {
40
41WTF_MAKE_ISO_ALLOCATED_IMPL(RenderMediaVolumeSliderContainer);
42WTF_MAKE_ISO_ALLOCATED_IMPL(RenderMediaControlTimelineContainer);
43#if ENABLE(VIDEO_TRACK)
44WTF_MAKE_ISO_ALLOCATED_IMPL(RenderTextTrackContainerElement);
45#endif
46
47RenderMediaVolumeSliderContainer::RenderMediaVolumeSliderContainer(Element& element, RenderStyle&& style)
48 : RenderBlockFlow(element, WTFMove(style))
49{
50}
51
52void RenderMediaVolumeSliderContainer::layout()
53{
54 RenderBlockFlow::layout();
55
56 if (style().display() == DisplayType::None || !is<RenderBox>(nextSibling()))
57 return;
58
59 RenderBox& buttonBox = downcast<RenderBox>(*nextSibling());
60 int absoluteOffsetTop = buttonBox.localToAbsolute(FloatPoint(0, -size().height())).y();
61
62 LayoutStateDisabler layoutStateDisabler(view().frameView().layoutContext());
63
64 // If the slider would be rendered outside the page, it should be moved below the controls.
65 if (UNLIKELY(absoluteOffsetTop < 0))
66 setY(buttonBox.offsetTop() + theme().volumeSliderOffsetFromMuteButton(buttonBox, size()).y());
67}
68
69// ----------------------------
70
71RenderMediaControlTimelineContainer::RenderMediaControlTimelineContainer(Element& element, RenderStyle&& style)
72 : RenderFlexibleBox(element, WTFMove(style))
73{
74}
75
76// We want the timeline slider to be at least 100 pixels wide.
77// FIXME: Eliminate hard-coded widths altogether.
78static const int minWidthToDisplayTimeDisplays = 45 + 100 + 45;
79
80void RenderMediaControlTimelineContainer::layout()
81{
82 RenderFlexibleBox::layout();
83
84 LayoutStateDisabler layoutStateDisabler(view().frameView().layoutContext());
85 MediaControlTimelineContainerElement* container = static_cast<MediaControlTimelineContainerElement*>(element());
86 container->setTimeDisplaysHidden(width().toInt() < minWidthToDisplayTimeDisplays);
87}
88
89// ----------------------------
90
91#if ENABLE(VIDEO_TRACK)
92
93RenderTextTrackContainerElement::RenderTextTrackContainerElement(Element& element, RenderStyle&& style)
94 : RenderBlockFlow(element, WTFMove(style))
95{
96}
97
98void RenderTextTrackContainerElement::layout()
99{
100 RenderBlockFlow::layout();
101 if (style().display() == DisplayType::None)
102 return;
103
104 ASSERT(mediaControlElementType(element()) == MediaTextTrackDisplayContainer);
105
106 LayoutStateDisabler layoutStateDisabler(view().frameView().layoutContext());
107 static_cast<MediaControlTextTrackContainerElement*>(element())->updateSizes();
108}
109
110#endif // ENABLE(VIDEO_TRACK)
111
112} // namespace WebCore
113
114#endif // ENABLE(VIDEO)
115
116