Index: third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegate.h |
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegate.h b/third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegate.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5146edf8d0927deb65bc84f8d5367d0fc521bc81 |
--- /dev/null |
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegate.h |
@@ -0,0 +1,69 @@ |
+// 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 MediaControlsRotateToFullscreenDelegate_h |
+#define MediaControlsRotateToFullscreenDelegate_h |
+ |
+#include "core/events/EventListener.h" |
+#include "modules/ModulesExport.h" |
+ |
+namespace blink { |
+ |
+class HTMLVideoElement; |
+class ElementVisibilityObserver; |
+ |
+// MediaControlsRotateToFullscreenDelegate automatically enters and exits |
+// fullscreen when the device is rotated whilst watching a <video>. It is meant |
+// to be created by `MediaControlsImpl` when the feature applies. Once created, |
+// it will listen for events. |
+class MediaControlsRotateToFullscreenDelegate final : public EventListener { |
+ public: |
+ explicit MediaControlsRotateToFullscreenDelegate(HTMLVideoElement&); |
+ |
+ // Called by MediaControlsImpl when the HTMLMediaElement is added to a |
+ // document. All event listeners should be added. |
+ void Attach(); |
+ |
+ // Called by MediaControlsImpl when the HTMLMediaElement is no longer in the |
+ // document. All event listeners should be removed in order to prepare the |
+ // object to be garbage collected. |
+ void Detach(); |
+ |
+ // EventListener implementation. |
+ bool operator==(const EventListener&) const override; |
+ |
+ DECLARE_VIRTUAL_TRACE(); |
+ |
+ private: |
+ friend class MediaControlsRotateToFullscreenDelegateTest; |
+ |
+ // Represents either screen orientation or video aspect ratio. |
+ enum class SimpleOrientation { kPortrait, kLandscape, kUnknown }; |
+ |
+ // EventListener implementation. |
+ void handleEvent(ExecutionContext*, Event*) override; |
+ |
+ void OnStateChange(); |
+ void OnVisibilityChange(bool is_visible); |
+ void OnScreenOrientationChange(); |
+ |
+ MODULES_EXPORT SimpleOrientation ComputeVideoOrientation() const; |
+ SimpleOrientation ComputeScreenOrientation() const; |
+ |
+ SimpleOrientation current_screen_orientation_ = SimpleOrientation::kUnknown; |
+ |
+ // Only valid when visibility_observer_ is active and the first |
+ // OnVisibilityChanged has been received; otherwise assume video is hidden. |
+ bool is_visible_ = false; |
+ |
+ // This is null whenever we're not listening. |
+ Member<ElementVisibilityObserver> visibility_observer_ = nullptr; |
+ |
+ // `video_element_` owns MediaControlsImpl that owns |this|. |
+ Member<HTMLVideoElement> video_element_; |
+}; |
+ |
+} // namespace blink |
+ |
+#endif // MediaControlsRotateToFullscreenDelegate_h |