blob: 91eb11599d694424a7a31c29c2bdcac92e1003e7 [file] [log] [blame]
// Copyright 2014 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_RENDERER_CORE_FRAME_REMOTE_FRAME_VIEW_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_REMOTE_FRAME_VIEW_H_
#include <optional>
#include "base/check.h"
#include "base/time/time.h"
#include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom-blink.h"
#include "third_party/blink/renderer/core/frame/embedded_content_view.h"
#include "third_party/blink/renderer/core/frame/frame_view.h"
#include "third_party/blink/renderer/core/layout/intrinsic_sizing_info.h"
#include "third_party/blink/renderer/core/paint/paint_flags.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/heap/member.h"
#include "ui/gfx/geometry/rect.h"
namespace cc {
class PaintCanvas;
}
namespace gfx {
class Vector2d;
}
namespace blink {
class CullRect;
class GraphicsContext;
class LocalFrameView;
class RemoteFrame;
class RemoteFrameView final : public GarbageCollected<RemoteFrameView>,
public FrameView {
public:
explicit RemoteFrameView(RemoteFrame*);
~RemoteFrameView() override;
void AttachToLayout() override;
void DetachFromLayout() override;
LocalFrameView* ParentFrameView() const override;
LayoutEmbeddedContent* GetLayoutEmbeddedContent() const override;
RemoteFrame& GetFrame() const {
DCHECK(remote_frame_);
return *remote_frame_;
}
void Dispose() override;
void SetFrameRect(const gfx::Rect&) override;
void PropagateFrameRects() override;
void ZoomChanged(float zoom_factor) override;
void Paint(GraphicsContext&,
PaintFlags,
const CullRect&,
const gfx::Vector2d& paint_offset) const override;
void UpdateGeometry() override;
void Hide() override;
void Show() override;
bool UpdateViewportIntersectionsForSubtree(
unsigned parent_flags,
std::optional<base::TimeTicks>&) override;
void SetNeedsOcclusionTracking(bool);
bool NeedsOcclusionTracking() const { return needs_occlusion_tracking_; }
bool GetIntrinsicSizingInfo(IntrinsicSizingInfo&) const override;
void SetIntrinsicSizeInfo(const IntrinsicSizingInfo& size_info);
bool HasIntrinsicSizingInfo() const override;
bool CanThrottleRendering() const override;
void VisibilityForThrottlingChanged() override;
void VisibilityChanged(blink::mojom::FrameVisibility visibility) override;
// Compute the interest rect of this frame in its unscrolled space. This may
// be used by the OOPIF's compositor to limit the amount of rastered tiles,
// and reduce the number of paint-ops generated. UpdateCompositingRect must be
// called before the parent frame commits a compositor frame.
void UpdateCompositingRect();
gfx::Rect GetCompositingRect() const { return compositing_rect_; }
void UpdateCompositingScaleFactor();
float GetCompositingScaleFactor() const { return compositing_scale_factor_; }
uint32_t Print(const gfx::Rect&, cc::PaintCanvas*) const;
uint32_t CapturePaintPreview(const gfx::Rect&, cc::PaintCanvas*) const;
void Trace(Visitor*) const override;
void ResetFrozenSize() { frozen_size_ = std::nullopt; }
protected:
bool NeedsViewportOffset() const override { return true; }
// This is used to service IntersectionObservers in an OOPIF child document.
void SetViewportIntersection(const mojom::blink::ViewportIntersectionState&
intersection_state) override;
void ParentVisibleChanged() override;
private:
// This function returns the LocalFrameView associated with the parent frame's
// local root, or nullptr if the parent frame is not a local frame. For
// portals, this will return the local root associated with the portal's
// owner.
LocalFrameView* ParentLocalRootFrameView() const;
// This provides the rectangle that the embedded compositor should raster
// based on its screen space rect. This takes into account the frame's
// viewport intersection and a buffer area to prevent checkerboarding during
// animations.
gfx::Rect ComputeCompositingRect() const;
// Fetch the frozen size, if any, from the associated LayoutObject.
void UpdateFrozenSize();
// The properties and handling of the cycle between RemoteFrame
// and its RemoteFrameView corresponds to that between LocalFrame
// and LocalFrameView. Please see the LocalFrameView::frame_ comment for
// details.
Member<RemoteFrame> remote_frame_;
mojom::blink::ViewportIntersectionState last_intersection_state_;
gfx::Rect compositing_rect_;
std::optional<gfx::Size> frozen_size_;
float compositing_scale_factor_ = 1.0f;
IntrinsicSizingInfo intrinsic_sizing_info_;
bool has_intrinsic_sizing_info_ = false;
bool needs_occlusion_tracking_ = false;
bool needs_frame_rect_propagation_ = false;
};
template <>
struct DowncastTraits<RemoteFrameView> {
static bool AllowFrom(const EmbeddedContentView& embedded_content_view) {
return !embedded_content_view.IsLocalFrameView() &&
!embedded_content_view.IsPluginView();
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_REMOTE_FRAME_VIEW_H_