blob: 2672d66cd8d69fa42c9ecef6bbf2619809530e9c [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MediaControlLoadingPanelElement_h
#define MediaControlLoadingPanelElement_h
#include "modules/ModulesExport.h"
#include "modules/media_controls/elements/MediaControlAnimationEventListener.h"
#include "modules/media_controls/elements/MediaControlDivElement.h"
namespace blink {
class ContainerNode;
class Element;
class HTMLDivElement;
class MediaControlsImpl;
// The loading panel shows the semi-transparent white mask and the transparent
// loading spinner.
class MODULES_EXPORT MediaControlLoadingPanelElement final
: public MediaControlDivElement,
public MediaControlAnimationEventListener::Observer {
USING_GARBAGE_COLLECTED_MIXIN(MediaControlLoadingPanelElement);
public:
explicit MediaControlLoadingPanelElement(MediaControlsImpl&);
// Update the state based on the Media Controls state.
void UpdateDisplayState();
void Trace(Visitor*);
private:
friend class MediaControlLoadingPanelElementTest;
enum State {
// The loading panel is hidden.
kHidden,
// The loading panel is shown and is playing the "spinner" animation.
kPlaying,
// The loading panel is playing the "cooldown" animation and will hide
// automatically once it is complete.
kCoolingDown,
};
// These are used by AnimationEventListener to notify of animation events.
void OnAnimationEnd() override;
void OnAnimationIteration() override;
Element& WatchedAnimationElement() const override;
// This sets the "animation-iteration-count" CSS property on the mask
// background elements.
void SetAnimationIterationCount(const String&);
// The loading panel is only used once and has a lot of DOM elements so these
// two functions will populate the shadow DOM or clean it if the panel is
// hidden.
void CleanupShadowDOM();
void PopulateShadowDOM();
// Cleans up the event listener when this element is removed from the DOM.
void RemovedFrom(ContainerNode*) override;
// This counts how many animation iterations the background elements have
// played.
int animation_count_ = 0;
State state_ = State::kHidden;
Member<MediaControlAnimationEventListener> event_listener_;
Member<HTMLDivElement> mask1_background_;
Member<HTMLDivElement> mask2_background_;
};
} // namespace blink
#endif // MediaControlLoadingPanelElement_h