| // Copyright 2024 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CONTENT_BROWSER_GUEST_PAGE_HOLDER_IMPL_H_ | 
 | #define CONTENT_BROWSER_GUEST_PAGE_HOLDER_IMPL_H_ | 
 |  | 
 | #include "base/callback_list.h" | 
 | #include "base/functional/callback.h" | 
 | #include "base/memory/raw_ref.h" | 
 | #include "content/browser/renderer_host/frame_tree.h" | 
 | #include "content/browser/renderer_host/frame_tree_node.h" | 
 | #include "content/browser/renderer_host/navigation_controller_delegate.h" | 
 | #include "content/common/content_export.h" | 
 | #include "content/public/browser/frame_tree_node_id.h" | 
 | #include "content/public/browser/guest_page_holder.h" | 
 | #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" | 
 |  | 
 | namespace content { | 
 |  | 
 | class ForwardingAudioStreamFactory; | 
 | class RenderFrameHostImpl; | 
 | class WebContentsImpl; | 
 |  | 
 | class GuestPageHolderImpl : public GuestPageHolder, | 
 |                             public FrameTree::Delegate, | 
 |                             public NavigationControllerDelegate { | 
 |  public: | 
 |   GuestPageHolderImpl(WebContentsImpl& owner_web_contents, | 
 |                       const std::string& frame_name, | 
 |                       RenderFrameHostImpl* opener, | 
 |                       scoped_refptr<SiteInstance> site_instance, | 
 |                       base::WeakPtr<GuestPageHolder::Delegate> delegate); | 
 |   ~GuestPageHolderImpl() override; | 
 |  | 
 |   FrameTree& frame_tree() { return frame_tree_; } | 
 |  | 
 |   void set_outer_frame_tree_node_id(FrameTreeNodeId outer_frame_tree_node_id); | 
 |  | 
 |   // Returns the delegate, this may be null. | 
 |   GuestPageHolder::Delegate* delegate() { return delegate_.get(); } | 
 |  | 
 |   // GuestPageHolder implementation. | 
 |   NavigationController& GetController() override; | 
 |   RenderFrameHostImpl* GetGuestMainFrame() override; | 
 |   bool IsAudioMuted() override; | 
 |   void SetAudioMuted(bool mute) override; | 
 |   RenderFrameHost* GetOpener() override; | 
 |  | 
 |   // FrameTree::Delegate implementation. | 
 |   void LoadingStateChanged(LoadingState new_state) override; | 
 |   void DidStartLoading(FrameTreeNode* frame_tree_node) override; | 
 |   void DidStopLoading() override; | 
 |   bool IsHidden() override; | 
 |   FrameTreeNodeId GetOuterDelegateFrameTreeNodeId() override; | 
 |   RenderFrameHostImpl* GetProspectiveOuterDocument() override; | 
 |   FrameTree* LoadingTree() override; | 
 |   void SetFocusedFrame(FrameTreeNode* node, SiteInstanceGroup* source) override; | 
 |   FrameTree* GetOwnedPictureInPictureFrameTree() override; | 
 |   FrameTree* GetPictureInPictureOpenerFrameTree() override; | 
 |   bool OnRenderFrameProxyVisibilityChanged( | 
 |       RenderFrameProxyHost* render_frame_proxy_host, | 
 |       blink::mojom::FrameVisibility visibility) override; | 
 |  | 
 |   // NavigationControllerDelegate implementation. | 
 |   void NotifyNavigationStateChangedFromController( | 
 |       InvalidateTypes changed_flags) override; | 
 |   void NotifyBeforeFormRepostWarningShow() override; | 
 |   void NotifyNavigationEntryCommitted( | 
 |       const LoadCommittedDetails& load_details) override; | 
 |   void NotifyNavigationEntryChanged( | 
 |       const EntryChangedDetails& change_details) override; | 
 |   void NotifyNavigationListPruned(const PrunedDetails& pruned_details) override; | 
 |   void NotifyNavigationEntriesDeleted() override; | 
 |   void ActivateAndShowRepostFormWarningDialog() override; | 
 |   bool ShouldPreserveAbortedURLs() override; | 
 |   void UpdateOverridingUserAgent() override; | 
 |  | 
 |   ForwardingAudioStreamFactory* GetAudioStreamFactory(); | 
 |   void SetAudioMutedFromWebContents(bool web_contents_muted); | 
 |  | 
 |   const blink::RendererPreferences& GetRendererPrefs(); | 
 |   const blink::web_pref::WebPreferences& GetWebPreferences(); | 
 |  | 
 |   FrameTree* CreateNewWindow(WindowOpenDisposition disposition, | 
 |                              const GURL& url, | 
 |                              const std::string& main_frame_name, | 
 |                              scoped_refptr<SiteInstance> site_instance, | 
 |                              RenderFrameHostImpl* opener); | 
 |  | 
 |   // If the `render_frame_host` is within a guest, returns the guest's | 
 |   // associated GuestPageHolder. Will return null if `render_frame_host` | 
 |   // is not within a guest. | 
 |   CONTENT_EXPORT static GuestPageHolderImpl* FromRenderFrameHost( | 
 |       RenderFrameHostImpl& render_frame_host); | 
 |  | 
 |   CONTENT_EXPORT base::CallbackListSubscription | 
 |   RegisterLoadStopCallbackForTesting(base::RepeatingClosure callback); | 
 |  | 
 |  private: | 
 |   const raw_ref<WebContentsImpl> owner_web_contents_; | 
 |  | 
 |   base::WeakPtr<GuestPageHolder::Delegate> delegate_; | 
 |  | 
 |   std::unique_ptr<ForwardingAudioStreamFactory> audio_stream_factory_; | 
 |   bool audio_muted_ = false; | 
 |  | 
 |   blink::RendererPreferences renderer_preferences_; | 
 |   std::unique_ptr<blink::web_pref::WebPreferences> web_preferences_; | 
 |  | 
 |   base::RepeatingClosureList load_stop_callbacks_for_testing_; | 
 |  | 
 |   // The outer FrameTreeNode is not known until the guest is attached. | 
 |   FrameTreeNodeId outer_frame_tree_node_id_; | 
 |  | 
 |   // This FrameTree contains the guest page. It has the type | 
 |   // `FrameTree::Type::kGuest`. | 
 |   // Note that the destruction of this tree may call back into this object, so | 
 |   // the destruction order of this tree matters relative to some other members. | 
 |   FrameTree frame_tree_; | 
 | }; | 
 |  | 
 | }  // namespace content | 
 |  | 
 | #endif  // CONTENT_BROWSER_GUEST_PAGE_HOLDER_IMPL_H_ |