Copy pdf data on IO thread to avoid causing main process hangs.
This commit is contained in:
parent
1eba552a8d
commit
16348fc895
2 changed files with 27 additions and 15 deletions
|
@ -40,6 +40,19 @@ void StopWorker(int document_cookie) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* CopyPDFDataOnIOThread(
|
||||||
|
const PrintHostMsg_DidPreviewDocument_Params& params) {
|
||||||
|
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||||
|
scoped_ptr<base::SharedMemory> shared_buf(
|
||||||
|
new base::SharedMemory(params.metafile_data_handle, true));
|
||||||
|
if (!shared_buf->Map(params.data_size))
|
||||||
|
return nullptr;
|
||||||
|
char* memory_pdf_data = static_cast<char*>(shared_buf->memory());
|
||||||
|
char* pdf_data = new char[params.data_size];
|
||||||
|
memcpy(pdf_data, memory_pdf_data, params.data_size);
|
||||||
|
return pdf_data;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace printing {
|
namespace printing {
|
||||||
|
@ -64,22 +77,20 @@ void PrintPreviewMessageHandler::OnMetafileReadyForPrinting(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_ptr<base::SharedMemory> shared_buf(
|
BrowserThread::PostTaskAndReplyWithResult(
|
||||||
new base::SharedMemory(params.metafile_data_handle, true));
|
BrowserThread::IO,
|
||||||
if (!shared_buf->Map(params.data_size)) {
|
FROM_HERE,
|
||||||
RunPrintToPDFCallback(params.preview_request_id, nullptr, 0);
|
base::Bind(&CopyPDFDataOnIOThread, params),
|
||||||
return;
|
base::Bind(&PrintPreviewMessageHandler::RunPrintToPDFCallback,
|
||||||
}
|
base::Unretained(this),
|
||||||
|
params.preview_request_id,
|
||||||
RunPrintToPDFCallback(params.preview_request_id,
|
params.data_size));
|
||||||
static_cast<char*>(shared_buf->memory()),
|
|
||||||
params.data_size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie,
|
void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie,
|
||||||
int request_id) {
|
int request_id) {
|
||||||
StopWorker(document_cookie);
|
StopWorker(document_cookie);
|
||||||
RunPrintToPDFCallback(request_id, nullptr, 0);
|
RunPrintToPDFCallback(request_id, 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrintPreviewMessageHandler::OnMessageReceived(
|
bool PrintPreviewMessageHandler::OnMessageReceived(
|
||||||
|
@ -107,12 +118,14 @@ void PrintPreviewMessageHandler::PrintToPDF(
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintPreviewMessageHandler::RunPrintToPDFCallback(
|
void PrintPreviewMessageHandler::RunPrintToPDFCallback(
|
||||||
int request_id, char* data, uint32 data_size) {
|
int request_id, uint32 data_size, char* data) {
|
||||||
|
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||||
|
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
||||||
v8::Locker locker(isolate);
|
v8::Locker locker(isolate);
|
||||||
v8::HandleScope handle_scope(isolate);
|
v8::HandleScope handle_scope(isolate);
|
||||||
if (data) {
|
if (data) {
|
||||||
v8::Local<v8::Value> buffer = node::Buffer::New(isolate,
|
v8::Local<v8::Value> buffer = node::Buffer::Use(isolate,
|
||||||
data, static_cast<size_t>(data_size));
|
data, static_cast<size_t>(data_size));
|
||||||
print_to_pdf_callback_map_[request_id].Run(v8::Null(isolate), buffer);
|
print_to_pdf_callback_map_[request_id].Run(v8::Null(isolate), buffer);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -47,8 +47,7 @@ class PrintPreviewMessageHandler
|
||||||
const PrintHostMsg_DidPreviewDocument_Params& params);
|
const PrintHostMsg_DidPreviewDocument_Params& params);
|
||||||
void OnPrintPreviewFailed(int document_cookie, int request_id);
|
void OnPrintPreviewFailed(int document_cookie, int request_id);
|
||||||
|
|
||||||
void RunPrintToPDFCallback(
|
void RunPrintToPDFCallback(int request_id, uint32 data_size, char* data);
|
||||||
int request_id, char* data, uint32 data_size);
|
|
||||||
|
|
||||||
PrintToPDFCallbackMap print_to_pdf_callback_map_;
|
PrintToPDFCallbackMap print_to_pdf_callback_map_;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue