| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // This file contains utility functions for creating and managing magic URLs |
| // used to implement NavigationManagerImpl. |
| // |
| // A restore session URL is a specific local file that is used to inject history |
| // into a new web view. See ios/web/navigation/resources/restore_session.html. |
| // |
| // A placeholder navigation is an "about:blank" page loaded into the WKWebView |
| // that corresponds to Native View or WebUI URL. This navigation is inserted to |
| // generate a WKBackForwardListItem for the Native View or WebUI URL in the |
| // WebView so that the WKBackForwardList contains the full list of user-visible |
| // navigations. See "Handling App-specific URLs" section in |
| // go/bling-navigation-experiment for more details. |
| |
| #ifndef IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_ |
| #define IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_ |
| |
| #import <Foundation/Foundation.h> |
| #include <memory> |
| #include <vector> |
| |
| #include "url/gurl.h" |
| |
| namespace web { |
| |
| class NavigationItem; |
| |
| namespace wk_navigation_util { |
| |
| // Session restoration algorithm has this limitation on maximum session size. |
| extern const int kMaxSessionSize; |
| |
| // URL fragment prefix used to encode the session history to inject in a |
| // restore_session.html URL. |
| extern const char kRestoreSessionSessionHashPrefix[]; |
| |
| // URL fragment prefix used to encode target URL in a restore_session.html URL. |
| extern const char kRestoreSessionTargetUrlHashPrefix[]; |
| |
| // The "Referer" [sic] HTTP header. |
| extern NSString* const kReferrerHeaderName; |
| |
| // Sets (offset, size) and returns an updated last committed index, so the final |
| // size is less or equal to kMaxSessionSize. If item_count is greater than |
| // kMaxSessionSize, then this function will trim navigation items, which are the |
| // furthest to `last_committed_item_index`. |
| int GetSafeItemRange(int last_committed_item_index, |
| int item_count, |
| int* offset, |
| int* size); |
| |
| // Returns true if `url` is a placeholder URL or restore_session.html URL. |
| bool IsWKInternalUrl(const GURL& url); |
| bool IsWKInternalUrl(NSURL* url); |
| |
| // Returns true if `url` is an app specific url or an about:// scheme |
| // non-placeholder url. |
| bool URLNeedsUserAgentType(const GURL& url); |
| |
| // Returns a file:// URL that points to the magic restore_session.html file. |
| // This is used in unit tests. |
| GURL GetRestoreSessionBaseUrl(); |
| |
| // Creates a restore_session.html `url` with the provided session |
| // history encoded in the URL fragment, such that when this URL is loaded in the |
| // web view, recreates all the history entries in `items` and the current loaded |
| // item is the entry at `last_committed_item_index`. Sets `first_index` to the |
| // new beginning of items. |
| void CreateRestoreSessionUrl( |
| int last_committed_item_index, |
| const std::vector<std::unique_ptr<NavigationItem>>& items, |
| GURL* url, |
| int* first_index); |
| |
| // Returns true if the base URL of `url` is restore_session.html. |
| bool IsRestoreSessionUrl(const GURL& url); |
| bool IsRestoreSessionUrl(NSURL* url); |
| |
| // Extracts the URL encoded in the URL fragment of `restore_session_url` to |
| // `target_url` and returns true. If the URL fragment does not have a |
| // "targetUrl=" prefix, returns false. |
| bool ExtractTargetURL(const GURL& restore_session_url, GURL* target_url); |
| |
| } // namespace wk_navigation_util |
| } // namespace web |
| |
| #endif // IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_ |