#ifndef IOS_WEB_CONTENT_JS_MESSAGING_CONTENT_WEB_FRAMES_MANAGER_H_
#define IOS_WEB_CONTENT_JS_MESSAGING_CONTENT_WEB_FRAMES_MANAGER_H_
#import "base/memory/weak_ptr.h"
#import "base/observer_list.h"
#import "build/blink_buildflags.h"
#import "content/public/browser/global_routing_id.h"
#import "content/public/browser/web_contents_observer.h"
#import "ios/web/public/js_messaging/web_frames_manager.h"
#if !BUILDFLAG(USE_BLINK)
#error File can only be included when USE_BLINK is true
#endif
namespace js_injection {
class JsCommunicationHost;
}
namespace web {
class ContentJavaScriptFeatureManager;
class ContentWebState;
class ScriptMessage;
class ContentWebFramesManager : public WebFramesManager,
public content::WebContentsObserver {
public:
ContentWebFramesManager(ContentWebState* content_web_state);
~ContentWebFramesManager() override;
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
std::set<WebFrame*> GetAllWebFrames() override;
WebFrame* GetMainWebFrame() override;
WebFrame* GetFrameWithId(const std::string& frame_id) override;
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
void DOMContentLoaded(content::RenderFrameHost* render_frame_host) override;
void PrimaryPageChanged(content::Page& page) override;
private:
WebFrame* WebFrameForContentId(content::GlobalRenderFrameHostId content_id);
void ScriptMessageReceived(const ScriptMessage& script_message);
std::map<std::string, std::unique_ptr<WebFrame>> web_frames_;
std::set<content::GlobalRenderFrameHostId> available_frame_hosts_;
std::map<content::GlobalRenderFrameHostId, std::string>
content_to_web_id_map_;
content::GlobalRenderFrameHostId main_frame_content_id_;
base::ObserverList<Observer, false> observers_;
raw_ptr<ContentWebState> content_web_state_;
std::unique_ptr<js_injection::JsCommunicationHost> js_communication_host_;
std::unique_ptr<ContentJavaScriptFeatureManager> js_feature_manager_;
base::WeakPtrFactory<ContentWebFramesManager> weak_factory_{this};
};
}
#endif