0

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}
This commit is contained in:
Mike Dougherty
2023-03-02 00:33:53 +00:00
committed by Chromium LUCI CQ
parent 5f3759cc99
commit 0164fe22ba
4 changed files with 26 additions and 69 deletions

@ -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_;

@ -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;

@ -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

@ -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&