diff --git a/ios/web/js_messaging/web_frames_manager_impl.h b/ios/web/js_messaging/web_frames_manager_impl.h index 81abd82b8c6f9..e587b66a1c4ec 100644 --- a/ios/web/js_messaging/web_frames_manager_impl.h +++ b/ios/web/js_messaging/web_frames_manager_impl.h @@ -11,26 +11,18 @@ #import "base/memory/weak_ptr.h" #import "base/observer_list.h" -#import "ios/web/public/js_messaging/content_world.h" -#import "ios/web/public/web_state_user_data.h" namespace web { class WebFrame; -class WebState; class WebFramesManagerImpl : public WebFramesManager { public: - // Returns the web frames manager for `web_state` and `content_world`. - // `content_world` must specify a specific content world so - // `kAllContentWorlds` is not a valid value. - static WebFramesManagerImpl& FromWebState(web::WebState* web_state, - ContentWorld content_world); + explicit WebFramesManagerImpl(); + ~WebFramesManagerImpl() override; WebFramesManagerImpl(const WebFramesManagerImpl&) = delete; WebFramesManagerImpl& operator=(const WebFramesManagerImpl&) = delete; - ~WebFramesManagerImpl() override; - // Adds `frame` to the list of web frames. A frame with the same frame ID must // not already be registered). Returns `false` and `frame` will be ignored if // `frame` is a main frame and a main frame has already been set. @@ -48,28 +40,6 @@ class WebFramesManagerImpl : public WebFramesManager { WebFrame* GetFrameWithId(const std::string& frame_id) override; private: - // Container that stores the web frame manager for each content world. - // Usage example: - // - // WebFramesManagerImpl::Container::FromWebState(web_state)-> - // ManagerForContentWorld(ContentWorld::kPageContentWorld); - class Container : public web::WebStateUserData<Container> { - public: - ~Container() override; - // Returns the web frames manager for `content_world`. - WebFramesManagerImpl& ManagerForContentWorld(ContentWorld content_world); - - private: - friend class web::WebStateUserData<Container>; - WEB_STATE_USER_DATA_KEY_DECL(); - Container(web::WebState* web_state); - - web::WebState* web_state_ = nullptr; - std::map<ContentWorld, std::unique_ptr<WebFramesManagerImpl>> managers_; - }; - - explicit WebFramesManagerImpl(); - // List of pointers to all web frames. std::map<std::string, std::unique_ptr<WebFrame>> web_frames_; diff --git a/ios/web/js_messaging/web_frames_manager_impl.mm b/ios/web/js_messaging/web_frames_manager_impl.mm index 70bdf30731188..7a67ef225f32f 100644 --- a/ios/web/js_messaging/web_frames_manager_impl.mm +++ b/ios/web/js_messaging/web_frames_manager_impl.mm @@ -15,35 +15,8 @@ namespace web { -#pragma mark - WebFramesManagerImpl::Container - -WEB_STATE_USER_DATA_KEY_IMPL(WebFramesManagerImpl::Container) - -WebFramesManagerImpl::Container::Container(web::WebState* web_state) - : web_state_(web_state) {} -WebFramesManagerImpl::Container::~Container() = default; - -WebFramesManagerImpl& WebFramesManagerImpl::Container::ManagerForContentWorld( - ContentWorld content_world) { - DCHECK_NE(content_world, ContentWorld::kAllContentWorlds); - - auto& manager = managers_[content_world]; - if (!manager) { - manager = base::WrapUnique(new WebFramesManagerImpl()); - } - return *manager.get(); -} - #pragma mark - WebFramesManagerImpl -WebFramesManagerImpl& WebFramesManagerImpl::FromWebState( - web::WebState* web_state, - ContentWorld content_world) { - WebFramesManagerImpl::Container::CreateForWebState(web_state); - return WebFramesManagerImpl::Container::FromWebState(web_state) - ->ManagerForContentWorld(content_world); -} - WebFramesManagerImpl::WebFramesManagerImpl() : weak_factory_(this) {} WebFramesManagerImpl::~WebFramesManagerImpl() = default; diff --git a/ios/web/web_state/web_state_impl_realized_web_state.h b/ios/web/web_state/web_state_impl_realized_web_state.h index 1fa4bb9ad44b8..0a7c4d67c16fa 100644 --- a/ios/web/web_state/web_state_impl_realized_web_state.h +++ b/ios/web/web_state/web_state_impl_realized_web_state.h @@ -5,12 +5,16 @@ #ifndef IOS_WEB_WEB_STATE_WEB_STATE_IMPL_REALIZED_WEB_STATE_H_ #define IOS_WEB_WEB_STATE_WEB_STATE_IMPL_REALIZED_WEB_STATE_H_ +#include <map> + #import "ios/web/web_state/web_state_impl.h" +#import "ios/web/public/js_messaging/content_world.h" #import "ios/web/public/web_state_observer.h" namespace web { +class WebFramesManagerImpl; class WebUIIOS; // Internal implementation of a realized WebStateImpl. @@ -55,10 +59,14 @@ class WebStateImpl::RealizedWebState final : public NavigationManagerDelegate { const NavigationManagerImpl& GetNavigationManager() const; NavigationManagerImpl& GetNavigationManager(); - // Returns the WebFrameManagerImpl associated with the owning WebStateImpl. - const WebFramesManagerImpl& GetPageWorldWebFramesManager() const; + // Returns the WebFrameManagerImpl associated with the owning WebStateImpl for + // the page content world. WebFramesManagerImpl& GetPageWorldWebFramesManager(); + // Returns the WebFrameManagerImpl associated with the owning WebStateImpl for + // the given `world`. + WebFramesManagerImpl& GetWebFramesManager(ContentWorld world); + // Returns the SessionCertificationPolicyCacheImpl associated with the owning // WebStateImpl. const SessionCertificatePolicyCacheImpl& GetSessionCertificatePolicyCache() @@ -304,6 +312,9 @@ class WebStateImpl::RealizedWebState final : public NavigationManagerDelegate { // The fake CRWWebViewNavigationProxy used for testing. Nil in production. __strong id<CRWWebViewNavigationProxy> web_view_for_testing_; + + // A map which stores the web frame manager for each content world. + std::map<ContentWorld, std::unique_ptr<WebFramesManagerImpl>> managers_; }; } // namespace web diff --git a/ios/web/web_state/web_state_impl_realized_web_state.mm b/ios/web/web_state/web_state_impl_realized_web_state.mm index 5c245873ec6e5..477ea1dac1ee0 100644 --- a/ios/web/web_state/web_state_impl_realized_web_state.mm +++ b/ios/web/web_state/web_state_impl_realized_web_state.mm @@ -150,16 +150,19 @@ NavigationManagerImpl& WebStateImpl::RealizedWebState::GetNavigationManager() { return *navigation_manager_; } -const WebFramesManagerImpl& -WebStateImpl::RealizedWebState::GetPageWorldWebFramesManager() const { - return WebFramesManagerImpl::FromWebState(owner_, - ContentWorld::kPageContentWorld); -} - WebFramesManagerImpl& WebStateImpl::RealizedWebState::GetPageWorldWebFramesManager() { - return WebFramesManagerImpl::FromWebState(owner_, - ContentWorld::kPageContentWorld); + return GetWebFramesManager(ContentWorld::kPageContentWorld); +} + +WebFramesManagerImpl& WebStateImpl::RealizedWebState::GetWebFramesManager( + ContentWorld world) { + DCHECK_NE(world, ContentWorld::kAllContentWorlds); + + if (!managers_[world]) { + managers_[world] = base::WrapUnique(new WebFramesManagerImpl()); + } + return *managers_[world].get(); } const SessionCertificatePolicyCacheImpl&