Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 07aefd06676f40193fb2648a2981571db64aeae7..e383a06297a468b2df73feb165cdd5468ded940d 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -5126,6 +5126,20 @@ void RenderFrameImpl::FocusedNodeChangedForAccessibility(const WebNode& node) { |
render_accessibility()->AccessibilityFocusedNodeChanged(node); |
} |
+// PlzNavigate: Used to delete the StreamHandle that live on the browser side. |
+class StreamHandleDeleter : public RenderFrameObserver { |
+ public: |
+ StreamHandleDeleter(RenderFrame* render_frame) |
+ : RenderFrameObserver(render_frame) {} |
+ void OnDestruct() override {} |
+ void OnStreamHandleConsumed(const GURL& stream_handle_url) { |
+ if (!render_frame()) |
+ return; |
+ static_cast<RenderFrameImpl*>(render_frame()) |
+ ->StreamHandleConsumed(stream_handle_url); |
+ } |
+}; |
+ |
// PlzNavigate |
void RenderFrameImpl::OnCommitNavigation( |
const ResourceResponseHead& response, |
@@ -5146,6 +5160,16 @@ void RenderFrameImpl::OnCommitNavigation( |
stream_override->redirect_responses = request_params.redirect_response; |
stream_override->redirect_infos = request_params.redirect_infos; |
+ // PlzNavigate: Notify the browser that it can released its |stream_handle_| |
+ // when the |stream_override| object is no more used. This is a temporary |
+ // solution until mojo is used. |
+ stream_override->on_delete = base::BindOnce( |
+ [](std::unique_ptr<StreamHandleDeleter> stream_handle_deleter, |
+ const GURL& url) { |
+ stream_handle_deleter->OnStreamHandleConsumed(url); |
clamy
2017/06/09 14:57:42
Why not binding the RenderFrameImpl directly with
arthursonzogni
2017/06/12 09:30:15
I thought base::weak_ptr was sort of the the same
|
+ }, |
+ base::MakeUnique<StreamHandleDeleter>(this)); |
+ |
if (commit_data.url_loader_factory.is_valid()) { |
// Chrome doesn't use interface versioning. |
url_loader_factory_.Bind(mojom::URLLoaderFactoryPtrInfo( |
@@ -6249,6 +6273,10 @@ void RenderFrameImpl::SyncSelectionIfRequired() { |
GetRenderWidget()->UpdateSelectionBounds(); |
} |
+void RenderFrameImpl::StreamHandleConsumed(const GURL& stream_url) { |
+ Send(new FrameHostMsg_StreamHandleConsumed(routing_id_, stream_url)); |
+} |
+ |
void RenderFrameImpl::InitializeUserMediaClient() { |
RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
if (!render_thread) // Will be NULL during unit tests. |