// 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 WEBLAYER_PUBLIC_NAVIGATION_H_ #define WEBLAYER_PUBLIC_NAVIGATION_H_ #include #include class GURL; namespace net { class HttpResponseHeaders; } namespace weblayer { class Page; // These types are sent over IPC and across different versions. Never remove // or change the order. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.weblayer_private // GENERATED_JAVA_CLASS_NAME_OVERRIDE: ImplNavigationState enum class NavigationState { // Waiting to receive initial response data. kWaitingResponse = 0, // Processing the response. kReceivingBytes = 1, // The navigation succeeded. Any NavigationObservers would have had // NavigationCompleted() called. kComplete = 2, // The navigation failed. This could be because of an error (in which case // IsErrorPage() will return true) or the navigation got turned into a // download (in which case IsDownload() will return true). // NavigationObservers would have had NavigationFailed() called. kFailed = 3, }; class Navigation { public: virtual ~Navigation() {} // The URL the frame is navigating to. This may change during the navigation // when encountering a server redirect. virtual GURL GetURL() = 0; // Returns the redirects that occurred on the way to the current page. The // current page is the last one in the list (so even when there's no redirect, // there will be one entry in the list). virtual const std::vector& GetRedirectChain() = 0; virtual NavigationState GetState() = 0; // Returns the status code of the navigation. Returns 0 if the navigation // hasn't completed yet or if a response wasn't received. virtual int GetHttpStatusCode() = 0; // Returns the HTTP response headers. Returns nullptr if the navigation // hasn't completed yet or if a response wasn't received. virtual const net::HttpResponseHeaders* GetResponseHeaders() = 0; // Whether the navigation happened without changing document. Examples of // same document navigations are: // * reference fragment navigations // * pushState/replaceState // * same page history navigation virtual bool IsSameDocument() = 0; // Whether the navigation resulted in an error page (e.g. interstitial). Note // that if an error page reloads, this will return true even though // GetNetErrorCode will be kNoError. virtual bool IsErrorPage() = 0; // Returns true if this navigation resulted in a download. Returns false if // this navigation did not result in a download, or if download status is not // yet known for this navigation. Download status is determined for a // navigation when processing final (post redirect) HTTP response headers. // This means the only time the embedder can know if it's a download is in // NavigationObserver::NavigationFailed. virtual bool IsDownload() = 0; // Whether the target URL can be handled by the browser's internal protocol // handlers, i.e., has a scheme that the browser knows how to process // internally. Examples of such URLs are http(s) URLs, data URLs, and file // URLs. A typical example of a URL for which there is no internal protocol // handler (and for which this method would return false) is an intent:// URL. // Added in 89. virtual bool IsKnownProtocol() = 0; // Returns true if the navigation was stopped before it could complete because // NavigationController::Stop() was called. virtual bool WasStopCalled() = 0; // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.weblayer_private // GENERATED_JAVA_CLASS_NAME_OVERRIDE: ImplLoadError enum LoadError { kNoError = 0, // Navigation completed successfully. kHttpClientError = 1, // Server responded with 4xx status code. kHttpServerError = 2, // Server responded with 5xx status code. kSSLError = 3, // Certificate error. kConnectivityError = 4, // Problem connecting to server. kOtherError = 5, // An error not listed above or below occurred. kSafeBrowsingError = 6, // Safe browsing error. }; // Return information about the error, if any, that was encountered while // loading the page. virtual LoadError GetLoadError() = 0; // Set a request's header. If the header is already present, its value is // overwritten. This function can only be called at two times, during start // and redirect. When called during start, the header applies to both the // start and redirect. |name| must be rfc 2616 compliant and |value| must // not contain '\0', '\n' or '\r'. // // This function may be used to set the referer. If the referer is set in // navigation start, it is reset during the redirect. In other words, if you // need to set a referer that applies to redirects, then this must be called // from NavigationRedirected(). virtual void SetRequestHeader(const std::string& name, const std::string& value) = 0; // Sets the user-agent string used for this navigation. The user-agent is // not sticky, it applies to this navigation only (and any redirects). This // function may only be called from NavigationObserver::NavigationStarted(). // Any value specified during start carries through to a redirect. |value| // must not contain any illegal characters as documented in // SetRequestHeader(). Setting this to a non empty string will cause the // User-Agent Client Hint header values and the values returned by // `navigator.userAgentData` to be empty for requests this override is applied // to. virtual void SetUserAgentString(const std::string& value) = 0; // Disables auto-reload for this navigation if the network is down and comes // back later. Auto-reload is enabled by default. This function may only be // called from NavigationObserver::NavigationStarted(). virtual void DisableNetworkErrorAutoReload() = 0; // Whether the navigation was initiated by the page. Examples of // page-initiated navigations include: // * link click // * changing window.location.href // * redirect via the tag // * using window.history.pushState // * window.history.forward() or window.history.back() // // This method returns false for navigations initiated by the WebLayer API. virtual bool IsPageInitiated() = 0; // Whether the navigation is a reload. Examples of reloads include: // * embedder-specified through NavigationController::Reload // * page-initiated reloads, e.g. location.reload() // * reloads when the network interface is reconnected virtual bool IsReload() = 0; // Whether the navigation is restoring a page from back-forward cache (see // https://web.dev/bfcache/). Since a previously loaded page is being reused, // there are some things embedders have to keep in mind such as: // * there will be no NavigationObserver::OnFirstContentfulPaint callbacks // * if an embedder injects code using Tab::ExecuteScript there is no need // to reinject scripts virtual bool IsServedFromBackForwardCache() = 0; // Returns true if this navigation was initiated by a form submission. virtual bool IsFormSubmission() = 0; // Returns the referrer for this request. virtual GURL GetReferrer() = 0; // Returns the Page object this navigation is occurring for. This method may // only be called in or after NavigationObserver::NavigationCompleted() or // NavigationObserve::NavigationFailed(). It can return null if the navigation // didn't commit (e.g. 204/205 or download). virtual Page* GetPage() = 0; // Returns the offset between the indices of the previous last committed and // the newly committed navigation entries (e.g. -1 for back navigations, 0 // for reloads, 1 for forward navigations). This may not cover all corner // cases, and can be incorrect in cases like main frame client redirects. virtual int GetNavigationEntryOffset() = 0; // Returns true if the navigation response was fetched from the cache. virtual bool WasFetchedFromCache() = 0; }; } // namespace weblayer #endif // WEBLAYER_PUBLIC_NAVIGATION_H_