blob: a79a3434ad4bdf2540e352331ddbb875285c616d [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_LINK_MANAGER_H_
#define CHROME_BROWSER_PRERENDER_PRERENDER_LINK_MANAGER_H_
#include <stddef.h>
#include <stdint.h>
#include <list>
#include <memory>
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/time/time.h"
#include "chrome/browser/prerender/prerender_handle.h"
#include "components/keyed_service/core/keyed_service.h"
#include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
#include "url/gurl.h"
#include "url/origin.h"
FORWARD_DECLARE_TEST(WebViewTest, NoPrerenderer);
namespace prerender {
class PrerenderContents;
class PrerenderManager;
// PrerenderLinkManager implements the API on Link elements for all documents
// being rendered in this chrome instance. It receives messages from the
// renderer indicating addition, cancelation and abandonment of link elements,
// and controls the PrerenderManager accordingly.
class PrerenderLinkManager : public KeyedService,
public PrerenderHandle::Observer {
public:
explicit PrerenderLinkManager(PrerenderManager* manager);
~PrerenderLinkManager() override;
// A <link rel=prerender ...> element has been inserted into the document.
// Returns true if a prerender was added.
bool OnAddPrerender(
int launcher_render_process_id,
int launcher_render_view_id,
blink::mojom::PrerenderAttributesPtr attributes,
mojo::PendingRemote<blink::mojom::PrerenderHandleClient> handle_client,
mojo::PendingReceiver<blink::mojom::PrerenderHandle> handle);
private:
friend class PrerenderBrowserTest;
friend class PrerenderTest;
// WebViewTest.NoPrerenderer needs to access the private IsEmpty() method.
FRIEND_TEST_ALL_PREFIXES(::WebViewTest, NoPrerenderer);
class PrerenderHandleProxy;
class LinkPrerender;
class PendingPrerenderManager;
// A <link rel=prerender ...> element has been explicitly removed from a
// document.
void OnCancelPrerender(LinkPrerender* link_prerender);
// A renderer launching <link rel=prerender ...> has navigated away from the
// launching page, the launching renderer process has crashed, or perhaps the
// renderer process was fast-closed when the last render view in it was
// closed.
void OnAbandonPrerender(LinkPrerender* link_prerender);
bool IsEmpty() const;
bool PrerenderIsRunningForTesting(LinkPrerender* link_prerender) const;
// Returns a count of currently running prerenders.
size_t CountRunningPrerenders() const;
// Start any prerenders that can be started, respecting concurrency limits for
// the system and per launcher.
void StartPrerenders();
LinkPrerender* FindByPrerenderHandle(PrerenderHandle* prerender_handle);
// Removes |prerender| from the the prerender link manager. Deletes the
// PrerenderHandle as needed.
void RemovePrerender(LinkPrerender* prerender);
// Cancels |prerender| and removes |prerender| from the prerender link
// manager.
void CancelPrerender(LinkPrerender* prerender);
// Called when |launcher| is swapped in.
void StartPendingPrerendersForLauncher(PrerenderContents* launcher);
// Called when |launcher| is aborted.
void CancelPendingPrerendersForLauncher(PrerenderContents* launcher);
// From KeyedService:
void Shutdown() override;
// From PrerenderHandle::Observer:
void OnPrerenderStart(PrerenderHandle* prerender_handle) override;
void OnPrerenderStopLoading(PrerenderHandle* prerender_handle) override;
void OnPrerenderDomContentLoaded(PrerenderHandle* prerender_handle) override;
void OnPrerenderStop(PrerenderHandle* prerender_handle) override;
void OnPrerenderNetworkBytesChanged(
PrerenderHandle* prerender_handle) override;
bool has_shutdown_;
PrerenderManager* const manager_;
// All prerenders known to this PrerenderLinkManager. Insertions are always
// made at the back, so the oldest prerender is at the front, and the youngest
// at the back. Using std::unique_ptr<> here as LinkPrerender is not copyable.
std::list<std::unique_ptr<LinkPrerender>> prerenders_;
// Helper object to manage prerenders which are launched by other prerenders
// and must be deferred until the launcher is swapped in.
std::unique_ptr<PendingPrerenderManager> pending_prerender_manager_;
DISALLOW_COPY_AND_ASSIGN(PrerenderLinkManager);
};
} // namespace prerender
#endif // CHROME_BROWSER_PRERENDER_PRERENDER_LINK_MANAGER_H_