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&