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
content / renderer / navigation_state.h [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_NAVIGATION_STATE_H_
#define CONTENT_RENDERER_NAVIGATION_STATE_H_
#include <memory>
#include "content/common/content_export.h"
#include "content/common/frame.mojom.h"
#include "content/renderer/navigation_client.h"
#include "third_party/blink/public/mojom/navigation/navigation_params.mojom.h"
namespace blink {
namespace mojom {
enum class CommitResult;
}
} // namespace blink
namespace content {
class CONTENT_EXPORT NavigationState {
public:
NavigationState(const NavigationState&) = delete;
NavigationState& operator=(const NavigationState&) = delete;
~NavigationState();
static std::unique_ptr<NavigationState> CreateForCrossDocumentCommit(
blink::mojom::CommonNavigationParamsPtr common_params,
blink::mojom::CommitNavigationParamsPtr commit_params,
mojom::NavigationClient::CommitNavigationCallback
per_navigation_mojo_interface_callback,
std::unique_ptr<NavigationClient> navigation_client,
bool was_initiated_in_this_frame);
static std::unique_ptr<NavigationState>
CreateForSameDocumentCommitFromBrowser(
blink::mojom::CommonNavigationParamsPtr common_params,
blink::mojom::CommitNavigationParamsPtr commit_params,
mojom::Frame::CommitSameDocumentNavigationCallback
commit_same_document_callback);
static std::unique_ptr<NavigationState> CreateForSynchronousCommit();
// True iff the frame's navigation was within the same document.
bool WasWithinSameDocument();
bool IsForSynchronousCommit();
const blink::mojom::CommonNavigationParams& common_params() const {
return *common_params_;
}
const blink::mojom::CommitNavigationParams& commit_params() const {
return *commit_params_;
}
bool has_navigation_client() const { return navigation_client_.get(); }
void set_was_within_same_document(bool value) {
was_within_same_document_ = value;
}
bool was_initiated_in_this_frame() const {
return was_initiated_in_this_frame_;
}
void set_transition_type(ui::PageTransition transition) {
common_params_->transition = transition;
}
const base::TimeTicks& commit_start_time() const {
return commit_start_time_;
}
void RunCommitNavigationCallback(
mojom::DidCommitProvisionalLoadParamsPtr params,
mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params);
void RunCommitSameDocumentNavigationCallback(
blink::mojom::CommitResult commit_result);
private:
NavigationState(blink::mojom::CommonNavigationParamsPtr common_params,
blink::mojom::CommitNavigationParamsPtr commit_params,
bool is_for_synchronous_commit,
content::mojom::NavigationClient::CommitNavigationCallback
commit_callback,
std::unique_ptr<NavigationClient> navigation_client,
mojom::Frame::CommitSameDocumentNavigationCallback
commit_same_document_callback,
bool was_initiated_in_this_frame);
// The time when the NavigationState is created, which is when the commit IPC
// from the browser is received in the renderer.
base::TimeTicks commit_start_time_;
bool was_within_same_document_;
// Indicates whether the navigation was initiated by the same RenderFrame
// it is about to commit in. An example would be a link click.
// A counter-example would be user typing in the url bar (browser-initiated
// navigation), or a link click leading to a process swap (different
// RenderFrame instance).
// Used to ensure consistent observer notifications about a navigation.
bool was_initiated_in_this_frame_;
// True if this navigation is for a renderer synchronous commit (e.g. the
// synchronous about:blank navigation, same-origin initiated same-document
// navigations), rather than using the browser's navigation stack.
const bool is_for_synchronous_commit_;
blink::mojom::CommonNavigationParamsPtr common_params_;
// Note: if IsContentInitiated() is false, whether this navigation should
// replace the current entry in the back/forward history list is determined by
// the should_replace_current_entry field in |history_params|. Otherwise, use
// replacesCurrentHistoryItem() on the WebDataSource.
//
// TODO(davidben): It would be good to unify these and have only one source
// for the two cases. We can plumb this through WebFrame::loadRequest to set
// lockBackForwardList on the FrameLoadRequest. However, this breaks process
// swaps because FrameLoader::loadWithNavigationAction treats loads before a
// FrameLoader has committedFirstRealDocumentLoad as a replacement. (Added for
// http://crbug.com/178380).
blink::mojom::CommitNavigationParamsPtr commit_params_;
// The NavigationClient interface gives control over the navigation ongoing in
// the browser process.
std::unique_ptr<NavigationClient> navigation_client_;
// Used to notify whether a commit request from the browser process was
// successful or not.
mojom::NavigationClient::CommitNavigationCallback commit_callback_;
// Used to notify whether a same document commit request from the browser
// process was successful or not.
mojom::Frame::CommitSameDocumentNavigationCallback
commit_same_document_callback_;
};
} // namespace content
#endif // CONTENT_RENDERER_NAVIGATION_STATE_H_