blob: cce3618e5aa37efb6b02f6276fc3ab6e55d07877 [file] [log] [blame] [edit]
// 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