OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/renderer/translate/translate_helper.h" | 5 #include "chrome/renderer/translate/translate_helper.h" |
6 | 6 |
7 #if defined(CLD2_DYNAMIC_MODE) | 7 #if defined(CLD2_DYNAMIC_MODE) |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 base::Bind(&TranslateHelper::SendCLD2DataFileRequest, | 619 base::Bind(&TranslateHelper::SendCLD2DataFileRequest, |
620 weak_method_factory_.GetWeakPtr(), | 620 weak_method_factory_.GetWeakPtr(), |
621 next_delay_millis, next_delay_millis), | 621 next_delay_millis, next_delay_millis), |
622 base::TimeDelta::FromMilliseconds(delay_millis)); | 622 base::TimeDelta::FromMilliseconds(delay_millis)); |
623 } | 623 } |
624 | 624 |
625 void TranslateHelper::OnCLDDataAvailable( | 625 void TranslateHelper::OnCLDDataAvailable( |
626 const IPC::PlatformFileForTransit ipc_file_handle, | 626 const IPC::PlatformFileForTransit ipc_file_handle, |
627 const uint64 data_offset, | 627 const uint64 data_offset, |
628 const uint64 data_length) { | 628 const uint64 data_length) { |
629 LoadCLDDData(ipc_file_handle, data_offset, data_length); | 629 LoadCLDDData(IPC::PlatformFileForTransitToFile(ipc_file_handle), data_offset, |
| 630 data_length); |
630 if (deferred_page_capture_ && CLD2::isDataLoaded()) { | 631 if (deferred_page_capture_ && CLD2::isDataLoaded()) { |
631 deferred_page_capture_ = false; // Don't do this a second time. | 632 deferred_page_capture_ = false; // Don't do this a second time. |
632 PageCaptured(deferred_page_id_, deferred_contents_); | 633 PageCaptured(deferred_page_id_, deferred_contents_); |
633 deferred_page_id_ = -1; // Clean up for sanity | 634 deferred_page_id_ = -1; // Clean up for sanity |
634 deferred_contents_.clear(); // Clean up for sanity | 635 deferred_contents_.clear(); // Clean up for sanity |
635 } | 636 } |
636 } | 637 } |
637 | 638 |
638 void TranslateHelper::LoadCLDDData( | 639 void TranslateHelper::LoadCLDDData( |
639 const IPC::PlatformFileForTransit ipc_file_handle, | 640 base::File file, |
640 const uint64 data_offset, | 641 const uint64 data_offset, |
641 const uint64 data_length) { | 642 const uint64 data_length) { |
642 // Terminate immediately if told to stop polling. | 643 // Terminate immediately if told to stop polling. |
643 if (cld2_data_file_polling_canceled_) | 644 if (cld2_data_file_polling_canceled_) |
644 return; | 645 return; |
645 | 646 |
646 // Terminate immediately if data is already loaded. | 647 // Terminate immediately if data is already loaded. |
647 if (CLD2::isDataLoaded()) | 648 if (CLD2::isDataLoaded()) |
648 return; | 649 return; |
649 | 650 |
650 // Grab the file handle | 651 if (!file.IsValid()) { |
651 base::PlatformFile platform_file = | |
652 IPC::PlatformFileForTransitToPlatformFile(ipc_file_handle); | |
653 if (platform_file == base::kInvalidPlatformFileValue) { | |
654 LOG(ERROR) << "Can't find the CLD data file."; | 652 LOG(ERROR) << "Can't find the CLD data file."; |
655 return; | 653 return; |
656 } | 654 } |
657 base::File basic_file(platform_file); | |
658 | 655 |
659 // mmap the file | 656 // mmap the file |
660 s_cld_mmap_.Get().value = new base::MemoryMappedFile(); | 657 s_cld_mmap_.Get().value = new base::MemoryMappedFile(); |
661 bool initialized = s_cld_mmap_.Get().value->Initialize(basic_file.Pass()); | 658 bool initialized = s_cld_mmap_.Get().value->Initialize(file.Pass()); |
662 if (!initialized) { | 659 if (!initialized) { |
663 LOG(ERROR) << "mmap initialization failed"; | 660 LOG(ERROR) << "mmap initialization failed"; |
664 delete s_cld_mmap_.Get().value; | 661 delete s_cld_mmap_.Get().value; |
665 s_cld_mmap_.Get().value = NULL; | 662 s_cld_mmap_.Get().value = NULL; |
666 return; | 663 return; |
667 } | 664 } |
668 | 665 |
669 // Sanity checks | 666 // Sanity checks |
670 uint64 max_int32 = std::numeric_limits<int32>::max(); | 667 uint64 max_int32 = std::numeric_limits<int32>::max(); |
671 if (data_length + data_offset > s_cld_mmap_.Get().value->length() | 668 if (data_length + data_offset > s_cld_mmap_.Get().value->length() |
672 || data_length > max_int32) { // max signed 32 bit integer | 669 || data_length > max_int32) { // max signed 32 bit integer |
673 LOG(ERROR) << "Illegal mmap config: data_offset=" | 670 LOG(ERROR) << "Illegal mmap config: data_offset=" |
674 << data_offset << ", data_length=" << data_length | 671 << data_offset << ", data_length=" << data_length |
675 << ", mmap->length()=" << s_cld_mmap_.Get().value->length(); | 672 << ", mmap->length()=" << s_cld_mmap_.Get().value->length(); |
676 delete s_cld_mmap_.Get().value; | 673 delete s_cld_mmap_.Get().value; |
677 s_cld_mmap_.Get().value = NULL; | 674 s_cld_mmap_.Get().value = NULL; |
678 return; | 675 return; |
679 } | 676 } |
680 | 677 |
681 // Initialize the CLD subsystem... and it's all done! | 678 // Initialize the CLD subsystem... and it's all done! |
682 const uint8* data_ptr = s_cld_mmap_.Get().value->data() + data_offset; | 679 const uint8* data_ptr = s_cld_mmap_.Get().value->data() + data_offset; |
683 CLD2::loadDataFromRawAddress(data_ptr, data_length); | 680 CLD2::loadDataFromRawAddress(data_ptr, data_length); |
684 DCHECK(CLD2::isDataLoaded()) << "Failed to load CLD data from mmap"; | 681 DCHECK(CLD2::isDataLoaded()) << "Failed to load CLD data from mmap"; |
685 } | 682 } |
686 #endif | 683 #endif |
OLD | NEW |