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:

committed by
Chromium LUCI CQ

parent
2232b95ce3
commit
8e95d93cda
@ -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) {
|
||||
|
Reference in New Issue
Block a user