forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
navigation.h
188 lines (156 loc) · 8.04 KB
/
navigation.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
// Copyright 2019 The Chromium Authors
// 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 <string>
#include <vector>
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<GURL>& 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:
// * <a> link click
// * changing window.location.href
// * redirect via the <meta http-equiv="refresh"> 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_