chromium/content/public/android/java/src/org/chromium/content_public/browser/NavigationController.java

// 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.

package org.chromium.content_public.browser;

import androidx.annotation.Nullable;

/**
 * The NavigationController Java wrapper to allow communicating with the native
 * NavigationController object.
 */
public interface NavigationController {
    /**
     * @return Whether back navigation is possible from the "current entry".
     */
    boolean canGoBack();

    /**
     * @return Whether forward navigation is possible from the "current entry".
     */
    boolean canGoForward();

    /**
     * @param offset The offset into the navigation history.
     * @return Whether we can move in history by given offset
     */
    boolean canGoToOffset(int offset);

    /**
     * Navigates to the specified offset from the "current entry". Does nothing if the offset is
     * out of bounds.
     * @param offset The offset into the navigation history.
     */
    void goToOffset(int offset);

    /**
     * Navigates to the specified index in the navigation entry for this page.
     * @param index The navigation index to navigate to.
     */
    void goToNavigationIndex(int index);

    /** Goes to the first non-skippable navigation entry before the current. */
    void goBack();

    /** Goes to the first non-skippable navigation entry following the current. */
    void goForward();

    /**
     * @return Whether the tab is navigating to the URL the tab is opened with.
     */
    boolean isInitialNavigation();

    /** Loads the current navigation if there is a pending lazy load (after tab restore). */
    public void loadIfNecessary();

    /**
     * @return Whether a reload has been requested.
     */
    public boolean needsReload();

    /** Requests the current navigation to be loaded upon the next call to loadIfNecessary(). */
    public void setNeedsReload();

    /** Reload the current page. */
    public void reload(boolean checkForRepost);

    /** Reload the current page, bypassing the contents of the cache. */
    public void reloadBypassingCache(boolean checkForRepost);

    /** Cancel the pending reload. */
    public void cancelPendingReload();

    /** Continue the pending reload. */
    public void continuePendingReload();

    /**
     * Load url without fixing up the url string. Consumers of NavigationController are responsible
     * for ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left
     * off during user input).
     *
     * @param params Parameters for this load.
     * @return NavigationHandle for the initiated navigation (might be null if the navigation
     *     couldn't be started for some reason).
     */
    public @Nullable NavigationHandle loadUrl(LoadUrlParams params);

    /**
     * Clears NavigationController's page history in both backwards and
     * forwards directions.
     */
    public void clearHistory();

    /**
     * Get a copy of the navigation history of NavigationController.
     * @return navigation history of NavigationController.
     */
    public NavigationHistory getNavigationHistory();

    /**
     * Get the navigation history of NavigationController from current navigation entry index
     * with direction (forward/backward)
     * @param isForward determines forward or backward from current index
     * @param itemLimit maximum number of entries to be retrieved in specified
     * diection.
     * @return navigation history by keeping above constraints.
     */
    public NavigationHistory getDirectedNavigationHistory(boolean isForward, int itemLimit);

    /** Clears SSL preferences for this NavigationController. */
    public void clearSslPreferences();

    /**
     * Get whether or not we're using a desktop user agent for the currently loaded page.
     * @return true, if use a desktop user agent and false for a mobile one.
     */
    public boolean getUseDesktopUserAgent();

    /**
     * Set whether or not we're using a desktop user agent for the currently loaded page.
     * @param override If true, use a desktop user agent.  Use a mobile one otherwise.
     * @param reloadOnChange Reload the page if the UA has changed.
     * @param caller The caller of this method.
     */
    public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange, int caller);

    /**
     * Return the NavigationEntry at the given index.
     * @param index Index to retrieve the NavigationEntry for.
     * @return Entry containing info about the navigation, null if the index is out of bounds.
     */
    public NavigationEntry getEntryAtIndex(int index);

    /**
     * @return The {@link NavigationEntry} that is appropriate to be displayed in the address bar.
     */
    @Nullable
    NavigationEntry getVisibleEntry();

    /**
     * @return The pending {@link NavigationEntry} for this controller or {@code null} if none
     *         exists.
     */
    public NavigationEntry getPendingEntry();

    /**
     * @return The index of the last committed entry.
     */
    public int getLastCommittedEntryIndex();

    /**
     * Removes the entry at the specified |index|.
     * @return false, if the index is the last committed index or the pending entry. Otherwise this
     *         call discards any transient or pending entries.
     */
    public boolean removeEntryAtIndex(int index);

    /**
     * Discards any transient or pending entries, then discards all entries after the current entry
     * index.
     */
    void pruneForwardEntries();

    /**
     * Gets extra data on the {@link NavigationEntry} at {@code index}.
     * @param index The index of the navigation entry.
     * @param key The data key.
     * @return The data value, or null if not found.
     */
    String getEntryExtraData(int index, String key);

    /**
     * Sets extra data on the {@link NavigationEntry} at {@code index}.
     * @param index The index of the navigation entry.
     * @param key The data key.
     * @param value The data value.
     */
    void setEntryExtraData(int index, String key, String value);
}