Chromium Code Reviews| 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 |