| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/public/browser/back_forward_transition_animation_manager.h" |
| |
| #include "content/browser/renderer_host/navigation_transitions/navigation_transition_config.h" |
| #include "content/public/common/content_features.h" |
| #include "third_party/blink/public/common/features_generated.h" |
| #include "ui/gfx/animation/animation.h" |
| |
| #if BUILDFLAG(IS_ANDROID) |
| #include "ui/base/l10n/l10n_util_android.h" |
| #endif // BUILDFLAG(IS_ANDROID) |
| |
| namespace content { |
| |
| // static |
| bool BackForwardTransitionAnimationManager::AreBackForwardTransitionsEnabled() { |
| return NavigationTransitionConfig::AreBackForwardTransitionsEnabled(); |
| } |
| |
| // static |
| bool BackForwardTransitionAnimationManager::ShouldAnimateNavigationTransition( |
| NavigationDirection navigation_direction, |
| ui::BackGestureEventSwipeEdge edge) { |
| #if BUILDFLAG(IS_ANDROID) |
| if (!AreBackForwardTransitionsEnabled()) { |
| return false; |
| } |
| |
| if (gfx::Animation::PrefersReducedMotion()) { |
| return false; |
| } |
| |
| ui::BackGestureEventSwipeEdge semantic_back_edge = |
| l10n_util::ShouldMirrorBackForwardGestures() |
| ? ui::BackGestureEventSwipeEdge::RIGHT |
| : ui::BackGestureEventSwipeEdge::LEFT; |
| |
| bool is_back = navigation_direction == NavigationDirection::kBackward; |
| bool from_semantic_back_edge = edge == semantic_back_edge; |
| |
| // If navigating forward, the swipe must come from the semantic forward |
| // direction (back can come from either direction in gestural navigation |
| // mode). |
| CHECK(is_back || !from_semantic_back_edge); |
| |
| // We allow back animations from the back edge and forward animations from the |
| // forward edge but disallow animations from an opposing edge (e.g. in three |
| // button mode where both edges navigate back, in a left-to-right UI we don't |
| // animate the back navigation that occurs from the right edge because |
| // "semantically" that edge is forward). |
| if (is_back != from_semantic_back_edge) { |
| return false; |
| } |
| |
| return true; |
| #else |
| return false; |
| #endif // BUILDFLAG(IS_ANDROID) |
| } |
| } // namespace content |