blob: af4ab08d59d55f186d686a80f7ee798f12ece54b [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_FRAME_VIEW_TRANSITION_STATE_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_FRAME_VIEW_TRANSITION_STATE_H_
#include <optional>
#include "base/containers/flat_map.h"
#include "components/viz/common/view_transition_element_resource_id.h"
#include "third_party/blink/public/common/common_export.h"
#include "third_party/blink/public/mojom/frame/view_transition_state.mojom-shared.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/geometry/transform.h"
#include "ui/gfx/geometry/vector2d_f.h"
namespace blink {
// The following two classes represent a view transition state necessary for a
// cross-document same-origin view transition. See
// third_party/blink/public/mojom/frame/view_transition_state.mojom for more
// comments.
struct BLINK_COMMON_EXPORT ViewTransitionElement {
struct LayeredBoxProperties {
gfx::RectF content_box;
gfx::RectF padding_box;
mojom::ViewTransitionElementBoxSizing box_sizing;
};
private:
// IMPORTANT:
// This is private + friends, because it is not meant to be used anywhere
// outside of ViewTransition feature implementation. Do not add friends unless
// it is necessary for view transitions. Data stored here comes from an
// untrusthworthy renderer process and should not be parsed or used by the
// browser process or in the renderer process for non-ViewTransition purposes.
friend class ViewTransitionStyleTracker;
friend struct mojo::StructTraits<blink::mojom::ViewTransitionElementDataView,
ViewTransitionElement>;
std::string tag_name;
gfx::RectF border_box_rect_in_enclosing_layer_css_space;
gfx::Transform viewport_matrix;
gfx::RectF overflow_rect_in_layout_space;
viz::ViewTransitionElementResourceId snapshot_id;
int32_t paint_order = 0;
std::optional<gfx::RectF> captured_rect_in_layout_space;
base::flat_map<blink::mojom::ViewTransitionPropertyId, std::string>
captured_css_properties;
base::flat_map<blink::mojom::ViewTransitionPropertyId, std::string>
group_children_css_properties;
gfx::Vector2d border_offset;
std::vector<std::string> class_list;
std::string containing_group_name;
std::optional<LayeredBoxProperties> layered_box_properties;
};
struct BLINK_COMMON_EXPORT ViewTransitionState {
public:
bool IsValid() const {
return next_element_resource_id !=
viz::ViewTransitionElementResourceId::kInvalidLocalId;
}
bool HasSubframeSnapshot() const { return subframe_snapshot_id.IsValid(); }
private:
// IMPORTANT:
// This is private + friends, because it is not meant to be used anywhere
// outside of ViewTransition feature implementation. Do not add friends unless
// it is necessary for view transitions. Data stored here comes from an
// untrusthworthy renderer process and should not be parsed or used by the
// browser process or in the renderer process for non-ViewTransition purposes.
friend class ViewTransitionStyleTracker;
friend class ViewTransition;
friend struct mojo::StructTraits<blink::mojom::ViewTransitionStateDataView,
ViewTransitionState>;
std::vector<ViewTransitionElement> elements;
ViewTransitionToken transition_token;
gfx::Size snapshot_root_size_at_capture;
float device_pixel_ratio = 1.f;
uint32_t next_element_resource_id =
viz::ViewTransitionElementResourceId::kInvalidLocalId;
viz::ViewTransitionElementResourceId subframe_snapshot_id;
base::flat_map<std::string, std::string> id_to_auto_name_map;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_FRAME_VIEW_TRANSITION_STATE_H_