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
content / public / browser / page_navigator.cc [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/public/browser/page_navigator.h"
#include "content/public/browser/navigation_handle.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "third_party/blink/public/mojom/frame/frame.mojom.h"
namespace content {
OpenURLParams::OpenURLParams(const GURL& url,
const Referrer& referrer,
WindowOpenDisposition disposition,
ui::PageTransition transition,
bool is_renderer_initiated)
: url(url),
referrer(referrer),
disposition(disposition),
transition(transition),
is_renderer_initiated(is_renderer_initiated),
user_gesture(!is_renderer_initiated) {}
OpenURLParams::OpenURLParams(const GURL& url,
const Referrer& referrer,
WindowOpenDisposition disposition,
ui::PageTransition transition,
bool is_renderer_initiated,
bool started_from_context_menu)
: url(url),
referrer(referrer),
disposition(disposition),
transition(transition),
is_renderer_initiated(is_renderer_initiated),
user_gesture(!is_renderer_initiated),
started_from_context_menu(started_from_context_menu) {}
OpenURLParams::OpenURLParams(const GURL& url,
const Referrer& referrer,
FrameTreeNodeId frame_tree_node_id,
WindowOpenDisposition disposition,
ui::PageTransition transition,
bool is_renderer_initiated)
: url(url),
referrer(referrer),
frame_tree_node_id(frame_tree_node_id),
disposition(disposition),
transition(transition),
is_renderer_initiated(is_renderer_initiated),
user_gesture(!is_renderer_initiated) {}
OpenURLParams::OpenURLParams(const OpenURLParams& other) = default;
OpenURLParams::~OpenURLParams() = default;
// static
OpenURLParams OpenURLParams::FromNavigationHandle(NavigationHandle* handle) {
OpenURLParams params(
handle->GetURL(), Referrer(handle->GetReferrer()),
handle->GetFrameTreeNodeId(), WindowOpenDisposition::CURRENT_TAB,
handle->GetPageTransition(), handle->IsRendererInitiated());
params.initiator_origin = handle->GetInitiatorOrigin();
params.initiator_base_url = handle->GetInitiatorBaseUrl();
params.source_site_instance = handle->GetSourceSiteInstance();
params.user_gesture = handle->HasUserGesture();
params.started_from_context_menu = handle->WasStartedFromContextMenu();
params.href_translate = handle->GetHrefTranslate();
params.reload_type = handle->GetReloadType();
// NavigationHandle will include all redirects that happened on the way to the
// the current page in its redirect chain, including the current page itself
// as the last entry. However OpenURLParams's redirect chain should only
// include redirects that occurred before the current page. We need to remove
// the last entry from `handle`'s redirect chain when initializing the
// OpenURLParams.
auto redirect_chain = handle->GetRedirectChain();
DCHECK(redirect_chain.size());
redirect_chain.pop_back();
params.redirect_chain = std::move(redirect_chain);
// TODO(lukasza): Consider also covering |post_data| (and |uses_post|) and
// |extra_headers| (this is difficult, because we can't cast |handle| to
// NavigationRequest*, because it may be MockNavigationHandle in unit tests).
#if DCHECK_IS_ON()
DCHECK(params.Valid());
#endif
return params;
}
#if DCHECK_IS_ON()
bool OpenURLParams::Valid() const {
// Make sure URLs that result in an opaque origin have their initiator
// information set so it can be used by downstream components. If |url|
// is about:blank or data: URL and |initiator_origin| is set, then we also
// need |source_site_instance| set so that
// RenderFrameHostManager::DetermineSiteInstanceForURL() can select the
// correct SiteInstance for these URLs.
const bool is_data_or_about =
url.IsAboutBlank() || url.SchemeIs(url::kDataScheme);
const bool has_valid_initiator =
initiator_origin.has_value() &&
initiator_origin->GetTupleOrPrecursorTupleIfOpaque().IsValid();
if (is_data_or_about && has_valid_initiator && !source_site_instance)
return false;
return true;
}
#endif // DCHECK_IS_ON()
} // namespace content