Index: content/browser/renderer_host/fullscreen_jank_detector.cc |
diff --git a/content/browser/renderer_host/fullscreen_jank_detector.cc b/content/browser/renderer_host/fullscreen_jank_detector.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5eaaa40e8e422d1867b511c8014f8f766be9e7c9 |
--- /dev/null |
+++ b/content/browser/renderer_host/fullscreen_jank_detector.cc |
@@ -0,0 +1,71 @@ |
+// Copyright (c) 2017 The Chromium Authors. All rights reserved. |
boliu
2017/07/05 17:39:48
no (c)
|
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/renderer_host/fullscreen_jank_detector.h" |
+ |
+#include "base/logging.h" |
+ |
+namespace content { |
+ |
+void FullscreenJankDetector::OnFullscreenStateChanged(bool is_fullscreen) { |
+ web_contents_is_fullscreen_ = is_fullscreen; |
+ UpdateFullscreenState(); |
+} |
+ |
+void FullscreenJankDetector::OnPhysicalBackingSizeChanged(gfx::Size size) { |
+ view_size_ = size; |
+ UpdateFullscreenState(); |
+} |
+ |
+void FullscreenJankDetector::OnFrameMetadataUpdated(bool frame_is_fullscreen, |
+ gfx::Size frame_size) { |
+ frame_is_fullscreen_ = frame_is_fullscreen; |
+ frame_size_ = frame_size; |
boliu
2017/07/05 17:39:48
this frame size may not be the "final" size, even
|
+ UpdateFullscreenState(); |
+} |
+ |
+void FullscreenJankDetector::UpdateFullscreenState() { |
+ bool mismatched_fullscreen_states = |
+ web_contents_is_fullscreen_ != frame_is_fullscreen_; |
+ bool mismatched_sizes = view_size_ != frame_size_; |
+ |
+ switch (state_) { |
+ // From kNotFullscreen, we transition to kEnteringFullscreen whenever the |
+ // fullscreen state changes. |
+ case FullscreenState::kNotFullscreen: |
+ if (mismatched_fullscreen_states) { |
+ DCHECK(web_contents_is_fullscreen_); |
+ state_ = FullscreenState::kEnteringFullscreen; |
+ } |
+ break; |
+ // From kFullscreen, we transition to kExitingFullscreen on a fullscreen |
+ // state change, or to kFullscreenRotation if we get a new size. |
+ case FullscreenState::kFullscreen: |
+ if (mismatched_fullscreen_states) { |
+ DCHECK(!web_contents_is_fullscreen_); |
+ state_ = FullscreenState::kExitingFullscreen; |
+ } else if (mismatched_sizes) { |
+ state_ = FullscreenState::kFullscreenRotation; |
+ } |
+ break; |
+ // From any transition state, once we receive a "good" frame we transition |
+ // to the proper "good" state. |
+ case FullscreenState::kExitingFullscreen: |
boliu
2017/07/05 17:39:48
looks like these three states can just be merged?
|
+ case FullscreenState::kEnteringFullscreen: |
+ case FullscreenState::kFullscreenRotation: |
+ if (!mismatched_fullscreen_states && !mismatched_sizes) { |
+ state_ = web_contents_is_fullscreen_ ? FullscreenState::kFullscreen |
+ : FullscreenState::kNotFullscreen; |
+ } |
+ break; |
+ } |
+} |
+ |
+bool FullscreenJankDetector::IsInFullscreenTransition() const { |
+ return (state_ == FullscreenState::kEnteringFullscreen || |
+ state_ == FullscreenState::kExitingFullscreen || |
+ state_ == FullscreenState::kFullscreenRotation); |
+} |
+ |
+} // namespace content |