no_state_prefetch_processor_impl.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/no_state_prefetch/browser/no_state_prefetch_processor_impl.h"
  5. #include "components/no_state_prefetch/browser/no_state_prefetch_link_manager.h"
  6. #include "content/public/browser/child_process_security_policy.h"
  7. #include "content/public/browser/render_frame_host.h"
  8. #include "content/public/browser/render_process_host.h"
  9. #include "content/public/browser/render_view_host.h"
  10. #include "content/public/common/referrer.h"
  11. namespace prerender {
  12. NoStatePrefetchProcessorImpl::NoStatePrefetchProcessorImpl(
  13. int render_process_id,
  14. int render_frame_id,
  15. const url::Origin& initiator_origin,
  16. mojo::PendingReceiver<blink::mojom::NoStatePrefetchProcessor> receiver,
  17. std::unique_ptr<NoStatePrefetchProcessorImplDelegate> delegate)
  18. : render_process_id_(render_process_id),
  19. render_frame_id_(render_frame_id),
  20. initiator_origin_(initiator_origin),
  21. delegate_(std::move(delegate)) {
  22. receiver_.Bind(std::move(receiver));
  23. receiver_.set_disconnect_handler(base::BindOnce(
  24. &NoStatePrefetchProcessorImpl::Abandon, base::Unretained(this)));
  25. }
  26. NoStatePrefetchProcessorImpl::~NoStatePrefetchProcessorImpl() = default;
  27. // static
  28. void NoStatePrefetchProcessorImpl::Create(
  29. content::RenderFrameHost* frame_host,
  30. mojo::PendingReceiver<blink::mojom::NoStatePrefetchProcessor> receiver,
  31. std::unique_ptr<NoStatePrefetchProcessorImplDelegate> delegate) {
  32. // NoStatePrefetchProcessorImpl is a self-owned object. This deletes itself on
  33. // the mojo disconnect handler.
  34. new NoStatePrefetchProcessorImpl(frame_host->GetProcess()->GetID(),
  35. frame_host->GetRoutingID(),
  36. frame_host->GetLastCommittedOrigin(),
  37. std::move(receiver), std::move(delegate));
  38. }
  39. void NoStatePrefetchProcessorImpl::Start(
  40. blink::mojom::PrerenderAttributesPtr attributes) {
  41. if (!initiator_origin_.opaque() &&
  42. !content::ChildProcessSecurityPolicy::GetInstance()
  43. ->CanAccessDataForOrigin(render_process_id_, initiator_origin_)) {
  44. receiver_.ReportBadMessage("NSPPI_INVALID_INITIATOR_ORIGIN");
  45. // The above ReportBadMessage() closes |receiver_| but does not trigger its
  46. // disconnect handler, so we need to call the handler explicitly
  47. // here to do some necessary work.
  48. Abandon();
  49. return;
  50. }
  51. // Start() must be called only one time.
  52. if (link_trigger_id_) {
  53. receiver_.ReportBadMessage("NSPPI_START_TWICE");
  54. // The above ReportBadMessage() closes |receiver_| but does not trigger its
  55. // disconnect handler, so we need to call the handler explicitly
  56. // here to do some necessary work.
  57. Abandon();
  58. return;
  59. }
  60. auto* render_frame_host =
  61. content::RenderFrameHost::FromID(render_process_id_, render_frame_id_);
  62. if (!render_frame_host)
  63. return;
  64. auto* link_manager = GetNoStatePrefetchLinkManager();
  65. if (!link_manager)
  66. return;
  67. DCHECK(!link_trigger_id_);
  68. link_trigger_id_ = link_manager->OnStartLinkTrigger(
  69. render_process_id_,
  70. render_frame_host->GetRenderViewHost()->GetRoutingID(),
  71. std::move(attributes), initiator_origin_);
  72. }
  73. void NoStatePrefetchProcessorImpl::Cancel() {
  74. if (!link_trigger_id_)
  75. return;
  76. auto* link_manager = GetNoStatePrefetchLinkManager();
  77. if (link_manager)
  78. link_manager->OnCancelLinkTrigger(*link_trigger_id_);
  79. }
  80. void NoStatePrefetchProcessorImpl::Abandon() {
  81. if (link_trigger_id_) {
  82. auto* link_manager = GetNoStatePrefetchLinkManager();
  83. if (link_manager)
  84. link_manager->OnAbandonLinkTrigger(*link_trigger_id_);
  85. }
  86. delete this;
  87. }
  88. NoStatePrefetchLinkManager*
  89. NoStatePrefetchProcessorImpl::GetNoStatePrefetchLinkManager() {
  90. auto* render_frame_host =
  91. content::RenderFrameHost::FromID(render_process_id_, render_frame_id_);
  92. if (!render_frame_host)
  93. return nullptr;
  94. return delegate_->GetNoStatePrefetchLinkManager(
  95. render_frame_host->GetProcess()->GetBrowserContext());
  96. }
  97. } // namespace prerender