Commit 9f8ff139 authored by Miyoung Shin's avatar Miyoung Shin Committed by Commit Bot

[remoteobjects] Remove the map entry on frame deletion

This change exposes a Java method on WebContentsObserverProxy that
allows it to observe render frame deletion and romoves a map entry
in RemoteObjectInjector when renderFrameDeleted is called.

Bug: 1105925
Change-Id: I2c155fc22b494efea40c212b2f4f6caac15b70e1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2462999Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Miyoung Shin <myid.shin@igalia.com>
Cr-Commit-Position: refs/heads/master@{#816962}
parent 17465300
......@@ -76,6 +76,14 @@ void WebContentsObserverProxy::RenderFrameCreated(
render_frame_host->GetRoutingID());
}
void WebContentsObserverProxy::RenderFrameDeleted(
RenderFrameHost* render_frame_host) {
JNIEnv* env = AttachCurrentThread();
Java_WebContentsObserverProxy_renderFrameDeleted(
env, java_observer_, render_frame_host->GetProcess()->GetID(),
render_frame_host->GetRoutingID());
}
void WebContentsObserverProxy::RenderViewReady() {
JNIEnv* env = AttachCurrentThread();
Java_WebContentsObserverProxy_renderViewReady(env, java_observer_);
......
......@@ -33,6 +33,7 @@ class WebContentsObserverProxy : public WebContentsObserver {
private:
void RenderFrameCreated(RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
void RenderViewReady() override;
void RenderProcessGone(base::TerminationStatus termination_status) override;
void DidStartLoading() override;
......
......@@ -71,6 +71,18 @@ public final class RemoteObjectInjector extends WebContentsObserver {
}
}
@Override
public void renderFrameDeleted(int renderProcessId, int renderFrameId) {
WebContents webContents = mWebContents.get();
if (webContents == null) return;
RenderFrameHost frameHost =
webContents.getRenderFrameHostFromId(renderProcessId, renderFrameId);
if (frameHost == null) return;
mRemoteObjectGatewayHelpers.remove(frameHost);
}
public void addInterface(
Object object, String name, Class<? extends Annotation> requiredAnnotation) {
WebContents webContents = mWebContents.get();
......
......@@ -71,6 +71,14 @@ class WebContentsObserverProxy extends WebContentsObserver {
}
}
@Override
@CalledByNative
public void renderFrameDeleted(int renderProcessId, int renderFrameId) {
for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
mObserversIterator.next().renderFrameDeleted(renderProcessId, renderFrameId);
}
}
@Override
@CalledByNative
public void renderViewReady() {
......
......@@ -38,6 +38,15 @@ public abstract class WebContentsObserver {
*/
public void renderFrameCreated(int renderProcessId, int renderFrameId) {}
/**
* Called when a RenderFrame for renderFrameHost is deleted in the
* renderer process.
* To avoid creating a RenderFrameHost object without necessity, only process id and frame id
* are passed. Call WebContents#getRenderFrameHostFromId() to get the RenderFrameHostImpl object
* if needed.
*/
public void renderFrameDeleted(int renderProcessId, int renderFrameId) {}
/**
* Called when the RenderView of the current RenderViewHost is ready, e.g. because we recreated
* it after a crash.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment