Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: components/pdf_viewer/pdf_viewer.cc

Issue 1431573002: Fix hangs in Mandoline page cycler on Linux with --enable-multiprocess. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/callback.h" 6 #include "base/callback.h"
7 #include "base/containers/hash_tables.h" 7 #include "base/containers/hash_tables.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "components/mus/public/cpp/scoped_window_ptr.h" 9 #include "components/mus/public/cpp/scoped_window_ptr.h"
10 #include "components/mus/public/cpp/types.h" 10 #include "components/mus/public/cpp/types.h"
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 DISALLOW_COPY_AND_ASSIGN(PDFView); 502 DISALLOW_COPY_AND_ASSIGN(PDFView);
503 }; 503 };
504 504
505 // Responsible for managing all the views for displaying a PDF document. 505 // Responsible for managing all the views for displaying a PDF document.
506 class PDFViewerApplicationDelegate 506 class PDFViewerApplicationDelegate
507 : public mojo::ApplicationDelegate, 507 : public mojo::ApplicationDelegate,
508 public mojo::InterfaceFactory<mus::mojom::WindowTreeClient> { 508 public mojo::InterfaceFactory<mus::mojom::WindowTreeClient> {
509 public: 509 public:
510 PDFViewerApplicationDelegate( 510 PDFViewerApplicationDelegate(
511 mojo::InterfaceRequest<mojo::Application> request, 511 mojo::InterfaceRequest<mojo::Application> request,
512 mojo::URLResponsePtr response) 512 mojo::URLResponsePtr response,
513 const mojo::Callback<void()>& destruct_callback)
513 : app_(this, 514 : app_(this,
514 request.Pass(), 515 request.Pass(),
515 base::Bind(&PDFViewerApplicationDelegate::OnTerminate, 516 base::Bind(&PDFViewerApplicationDelegate::OnTerminate,
516 base::Unretained(this))), 517 base::Unretained(this))),
517 doc_(nullptr), 518 doc_(nullptr),
518 is_destroying_(false) { 519 is_destroying_(false),
520 destruct_callback_(destruct_callback) {
519 FetchPDF(response.Pass()); 521 FetchPDF(response.Pass());
520 } 522 }
521 523
522 ~PDFViewerApplicationDelegate() override { 524 ~PDFViewerApplicationDelegate() override {
523 is_destroying_ = true; 525 is_destroying_ = true;
524 if (doc_) 526 if (doc_)
525 FPDF_CloseDocument(doc_); 527 FPDF_CloseDocument(doc_);
526 while (!pdf_views_.empty()) 528 while (!pdf_views_.empty())
527 pdf_views_.front()->Close(); 529 pdf_views_.front()->Close();
530 destruct_callback_.Run();
528 } 531 }
529 532
530 private: 533 private:
531 void FetchPDF(mojo::URLResponsePtr response) { 534 void FetchPDF(mojo::URLResponsePtr response) {
532 data_.clear(); 535 data_.clear();
533 mojo::common::BlockingCopyToString(response->body.Pass(), &data_); 536 mojo::common::BlockingCopyToString(response->body.Pass(), &data_);
534 if (data_.length() >= static_cast<size_t>(std::numeric_limits<int>::max())) 537 if (data_.length() >= static_cast<size_t>(std::numeric_limits<int>::max()))
535 return; 538 return;
536 doc_ = FPDF_LoadMemDocument(data_.data(), static_cast<int>(data_.length()), 539 doc_ = FPDF_LoadMemDocument(data_.data(), static_cast<int>(data_.length()),
537 nullptr); 540 nullptr);
(...skipping 29 matching lines...) Expand all
567 mus::WindowTreeConnection::Create( 570 mus::WindowTreeConnection::Create(
568 pdf_view, request.Pass(), 571 pdf_view, request.Pass(),
569 mus::WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED); 572 mus::WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED);
570 } 573 }
571 574
572 mojo::ApplicationImpl app_; 575 mojo::ApplicationImpl app_;
573 std::string data_; 576 std::string data_;
574 std::vector<PDFView*> pdf_views_; 577 std::vector<PDFView*> pdf_views_;
575 FPDF_DOCUMENT doc_; 578 FPDF_DOCUMENT doc_;
576 bool is_destroying_; 579 bool is_destroying_;
580 mojo::Callback<void()> destruct_callback_;
577 581
578 DISALLOW_COPY_AND_ASSIGN(PDFViewerApplicationDelegate); 582 DISALLOW_COPY_AND_ASSIGN(PDFViewerApplicationDelegate);
579 }; 583 };
580 584
581 class ContentHandlerImpl : public mojo::ContentHandler { 585 class ContentHandlerImpl : public mojo::ContentHandler {
582 public: 586 public:
583 ContentHandlerImpl(mojo::InterfaceRequest<ContentHandler> request) 587 ContentHandlerImpl(mojo::InterfaceRequest<ContentHandler> request)
584 : binding_(this, request.Pass()) {} 588 : binding_(this, request.Pass()) {}
585 ~ContentHandlerImpl() override {} 589 ~ContentHandlerImpl() override {}
586 590
587 private: 591 private:
588 // ContentHandler: 592 // ContentHandler:
589 void StartApplication(mojo::InterfaceRequest<mojo::Application> request, 593 void StartApplication(
590 mojo::URLResponsePtr response) override { 594 mojo::InterfaceRequest<mojo::Application> request,
591 new PDFViewerApplicationDelegate(request.Pass(), response.Pass()); 595 mojo::URLResponsePtr response,
596 const mojo::Callback<void()>& destruct_callback) override {
597 new PDFViewerApplicationDelegate(
598 request.Pass(), response.Pass(), destruct_callback);
592 } 599 }
593 600
594 mojo::StrongBinding<mojo::ContentHandler> binding_; 601 mojo::StrongBinding<mojo::ContentHandler> binding_;
595 602
596 DISALLOW_COPY_AND_ASSIGN(ContentHandlerImpl); 603 DISALLOW_COPY_AND_ASSIGN(ContentHandlerImpl);
597 }; 604 };
598 605
599 class PDFViewer : public mojo::ApplicationDelegate, 606 class PDFViewer : public mojo::ApplicationDelegate,
600 public mojo::InterfaceFactory<mojo::ContentHandler> { 607 public mojo::InterfaceFactory<mojo::ContentHandler> {
601 public: 608 public:
(...skipping 26 matching lines...) Expand all
628 635
629 DISALLOW_COPY_AND_ASSIGN(PDFViewer); 636 DISALLOW_COPY_AND_ASSIGN(PDFViewer);
630 }; 637 };
631 } // namespace 638 } // namespace
632 } // namespace pdf_viewer 639 } // namespace pdf_viewer
633 640
634 MojoResult MojoMain(MojoHandle application_request) { 641 MojoResult MojoMain(MojoHandle application_request) {
635 mojo::ApplicationRunner runner(new pdf_viewer::PDFViewer()); 642 mojo::ApplicationRunner runner(new pdf_viewer::PDFViewer());
636 return runner.Run(application_request); 643 return runner.Run(application_request);
637 } 644 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698