| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/browser/chromeos/extensions/file_manager/event_router.h" | 5 #include "chrome/browser/chromeos/extensions/file_manager/event_router.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 | 338 |
| 339 EventRouter::EventRouter(Profile* profile) | 339 EventRouter::EventRouter(Profile* profile) |
| 340 : pref_change_registrar_(new PrefChangeRegistrar), | 340 : pref_change_registrar_(new PrefChangeRegistrar), |
| 341 profile_(profile), | 341 profile_(profile), |
| 342 device_event_router_(new DeviceEventRouterImpl(profile)), | 342 device_event_router_(new DeviceEventRouterImpl(profile)), |
| 343 job_event_router_(new JobEventRouterImpl(profile)), | 343 job_event_router_(new JobEventRouterImpl(profile)), |
| 344 dispatch_directory_change_event_impl_( | 344 dispatch_directory_change_event_impl_( |
| 345 base::Bind(&EventRouter::DispatchDirectoryChangeEventImpl, | 345 base::Bind(&EventRouter::DispatchDirectoryChangeEventImpl, |
| 346 base::Unretained(this))), | 346 base::Unretained(this))), |
| 347 weak_factory_(this) { | 347 weak_factory_(this) { |
| 348 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 348 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 349 ObserveEvents(); | 349 ObserveEvents(); |
| 350 } | 350 } |
| 351 | 351 |
| 352 EventRouter::~EventRouter() { | 352 EventRouter::~EventRouter() { |
| 353 } | 353 } |
| 354 | 354 |
| 355 void EventRouter::Shutdown() { | 355 void EventRouter::Shutdown() { |
| 356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 356 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 357 | 357 |
| 358 DLOG_IF(WARNING, !file_watchers_.empty()) | 358 DLOG_IF(WARNING, !file_watchers_.empty()) |
| 359 << "Not all file watchers are " | 359 << "Not all file watchers are " |
| 360 << "removed. This can happen when Files.app is open during shutdown."; | 360 << "removed. This can happen when Files.app is open during shutdown."; |
| 361 STLDeleteValues(&file_watchers_); | 361 STLDeleteValues(&file_watchers_); |
| 362 if (!profile_) { | 362 if (!profile_) { |
| 363 NOTREACHED(); | 363 NOTREACHED(); |
| 364 return; | 364 return; |
| 365 } | 365 } |
| 366 | 366 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 pref_change_registrar_->Add(prefs::kDisableDriveHostedFiles, callback); | 439 pref_change_registrar_->Add(prefs::kDisableDriveHostedFiles, callback); |
| 440 pref_change_registrar_->Add(prefs::kDisableDrive, callback); | 440 pref_change_registrar_->Add(prefs::kDisableDrive, callback); |
| 441 pref_change_registrar_->Add(prefs::kUse24HourClock, callback); | 441 pref_change_registrar_->Add(prefs::kUse24HourClock, callback); |
| 442 } | 442 } |
| 443 | 443 |
| 444 // File watch setup routines. | 444 // File watch setup routines. |
| 445 void EventRouter::AddFileWatch(const base::FilePath& local_path, | 445 void EventRouter::AddFileWatch(const base::FilePath& local_path, |
| 446 const base::FilePath& virtual_path, | 446 const base::FilePath& virtual_path, |
| 447 const std::string& extension_id, | 447 const std::string& extension_id, |
| 448 const BoolCallback& callback) { | 448 const BoolCallback& callback) { |
| 449 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 449 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 450 DCHECK(!callback.is_null()); | 450 DCHECK(!callback.is_null()); |
| 451 | 451 |
| 452 base::FilePath watch_path = local_path; | 452 base::FilePath watch_path = local_path; |
| 453 bool is_on_drive = drive::util::IsUnderDriveMountPoint(watch_path); | 453 bool is_on_drive = drive::util::IsUnderDriveMountPoint(watch_path); |
| 454 // Tweak watch path for remote sources - we need to drop leading /special | 454 // Tweak watch path for remote sources - we need to drop leading /special |
| 455 // directory from there in order to be able to pair these events with | 455 // directory from there in order to be able to pair these events with |
| 456 // their change notifications. | 456 // their change notifications. |
| 457 if (is_on_drive) | 457 if (is_on_drive) |
| 458 watch_path = drive::util::ExtractDrivePath(watch_path); | 458 watch_path = drive::util::ExtractDrivePath(watch_path); |
| 459 | 459 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 479 file_watchers_[watch_path] = watcher.release(); | 479 file_watchers_[watch_path] = watcher.release(); |
| 480 } else { | 480 } else { |
| 481 iter->second->AddExtension(extension_id); | 481 iter->second->AddExtension(extension_id); |
| 482 base::MessageLoopProxy::current()->PostTask(FROM_HERE, | 482 base::MessageLoopProxy::current()->PostTask(FROM_HERE, |
| 483 base::Bind(callback, true)); | 483 base::Bind(callback, true)); |
| 484 } | 484 } |
| 485 } | 485 } |
| 486 | 486 |
| 487 void EventRouter::RemoveFileWatch(const base::FilePath& local_path, | 487 void EventRouter::RemoveFileWatch(const base::FilePath& local_path, |
| 488 const std::string& extension_id) { | 488 const std::string& extension_id) { |
| 489 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 489 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 490 | 490 |
| 491 base::FilePath watch_path = local_path; | 491 base::FilePath watch_path = local_path; |
| 492 // Tweak watch path for remote sources - we need to drop leading /special | 492 // Tweak watch path for remote sources - we need to drop leading /special |
| 493 // directory from there in order to be able to pair these events with | 493 // directory from there in order to be able to pair these events with |
| 494 // their change notifications. | 494 // their change notifications. |
| 495 if (drive::util::IsUnderDriveMountPoint(watch_path)) { | 495 if (drive::util::IsUnderDriveMountPoint(watch_path)) { |
| 496 watch_path = drive::util::ExtractDrivePath(watch_path); | 496 watch_path = drive::util::ExtractDrivePath(watch_path); |
| 497 } | 497 } |
| 498 WatcherMap::iterator iter = file_watchers_.find(watch_path); | 498 WatcherMap::iterator iter = file_watchers_.find(watch_path); |
| 499 if (iter == file_watchers_.end()) | 499 if (iter == file_watchers_.end()) |
| 500 return; | 500 return; |
| 501 // Remove the watcher if |watch_path| is no longer watched by any extensions. | 501 // Remove the watcher if |watch_path| is no longer watched by any extensions. |
| 502 iter->second->RemoveExtension(extension_id); | 502 iter->second->RemoveExtension(extension_id); |
| 503 if (iter->second->GetExtensionIds().empty()) { | 503 if (iter->second->GetExtensionIds().empty()) { |
| 504 delete iter->second; | 504 delete iter->second; |
| 505 file_watchers_.erase(iter); | 505 file_watchers_.erase(iter); |
| 506 } | 506 } |
| 507 } | 507 } |
| 508 | 508 |
| 509 void EventRouter::OnCopyCompleted(int copy_id, | 509 void EventRouter::OnCopyCompleted(int copy_id, |
| 510 const GURL& source_url, | 510 const GURL& source_url, |
| 511 const GURL& destination_url, | 511 const GURL& destination_url, |
| 512 base::File::Error error) { | 512 base::File::Error error) { |
| 513 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 513 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 514 | 514 |
| 515 file_manager_private::CopyProgressStatus status; | 515 file_manager_private::CopyProgressStatus status; |
| 516 if (error == base::File::FILE_OK) { | 516 if (error == base::File::FILE_OK) { |
| 517 // Send success event. | 517 // Send success event. |
| 518 status.type = file_manager_private::COPY_PROGRESS_STATUS_TYPE_SUCCESS; | 518 status.type = file_manager_private::COPY_PROGRESS_STATUS_TYPE_SUCCESS; |
| 519 status.source_url.reset(new std::string(source_url.spec())); | 519 status.source_url.reset(new std::string(source_url.spec())); |
| 520 status.destination_url.reset(new std::string(destination_url.spec())); | 520 status.destination_url.reset(new std::string(destination_url.spec())); |
| 521 } else { | 521 } else { |
| 522 // Send error event. | 522 // Send error event. |
| 523 status.type = file_manager_private::COPY_PROGRESS_STATUS_TYPE_ERROR; | 523 status.type = file_manager_private::COPY_PROGRESS_STATUS_TYPE_ERROR; |
| 524 status.error.reset(new std::string(FileErrorToErrorName(error))); | 524 status.error.reset(new std::string(FileErrorToErrorName(error))); |
| 525 } | 525 } |
| 526 | 526 |
| 527 BroadcastEvent( | 527 BroadcastEvent( |
| 528 profile_, | 528 profile_, |
| 529 file_manager_private::OnCopyProgress::kEventName, | 529 file_manager_private::OnCopyProgress::kEventName, |
| 530 file_manager_private::OnCopyProgress::Create(copy_id, status)); | 530 file_manager_private::OnCopyProgress::Create(copy_id, status)); |
| 531 } | 531 } |
| 532 | 532 |
| 533 void EventRouter::OnCopyProgress( | 533 void EventRouter::OnCopyProgress( |
| 534 int copy_id, | 534 int copy_id, |
| 535 storage::FileSystemOperation::CopyProgressType type, | 535 storage::FileSystemOperation::CopyProgressType type, |
| 536 const GURL& source_url, | 536 const GURL& source_url, |
| 537 const GURL& destination_url, | 537 const GURL& destination_url, |
| 538 int64 size) { | 538 int64 size) { |
| 539 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 539 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 540 | 540 |
| 541 file_manager_private::CopyProgressStatus status; | 541 file_manager_private::CopyProgressStatus status; |
| 542 status.type = CopyProgressTypeToCopyProgressStatusType(type); | 542 status.type = CopyProgressTypeToCopyProgressStatusType(type); |
| 543 status.source_url.reset(new std::string(source_url.spec())); | 543 status.source_url.reset(new std::string(source_url.spec())); |
| 544 if (type == storage::FileSystemOperation::END_COPY_ENTRY) | 544 if (type == storage::FileSystemOperation::END_COPY_ENTRY) |
| 545 status.destination_url.reset(new std::string(destination_url.spec())); | 545 status.destination_url.reset(new std::string(destination_url.spec())); |
| 546 if (type == storage::FileSystemOperation::PROGRESS) | 546 if (type == storage::FileSystemOperation::PROGRESS) |
| 547 status.size.reset(new double(size)); | 547 status.size.reset(new double(size)); |
| 548 | 548 |
| 549 // Should not skip events other than TYPE_PROGRESS. | 549 // Should not skip events other than TYPE_PROGRESS. |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 677 } | 677 } |
| 678 event.file_url = util::ConvertDrivePathToFileSystemUrl( | 678 event.file_url = util::ConvertDrivePathToFileSystemUrl( |
| 679 profile_, drive_path, kFileManagerAppId).spec(); | 679 profile_, drive_path, kFileManagerAppId).spec(); |
| 680 BroadcastEvent( | 680 BroadcastEvent( |
| 681 profile_, | 681 profile_, |
| 682 file_manager_private::OnDriveSyncError::kEventName, | 682 file_manager_private::OnDriveSyncError::kEventName, |
| 683 file_manager_private::OnDriveSyncError::Create(event)); | 683 file_manager_private::OnDriveSyncError::Create(event)); |
| 684 } | 684 } |
| 685 | 685 |
| 686 void EventRouter::OnRefreshTokenInvalid() { | 686 void EventRouter::OnRefreshTokenInvalid() { |
| 687 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 687 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 688 | 688 |
| 689 // Raise a DriveConnectionStatusChanged event to notify the status offline. | 689 // Raise a DriveConnectionStatusChanged event to notify the status offline. |
| 690 BroadcastEvent( | 690 BroadcastEvent( |
| 691 profile_, | 691 profile_, |
| 692 file_manager_private::OnDriveConnectionStatusChanged::kEventName, | 692 file_manager_private::OnDriveConnectionStatusChanged::kEventName, |
| 693 file_manager_private::OnDriveConnectionStatusChanged::Create()); | 693 file_manager_private::OnDriveConnectionStatusChanged::Create()); |
| 694 } | 694 } |
| 695 | 695 |
| 696 void EventRouter::OnReadyToSendRequests() { | 696 void EventRouter::OnReadyToSendRequests() { |
| 697 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 697 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 698 | 698 |
| 699 // Raise a DriveConnectionStatusChanged event to notify the status online. | 699 // Raise a DriveConnectionStatusChanged event to notify the status online. |
| 700 BroadcastEvent( | 700 BroadcastEvent( |
| 701 profile_, | 701 profile_, |
| 702 file_manager_private::OnDriveConnectionStatusChanged::kEventName, | 702 file_manager_private::OnDriveConnectionStatusChanged::kEventName, |
| 703 file_manager_private::OnDriveConnectionStatusChanged::Create()); | 703 file_manager_private::OnDriveConnectionStatusChanged::Create()); |
| 704 } | 704 } |
| 705 | 705 |
| 706 void EventRouter::HandleFileWatchNotification(const drive::FileChange* list, | 706 void EventRouter::HandleFileWatchNotification(const drive::FileChange* list, |
| 707 const base::FilePath& local_path, | 707 const base::FilePath& local_path, |
| 708 bool got_error) { | 708 bool got_error) { |
| 709 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 709 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 710 | 710 |
| 711 WatcherMap::const_iterator iter = file_watchers_.find(local_path); | 711 WatcherMap::const_iterator iter = file_watchers_.find(local_path); |
| 712 if (iter == file_watchers_.end()) { | 712 if (iter == file_watchers_.end()) { |
| 713 return; | 713 return; |
| 714 } | 714 } |
| 715 | 715 |
| 716 if (list && list->size() > kDirectoryChangeEventMaxDetailInfoSize) { | 716 if (list && list->size() > kDirectoryChangeEventMaxDetailInfoSize) { |
| 717 // Removes the detailed information, if the list size is more than | 717 // Removes the detailed information, if the list size is more than |
| 718 // kDirectoryChangeEventMaxDetailInfoSize, since passing large list | 718 // kDirectoryChangeEventMaxDetailInfoSize, since passing large list |
| 719 // and processing it may cause more itme. | 719 // and processing it may cause more itme. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 | 830 |
| 831 DispatchEventToExtension( | 831 DispatchEventToExtension( |
| 832 profile_, | 832 profile_, |
| 833 *extension_id, | 833 *extension_id, |
| 834 file_manager_private::OnDirectoryChanged::kEventName, | 834 file_manager_private::OnDirectoryChanged::kEventName, |
| 835 file_manager_private::OnDirectoryChanged::Create(event)); | 835 file_manager_private::OnDirectoryChanged::Create(event)); |
| 836 } | 836 } |
| 837 | 837 |
| 838 void EventRouter::OnDiskAdded( | 838 void EventRouter::OnDiskAdded( |
| 839 const DiskMountManager::Disk& disk, bool mounting) { | 839 const DiskMountManager::Disk& disk, bool mounting) { |
| 840 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 840 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 841 // Do nothing. | 841 // Do nothing. |
| 842 } | 842 } |
| 843 | 843 |
| 844 void EventRouter::OnDiskRemoved(const DiskMountManager::Disk& disk) { | 844 void EventRouter::OnDiskRemoved(const DiskMountManager::Disk& disk) { |
| 845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 845 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 846 // Do nothing. | 846 // Do nothing. |
| 847 } | 847 } |
| 848 | 848 |
| 849 void EventRouter::OnDeviceAdded(const std::string& device_path) { | 849 void EventRouter::OnDeviceAdded(const std::string& device_path) { |
| 850 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 850 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 851 // Do nothing. | 851 // Do nothing. |
| 852 } | 852 } |
| 853 | 853 |
| 854 void EventRouter::OnDeviceRemoved(const std::string& device_path) { | 854 void EventRouter::OnDeviceRemoved(const std::string& device_path) { |
| 855 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 855 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 856 // Do nothing. | 856 // Do nothing. |
| 857 } | 857 } |
| 858 | 858 |
| 859 void EventRouter::OnVolumeMounted(chromeos::MountError error_code, | 859 void EventRouter::OnVolumeMounted(chromeos::MountError error_code, |
| 860 const VolumeInfo& volume_info) { | 860 const VolumeInfo& volume_info) { |
| 861 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 861 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 862 // profile_ is NULL if ShutdownOnUIThread() is called earlier. This can | 862 // profile_ is NULL if ShutdownOnUIThread() is called earlier. This can |
| 863 // happen at shutdown. This should be removed after removing Drive mounting | 863 // happen at shutdown. This should be removed after removing Drive mounting |
| 864 // code in addMount. (addMount -> OnFileSystemMounted -> OnVolumeMounted is | 864 // code in addMount. (addMount -> OnFileSystemMounted -> OnVolumeMounted is |
| 865 // the only path to come here after Shutdown is called). | 865 // the only path to come here after Shutdown is called). |
| 866 if (!profile_) | 866 if (!profile_) |
| 867 return; | 867 return; |
| 868 | 868 |
| 869 DispatchMountCompletedEvent( | 869 DispatchMountCompletedEvent( |
| 870 file_manager_private::MOUNT_COMPLETED_EVENT_TYPE_MOUNT, | 870 file_manager_private::MOUNT_COMPLETED_EVENT_TYPE_MOUNT, |
| 871 error_code, | 871 error_code, |
| 872 volume_info); | 872 volume_info); |
| 873 } | 873 } |
| 874 | 874 |
| 875 void EventRouter::OnVolumeUnmounted(chromeos::MountError error_code, | 875 void EventRouter::OnVolumeUnmounted(chromeos::MountError error_code, |
| 876 const VolumeInfo& volume_info) { | 876 const VolumeInfo& volume_info) { |
| 877 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 877 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 878 DispatchMountCompletedEvent( | 878 DispatchMountCompletedEvent( |
| 879 file_manager_private::MOUNT_COMPLETED_EVENT_TYPE_UNMOUNT, | 879 file_manager_private::MOUNT_COMPLETED_EVENT_TYPE_UNMOUNT, |
| 880 error_code, | 880 error_code, |
| 881 volume_info); | 881 volume_info); |
| 882 } | 882 } |
| 883 | 883 |
| 884 void EventRouter::DispatchMountCompletedEvent( | 884 void EventRouter::DispatchMountCompletedEvent( |
| 885 file_manager_private::MountCompletedEventType event_type, | 885 file_manager_private::MountCompletedEventType event_type, |
| 886 chromeos::MountError error, | 886 chromeos::MountError error, |
| 887 const VolumeInfo& volume_info) { | 887 const VolumeInfo& volume_info) { |
| 888 // Build an event object. | 888 // Build an event object. |
| 889 file_manager_private::MountCompletedEvent event; | 889 file_manager_private::MountCompletedEvent event; |
| 890 event.event_type = event_type; | 890 event.event_type = event_type; |
| 891 event.status = MountErrorToMountCompletedStatus(error); | 891 event.status = MountErrorToMountCompletedStatus(error); |
| 892 util::VolumeInfoToVolumeMetadata( | 892 util::VolumeInfoToVolumeMetadata( |
| 893 profile_, volume_info, &event.volume_metadata); | 893 profile_, volume_info, &event.volume_metadata); |
| 894 event.should_notify = ShouldShowNotificationForVolume( | 894 event.should_notify = ShouldShowNotificationForVolume( |
| 895 profile_, *device_event_router_, volume_info); | 895 profile_, *device_event_router_, volume_info); |
| 896 BroadcastEvent(profile_, | 896 BroadcastEvent(profile_, |
| 897 file_manager_private::OnMountCompleted::kEventName, | 897 file_manager_private::OnMountCompleted::kEventName, |
| 898 file_manager_private::OnMountCompleted::Create(event)); | 898 file_manager_private::OnMountCompleted::Create(event)); |
| 899 } | 899 } |
| 900 | 900 |
| 901 void EventRouter::OnFormatStarted(const std::string& device_path, | 901 void EventRouter::OnFormatStarted(const std::string& device_path, |
| 902 bool success) { | 902 bool success) { |
| 903 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 903 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 904 // Do nothing. | 904 // Do nothing. |
| 905 } | 905 } |
| 906 | 906 |
| 907 void EventRouter::OnFormatCompleted(const std::string& device_path, | 907 void EventRouter::OnFormatCompleted(const std::string& device_path, |
| 908 bool success) { | 908 bool success) { |
| 909 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 909 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 910 // Do nothing. | 910 // Do nothing. |
| 911 } | 911 } |
| 912 | 912 |
| 913 void EventRouter::SetDispatchDirectoryChangeEventImplForTesting( | 913 void EventRouter::SetDispatchDirectoryChangeEventImplForTesting( |
| 914 const DispatchDirectoryChangeEventImplCallback& callback) { | 914 const DispatchDirectoryChangeEventImplCallback& callback) { |
| 915 dispatch_directory_change_event_impl_ = callback; | 915 dispatch_directory_change_event_impl_ = callback; |
| 916 } | 916 } |
| 917 | 917 |
| 918 base::WeakPtr<EventRouter> EventRouter::GetWeakPtr() { | 918 base::WeakPtr<EventRouter> EventRouter::GetWeakPtr() { |
| 919 return weak_factory_.GetWeakPtr(); | 919 return weak_factory_.GetWeakPtr(); |
| 920 } | 920 } |
| 921 | 921 |
| 922 } // namespace file_manager | 922 } // namespace file_manager |
| OLD | NEW |