blob: 1bc29e047b1f555d64386d990879d785ab26448b [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_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_
#define CHROME_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_
#include <map>
#include <memory>
#include <set>
#include <vector>
#include "base/compiler_specific.h"
#include "base/time/time.h"
#include "chrome/common/prerender.mojom.h"
#include "content/public/renderer/render_thread_observer.h"
#include "mojo/public/cpp/bindings/associated_binding_set.h"
#include "third_party/WebKit/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/WebKit/public/platform/WebPrerender.h"
#include "third_party/WebKit/public/platform/WebPrerenderingSupport.h"
class GURL;
namespace prerender {
// There is one PrerenderDispatcher per render process. It keeps track of which
// prerenders were launched from this renderer, and ensures prerender navigation
// is triggered on navigation to those. It implements the prerendering interface
// supplied to WebKit.
class PrerenderDispatcher : public content::RenderThreadObserver,
public blink::WebPrerenderingSupport,
public chrome::mojom::PrerenderDispatcher {
public:
PrerenderDispatcher();
~PrerenderDispatcher() override;
bool IsPrerenderURL(const GURL& url) const;
void IncrementPrefetchCount();
void DecrementPrefetchCount();
private:
friend class PrerenderDispatcherTest;
// chrome::mojom::PrerenderDispatcher:
void PrerenderStart(int prerender_id) override;
void PrerenderStopLoading(int prerender_id) override;
void PrerenderDomContentLoaded(int prerender_id) override;
void PrerenderAddAlias(const GURL& alias) override;
void PrerenderRemoveAliases(const std::vector<GURL>& aliases) override;
void PrerenderStop(int prerender_id) override;
void OnPrerenderDispatcherRequest(
chrome::mojom::PrerenderDispatcherAssociatedRequest request);
// From RenderThreadObserver:
void RegisterMojoInterfaces(
blink::AssociatedInterfaceRegistry* associated_interfaces) override;
void UnregisterMojoInterfaces(
blink::AssociatedInterfaceRegistry* associated_interfaces) override;
// From WebPrerenderingSupport:
void Add(const blink::WebPrerender& prerender) override;
void Cancel(const blink::WebPrerender& prerender) override;
void Abandon(const blink::WebPrerender& prerender) override;
void PrefetchFinished() override;
// From WebKit, prerender elements launched by renderers in our process.
std::map<int, blink::WebPrerender> prerenders_;
// From the browser process, which prerenders are running, indexed by URL.
// Updated by the browser processes as aliases are discovered.
std::multiset<GURL> running_prerender_urls_;
int prefetch_count_ = 0;
bool prefetch_finished_ = false;
base::TimeTicks process_start_time_;
base::TimeTicks prefetch_parsed_time_;
mojo::AssociatedBindingSet<chrome::mojom::PrerenderDispatcher> bindings_;
};
} // namespace prerender
#endif // CHROME_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_