diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:20:33 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:28:57 +0000 |
commit | d17ea114e5ef69ad5d5d7413280a13e6428098aa (patch) | |
tree | 2c01a75df69f30d27b1432467cfe7c1467a498da /chromium/third_party/blink/renderer/core/frame/local_frame_view.h | |
parent | 8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (diff) | |
download | qtwebengine-chromium-d17ea114e5ef69ad5d5d7413280a13e6428098aa.tar.gz |
BASELINE: Update Chromium to 67.0.3396.47
Change-Id: Idcb1341782e417561a2473eeecc82642dafda5b7
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/frame/local_frame_view.h')
-rw-r--r-- | chromium/third_party/blink/renderer/core/frame/local_frame_view.h | 1399 |
1 files changed, 1399 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/frame/local_frame_view.h b/chromium/third_party/blink/renderer/core/frame/local_frame_view.h new file mode 100644 index 00000000000..36dee2f49e6 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/frame/local_frame_view.h @@ -0,0 +1,1399 @@ +/* + Copyright (C) 1997 Martin Jones (mjones@kde.org) + (C) 1998 Waldo Bastian (bastian@kde.org) + (C) 1998, 1999 Torben Weis (weis@kde.org) + (C) 1999 Lars Knoll (knoll@kde.org) + (C) 1999 Antti Koivisto (koivisto@kde.org) + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights + reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_VIEW_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_VIEW_H_ + +#include <memory> +#include <utility> + +#include "third_party/blink/public/platform/shape_properties.h" +#include "third_party/blink/public/platform/web_display_mode.h" +#include "third_party/blink/public/platform/web_rect.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/dom/document_lifecycle.h" +#include "third_party/blink/renderer/core/frame/frame_view.h" +#include "third_party/blink/renderer/core/frame/frame_view_auto_size_info.h" +#include "third_party/blink/renderer/core/frame/layout_subtree_root_list.h" +#include "third_party/blink/renderer/core/frame/root_frame_viewport.h" +#include "third_party/blink/renderer/core/layout/map_coordinates_flags.h" +#include "third_party/blink/renderer/core/layout/scroll_anchor.h" +#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" +#include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h" +#include "third_party/blink/renderer/core/paint/object_paint_properties.h" +#include "third_party/blink/renderer/core/paint/paint_invalidation_capable_scrollable_area.h" +#include "third_party/blink/renderer/core/paint/paint_phase.h" +#include "third_party/blink/renderer/core/paint/scrollbar_manager.h" +#include "third_party/blink/renderer/platform/geometry/int_rect.h" +#include "third_party/blink/renderer/platform/geometry/layout_rect.h" +#include "third_party/blink/renderer/platform/graphics/color.h" +#include "third_party/blink/renderer/platform/graphics/compositor_element_id.h" +#include "third_party/blink/renderer/platform/graphics/graphics_layer_client.h" +#include "third_party/blink/renderer/platform/graphics/paint/property_tree_state.h" +#include "third_party/blink/renderer/platform/platform_frame_view.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" +#include "third_party/blink/renderer/platform/scroll/scroll_types.h" +#include "third_party/blink/renderer/platform/scroll/scrollbar.h" +#include "third_party/blink/renderer/platform/scroll/smooth_scroll_sequencer.h" +#include "third_party/blink/renderer/platform/ukm_time_aggregator.h" +#include "third_party/blink/renderer/platform/wtf/allocator.h" +#include "third_party/blink/renderer/platform/wtf/auto_reset.h" +#include "third_party/blink/renderer/platform/wtf/forward.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class AXObjectCache; +class Cursor; +class DocumentLifecycle; +class Element; +class ElementVisibilityObserver; +class Frame; +class FloatSize; +class IntRect; +class JSONArray; +class JSONObject; +class LayoutEmbeddedContent; +class LocalFrame; +class KURL; +class Node; +class LayoutAnalyzer; +class LayoutBox; +class LayoutEmbeddedObject; +class LayoutObject; +class LayoutReplaced; +class LayoutScrollbarPart; +class LayoutView; +class PaintArtifactCompositor; +class PaintController; +class Page; +class PrintContext; +class ScrollingCoordinator; +class ScrollingCoordinatorContext; +class TracedValue; +class TransformState; +class WebPluginContainerImpl; +struct AnnotatedRegionValue; +struct IntrinsicSizingInfo; +struct WebScrollIntoViewParams; + +typedef unsigned long long DOMTimeStamp; + +class CORE_EXPORT LocalFrameView final + : public GarbageCollectedFinalized<LocalFrameView>, + public PlatformFrameView, + public FrameView, + public PaintInvalidationCapableScrollableArea { + USING_GARBAGE_COLLECTED_MIXIN(LocalFrameView); + + friend class PaintControllerPaintTestBase; + friend class Internals; + friend class LayoutEmbeddedContent; // for invalidateTreeIfNeeded + + public: + static LocalFrameView* Create(LocalFrame&); + static LocalFrameView* Create(LocalFrame&, const IntSize& initial_size); + + ~LocalFrameView() override; + + void Invalidate() { InvalidateRect(IntRect(0, 0, Width(), Height())); } + void InvalidateRect(const IntRect&); + void SetFrameRect(const IntRect&) override; + IntRect FrameRect() const override { return IntRect(Location(), Size()); } + IntPoint Location() const; + int X() const { return Location().X(); } + int Y() const { return Location().Y(); } + int Width() const { return Size().Width(); } + int Height() const { return Size().Height(); } + IntSize Size() const { return frame_rect_.Size(); } + void Resize(int width, int height) { Resize(IntSize(width, height)); } + void Resize(const IntSize& size) { + SetFrameRect(IntRect(frame_rect_.Location(), size)); + } + + // Called when our frame rect changes (or the rect/scroll offset of an + // ancestor changes). + void FrameRectsChanged() override; + + LocalFrame& GetFrame() const { + DCHECK(frame_); + return *frame_; + } + + Page* GetPage() const; + + LayoutView* GetLayoutView() const; + + // If false, prevents scrollbars on the viewport even if web content would + // make them appear. Also prevents user-input scrolls (but not programmatic + // scrolls). + // This API is root-layer-scrolling-aware (affects root PLSA in RLS mode). + void SetCanHaveScrollbars(bool); + bool CanHaveScrollbars() const { return can_have_scrollbars_; } + + Scrollbar* CreateScrollbar(ScrollbarOrientation) override; + + void SnapAfterScrollbarDragging(ScrollbarOrientation) override; + + void SetLayoutOverflowSize(const IntSize&); + + void UpdateLayout(); + bool DidFirstLayout() const; + bool LifecycleUpdatesActive() const; + void ScheduleRelayout(); + void ScheduleRelayoutOfSubtree(LayoutObject*); + bool LayoutPending() const; + bool IsInPerformLayout() const; + + void ClearLayoutSubtreeRoot(const LayoutObject&); + void AddOrthogonalWritingModeRoot(LayoutBox&); + void RemoveOrthogonalWritingModeRoot(LayoutBox&); + bool HasOrthogonalWritingModeRoots() const; + void LayoutOrthogonalWritingModeRoots(); + void ScheduleOrthogonalWritingModeRootsForLayout(); + int LayoutCount() const { return layout_count_; } + + void CountObjectsNeedingLayout(unsigned& needs_layout_objects, + unsigned& total_objects, + bool& is_partial); + + bool NeedsLayout() const; + bool CheckDoesNotNeedLayout() const; + void SetNeedsLayout(); + + void SetNeedsUpdateGeometries() { needs_update_geometries_ = true; } + void UpdateGeometry() override; + + // Marks this frame, and ancestor frames, as needing one intersection + // observervation. This overrides throttling for one frame, up to + // kLayoutClean. + void SetNeedsIntersectionObservation(); + // Marks this frame, and ancestor frames, as needing a mandatory compositing + // update. This overrides throttling for one frame, up to kCompositingClean. + void SetNeedsForcedCompositingUpdate(); + void ResetNeedsForcedCompositingUpdate() { + needs_forced_compositing_update_ = false; + } + + // Methods for getting/setting the size Blink should use to layout the + // contents. + // NOTE: Scrollbar exclusion is based on the LocalFrameView's scrollbars. To + // exclude scrollbars on the root PaintLayer, use LayoutView::layoutSize. + IntSize GetLayoutSize(IncludeScrollbarsInRect = kExcludeScrollbars) const; + void SetLayoutSize(const IntSize&); + + // If this is set to false, the layout size will need to be explicitly set by + // the owner. E.g. WebViewImpl sets its mainFrame's layout size manually + void SetLayoutSizeFixedToFrameSize(bool); + bool LayoutSizeFixedToFrameSize() { return layout_size_fixed_to_frame_size_; } + + void SetInitialViewportSize(const IntSize&); + int InitialViewportWidth() const; + int InitialViewportHeight() const; + + bool GetIntrinsicSizingInfo(IntrinsicSizingInfo&) const override; + bool HasIntrinsicSizingInfo() const override; + + void UpdateAcceleratedCompositingSettings(); + + void RecalcOverflowAfterStyleChange(); + void UpdateCountersAfterStyleChange(); + + bool IsEnclosedInCompositingLayer() const; + + void Dispose() override; + void DetachScrollbars(); + void RecalculateCustomScrollbarStyle(); + void InvalidateAllCustomScrollbarsOnActiveChanged(); + + // True if the LocalFrameView's base background color is completely opaque. + bool HasOpaqueBackground() const; + + Color BaseBackgroundColor() const; + void SetBaseBackgroundColor(const Color&); + void UpdateBaseBackgroundColorRecursively(const Color&); + + void AdjustViewSize(); + void AdjustViewSizeAndLayout(); + + // Scale used to convert incoming input events. + float InputEventsScaleFactor() const; + + // Scale used to convert incoming input events while emulating device metics. + void SetInputEventsScaleForEmulation(float); + + void DidChangeScrollOffset(); + void DidUpdateElasticOverscroll(); + + void ViewportSizeChanged(bool width_changed, bool height_changed); + void MarkViewportConstrainedObjectsForLayout(bool width_changed, + bool height_changed); + + AtomicString MediaType() const; + void SetMediaType(const AtomicString&); + void AdjustMediaTypeForPrinting(bool printing); + + WebDisplayMode DisplayMode() { return display_mode_; } + void SetDisplayMode(WebDisplayMode); + + DisplayShape GetDisplayShape() { return display_shape_; } + void SetDisplayShape(DisplayShape); + + // Fixed-position objects. + typedef HashSet<LayoutObject*> ViewportConstrainedObjectSet; + void AddViewportConstrainedObject(LayoutObject&); + void RemoveViewportConstrainedObject(LayoutObject&); + const ViewportConstrainedObjectSet* ViewportConstrainedObjects() const { + return viewport_constrained_objects_.get(); + } + bool HasViewportConstrainedObjects() const { + return viewport_constrained_objects_ && + viewport_constrained_objects_->size() > 0; + } + + // Objects with background-attachment:fixed. + void AddBackgroundAttachmentFixedObject(LayoutObject*); + void RemoveBackgroundAttachmentFixedObject(LayoutObject*); + bool HasBackgroundAttachmentFixedObjects() const { + return background_attachment_fixed_objects_.size(); + } + bool HasBackgroundAttachmentFixedDescendants(const LayoutObject&) const; + void InvalidateBackgroundAttachmentFixedDescendants(const LayoutObject&); + + void HandleLoadCompleted(); + + void UpdateDocumentAnnotatedRegions() const; + + void DidAttachDocument(); + + void RestoreScrollbar(); + + void PostLayoutTimerFired(TimerBase*); + + bool SafeToPropagateScrollToParent() const { + return safe_to_propagate_scroll_to_parent_; + } + void SetSafeToPropagateScrollToParent(bool is_safe) { + safe_to_propagate_scroll_to_parent_ = is_safe; + } + + void AddPartToUpdate(LayoutEmbeddedObject&); + + Color DocumentBackgroundColor() const; + + // Called when this view is going to be removed from its owning + // LocalFrame. + void WillBeRemovedFromFrame(); + + // Run all needed lifecycle stages. After calling this method, all frames will + // be in the lifecycle state PaintClean. If lifecycle throttling is allowed + // (see DocumentLifecycle::AllowThrottlingScope), some frames may skip the + // lifecycle update (e.g., based on visibility) and will not end up being + // PaintClean. + void UpdateAllLifecyclePhases(); + + // Everything except paint (the last phase). + bool UpdateAllLifecyclePhasesExceptPaint(); + + // Printing needs everything up-to-date except paint (which will be done + // specially). We may also print a detached frame or a descendant of a + // detached frame and need special handling of the frame. + void UpdateLifecyclePhasesForPrinting(); + + // Computes the style, layout, compositing and pre-paint lifecycle stages + // if needed. + // After calling this method, all frames will be in a lifecycle + // state >= PrePaintClean, unless the frame was throttled or inactive. + // Returns whether the lifecycle was successfully updated to the + // desired state. + bool UpdateLifecycleToPrePaintClean(); + + // After calling this method, all frames will be in a lifecycle + // state >= CompositingClean, and scrolling has been updated (unless + // throttling is allowed), unless the frame was throttled or inactive. + // Returns whether the lifecycle was successfully updated to the + // desired state. + bool UpdateLifecycleToCompositingCleanPlusScrolling(); + + // Computes the style, layout, and compositing inputs lifecycle stages if + // needed. After calling this method, all frames will be in a lifecycle state + // >= CompositingInputsClean, unless the frame was throttled or inactive. + // Returns whether the lifecycle was successfully updated to the + // desired state. + bool UpdateLifecycleToCompositingInputsClean(); + + // Computes only the style and layout lifecycle stages. + // After calling this method, all frames will be in a lifecycle + // state >= LayoutClean, unless the frame was throttled or inactive. + // Returns whether the lifecycle was successfully updated to the + // desired state. + bool UpdateLifecycleToLayoutClean(); + + void ScheduleVisualUpdateForPaintInvalidationIfNeeded(); + + bool InvalidateViewportConstrainedObjects(); + + void IncrementLayoutObjectCount() { layout_object_counter_.Increment(); } + void IncrementVisuallyNonEmptyCharacterCount(unsigned); + void IncrementVisuallyNonEmptyPixelCount(const IntSize&); + bool IsVisuallyNonEmpty() const { return is_visually_non_empty_; } + void SetIsVisuallyNonEmpty() { is_visually_non_empty_ = true; } + void EnableAutoSizeMode(const IntSize& min_size, const IntSize& max_size); + void DisableAutoSizeMode(); + + void ForceLayoutForPagination(const FloatSize& page_size, + const FloatSize& original_page_size, + float maximum_shrink_factor); + + enum UrlFragmentBehavior { kUrlFragmentScroll, kUrlFragmentDontScroll }; + // Updates the fragment anchor element based on URL's fragment identifier. + // Updates corresponding ':target' CSS pseudo class on the anchor element. + // If |UrlFragmentScroll| is passed it sets the anchor element so that it + // will be focused and scrolled into view during layout. The scroll offset is + // maintained during the frame loading process. + void ProcessUrlFragment(const KURL&, + UrlFragmentBehavior = kUrlFragmentScroll); + void ClearFragmentAnchor(); + + // Methods to convert points and rects between the coordinate space of the + // layoutObject, and this view. + IntRect ConvertFromLayoutObject(const LayoutObject&, const IntRect&) const; + IntRect ConvertToLayoutObject(const LayoutObject&, const IntRect&) const; + IntPoint ConvertFromLayoutObject(const LayoutObject&, const IntPoint&) const; + IntPoint ConvertToLayoutObject(const LayoutObject&, const IntPoint&) const; + LayoutPoint ConvertFromLayoutObject(const LayoutObject&, + const LayoutPoint&) const; + LayoutPoint ConvertToLayoutObject(const LayoutObject&, + const LayoutPoint&) const; + FloatPoint ConvertToLayoutObject(const LayoutObject&, + const FloatPoint&) const; + + bool IsFrameViewScrollCorner(LayoutScrollbarPart* scroll_corner) const { + return scroll_corner_ == scroll_corner; + } + + enum ScrollingReasons { + kScrollable, + kNotScrollableNoOverflow, + kNotScrollableNotVisible, + kNotScrollableExplicitlyDisabled + }; + + ScrollingReasons GetScrollingReasons() const; + bool IsScrollable() const override; + bool IsProgrammaticallyScrollable() override; + + IntPoint LastKnownMousePosition() const override; + bool ShouldSetCursor() const; + + void SetCursor(const Cursor&); + + bool ScrollbarsCanBeActive() const override; + void ScrollbarVisibilityChanged() override; + void ScrollbarFrameRectChanged() override; + + // FIXME: Remove this method once plugin loading is decoupled from layout. + void FlushAnyPendingPostLayoutTasks(); + + bool ShouldSuspendScrollAnimations() const override; + void ScrollbarStyleChanged() override; + + static void SetInitialTracksPaintInvalidationsForTesting(bool); + + // These methods are for testing. + void SetTracksPaintInvalidations(bool); + bool IsTrackingPaintInvalidations() const { + return tracked_object_paint_invalidations_.get(); + } + void TrackObjectPaintInvalidation(const DisplayItemClient&, + PaintInvalidationReason); + std::unique_ptr<JSONArray> TrackedObjectPaintInvalidationsAsJSON() const; + + using ScrollableAreaSet = HeapHashSet<Member<ScrollableArea>>; + void AddScrollableArea(ScrollableArea*); + void RemoveScrollableArea(ScrollableArea*); + const ScrollableAreaSet* ScrollableAreas() const { + return scrollable_areas_.Get(); + } + + void AddAnimatingScrollableArea(ScrollableArea*); + void RemoveAnimatingScrollableArea(ScrollableArea*); + const ScrollableAreaSet* AnimatingScrollableAreas() const { + return animating_scrollable_areas_.Get(); + } + + // With CSS style "resize:" enabled, a little resizer handle will appear at + // the bottom right of the object. We keep track of these resizer areas for + // checking if touches (implemented using Scroll gesture) are targeting the + // resizer. + typedef HashSet<LayoutBox*> ResizerAreaSet; + void AddResizerArea(LayoutBox&); + void RemoveResizerArea(LayoutBox&); + const ResizerAreaSet* ResizerAreas() const { return resizer_areas_.get(); } + + bool ShouldUseIntegerScrollOffset() const override; + + bool IsActive() const override; + + // Override scrollbar notifications to update the AXObject cache. + void DidAddScrollbar(Scrollbar&, ScrollbarOrientation) override; + + // FIXME: This should probably be renamed as the 'inSubtreeLayout' parameter + // passed around the LocalFrameView layout methods can be true while this + // returns false. + bool IsSubtreeLayout() const { return !layout_subtree_root_list_.IsEmpty(); } + + // Sets the tickmarks for the LocalFrameView, overriding the default behavior + // which is to display the tickmarks corresponding to find results. + // If |m_tickmarks| is empty, the default behavior is restored. + void SetTickmarks(const Vector<IntRect>& tickmarks) { + tickmarks_ = tickmarks; + InvalidatePaintForTickmarks(); + } + + void InvalidatePaintForTickmarks(); + + IntSize MaximumScrollOffsetInt() const override; + + // ScrollableArea interface + void GetTickmarks(Vector<IntRect>&) const override; + IntRect ScrollableAreaBoundingBox() const override; + CompositorElementId GetCompositorElementId() const override; + bool ScrollAnimatorEnabled() const override; + bool ShouldScrollOnMainThread() const override; + PaintLayer* Layer() const override; + GraphicsLayer* LayerForScrolling() const override; + GraphicsLayer* LayerForHorizontalScrollbar() const override; + GraphicsLayer* LayerForVerticalScrollbar() const override; + GraphicsLayer* LayerForScrollCorner() const override; + int ScrollSize(ScrollbarOrientation) const override; + bool IsScrollCornerVisible() const override; + bool UpdateAfterCompositingChange() override; + bool UserInputScrollable(ScrollbarOrientation) const override; + bool ShouldPlaceVerticalScrollbarOnLeft() const override; + bool ScheduleAnimation() override; + CompositorAnimationHost* GetCompositorAnimationHost() const override; + CompositorAnimationTimeline* GetCompositorAnimationTimeline() const override; + LayoutBox* GetLayoutBox() const override; + FloatQuad LocalToVisibleContentQuad(const FloatQuad&, + const LayoutObject*, + unsigned = 0) const final; + scoped_refptr<base::SingleThreadTaskRunner> GetTimerTaskRunner() const final; + + LayoutRect ScrollIntoView(const LayoutRect& rect_in_absolute, + const WebScrollIntoViewParams& params) override; + + // The window that hosts the LocalFrameView. The LocalFrameView will + // communicate scrolls and repaints to the host window in the window's + // coordinate space. + PlatformChromeClient* GetChromeClient() const override; + + SmoothScrollSequencer* GetSmoothScrollSequencer() const override; + + // Functions for child manipulation and inspection. + bool IsSelfVisible() const { + return self_visible_; + } // Whether or not we have been explicitly marked as visible or not. + bool IsParentVisible() const { + return parent_visible_; + } // Whether or not our parent is visible. + bool IsVisible() const { + return self_visible_ && parent_visible_; + } // Whether or not we are actually visible. + void SetParentVisible(bool) override; + void SetSelfVisible(bool v) { self_visible_ = v; } + void AttachToLayout() override; + void DetachFromLayout() override; + bool IsAttached() const override { return is_attached_; } + using PluginSet = HeapHashSet<Member<WebPluginContainerImpl>>; + const PluginSet& Plugins() const { return plugins_; } + void AddPlugin(WebPluginContainerImpl*); + // Custom scrollbars in PaintLayerScrollableArea need to be called with + // StyleChanged whenever window focus is changed. + void RemoveScrollbar(Scrollbar*); + void AddScrollbar(Scrollbar*); + + // If the scroll view does not use a native widget, then it will have + // cross-platform Scrollbars. These functions can be used to obtain those + // scrollbars. + Scrollbar* HorizontalScrollbar() const override { + return scrollbar_manager_.HorizontalScrollbar(); + } + Scrollbar* VerticalScrollbar() const override { + return scrollbar_manager_.VerticalScrollbar(); + } + LayoutScrollbarPart* ScrollCorner() const override { return scroll_corner_; } + + void PositionScrollbarLayers(); + + // Functions for setting and retrieving the scrolling mode in each axis + // (horizontal/vertical). The mode has values of AlwaysOff, AlwaysOn, and + // Auto. AlwaysOff means never show a scrollbar, AlwaysOn means always show a + // scrollbar. Auto means show a scrollbar only when one is needed. + // Note that for platforms with native widgets, these modes are considered + // advisory. In other words the underlying native widget may choose not to + // honor the requested modes. + void SetScrollbarModes(ScrollbarMode horizontal_mode, + ScrollbarMode vertical_mode); + void SetHorizontalScrollbarMode(ScrollbarMode mode) { + SetScrollbarModes(mode, vertical_scrollbar_mode_); + } + void SetVerticalScrollbarMode(ScrollbarMode mode) { + SetScrollbarModes(horizontal_scrollbar_mode_, mode); + } + ScrollbarMode EffectiveHorizontalScrollbarMode() const; + ScrollbarMode EffectiveVerticalScrollbarMode() const; + + // The visible content rect has a location that is the scrolled offset of + // the document. The width and height are the layout viewport width and + // height. By default the scrollbars themselves are excluded from this + // rectangle, but an optional boolean argument allows them to be included. + IntRect VisibleContentRect( + IncludeScrollbarsInRect = kExcludeScrollbars) const override; + IntSize VisibleContentSize( + IncludeScrollbarsInRect = kExcludeScrollbars) const; + + // The visible scroll snapport rect is contracted from the visible content + // rect, by the amount of the document's scroll-padding. + LayoutRect VisibleScrollSnapportRect() const override; + + // Clips the provided rect to the visible content area. For this purpose, we + // also query the chrome client for any active overrides to the visible area + // (e.g. DevTool's viewport override). + void ClipPaintRect(FloatRect*) const; + + // Functions for getting/setting the size of the document contained inside the + // LocalFrameView (as an IntSize or as individual width and height values). + // Always at least as big as the visibleWidth()/visibleHeight(). + IntSize ContentsSize() const override; + int ContentsWidth() const { return ContentsSize().Width(); } + int ContentsHeight() const { return ContentsSize().Height(); } + + // Functions for querying the current scrolled offset (both as a point, a + // size, or as individual X and Y values). Be careful in using the Float + // version getScrollOffset() and getScrollOffset(). They are meant to be used + // to communicate the fractional scroll offset with chromium compositor which + // can do sub-pixel positioning. Do not call these if the scroll offset is + // used in Blink for positioning. Use the Int version instead. + IntSize ScrollOffsetInt() const override { + return ToIntSize(VisibleContentRect().Location()); + } + ScrollOffset GetScrollOffset() const override { return scroll_offset_; } + ScrollOffset PendingScrollDelta() const { return pending_scroll_delta_; } + IntSize MinimumScrollOffsetInt() + const override; // The minimum offset we can be scrolled to. + int ScrollX() const { return ScrollOffsetInt().Width(); } + int ScrollY() const { return ScrollOffsetInt().Height(); } + + // Scroll the actual contents of the view (either blitting or invalidating as + // needed). + void ScrollContents(const IntSize& scroll_delta); + + // This gives us a means of blocking updating our scrollbars until the first + // layout has occurred. + void SetScrollbarsSuppressed(bool suppressed) { + scrollbars_suppressed_ = suppressed; + } + bool ScrollbarsSuppressed() const { return scrollbars_suppressed_; } + + // Indicates the root layer's scroll offset changed since the last frame + void SetRootLayerDidScroll() { root_layer_did_scroll_ = true; } + + // Methods for converting between this frame and other coordinate spaces. + // For definitions and an explanation of the varous spaces, please see: + // http://www.chromium.org/developers/design-documents/blink-coordinate-spaces + // WARNING: With --root-layer-scrolling, these become ambiguous since content + // coordinates mean something different. These will eventually be replaced, + // see comments below about writing RLS agnostic conversions. + IntPoint RootFrameToContents(const IntPoint&) const; + FloatPoint RootFrameToContents(const FloatPoint&) const; + LayoutPoint RootFrameToContents(const LayoutPoint&) const; + IntRect RootFrameToContents(const IntRect&) const; + IntPoint ContentsToRootFrame(const IntPoint&) const; + LayoutPoint ContentsToRootFrame(const LayoutPoint&) const; + IntRect ContentsToRootFrame(const IntRect&) const; + + IntRect ViewportToContents(const IntRect&) const; + IntRect ContentsToViewport(const IntRect&) const; + IntPoint ContentsToViewport(const IntPoint&) const; + IntPoint ViewportToContents(const IntPoint&) const; + LayoutPoint ViewportToContents(const LayoutPoint&) const; + + // FIXME: Some external callers expect to get back a rect that's positioned + // in viewport space, but sized in CSS pixels. This is an artifact of the + // old pinch-zoom path. These callers should be converted to expect a rect + // fully in viewport space. crbug.com/459591. + IntPoint SoonToBeRemovedUnscaledViewportToContents(const IntPoint&) const; + + // Methods for converting between Frame and Content (i.e. Document) + // coordinates. Frame coordinates are relative to the top left corner of the + // frame and so they are affected by scroll offset. Content coordinates are + // relative to the document's top left corner and thus are not affected by + // scroll offset. + // WARNING: With --root-layer-scrolling, these become ambiguous since content + // coordinates mean something different. These will eventually be replaced, + // see comments below about writing RLS agnostic conversions. + IntPoint ContentsToFrame(const IntPoint&) const; + LayoutPoint ContentsToFrame(const LayoutPoint&) const; + FloatPoint ContentsToFrame(const FloatPoint&) const; + IntRect ContentsToFrame(const IntRect&) const; + IntPoint FrameToContents(const IntPoint&) const; + FloatPoint FrameToContents(const FloatPoint&) const; + LayoutPoint FrameToContents(const LayoutPoint&) const; + IntRect FrameToContents(const IntRect&) const; + + // Functions for converting to screen coordinates. + IntRect ContentsToScreen(const IntRect&) const; + + // For platforms that need to hit test scrollbars from within the engine's + // event handlers (like Win32). + Scrollbar* ScrollbarAtFramePoint(const IntPoint&); + + // Converts from/to local "frame" coordinates to the root "frame" + // coordinates. Note: with root-layer-scrolls, "frame" coordinates become + // equivalent to "absoltue" coordinates since the LayoutView (same size and + // origin as the frame) clips and scrolls content below it. Without RLS, the + // LayoutView is the size of the entire document and doesn't scroll itself so + // "absolute" means "document". To write RLS agnostic-code, use (or add) the + // methods below these ones. For details, see: + // http://www.chromium.org/developers/design-documents/blink-coordinate-spaces + IntRect ConvertToRootFrame(const IntRect&) const; + IntPoint ConvertToRootFrame(const IntPoint&) const; + LayoutPoint ConvertToRootFrame(const LayoutPoint&) const; + IntRect ConvertFromRootFrame(const IntRect&) const; + IntPoint ConvertFromRootFrame(const IntPoint&) const override; + FloatPoint ConvertFromRootFrame(const FloatPoint&) const; + LayoutPoint ConvertFromRootFrame(const LayoutPoint&) const; + IntPoint ConvertSelfToChild(const EmbeddedContentView&, + const IntPoint&) const; + + // root-layer-scrolls agnostic conversion functions: + // Maps from "absolute" coordinates to root frame coordinates. TODO(bokan) + // This is a temporary shim to hide the difference between root-layer-scrolls + // being on and off. Once RLS is turned on, this becomes (and can be replaced + // with) ConvertToRootFrame since "frame coordinates" == "absolute + // coordinates" in RLS. Without RLS, "absolute coordinates" == "document + // coordinates". https://crbug.com/417782. + IntRect AbsoluteToRootFrame(const IntRect&) const; + IntPoint AbsoluteToRootFrame(const IntPoint&) const; + LayoutRect AbsoluteToRootFrame(const LayoutRect&) const; + IntRect RootFrameToDocument(const IntRect&); + IntPoint RootFrameToDocument(const IntPoint&); + FloatPoint RootFrameToDocument(const FloatPoint&); + LayoutPoint RootFrameToAbsolute(const LayoutPoint&) const; + IntPoint RootFrameToAbsolute(const IntPoint&) const; + IntRect RootFrameToAbsolute(const IntRect&) const; + DoublePoint DocumentToAbsolute(const DoublePoint&) const; + FloatPoint DocumentToAbsolute(const FloatPoint&) const; + LayoutPoint DocumentToAbsolute(const LayoutPoint&) const; + LayoutRect DocumentToAbsolute(const LayoutRect&) const; + + LayoutPoint AbsoluteToDocument(const LayoutPoint&) const; + LayoutRect AbsoluteToDocument(const LayoutRect&) const; + + // Handles painting of the contents of the view as well as the scrollbars. + void Paint(GraphicsContext&, + const GlobalPaintFlags, + const CullRect&, + const IntSize& paint_offset = IntSize()) const override; + // Paints, and also updates the lifecycle to in-paint and paint clean + // beforehand. Call this for painting use-cases outside of the lifecycle. + void PaintWithLifecycleUpdate(GraphicsContext&, + const GlobalPaintFlags, + const CullRect&); + void PaintContents(GraphicsContext&, + const GlobalPaintFlags, + const IntRect& damage_rect); + + void Show() override; + void Hide() override; + + bool IsPointInScrollbarCorner(const IntPoint&); + bool ScrollbarCornerPresent() const; + IntRect ScrollCornerRect() const override; + + IntPoint ConvertFromContainingEmbeddedContentViewToScrollbar( + const Scrollbar&, + const IntPoint&) const override; + + bool IsLocalFrameView() const override { return true; } + + virtual void Trace(blink::Visitor*); + void NotifyPageThatContentAreaWillPaint() const; + + // Returns the scrollable area for the frame. For the root frame, this will + // be the RootFrameViewport, which adds pinch-zoom semantics to scrolling. + // For non-root frames, this will be the the ScrollableArea used by the + // LocalFrameView, depending on whether root-layer-scrolls is enabled. + ScrollableArea* GetScrollableArea(); + + // Used to get at the underlying layoutViewport in the rare instances where + // we actually want to scroll *just* the layout viewport (e.g. when sending + // deltas from CC). For typical scrolling cases, use getScrollableArea(). + ScrollableArea* LayoutViewportScrollableArea(); + + // If this is the main frame, this will return the RootFrameViewport used + // to scroll the main frame. Otherwise returns nullptr. Unless you need a + // unique method on RootFrameViewport, you should probably use + // getScrollableArea. + RootFrameViewport* GetRootFrameViewport(); + + int ViewportWidth() const; + + LayoutAnalyzer* GetLayoutAnalyzer() { return analyzer_.get(); } + + // Returns true if this frame should not render or schedule visual updates. + bool ShouldThrottleRendering() const; + + // Returns true if this frame could potentially skip rendering and avoid + // scheduling visual updates. + bool CanThrottleRendering() const; + bool IsHiddenForThrottling() const { return hidden_for_throttling_; } + void SetupRenderThrottling(); + + // For testing, run pending intersection observer notifications for this + // frame. + void UpdateRenderThrottlingStatusForTesting(); + + void BeginLifecycleUpdates(); + + void SetPreTranslation( + scoped_refptr<TransformPaintPropertyNode> pre_translation) { + pre_translation_ = std::move(pre_translation); + } + TransformPaintPropertyNode* PreTranslation() const { + return pre_translation_.get(); + } + void SetScrollNode(scoped_refptr<ScrollPaintPropertyNode> scroll_node) { + scroll_node_ = std::move(scroll_node); + } + ScrollPaintPropertyNode* ScrollNode() const { return scroll_node_.get(); } + void SetScrollTranslation( + scoped_refptr<TransformPaintPropertyNode> scroll_translation) { + scroll_translation_ = std::move(scroll_translation); + } + TransformPaintPropertyNode* ScrollTranslation() const { + return scroll_translation_.get(); + } + void SetContentClip(scoped_refptr<ClipPaintPropertyNode> content_clip) { + content_clip_ = std::move(content_clip); + } + ClipPaintPropertyNode* ContentClip() const { return content_clip_.get(); } + + // The property tree state that should be used for painting contents. These + // properties are either created by this LocalFrameView or are inherited from + // an ancestor. + void SetTotalPropertyTreeStateForContents( + std::unique_ptr<PropertyTreeState> state) { + total_property_tree_state_for_contents_ = std::move(state); + } + const PropertyTreeState* TotalPropertyTreeStateForContents() const { + return total_property_tree_state_for_contents_.get(); + } + + // The property tree state that should be used for painting scrollbars etc. + // for which no content clip or scroll should be applied. + PropertyTreeState PreContentClipProperties() const { + DCHECK(!RuntimeEnabledFeatures::RootLayerScrollingEnabled()); + DCHECK(total_property_tree_state_for_contents_); + return PropertyTreeState( + PreTranslation(), + total_property_tree_state_for_contents_->Clip()->Parent(), + total_property_tree_state_for_contents_->Effect()); + } + + // Paint properties (e.g., m_preTranslation, etc.) are built from the + // LocalFrameView's state (e.g., x(), y(), etc.) as well as inherited context. + // When these inputs change, setNeedsPaintPropertyUpdate will cause a paint + // property tree update during the next document lifecycle update. + // setNeedsPaintPropertyUpdate also sets the owning layout tree as needing a + // paint property update. + void SetNeedsPaintPropertyUpdate(); +#if DCHECK_IS_ON() + // Similar to setNeedsPaintPropertyUpdate() but does not set the owning layout + // tree as needing a paint property update. + void SetOnlyThisNeedsPaintPropertyUpdateForTesting() { + needs_paint_property_update_ = true; + } +#endif + void ClearNeedsPaintPropertyUpdate() { + DCHECK_EQ(Lifecycle().GetState(), DocumentLifecycle::kInPrePaint); + needs_paint_property_update_ = false; + } + bool NeedsPaintPropertyUpdate() const { return needs_paint_property_update_; } + + // Set when the whole frame subtree needs full paint property update, + // e.g. when beginning or finishing printing. + void SetSubtreeNeedsPaintPropertyUpdate(); + + // Viewport size that should be used for viewport units (i.e. 'vh'/'vw'). + // May include the size of browser controls. See implementation for further + // documentation. + FloatSize ViewportSizeForViewportUnits() const; + + // Initial containing block size for evaluating viewport-dependent media + // queries. + FloatSize ViewportSizeForMediaQueries() const; + + bool RestoreScrollAnchor(const SerializedAnchor&) override; + ScrollAnchor* GetScrollAnchor() override { return &scroll_anchor_; } + void ClearScrollAnchor(); + bool ShouldPerformScrollAnchoring() const override; + void EnqueueScrollAnchoringAdjustment(ScrollableArea*); + void DequeueScrollAnchoringAdjustment(ScrollableArea*); + void PerformScrollAnchoringAdjustments(); + + // Only for SPv2. + std::unique_ptr<JSONObject> CompositedLayersAsJSON(LayerTreeFlags); + + // Recursively update frame tree. Each frame has its only + // scroll on main reason. Given the following frame tree + // .. A... + // ../.\.. + // .B...C. + // .|..... + // .D..... + // If B has fixed background-attachment but other frames + // don't, both A and C should scroll on cc. Frame D should + // scrolled on main thread as its ancestor B. + void UpdateSubFrameScrollOnMainReason(const Frame&, + MainThreadScrollingReasons); + String MainThreadScrollingReasonsAsText(); + // Main thread scrolling reasons including reasons from ancestors. + MainThreadScrollingReasons GetMainThreadScrollingReasons() const; + // Main thread scrolling reasons for this object only. For all reasons, + // see: mainThreadScrollingReasons(). + MainThreadScrollingReasons MainThreadScrollingReasonsPerFrame() const; + + bool HasVisibleSlowRepaintViewportConstrainedObjects() const; + + // Called on a view for a LocalFrame with a RemoteFrame parent. This makes + // viewport intersection available that accounts for remote ancestor frames + // and their respective scroll positions, clips, etc. + void SetViewportIntersectionFromParent(const IntRect&); + IntRect RemoteViewportIntersection(); + + // This method uses localToAncestorQuad to map a rect into an ancestor's + // coordinate space, while guaranteeing that the top-level scroll offset + // is accounted for. This is needed because LayoutView::mapLocalToAncestor() + // implicitly includes the ancestor frame's scroll offset when there is + // a remote frame in the ancestor chain, but does not include it when + // there are only local frames in the frame tree. + void MapQuadToAncestorFrameIncludingScrollOffset( + LayoutRect&, + const LayoutObject* descendant, + const LayoutView* ancestor, + MapCoordinatesFlags mode); + + bool MapToVisualRectInTopFrameSpace(LayoutRect&); + + void ApplyTransformForTopFrameSpace(TransformState&); + + void CrossOriginStatusChanged(); + + // The visual viewport can supply scrollbars which affect the existence of + // our scrollbars (see: computeScrollbarExistence). + void VisualViewportScrollbarsChanged(); + + LayoutUnit CaretWidth() const; + + size_t PaintFrameCount() const { return paint_frame_count_; }; + + // Return the ScrollableArea in a FrameView with the given ElementId, if any. + // This is not recursive and will only return ScrollableAreas owned by this + // LocalFrameView (or possibly the LocalFrameView itself). + ScrollableArea* ScrollableAreaWithElementId(const CompositorElementId&); + + // When the frame is a local root and not a main frame, any recursive + // scrolling should continue in the parent process. + void ScrollRectToVisibleInRemoteParent(const LayoutRect&, + const WebScrollIntoViewParams&); + + PaintArtifactCompositor* GetPaintArtifactCompositorForTesting() { + DCHECK(RuntimeEnabledFeatures::SlimmingPaintV2Enabled()); + return paint_artifact_compositor_.get(); + } + + ScrollbarTheme& GetPageScrollbarTheme() const override; + + enum ForceThrottlingInvalidationBehavior { + kDontForceThrottlingInvalidation, + kForceThrottlingInvalidation + }; + enum NotifyChildrenBehavior { kDontNotifyChildren, kNotifyChildren }; + void UpdateRenderThrottlingStatus( + bool hidden, + bool subtree_throttled, + ForceThrottlingInvalidationBehavior = kDontForceThrottlingInvalidation, + NotifyChildrenBehavior = kNotifyChildren); + + // Keeps track of whether the scrollable state for the LocalRoot has changed + // since ScrollingCoordinator last checked. Only ScrollingCoordinator should + // ever call the clearing function. + bool FrameIsScrollableDidChange(); + void ClearFrameIsScrollableDidChange(); + + // Should be called whenever this LocalFrameView adds or removes a + // scrollable area, or gains/loses a composited layer. + void ScrollableAreasDidChange(); + + ScrollingCoordinatorContext* GetScrollingContext() const; + + void ScrollAndFocusFragmentAnchor(); + + protected: + // Scroll the content via the compositor. + bool ScrollContentsFastPath(const IntSize& scroll_delta); + + // Scroll the content by invalidating everything. + void ScrollContentsSlowPath(); + + ScrollBehavior ScrollBehaviorStyle() const override; + + void ScrollContentsIfNeeded(); + void NotifyFrameRectsChangedIfNeeded(); + + enum ComputeScrollbarExistenceOption { kFirstPass, kIncremental }; + void ComputeScrollbarExistence(bool& new_has_horizontal_scrollbar, + bool& new_has_vertical_scrollbar, + const IntSize& doc_size, + ComputeScrollbarExistenceOption = kFirstPass); + void UpdateScrollbarGeometry(); + + // Called to update the scrollbars to accurately reflect the state of the + // view. + void UpdateScrollbars(); + void UpdateScrollbarsIfNeeded(); + + class InUpdateScrollbarsScope { + STACK_ALLOCATED(); + + public: + explicit InUpdateScrollbarsScope(LocalFrameView* view) + : scope_(&view->in_update_scrollbars_, true) {} + + private: + AutoReset<bool> scope_; + }; + + private: + explicit LocalFrameView(LocalFrame&, IntRect); + class ScrollbarManager : public blink::ScrollbarManager { + DISALLOW_NEW(); + + // Helper class to manage the life cycle of Scrollbar objects. + public: + ScrollbarManager(LocalFrameView& scroller) + : blink::ScrollbarManager(scroller) {} + + void SetHasHorizontalScrollbar(bool has_scrollbar) override; + void SetHasVerticalScrollbar(bool has_scrollbar) override; + + // TODO(ymalik): This should be hidden and all calls should go through + // setHas*Scrollbar functions above. + Scrollbar* CreateScrollbar(ScrollbarOrientation) override; + + protected: + void DestroyScrollbar(ScrollbarOrientation) override; + }; + + void PaintInternal(GraphicsContext&, + const GlobalPaintFlags, + const CullRect&) const; + + LocalFrameView* ParentFrameView() const; + LayoutReplaced* EmbeddedReplacedContent() const; + + void UpdateScrollOffset(const ScrollOffset&, ScrollType) override; + + void UpdateScrollbarEnabledState(); + + void DispatchEventsForPrintingOnAllFrames(); + + void SetupPrintContext(); + void ClearPrintContext(); + + // Returns whethre the lifecycle was succesfully updated to the + // target state. + bool UpdateLifecyclePhasesInternal( + DocumentLifecycle::LifecycleState target_state); + + void ScrollContentsIfNeededRecursive(); + void NotifyFrameRectsChangedIfNeededRecursive(); + void UpdateStyleAndLayoutIfNeededRecursive(); + void PrePaint(); + void PaintTree(); + + void UpdateStyleAndLayoutIfNeededRecursiveInternal(); + + void PushPaintArtifactToCompositor( + CompositorElementIdSet& composited_element_ids); + + void Reset(); + void Init(); + + void ClearLayoutSubtreeRootsAndMarkContainingBlocks(); + + bool ContentsInCompositedLayer() const; + + void PerformPreLayoutTasks(); + void PerformLayout(bool in_subtree_layout); + void ScheduleOrPerformPostLayoutTasks(); + void PerformPostLayoutTasks(); + + void RecordDeferredLoadingStats(); + + DocumentLifecycle& Lifecycle() const; + + void ContentsResized() override; + void ScrollbarExistenceMaybeChanged(); + + // Methods to do point conversion via layoutObjects, in order to take + // transforms into account. + IntRect ConvertToContainingEmbeddedContentView(const IntRect&) const; + IntPoint ConvertToContainingEmbeddedContentView(const IntPoint&) const; + LayoutPoint ConvertToContainingEmbeddedContentView(const LayoutPoint&) const; + IntRect ConvertFromContainingEmbeddedContentView(const IntRect&) const; + IntPoint ConvertFromContainingEmbeddedContentView(const IntPoint&) const; + LayoutPoint ConvertFromContainingEmbeddedContentView( + const LayoutPoint&) const; + FloatPoint ConvertFromContainingEmbeddedContentView(const FloatPoint&) const; + DoublePoint ConvertFromContainingEmbeddedContentView( + const DoublePoint&) const; + + void DidChangeGlobalRootScroller() override; + + void UpdateGeometriesIfNeeded(); + + bool WasViewportResized(); + void SendResizeEventIfNeeded(); + + void UpdateParentScrollableAreaSet(); + + void ScheduleUpdatePluginsIfNecessary(); + void UpdatePluginsTimerFired(TimerBase*); + bool UpdatePlugins(); + + bool ProcessUrlFragmentHelper(const String&, UrlFragmentBehavior); + void DidScrollTimerFired(TimerBase*); + + void UpdateLayersAndCompositingAfterScrollIfNeeded(); + + void UpdateCompositedSelectionIfNeeded(); + void SetNeedsCompositingUpdate(CompositingUpdateType); + + // Returns true if the LocalFrameView's own scrollbars overlay its content + // when visible. + bool HasOverlayScrollbars() const; + + // Returns true if the frame should use custom scrollbars. If true, sets + // customScrollbarElement to the element that supplies the scrollbar's style + // information. + bool ShouldUseCustomScrollbars(Element*& custom_scrollbar_element) const; + + // Returns true if a scrollbar needs to go from native -> custom or vice + // versa, or if a custom scrollbar has a stale owner. + bool NeedsScrollbarReconstruction() const; + + bool ShouldIgnoreOverflowHidden() const; + + void UpdateScrollCorner(); + + AXObjectCache* ExistingAXObjectCache() const; + + void SetLayoutSizeInternal(const IntSize&); + + bool AdjustScrollbarExistence(ComputeScrollbarExistenceOption = kFirstPass); + void AdjustScrollbarOpacity(); + void AdjustScrollOffsetFromUpdateScrollbars(); + bool VisualViewportSuppliesScrollbars(); + + ScrollingCoordinator* GetScrollingCoordinator() const; + + void PrepareLayoutAnalyzer(); + std::unique_ptr<TracedValue> AnalyzerCounters(); + + // LayoutObject for the viewport-defining element (see + // Document::viewportDefiningElement). + LayoutObject* ViewportLayoutObject() const; + + void CollectAnnotatedRegions(LayoutObject&, + Vector<AnnotatedRegionValue>&) const; + + template <typename Function> + void ForAllChildViewsAndPlugins(const Function&); + + template <typename Function> + void ForAllChildLocalFrameViews(const Function&); + + template <typename Function> + void ForAllNonThrottledLocalFrameViews(const Function&); + + void UpdateViewportIntersectionsForSubtree( + DocumentLifecycle::LifecycleState) override; + + void NotifyResizeObservers(); + + // PaintInvalidationCapableScrollableArea + LayoutScrollbarPart* Resizer() const override { return nullptr; } + + bool CheckLayoutInvalidationIsAllowed() const; + + PaintController* GetPaintController() { return paint_controller_.get(); } + + void LayoutFromRootObject(LayoutObject& root); + + UkmTimeAggregator& EnsureUkmTimeAggregator(); + + LayoutSize size_; + + typedef HashSet<scoped_refptr<LayoutEmbeddedObject>> EmbeddedObjectSet; + EmbeddedObjectSet part_update_set_; + + Member<LocalFrame> frame_; + Member<LocalFrameView> parent_; + + IntRect frame_rect_; + bool is_attached_; + bool self_visible_; + bool parent_visible_; + + WebDisplayMode display_mode_; + + DisplayShape display_shape_; + + bool can_have_scrollbars_; + + bool has_pending_layout_; + LayoutSubtreeRootList layout_subtree_root_list_; + DepthOrderedLayoutObjectList orthogonal_writing_mode_root_list_; + + bool layout_scheduling_enabled_; + bool in_synchronous_post_layout_; + int layout_count_; + unsigned nested_layout_count_; + TaskRunnerTimer<LocalFrameView> post_layout_tasks_timer_; + TaskRunnerTimer<LocalFrameView> update_plugins_timer_; + + bool first_layout_; + Color base_background_color_; + IntSize last_viewport_size_; + float last_zoom_factor_; + + AtomicString media_type_; + AtomicString media_type_when_not_printing_; + + bool safe_to_propagate_scroll_to_parent_; + + unsigned visually_non_empty_character_count_; + uint64_t visually_non_empty_pixel_count_; + bool is_visually_non_empty_; + FirstMeaningfulPaintDetector::LayoutObjectCounter layout_object_counter_; + + Member<Node> fragment_anchor_; + + // layoutObject to hold our custom scroll corner. + LayoutScrollbarPart* scroll_corner_; + + Member<ScrollableAreaSet> scrollable_areas_; + Member<ScrollableAreaSet> animating_scrollable_areas_; + std::unique_ptr<ResizerAreaSet> resizer_areas_; + std::unique_ptr<ViewportConstrainedObjectSet> viewport_constrained_objects_; + unsigned sticky_position_object_count_; + ViewportConstrainedObjectSet background_attachment_fixed_objects_; + Member<FrameViewAutoSizeInfo> auto_size_info_; + + float input_events_scale_factor_for_emulation_; + + IntSize layout_size_; + IntSize initial_viewport_size_; + bool layout_size_fixed_to_frame_size_; + + TaskRunnerTimer<LocalFrameView> did_scroll_timer_; + + Vector<IntRect> tickmarks_; + + bool needs_update_geometries_; + +#if DCHECK_IS_ON() + // Verified when finalizing. + bool has_been_disposed_ = false; +#endif + + ScrollbarMode horizontal_scrollbar_mode_; + ScrollbarMode vertical_scrollbar_mode_; + + PluginSet plugins_; + HeapHashSet<Member<Scrollbar>> scrollbars_; + + ScrollOffset pending_scroll_delta_; + ScrollOffset scroll_offset_; + + // TODO(bokan): This is unneeded when root-layer-scrolls is turned on. + // crbug.com/417782. + IntSize layout_overflow_size_; + + bool scrollbars_suppressed_; + bool root_layer_did_scroll_; + bool in_update_scrollbars_; + + std::unique_ptr<LayoutAnalyzer> analyzer_; + + // Mark if something has changed in the mapping from Frame to GraphicsLayer + // and the Frame Timing regions should be recalculated. + bool frame_timing_requests_dirty_; + + // Exists only on root frame. + // TODO(bokan): crbug.com/484188. We should specialize LocalFrameView for the + // main frame. + Member<RootFrameViewport> viewport_scrollable_area_; + + // The following members control rendering pipeline throttling for this + // frame. They are only updated in response to intersection observer + // notifications, i.e., not in the middle of the lifecycle. + bool hidden_for_throttling_; + bool subtree_throttled_; + bool lifecycle_updates_throttled_; + + // The hierarchy of transform subtree created by a LocalFrameView. + // [ preTranslation ] The offset from LocalFrameView::FrameRect. + // | Establishes viewport. + // +---[ scrollTranslation ] Frame scrolling. + // TODO(trchen): These will not be needed once settings->rootLayerScrolls() is + // enabled. + scoped_refptr<TransformPaintPropertyNode> pre_translation_; + scoped_refptr<TransformPaintPropertyNode> scroll_translation_; + scoped_refptr<ScrollPaintPropertyNode> scroll_node_; + // The content clip clips the document (= LayoutView) but not the scrollbars. + // TODO(trchen): This will not be needed once settings->rootLayerScrolls() is + // enabled. + scoped_refptr<ClipPaintPropertyNode> content_clip_; + // The property tree state that should be used for painting contents. These + // properties are either created by this LocalFrameView or are inherited from + // an ancestor. + std::unique_ptr<PropertyTreeState> total_property_tree_state_for_contents_; + // Whether the paint properties need to be updated. For more details, see + // LocalFrameView::needsPaintPropertyUpdate(). + bool needs_paint_property_update_; + + // This is set on the local root frame view only. + DocumentLifecycle::LifecycleState + current_update_lifecycle_phases_target_state_; + bool past_layout_lifecycle_update_; + + ScrollAnchor scroll_anchor_; + using AnchoringAdjustmentQueue = + HeapLinkedHashSet<WeakMember<ScrollableArea>>; + AnchoringAdjustmentQueue anchoring_adjustment_queue_; + + // ScrollbarManager holds the Scrollbar instances. + ScrollbarManager scrollbar_manager_; + + bool needs_scrollbars_update_; + bool suppress_adjust_view_size_; + bool allows_layout_invalidation_after_layout_clean_; + bool needs_intersection_observation_; + bool needs_forced_compositing_update_; + + bool needs_focus_on_fragment_; + + Member<ElementVisibilityObserver> visibility_observer_; + + IntRect remote_viewport_intersection_; + + // Lazily created, but should only be created on a local frame root's view. + mutable std::unique_ptr<ScrollingCoordinatorContext> scrolling_context_; + + // For testing. + struct ObjectPaintInvalidation { + String name; + PaintInvalidationReason reason; + }; + std::unique_ptr<Vector<ObjectPaintInvalidation>> + tracked_object_paint_invalidations_; + + // For Slimming Paint v2 only. + std::unique_ptr<PaintController> paint_controller_; + std::unique_ptr<PaintArtifactCompositor> paint_artifact_compositor_; + + MainThreadScrollingReasons main_thread_scrolling_reasons_; + + std::unique_ptr<UkmTimeAggregator> ukm_time_aggregator_; + + Member<PrintContext> print_context_; + + // From the beginning of the document, how many frames have painted. + size_t paint_frame_count_; + + UniqueObjectId unique_id_; + + FRIEND_TEST_ALL_PREFIXES(WebViewTest, DeviceEmulationResetScrollbars); +}; + +inline void LocalFrameView::IncrementVisuallyNonEmptyCharacterCount( + unsigned count) { + if (is_visually_non_empty_) + return; + visually_non_empty_character_count_ += count; + // Use a threshold value to prevent very small amounts of visible content from + // triggering didMeaningfulLayout. The first few hundred characters rarely + // contain the interesting content of the page. + static const unsigned kVisualCharacterThreshold = 200; + if (visually_non_empty_character_count_ > kVisualCharacterThreshold) + SetIsVisuallyNonEmpty(); +} + +inline void LocalFrameView::IncrementVisuallyNonEmptyPixelCount( + const IntSize& size) { + if (is_visually_non_empty_) + return; + visually_non_empty_pixel_count_ += size.Area(); + // Use a threshold value to prevent very small amounts of visible content from + // triggering didMeaningfulLayout. + static const unsigned kVisualPixelThreshold = 32 * 32; + if (visually_non_empty_pixel_count_ > kVisualPixelThreshold) + SetIsVisuallyNonEmpty(); +} + +DEFINE_TYPE_CASTS(LocalFrameView, + PlatformFrameView, + platform_frame_view, + platform_frame_view->IsLocalFrameView(), + platform_frame_view.IsLocalFrameView()); +DEFINE_TYPE_CASTS(LocalFrameView, + EmbeddedContentView, + embedded_content_view, + embedded_content_view->IsLocalFrameView(), + embedded_content_view.IsLocalFrameView()); +DEFINE_TYPE_CASTS(LocalFrameView, + ScrollableArea, + scrollableArea, + scrollableArea->IsLocalFrameView(), + scrollableArea.IsLocalFrameView()); + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_VIEW_H_ |