Chromium Code Reviews| 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. |