blob: 0c7e3cce9232b5cceca1234f6db73cc72b016dc5 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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_PAGE_SCROLLING_FRAGMENT_ANCHOR_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_FRAGMENT_ANCHOR_H_
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/scroll/scroll_types.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
namespace blink {
class LocalFrame;
class KURL;
// This class is an interface for the concept of a "fragment anchor". A
// fragment anchor allows a page to link to a specific part of a page by using
// the URL fragment. The fragment is the part after the '#' character. E.g.
// navigating to www.example.com/index.html#section3 will find the element with
// id "section3" and focus and scroll it into view.
//
// This class provides an interface that different types of fragment anchors
// can implement, allowing fragments to specify different kinds of anchors.
// Callers should use the TryCreate static method to create and return the
// appropriate type of base class.
class CORE_EXPORT FragmentAnchor : public GarbageCollected<FragmentAnchor> {
public:
// Parses the fragment string and tries to create a FragmentAnchor object of
// the appropriate derived type. If no anchor could be created from the given
// url, this returns nullptr. In either case, side-effects on the document
// will be performed, for example, setting/clearing :target and svgView().
static FragmentAnchor* TryCreate(const KURL& url,
LocalFrame& frame,
bool should_scroll);
FragmentAnchor() = default;
virtual ~FragmentAnchor() = default;
// Invoking the fragment anchor scrolls it into view and performs any other
// desired actions. This is called repeatedly during loading as the lifecycle
// is updated to keep the element in view. If true, the anchor should be kept
// alive and invoked again. Otherwise it may be disposed.
virtual bool Invoke() = 0;
// This should be called when the anchor is "installed". In other words, when
// the caller receives the FragmentAnchor and stores it. This allows the
// anchor to perform some initialization.
virtual void Installed() = 0;
virtual void DidScroll(mojom::blink::ScrollType type) = 0;
virtual void PerformPreRafActions() = 0;
// Dismissing the fragment anchor removes indicators of the anchor, such as
// text highlighting on a text fragment anchor. If true, the anchor has been
// dismissed and can be disposed.
virtual bool Dismiss() = 0;
virtual void Trace(Visitor*) const {}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_FRAGMENT_ANCHOR_H_