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() { ...@@ -382,6 +382,8 @@ void PrintViewManagerBase::DidStartLoading() {
void PrintViewManagerBase::RenderFrameDeleted( void PrintViewManagerBase::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) { content::RenderFrameHost* render_frame_host) {
PrintManager::RenderFrameDeleted(render_frame_host);
// Terminates or cancels the print job if one was pending. // Terminates or cancels the print job if one was pending.
if (render_frame_host != printing_rfh_) if (render_frame_host != printing_rfh_)
return; return;
......
...@@ -91,6 +91,11 @@ bool PrintManager::OnMessageReceived( ...@@ -91,6 +91,11 @@ bool PrintManager::OnMessageReceived(
return handled; return handled;
} }
void PrintManager::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
print_render_frames_.erase(render_frame_host);
}
void PrintManager::OnDidGetPrintedPagesCount(int cookie, void PrintManager::OnDidGetPrintedPagesCount(int cookie,
int number_pages) { int number_pages) {
DCHECK_GT(cookie, 0); DCHECK_GT(cookie, 0);
...@@ -114,15 +119,19 @@ void PrintManager::OnPrintingFailed(int cookie) { ...@@ -114,15 +119,19 @@ void PrintManager::OnPrintingFailed(int cookie) {
const mojo::AssociatedRemote<printing::mojom::PrintRenderFrame>& const mojo::AssociatedRemote<printing::mojom::PrintRenderFrame>&
PrintManager::GetPrintRenderFrame(content::RenderFrameHost* rfh) { PrintManager::GetPrintRenderFrame(content::RenderFrameHost* rfh) {
// When print preview is closed, the remote is disconnected from the receiver. auto it = print_render_frames_.find(rfh);
// Reset a disconnected remote before using it again. if (it == print_render_frames_.end()) {
if (print_render_frame_.is_bound() && !print_render_frame_.is_connected()) mojo::AssociatedRemote<printing::mojom::PrintRenderFrame> remote;
print_render_frame_.reset(); rfh->GetRemoteAssociatedInterfaces()->GetInterface(&remote);
it = print_render_frames_.insert({rfh, std::move(remote)}).first;
if (!print_render_frame_.is_bound()) } else if (it->second.is_bound() && !it->second.is_connected()) {
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame_); // 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() { void PrintManager::PrintingRenderFrameDeleted() {
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_H_ #ifndef COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_H_
#define COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_H_ #define COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_H_
#include <map>
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
...@@ -52,6 +53,7 @@ class PrintManager : public content::WebContentsObserver { ...@@ -52,6 +53,7 @@ class PrintManager : public content::WebContentsObserver {
// content::WebContentsObserver // content::WebContentsObserver
bool OnMessageReceived(const IPC::Message& message, bool OnMessageReceived(const IPC::Message& message,
content::RenderFrameHost* render_frame_host) override; content::RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
// IPC handling support // IPC handling support
struct FrameDispatchHelper; struct FrameDispatchHelper;
...@@ -103,9 +105,12 @@ class PrintManager : public content::WebContentsObserver { ...@@ -103,9 +105,12 @@ class PrintManager : public content::WebContentsObserver {
private: private:
void OnDidGetDocumentCookie(int cookie); void OnDidGetDocumentCookie(int cookie);
// Used to transmit mojom interface method calls to the PrintRenderFrame // Stores a PrintRenderFrame associated remote with the RenderFrameHost used
// associated remote. // to bind it. The PrintRenderFrame is used to transmit mojo interface method
mojo::AssociatedRemote<printing::mojom::PrintRenderFrame> print_render_frame_; // calls to the associated receiver.
std::map<content::RenderFrameHost*,
mojo::AssociatedRemote<printing::mojom::PrintRenderFrame>>
print_render_frames_;
DISALLOW_COPY_AND_ASSIGN(PrintManager); 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