| 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 |