Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Google Inc. All rights reserved. | 3 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 */ | 28 */ |
| 29 | 29 |
| 30 #include "core/html/track/TextTrackContainer.h" | 30 #include "core/html/track/TextTrackContainer.h" |
| 31 | 31 |
| 32 #include "core/dom/ResizeObserver.h" | |
| 33 #include "core/dom/ResizeObserverCallback.h" | |
| 34 #include "core/dom/ResizeObserverEntry.h" | |
| 32 #include "core/html/HTMLVideoElement.h" | 35 #include "core/html/HTMLVideoElement.h" |
| 33 #include "core/html/track/CueTimeline.h" | 36 #include "core/html/track/CueTimeline.h" |
| 34 #include "core/layout/LayoutTextTrackContainer.h" | 37 #include "core/layout/LayoutBlockFlow.h" |
| 38 #include "core/layout/LayoutVideo.h" | |
| 35 | 39 |
| 36 namespace blink { | 40 namespace blink { |
| 37 | 41 |
| 42 namespace { | |
| 43 | |
| 44 class VideoElementResizeCallback final : public ResizeObserverCallback { | |
| 45 public: | |
| 46 VideoElementResizeCallback(TextTrackContainer& container) | |
| 47 : ResizeObserverCallback(), m_textTrackContainer(container) {} | |
| 48 | |
| 49 void handleEvent(const HeapVector<Member<ResizeObserverEntry>>& entries, | |
| 50 ResizeObserver*) override { | |
| 51 DCHECK_EQ(entries.size(), 1u); | |
| 52 DCHECK(isHTMLVideoElement(entries[0]->target())); | |
| 53 m_textTrackContainer->updateDefaultFontSize( | |
| 54 entries[0]->target()->layoutObject()); | |
| 55 } | |
| 56 | |
| 57 DEFINE_INLINE_VIRTUAL_TRACE() { | |
| 58 visitor->trace(m_textTrackContainer); | |
| 59 ResizeObserverCallback::trace(visitor); | |
| 60 } | |
| 61 | |
| 62 private: | |
| 63 Member<TextTrackContainer> m_textTrackContainer; | |
| 64 }; | |
| 65 } | |
|
mlamouri (slow - plz ping)
2017/04/08 12:57:57
style: leave empty line before end of namespace an
fs
2017/04/10 13:36:27
Done.
| |
| 66 | |
| 38 TextTrackContainer::TextTrackContainer(Document& document) | 67 TextTrackContainer::TextTrackContainer(Document& document) |
| 39 : HTMLDivElement(document) {} | 68 : HTMLDivElement(document), m_defaultFontSize(0) {} |
| 40 | 69 |
| 41 TextTrackContainer* TextTrackContainer::create(Document& document) { | 70 DEFINE_TRACE(TextTrackContainer) { |
| 42 TextTrackContainer* element = new TextTrackContainer(document); | 71 visitor->trace(m_videoSizeObserver); |
| 72 HTMLDivElement::trace(visitor); | |
| 73 } | |
| 74 | |
| 75 TextTrackContainer* TextTrackContainer::create(HTMLMediaElement& mediaElement) { | |
| 76 TextTrackContainer* element = new TextTrackContainer(mediaElement.document()); | |
| 43 element->setShadowPseudoId( | 77 element->setShadowPseudoId( |
| 44 AtomicString("-webkit-media-text-track-container")); | 78 AtomicString("-webkit-media-text-track-container")); |
| 79 if (isHTMLVideoElement(mediaElement)) | |
| 80 element->observeSizeChanges(mediaElement); | |
| 45 return element; | 81 return element; |
| 46 } | 82 } |
| 47 | 83 |
| 48 LayoutObject* TextTrackContainer::createLayoutObject(const ComputedStyle&) { | 84 LayoutObject* TextTrackContainer::createLayoutObject(const ComputedStyle&) { |
| 49 return new LayoutTextTrackContainer(this); | 85 return new LayoutBlockFlow(this); |
| 86 } | |
| 87 | |
| 88 void TextTrackContainer::observeSizeChanges(Element& element) { | |
| 89 m_videoSizeObserver = | |
| 90 ResizeObserver::create(document(), new VideoElementResizeCallback(*this)); | |
| 91 m_videoSizeObserver->observe(&element); | |
| 92 } | |
| 93 | |
| 94 void TextTrackContainer::updateDefaultFontSize( | |
| 95 LayoutObject* mediaLayoutObject) { | |
| 96 if (!mediaLayoutObject || !mediaLayoutObject->isVideo()) | |
| 97 return; | |
| 98 // FIXME: The video size is used to calculate the font size (a workaround | |
| 99 // for lack of per-spec vh/vw support) but the whole media element is used | |
| 100 // for cue rendering. This is inconsistent. See also the somewhat related | |
| 101 // spec bug: https://www.w3.org/Bugs/Public/show_bug.cgi?id=28105 | |
| 102 LayoutSize videoSize = | |
| 103 toLayoutVideo(*mediaLayoutObject).replacedContentRect().size(); | |
| 104 LayoutUnit smallestDimension = | |
| 105 std::min(videoSize.height(), videoSize.width()); | |
| 106 float fontSize = smallestDimension * 0.05f; | |
| 107 | |
| 108 // Avoid excessive FP precision issue. | |
| 109 // C11 5.2.4.2.2:9 requires assignment and cast to remove extra precision, but | |
| 110 // the behavior is currently not portable. fontSize may have precision higher | |
| 111 // than m_fontSize thus straight comparison can fail despite they cast to the | |
| 112 // same float value. | |
| 113 volatile float& currentFontSize = m_defaultFontSize; | |
| 114 float oldFontSize = currentFontSize; | |
| 115 currentFontSize = fontSize; | |
| 116 if (currentFontSize == oldFontSize) | |
| 117 return; | |
| 118 setInlineStyleProperty(CSSPropertyFontSize, m_defaultFontSize, | |
| 119 CSSPrimitiveValue::UnitType::Pixels); | |
| 50 } | 120 } |
| 51 | 121 |
| 52 void TextTrackContainer::updateDisplay(HTMLMediaElement& mediaElement, | 122 void TextTrackContainer::updateDisplay(HTMLMediaElement& mediaElement, |
| 53 ExposingControls exposingControls) { | 123 ExposingControls exposingControls) { |
| 54 if (!mediaElement.textTracksVisible()) { | 124 if (!mediaElement.textTracksVisible()) { |
| 55 removeChildren(); | 125 removeChildren(); |
| 56 return; | 126 return; |
| 57 } | 127 } |
| 58 | 128 |
| 59 // http://dev.w3.org/html5/webvtt/#dfn-rules-for-updating-the-display-of-webvt t-text-tracks | 129 // http://dev.w3.org/html5/webvtt/#dfn-rules-for-updating-the-display-of-webvt t-text-tracks |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 | 188 |
| 119 cue->updateDisplay(*this); | 189 cue->updateDisplay(*this); |
| 120 cue->updatePastAndFutureNodes(movieTime); | 190 cue->updatePastAndFutureNodes(movieTime); |
| 121 } | 191 } |
| 122 | 192 |
| 123 // 11. Return output. | 193 // 11. Return output. |
| 124 // See the note for step 3 for why there is no output to return. | 194 // See the note for step 3 for why there is no output to return. |
| 125 } | 195 } |
| 126 | 196 |
| 127 } // namespace blink | 197 } // namespace blink |
| OLD | NEW |