0

Rewrite usage of RenderFrame::GetRoutingID

Use LocalFrameToken instead. Move destruction
of observer to WillDetach.

Bug: 1502660
Change-Id: Ic3318c7b44b815647a23e85c97b57f1e9c51d3c9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5033445
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: Zijie He <zijiehe@google.com>
Cr-Commit-Position: refs/heads/main@{#1225737}
This commit is contained in:
Dave Tapuska
2023-11-16 21:42:15 +00:00
committed by Chromium LUCI CQ
parent 2232b95ce3
commit 8e95d93cda
5 changed files with 42 additions and 29 deletions

@ -27,6 +27,7 @@
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_view.h"
#include "third_party/widevine/cdm/buildflags.h"
@ -135,15 +136,16 @@ WebEngineContentRendererClient::WebEngineContentRendererClient() = default;
WebEngineContentRendererClient::~WebEngineContentRendererClient() = default;
WebEngineRenderFrameObserver*
WebEngineContentRendererClient::GetWebEngineRenderFrameObserverForRenderFrameId(
int render_frame_id) const {
auto iter = render_frame_id_to_observer_map_.find(render_frame_id);
DCHECK(iter != render_frame_id_to_observer_map_.end());
WebEngineContentRendererClient::GetWebEngineRenderFrameObserverForFrameToken(
const blink::LocalFrameToken& frame_token) const {
auto iter = frame_token_to_observer_map_.find(frame_token);
DCHECK(iter != frame_token_to_observer_map_.end());
return iter->second.get();
}
void WebEngineContentRendererClient::OnRenderFrameDeleted(int render_frame_id) {
size_t count = render_frame_id_to_observer_map_.erase(render_frame_id);
void WebEngineContentRendererClient::OnRenderFrameDeleted(
const blink::LocalFrameToken& frame_token) {
size_t count = frame_token_to_observer_map_.erase(frame_token);
DCHECK_EQ(count, 1u);
}
@ -165,14 +167,14 @@ void WebEngineContentRendererClient::RenderFrameCreated(
// The objects' lifetimes are bound to the RenderFrame's lifetime.
new on_load_script_injector::OnLoadScriptInjector(render_frame);
int render_frame_id = render_frame->GetRoutingID();
auto frame_token = render_frame->GetWebFrame()->GetLocalFrameToken();
auto render_frame_observer = std::make_unique<WebEngineRenderFrameObserver>(
render_frame,
base::BindOnce(&WebEngineContentRendererClient::OnRenderFrameDeleted,
base::Unretained(this)));
auto render_frame_observer_iter = render_frame_id_to_observer_map_.emplace(
render_frame_id, std::move(render_frame_observer));
auto render_frame_observer_iter = frame_token_to_observer_map_.emplace(
frame_token, std::move(render_frame_observer));
DCHECK(render_frame_observer_iter.second);
// Lifetime is tied to |render_frame| via content::RenderFrameObserver.

@ -11,6 +11,7 @@
#include "content/public/renderer/content_renderer_client.h"
#include "fuchsia_web/webengine/renderer/web_engine_audio_device_factory.h"
#include "fuchsia_web/webengine/renderer/web_engine_render_frame_observer.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#if BUILDFLAG(ENABLE_CAST_RECEIVER)
namespace cast_streaming {
@ -34,14 +35,14 @@ class WebEngineContentRendererClient : public content::ContentRendererClient {
~WebEngineContentRendererClient() override;
// Returns the WebEngineRenderFrameObserver corresponding to
// |render_frame_id|.
WebEngineRenderFrameObserver* GetWebEngineRenderFrameObserverForRenderFrameId(
int render_frame_id) const;
// `frame_token`.
WebEngineRenderFrameObserver* GetWebEngineRenderFrameObserverForFrameToken(
const blink::LocalFrameToken& frame_token) const;
private:
// Called by WebEngineRenderFrameObserver when its corresponding RenderFrame
// is in the process of being deleted.
void OnRenderFrameDeleted(int render_frame_id);
void OnRenderFrameDeleted(const blink::LocalFrameToken& frame_token);
// content::ContentRendererClient overrides.
void RenderThreadStarted() override;
@ -73,9 +74,10 @@ class WebEngineContentRendererClient : public content::ContentRendererClient {
// use the AudioConsumer service directly.
WebEngineAudioDeviceFactory audio_device_factory_;
// Map of RenderFrame ID to WebEngineRenderFrameObserver.
std::map<int, std::unique_ptr<WebEngineRenderFrameObserver>>
render_frame_id_to_observer_map_;
// Map of `blink::LocalFrameToken` to WebEngineRenderFrameObserver.
std::map<blink::LocalFrameToken,
std::unique_ptr<WebEngineRenderFrameObserver>>
frame_token_to_observer_map_;
// Initiates cache purges and Blink/V8 garbage collection when free memory
// is limited.

@ -5,12 +5,15 @@
#include "fuchsia_web/webengine/renderer/web_engine_render_frame_observer.h"
#include "base/functional/bind.h"
#include "base/notreached.h"
#include "content/public/renderer/render_frame.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/blink/public/web/web_local_frame.h"
WebEngineRenderFrameObserver::WebEngineRenderFrameObserver(
content::RenderFrame* render_frame,
base::OnceCallback<void(int)> on_render_frame_deleted_callback)
base::OnceCallback<void(const blink::LocalFrameToken&)>
on_render_frame_deleted_callback)
: content::RenderFrameObserver(render_frame),
url_request_rules_receiver_(render_frame),
on_render_frame_deleted_callback_(
@ -22,5 +25,12 @@ WebEngineRenderFrameObserver::WebEngineRenderFrameObserver(
WebEngineRenderFrameObserver::~WebEngineRenderFrameObserver() = default;
void WebEngineRenderFrameObserver::OnDestruct() {
std::move(on_render_frame_deleted_callback_).Run(routing_id());
// We should never hit this since we will have destroyed this observer
// in WillDetach.
NOTREACHED();
}
void WebEngineRenderFrameObserver::WillDetach() {
std::move(on_render_frame_deleted_callback_)
.Run(render_frame()->GetWebFrame()->GetLocalFrameToken());
}

@ -8,6 +8,7 @@
#include "base/functional/callback.h"
#include "components/url_rewrite/renderer/url_request_rules_receiver.h"
#include "content/public/renderer/render_frame_observer.h"
#include "third_party/blink/public/common/tokens/tokens.h"
namespace content {
class RenderFrame;
@ -15,14 +16,15 @@ class RenderFrame;
// This class owns WebEngine-specific objects whose lifespan is tied to a
// RenderFrame. Owned by WebEngineContentRendererClient, this object will be
// destroyed on RenderFrame destruction, triggering the destruction of all of
// the objects it exposes.
// destroyed on `blink::WebLocalFrame` destruction, triggering the destruction
// of all of the objects it exposes.
class WebEngineRenderFrameObserver final : public content::RenderFrameObserver {
public:
// |on_render_frame_deleted_callback| must delete |this|.
WebEngineRenderFrameObserver(
content::RenderFrame* render_frame,
base::OnceCallback<void(int)> on_render_frame_deleted_callback);
base::OnceCallback<void(const blink::LocalFrameToken&)>
on_render_frame_deleted_callback);
~WebEngineRenderFrameObserver() override;
WebEngineRenderFrameObserver(const WebEngineRenderFrameObserver&) = delete;
@ -36,10 +38,12 @@ class WebEngineRenderFrameObserver final : public content::RenderFrameObserver {
private:
// content::RenderFrameObserver implementation.
void OnDestruct() override;
void WillDetach() override;
url_rewrite::UrlRequestRulesReceiver url_request_rules_receiver_;
base::OnceCallback<void(int)> on_render_frame_deleted_callback_;
base::OnceCallback<void(const blink::LocalFrameToken&)>
on_render_frame_deleted_callback_;
};
#endif // FUCHSIA_WEB_WEBENGINE_RENDERER_WEB_ENGINE_RENDER_FRAME_OBSERVER_H_

@ -40,14 +40,9 @@ WebEngineURLLoaderThrottleProvider::CreateThrottles(
if (!web_frame) {
return throttles;
}
content::RenderFrame* render_frame =
content::RenderFrame::FromWebFrame(web_frame);
if (!render_frame) {
return throttles;
}
auto rules = content_renderer_client_
->GetWebEngineRenderFrameObserverForRenderFrameId(
render_frame->GetRoutingID())
->GetWebEngineRenderFrameObserverForFrameToken(
local_frame_token.value())
->url_request_rules_receiver()
->GetCachedRules();
if (rules) {