no_state_prefetch_link_manager.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // Copyright (c) 2012 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. #ifndef COMPONENTS_NO_STATE_PREFETCH_BROWSER_NO_STATE_PREFETCH_LINK_MANAGER_H_
  5. #define COMPONENTS_NO_STATE_PREFETCH_BROWSER_NO_STATE_PREFETCH_LINK_MANAGER_H_
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <list>
  9. #include <memory>
  10. #include "base/gtest_prod_util.h"
  11. #include "base/memory/raw_ptr.h"
  12. #include "base/time/time.h"
  13. #include "components/keyed_service/core/keyed_service.h"
  14. #include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
  15. #include "third_party/abseil-cpp/absl/types/optional.h"
  16. #include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
  17. #include "url/gurl.h"
  18. #include "url/origin.h"
  19. FORWARD_DECLARE_TEST(WebViewTest, NoPrerenderer);
  20. namespace prerender {
  21. class NoStatePrefetchManager;
  22. // NoStatePrefetchLinkManager implements the API on Link elements for all
  23. // documents being rendered in this chrome instance. It receives messages from
  24. // the renderer indicating addition, cancelation and abandonment of link
  25. // elements, and controls the NoStatePrefetchManager accordingly.
  26. class NoStatePrefetchLinkManager : public KeyedService,
  27. public NoStatePrefetchHandle::Observer {
  28. public:
  29. explicit NoStatePrefetchLinkManager(NoStatePrefetchManager* manager);
  30. NoStatePrefetchLinkManager(const NoStatePrefetchLinkManager&) = delete;
  31. NoStatePrefetchLinkManager& operator=(const NoStatePrefetchLinkManager&) =
  32. delete;
  33. ~NoStatePrefetchLinkManager() override;
  34. // Called when a <link rel=prerender ...> element has been inserted into the
  35. // document. Returns the link trigger id that is used for canceling or
  36. // abandoning prefetch. Returns absl::nullopt if the prefetch was not started.
  37. virtual absl::optional<int> OnStartLinkTrigger(
  38. int launcher_render_process_id,
  39. int launcher_render_view_id,
  40. blink::mojom::PrerenderAttributesPtr attributes,
  41. const url::Origin& initiator_origin);
  42. // Called when a <link rel=prerender ...> element has been explicitly removed
  43. // from a document.
  44. virtual void OnCancelLinkTrigger(int link_trigger_id);
  45. // Called when a renderer launching <link rel=prerender ...> has navigated
  46. // away from the launching page, the launching renderer process has crashed,
  47. // or perhaps the renderer process was fast-closed when the last render view
  48. // in it was closed.
  49. virtual void OnAbandonLinkTrigger(int link_trigger_id);
  50. private:
  51. friend class PrerenderBrowserTest;
  52. friend class NoStatePrefetchTest;
  53. // WebViewTest.NoPrerenderer needs to access the private IsEmpty() method.
  54. FRIEND_TEST_ALL_PREFIXES(::WebViewTest, NoPrerenderer);
  55. // Used to store state about a <link rel=prerender ...> that triggers
  56. // NoStatePrefetch.
  57. struct LinkTrigger {
  58. LinkTrigger(int launcher_render_process_id,
  59. int launcher_render_view_id,
  60. blink::mojom::PrerenderAttributesPtr attributes,
  61. const url::Origin& initiator_origin,
  62. base::TimeTicks creation_time,
  63. NoStatePrefetchContents* deferred_launcher);
  64. ~LinkTrigger();
  65. LinkTrigger(const LinkTrigger& other) = delete;
  66. LinkTrigger& operator=(const LinkTrigger& other) = delete;
  67. // Parameters from NoStatePrefetchLinkManager::OnStartLinkTrigger():
  68. const int launcher_render_process_id;
  69. const int launcher_render_view_id;
  70. const GURL url;
  71. const blink::mojom::PrerenderTriggerType trigger_type;
  72. const content::Referrer referrer;
  73. const url::Origin initiator_origin;
  74. const gfx::Size size;
  75. // The time at which this trigger was added to NoStatePrefetchLinkManager.
  76. const base::TimeTicks creation_time;
  77. // If non-null, this trigger was launched by an unswapped prefetcher,
  78. // |deferred_launcher|. When |deferred_launcher| is swapped in, the field is
  79. // set to null.
  80. raw_ptr<const NoStatePrefetchContents> deferred_launcher;
  81. // Initially null, |handle| is set once we start this trigger. It is owned
  82. // by this struct, and must be deleted before destructing this struct.
  83. std::unique_ptr<NoStatePrefetchHandle> handle;
  84. // True if this trigger has been abandoned by its launcher.
  85. bool has_been_abandoned;
  86. // The unique ID of this trigger. Used for canceling or abandoning
  87. // prefetching.
  88. const int link_trigger_id;
  89. };
  90. bool IsEmpty() const;
  91. bool TriggerIsRunningForTesting(LinkTrigger* link_trigger) const;
  92. // Returns a count of currently running triggers.
  93. size_t CountRunningTriggers() const;
  94. // Start any triggers that can be started, respecting concurrency limits for
  95. // the system and per launcher.
  96. void StartLinkTriggers();
  97. LinkTrigger* FindByNoStatePrefetchHandle(
  98. NoStatePrefetchHandle* no_state_prefetch_handle);
  99. LinkTrigger* FindByLinkTriggerId(int link_trigger_id);
  100. // Removes |trigger| from the the prerender link manager. Deletes the
  101. // NoStatePrefetchHandle as needed.
  102. void RemoveLinkTrigger(LinkTrigger* trigger);
  103. // Cancels |trigger| and removes |trigger| from the prerender link
  104. // manager.
  105. void CancelLinkTrigger(LinkTrigger* trigger);
  106. // From KeyedService:
  107. void Shutdown() override;
  108. // From NoStatePrefetchHandle::Observer:
  109. void OnPrefetchStop(NoStatePrefetchHandle* no_state_prefetch_handle) override;
  110. void OnPrefetchNetworkBytesChanged(
  111. NoStatePrefetchHandle* no_state_prefetch_handle) override;
  112. bool has_shutdown_;
  113. const raw_ptr<NoStatePrefetchManager> manager_;
  114. // All triggers known to this NoStatePrefetchLinkManager. Insertions are
  115. // always made at the back, so the oldest trigger is at the front, and the
  116. // youngest at the back. Using std::unique_ptr<> here as LinkTrigger is not
  117. // copyable.
  118. std::list<std::unique_ptr<LinkTrigger>> triggers_;
  119. };
  120. } // namespace prerender
  121. #endif // COMPONENTS_NO_STATE_PREFETCH_BROWSER_NO_STATE_PREFETCH_LINK_MANAGER_H_