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( ...@@ -76,6 +76,14 @@ void WebContentsObserverProxy::RenderFrameCreated(
render_frame_host->GetRoutingID()); 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() { void WebContentsObserverProxy::RenderViewReady() {
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
Java_WebContentsObserverProxy_renderViewReady(env, java_observer_); Java_WebContentsObserverProxy_renderViewReady(env, java_observer_);
......
...@@ -33,6 +33,7 @@ class WebContentsObserverProxy : public WebContentsObserver { ...@@ -33,6 +33,7 @@ class WebContentsObserverProxy : public WebContentsObserver {
private: private:
void RenderFrameCreated(RenderFrameHost* render_frame_host) override; void RenderFrameCreated(RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
void RenderViewReady() override; void RenderViewReady() override;
void RenderProcessGone(base::TerminationStatus termination_status) override; void RenderProcessGone(base::TerminationStatus termination_status) override;
void DidStartLoading() override; void DidStartLoading() override;
......
...@@ -71,6 +71,18 @@ public final class RemoteObjectInjector extends WebContentsObserver { ...@@ -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( public void addInterface(
Object object, String name, Class<? extends Annotation> requiredAnnotation) { Object object, String name, Class<? extends Annotation> requiredAnnotation) {
WebContents webContents = mWebContents.get(); WebContents webContents = mWebContents.get();
......
...@@ -71,6 +71,14 @@ class WebContentsObserverProxy extends WebContentsObserver { ...@@ -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 @Override
@CalledByNative @CalledByNative
public void renderViewReady() { public void renderViewReady() {
......
...@@ -38,6 +38,15 @@ public abstract class WebContentsObserver { ...@@ -38,6 +38,15 @@ public abstract class WebContentsObserver {
*/ */
public void renderFrameCreated(int renderProcessId, int renderFrameId) {} 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 * Called when the RenderView of the current RenderViewHost is ready, e.g. because we recreated
* it after a crash. * 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