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