blob: 1928089d3de99edb0467b24457007aabfb977b90 [file] [log] [blame]
// 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.
#ifndef CONTENT_PUBLIC_BROWSER_BACK_FORWARD_TRANSITION_ANIMATION_MANAGER_H_
#define CONTENT_PUBLIC_BROWSER_BACK_FORWARD_TRANSITION_ANIMATION_MANAGER_H_
#include "content/common/content_export.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/events/back_gesture_event.h"
namespace ui {
class BackGestureEvent;
} // namespace ui
namespace content {
// This class manages the back/forward page preview animation during a
// back/forward session history navigation, triggered by a user gesture.
// Instances of this class can not outlive the associated `WebContentsView`. The
// caller of all the APIs must ensure that the associated `WebContents` is
// visible and is being composited.
class CONTENT_EXPORT BackForwardTransitionAnimationManager {
public:
// Indicates the direction of the session history navigation. This is required
// as the swipe-edge alone is not sufficient to deduce the direction of the
// history navigation.
enum class NavigationDirection { kForward, kBackward };
// GENERATED_JAVA_ENUM_PACKAGE: (
// org.chromium.content_public.browser.back_forward_transition)
enum class AnimationStage {
// Indicates no gesture is active or no animation is being done for a
// gesture.
kNone = 0,
// Indicates that an ongoing gesture has invoked. An animation to remove the
// content of the entry the user is navigation away from is in progress.
kInvokeAnimation,
// A native progress bar is also drawn, in addition to the the invoke
// animation.
kInvokeAnimationWithProgressBar,
// Indicates that animation manager is waiting for the embedder to show
// its content.
kWaitingForEmbedderContentForCommittedEntry,
// All other stages for an active animation.
kOther,
};
// Provides drawing information about the fallback UX for navigation
// transitions, when no valid screenshot is available.
struct FallbackUXConfig {
// The color of the rounded rectangle that embeds the favicon.
SkColor4f rounded_rectangle_color = SkColors::kTransparent;
// The background color of the fallback UX.
SkColor4f background_color = SkColors::kTransparent;
};
virtual ~BackForwardTransitionAnimationManager() = default;
// Called when the user gesture for showing the history preview starts. This
// is the starting point of the animation. The caller must end a gesture
// sequence by calling `OnGestureCancelled()` or `OnGestureInvoked()` after
// this API. It is invalid to start another gesture by calling
// `OnGestureStarted()` before an existing gesture ends.
//
// `navigation_direction` indicates which direction the gesture should
// navigate the user. The caller must ensure the requested history navigation
// is feasible (i.e., there is a `NavigationEntry` for the type requested by
// the user).
virtual void OnGestureStarted(const ui::BackGestureEvent& gesture,
ui::BackGestureEventSwipeEdge edge,
NavigationDirection navigation_direction) = 0;
// Called when the user swipes across the screen. This method updates the
// animation and makes sure the animation responds to the user's finger
// movement.
virtual void OnGestureProgressed(const ui::BackGestureEvent& gesture) = 0;
// Called when the user finishes the gesture but does not signal the start of
// a session history navigation. This API is responsible for displaying a
// "cancel animation" that puts the current page back to the center of the
// viewport.
virtual void OnGestureCancelled() = 0;
// Called when the user finishes the gesture and signals the start of a
// session history navigation. This navigation destination is specified by
// `navigation_direction` argument of `OnGestureStarted()`. This API is
// responsible for displaying an "invoke animation" that moves the old page
// completely out of the viewport, and puts the new page to the center of the
// viewport. This API also starts the session history navigation.
virtual void OnGestureInvoked() = 0;
// For cases where the content for a navigation entry is being drawn by the
// embedder (instead of the web page), this notifies when the embedder has
// rendered the UI at its final state.
virtual void OnContentForNavigationEntryShown() = 0;
// Get current stage of the back forward transition.
virtual AnimationStage GetCurrentAnimationStage() = 0;
// Sets the favicon for navigation transitions. The favicon is associated with
// the last committed entry for the current WebContents. The favicon will be
// used to compose a fallback UX when needed.
virtual void SetFavicon(const SkBitmap& favicon) = 0;
// Returns true if a gesture navigation from the screen edge `edge`, towards
// the session history direction `navigation_direction` should be animated.
static bool ShouldAnimateNavigationTransition(
NavigationDirection navigation_direction,
ui::BackGestureEventSwipeEdge edge);
// Returns true if back forward visual transitions are enabled.
static bool AreBackForwardTransitionsEnabled();
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_BACK_FORWARD_TRANSITION_ANIMATION_MANAGER_H_