Commit b962e6f4 authored by Jesse Schettler's avatar Jesse Schettler Committed by Commit Bot

printing: Store PrintRenderFrame with its RenderFrameHost

Add a std::map to store a PrintRenderFrame with the RenderFrameHost used
to bind it. When calling GetPrintRenderFrame(), use the provided
RenderFrameHost to fetch the correct PrintRenderFrame associated remote
or create a new one.

Bug: 1019847, 1019960, 1020108
Test: https://clusterfuzz.com/testcase-detail/4896664890245120
Change-Id: I5ebf26b1dcdcd045bac1d1c5b204c8517fdb5ea3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1892055Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Commit-Queue: Jesse Schettler <jschettler@chromium.org>
Auto-Submit: Jesse Schettler <jschettler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711434}
parent 73ea5599
......@@ -382,6 +382,8 @@ void PrintViewManagerBase::DidStartLoading() {
void PrintViewManagerBase::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
PrintManager::RenderFrameDeleted(render_frame_host);
// Terminates or cancels the print job if one was pending.
if (render_frame_host != printing_rfh_)
return;
......
......@@ -91,6 +91,11 @@ bool PrintManager::OnMessageReceived(
return handled;
}
void PrintManager::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
print_render_frames_.erase(render_frame_host);
}
void PrintManager::OnDidGetPrintedPagesCount(int cookie,
int number_pages) {
DCHECK_GT(cookie, 0);
......@@ -114,15 +119,19 @@ void PrintManager::OnPrintingFailed(int cookie) {
const mojo::AssociatedRemote<printing::mojom::PrintRenderFrame>&
PrintManager::GetPrintRenderFrame(content::RenderFrameHost* rfh) {
// When print preview is closed, the remote is disconnected from the receiver.
// Reset a disconnected remote before using it again.
if (print_render_frame_.is_bound() && !print_render_frame_.is_connected())
print_render_frame_.reset();
if (!print_render_frame_.is_bound())
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame_);
auto it = print_render_frames_.find(rfh);
if (it == print_render_frames_.end()) {
mojo::AssociatedRemote<printing::mojom::PrintRenderFrame> remote;
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&remote);
it = print_render_frames_.insert({rfh, std::move(remote)}).first;
} else if (it->second.is_bound() && !it->second.is_connected()) {
// When print preview is closed, the remote is disconnected from the
// receiver. Reset and bind the remote before using it again.
it->second.reset();
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&it->second);
}
return print_render_frame_;
return it->second;
}
void PrintManager::PrintingRenderFrameDeleted() {
......
......@@ -5,6 +5,7 @@
#ifndef COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_H_
#define COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_H_
#include <map>
#include <memory>
#include "base/macros.h"
......@@ -52,6 +53,7 @@ class PrintManager : public content::WebContentsObserver {
// content::WebContentsObserver
bool OnMessageReceived(const IPC::Message& message,
content::RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
// IPC handling support
struct FrameDispatchHelper;
......@@ -103,9 +105,12 @@ class PrintManager : public content::WebContentsObserver {
private:
void OnDidGetDocumentCookie(int cookie);
// Used to transmit mojom interface method calls to the PrintRenderFrame
// associated remote.
mojo::AssociatedRemote<printing::mojom::PrintRenderFrame> print_render_frame_;
// Stores a PrintRenderFrame associated remote with the RenderFrameHost used
// to bind it. The PrintRenderFrame is used to transmit mojo interface method
// calls to the associated receiver.
std::map<content::RenderFrameHost*,
mojo::AssociatedRemote<printing::mojom::PrintRenderFrame>>
print_render_frames_;
DISALLOW_COPY_AND_ASSIGN(PrintManager);
};
......
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