// Copyright 2020 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 CONTENT_BROWSER_PRERENDER_PRERENDER_HOST_H_ #define CONTENT_BROWSER_PRERENDER_PRERENDER_HOST_H_ #include #include "content/common/content_export.h" #include "content/public/browser/global_routing_id.h" #include "content/public/browser/web_contents_observer.h" #include "third_party/blink/public/mojom/prerender/prerender.mojom.h" #include "url/gurl.h" namespace content { class RenderFrameHostImpl; class WebContents; // Prerender2: // PrerenderHost creates a new WebContents and starts prerendering with that. // Then navigation code is expected to find this host from PrerenderHostRegistry // and activate the prerendered WebContents upon navigation. This is created per // request from a renderer process via PrerenderProcessor or will directly be // created for browser-initiated prerendering (this code path is not implemented // yet). This is owned by PrerenderHostRegistry. // // TODO(https://crbug.com/1132746): Stop creating a new WebContents and instead // use the MPArch. class CONTENT_EXPORT PrerenderHost final : public WebContentsObserver { public: PrerenderHost(blink::mojom::PrerenderAttributesPtr attributes, const GlobalFrameRoutingId& initiator_render_frame_host_id, const url::Origin& initiator_origin); ~PrerenderHost() override; PrerenderHost(const PrerenderHost&) = delete; PrerenderHost& operator=(const PrerenderHost&) = delete; PrerenderHost(PrerenderHost&&) = delete; PrerenderHost& operator=(PrerenderHost&&) = delete; void StartPrerendering(); // WebContentsObserver implementation: void DidFinishNavigation(NavigationHandle* navigation_handle) override; // Activates the prerendered contents. Returns false when activation didn't // occur for some reason. This must be called after this host gets ready for // activation. bool ActivatePrerenderedContents( RenderFrameHostImpl& current_render_frame_host); bool is_ready_for_activation() const { return is_ready_for_activation_; } private: const blink::mojom::PrerenderAttributesPtr attributes_; const GlobalFrameRoutingId initiator_render_frame_host_id_; const url::Origin initiator_origin_; // WebContents for prerendering. // TODO(https://crbug.com/1132746): Stop owning a new WebContents and instead // use the new MPArch mechanism. std::unique_ptr prerendered_contents_; // Indicates if `prerendered_contents_` is ready for activation. bool is_ready_for_activation_ = false; }; } // namespace content #endif // CONTENT_BROWSER_PRERENDER_PRERENDER_HOST_H_