OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 | 47 |
48 void LayoutMedia::layout() { | 48 void LayoutMedia::layout() { |
49 LayoutSize oldSize = contentBoxRect().size(); | 49 LayoutSize oldSize = contentBoxRect().size(); |
50 | 50 |
51 LayoutImage::layout(); | 51 LayoutImage::layout(); |
52 | 52 |
53 LayoutRect newRect = contentBoxRect(); | 53 LayoutRect newRect = contentBoxRect(); |
54 | 54 |
55 LayoutState state(*this); | 55 LayoutState state(*this); |
56 | 56 |
57 Optional<LayoutUnit> newPanelWidth; | |
58 | |
59 // Iterate the children in reverse order so that the media controls are laid | 57 // Iterate the children in reverse order so that the media controls are laid |
60 // out before the text track container. This is to ensure that the text | 58 // out before the text track container. This is to ensure that the text |
61 // track rendering has an up-to-date position of the media controls for | 59 // track rendering has an up-to-date position of the media controls for |
62 // overlap checking, see LayoutVTTCue. | 60 // overlap checking, see LayoutVTTCue. |
63 #if DCHECK_IS_ON() | 61 #if DCHECK_IS_ON() |
64 bool seenTextTrackContainer = false; | 62 bool seenTextTrackContainer = false; |
65 #endif | 63 #endif |
66 for (LayoutObject* child = m_children.lastChild(); child; | 64 for (LayoutObject* child = m_children.lastChild(); child; |
67 child = child->previousSibling()) { | 65 child = child->previousSibling()) { |
68 #if DCHECK_IS_ON() | 66 #if DCHECK_IS_ON() |
69 if (child->node()->isMediaControls()) | 67 if (child->node()->isMediaControls()) |
70 ASSERT(!seenTextTrackContainer); | 68 ASSERT(!seenTextTrackContainer); |
71 else if (child->node()->isTextTrackContainer()) | 69 else if (child->node()->isTextTrackContainer()) |
72 seenTextTrackContainer = true; | 70 seenTextTrackContainer = true; |
73 else | 71 else |
74 ASSERT_NOT_REACHED(); | 72 ASSERT_NOT_REACHED(); |
75 #endif | 73 #endif |
76 | 74 |
77 // TODO(mlamouri): we miss some layouts because needsLayout returns false in | 75 // TODO(mlamouri): we miss some layouts because needsLayout returns false in |
78 // some cases where we want to change the width of the controls because the | 76 // some cases where we want to change the width of the controls because the |
79 // visible viewport has changed for example. | 77 // visible viewport has changed for example. |
80 if (newRect.size() == oldSize && !child->needsLayout()) | 78 if (newRect.size() == oldSize && !child->needsLayout()) |
81 continue; | 79 continue; |
82 | 80 |
83 LayoutUnit width = newRect.width(); | 81 LayoutUnit width = newRect.width(); |
84 if (child->node()->isMediaControls()) { | 82 if (child->node()->isMediaControls()) { |
85 width = computePanelWidth(newRect); | 83 width = computePanelWidth(newRect); |
86 newPanelWidth = width; | |
87 } | 84 } |
88 | 85 |
89 LayoutBox* layoutBox = toLayoutBox(child); | 86 LayoutBox* layoutBox = toLayoutBox(child); |
90 layoutBox->setLocation(newRect.location()); | 87 layoutBox->setLocation(newRect.location()); |
91 // TODO(foolip): Remove the mutableStyleRef() and depend on CSS | 88 // TODO(foolip): Remove the mutableStyleRef() and depend on CSS |
92 // width/height: inherit to match the media element size. | 89 // width/height: inherit to match the media element size. |
93 layoutBox->mutableStyleRef().setHeight(Length(newRect.height(), Fixed)); | 90 layoutBox->mutableStyleRef().setHeight(Length(newRect.height(), Fixed)); |
94 layoutBox->mutableStyleRef().setWidth(Length(width, Fixed)); | 91 layoutBox->mutableStyleRef().setWidth(Length(width, Fixed)); |
95 | 92 |
96 layoutBox->forceLayout(); | 93 layoutBox->forceLayout(); |
97 } | 94 } |
98 | 95 |
99 clearNeedsLayout(); | 96 clearNeedsLayout(); |
100 | |
101 // Notify our MediaControls that a layout has happened. | |
102 if (mediaElement() && mediaElement()->mediaControls() && | |
103 newPanelWidth.has_value()) { | |
104 if (!m_lastReportedPanelWidth.has_value() || | |
105 m_lastReportedPanelWidth.value() != newPanelWidth.value()) { | |
106 mediaElement()->mediaControls()->notifyPanelWidthChanged( | |
107 newPanelWidth.value()); | |
108 // Store the last value we reported, so we know if it has changed. | |
109 m_lastReportedPanelWidth = newPanelWidth.value(); | |
110 } | |
111 } | |
112 } | 97 } |
113 | 98 |
114 bool LayoutMedia::isChildAllowed(LayoutObject* child, | 99 bool LayoutMedia::isChildAllowed(LayoutObject* child, |
115 const ComputedStyle&) const { | 100 const ComputedStyle&) const { |
116 // Two types of child layout objects are allowed: media controls | 101 // Two types of child layout objects are allowed: media controls |
117 // and the text track container. Filter children by node type. | 102 // and the text track container. Filter children by node type. |
118 ASSERT(child->node()); | 103 ASSERT(child->node()); |
119 | 104 |
120 // The user agent stylesheet (mediaControls.css) has | 105 // The user agent stylesheet (mediaControls.css) has |
121 // ::-webkit-media-controls { display: flex; }. If author style | 106 // ::-webkit-media-controls { display: flex; }. If author style |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 .x()); | 149 .x()); |
165 const LayoutUnit newWidth = visibleWidth - absoluteXOffset; | 150 const LayoutUnit newWidth = visibleWidth - absoluteXOffset; |
166 | 151 |
167 if (newWidth < 0) | 152 if (newWidth < 0) |
168 return mediaRect.width(); | 153 return mediaRect.width(); |
169 | 154 |
170 return std::min(mediaRect.width(), visibleWidth - absoluteXOffset); | 155 return std::min(mediaRect.width(), visibleWidth - absoluteXOffset); |
171 } | 156 } |
172 | 157 |
173 } // namespace blink | 158 } // namespace blink |
OLD | NEW |