Move ownership of WebFramesManagerImpl to WebState
Moves the ownership of WebFramesManagerImpl instances from a
WebStateUserData Container to being owned by the realized web state
directly.
Bug: 1380918
Change-Id: I2dc8ec7c2f742ce10087732dd945252019b94062
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4301709
Reviewed-by: Ali Juma <ajuma@chromium.org>
Commit-Queue: Mike Dougherty <michaeldo@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1111939}
diff --git a/ios/web/js_messaging/web_frames_manager_impl.h b/ios/web/js_messaging/web_frames_manager_impl.h
index 81abd82..e587b66 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 @@
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 70bdf307..7a67ef2 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 1fa4bb9..0a7c4d67 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 @@
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 @@
// 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 5c24587..477ea1d 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 @@
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&