1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google Inc.  All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * in the documentation and/or other materials provided with the
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * distribution.
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * this software without specific prior written permission.
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#ifndef VTTRegion_h
3219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#define VTTRegion_h
33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/ContextLifecycleObserver.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/track/TextTrack.h"
36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/Timer.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatPoint.h"
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h"
39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/PassOwnPtr.h"
40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefCounted.h"
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace WebCore {
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
44df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class HTMLDivElement;
46a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class VTTCueBox;
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class VTTScanner;
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
49f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass VTTRegion FINAL : public RefCountedWillBeGarbageCollectedFinalized<VTTRegion> {
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
51f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    static PassRefPtrWillBeRawPtr<VTTRegion> create()
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return adoptRefWillBeNoop(new VTTRegion());
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    virtual ~VTTRegion();
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TextTrack* track() const { return m_track; }
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setTrack(TextTrack*);
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const String& id() const { return m_id; }
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setId(const String&);
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double width() const { return m_width; }
65df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setWidth(double, ExceptionState&);
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    long height() const { return m_heightInLines; }
68df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setHeight(long, ExceptionState&);
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double regionAnchorX() const { return m_regionAnchor.x(); }
71df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setRegionAnchorX(double, ExceptionState&);
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double regionAnchorY() const { return m_regionAnchor.y(); }
74df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setRegionAnchorY(double, ExceptionState&);
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double viewportAnchorX() const { return m_viewportAnchor.x(); }
77df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setViewportAnchorX(double, ExceptionState&);
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double viewportAnchorY() const { return m_viewportAnchor.y(); }
80df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setViewportAnchorY(double, ExceptionState&);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const AtomicString scroll() const;
83df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setScroll(const AtomicString&, ExceptionState&);
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void updateParametersFromRegion(VTTRegion*);
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const String& regionSettings() const { return m_settings; }
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setRegionSettings(const String&);
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    bool isScrollingRegion() { return m_scroll; }
915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    PassRefPtrWillBeRawPtr<HTMLDivElement> getDisplayTree(Document&);
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
94323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void appendVTTCueBox(PassRefPtrWillBeRawPtr<VTTCueBox>);
95a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void displayLastVTTCueBox();
96a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void willRemoveVTTCueBox(VTTCueBox*);
975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
98f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void trace(Visitor*);
99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
10119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    VTTRegion();
1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void prepareRegionDisplayTree();
1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // The timer is needed to continue processing when cue scrolling ended.
1065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void startTimer();
1075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void stopTimer();
10819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void scrollTimerFired(Timer<VTTRegion>*);
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    enum RegionSetting {
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        None,
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Id,
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Width,
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Height,
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RegionAnchor,
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ViewportAnchor,
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Scroll
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RegionSetting scanSettingName(VTTScanner&);
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void parseSettingValue(RegionSetting, VTTScanner&);
12153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    static const AtomicString& textTrackCueContainerShadowPseudoId();
1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    static const AtomicString& textTrackCueContainerScrollingClass();
1245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    static const AtomicString& textTrackRegionShadowPseudoId();
1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String m_id;
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String m_settings;
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double m_width;
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned m_heightInLines;
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FloatPoint m_regionAnchor;
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FloatPoint m_viewportAnchor;
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_scroll;
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // The cue container is the container that is scrolled up to obtain the
1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // effect of scrolling cues when this is enabled for the regions.
136323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeMember<HTMLDivElement> m_cueContainer;
137323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeMember<HTMLDivElement> m_regionDisplayTree;
1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // The member variable track can be a raw pointer as it will never
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // reference a destroyed TextTrack, as this member variable
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // is cleared in the TextTrack destructor and it is generally
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // set/reset within the addRegion and removeRegion methods.
143f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RawPtrWillBeMember<TextTrack> m_track;
1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Keep track of the current numeric value of the css "top" property.
1465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    double m_currentTop;
1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // The timer is used to display the next cue line after the current one has
1495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // been displayed. It's main use is for scrolling regions and it triggers as
1505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // soon as the animation for rolling out one line has finished, but
1515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // currently it is used also for non-scrolling regions to use a single
1525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // code path.
15319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    Timer<VTTRegion> m_scrollTimer;
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} // namespace WebCore
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
158