Index: chrome/browser/chromeos/extensions/file_manager/event_router.cc |
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc |
index 83e1f144e3411613540a81fde51c93277b7299fb..7cb8c878a1b98d85692c7a1569b959ea16b27972 100644 |
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc |
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc |
@@ -10,6 +10,7 @@ |
#include "base/prefs/pref_change_registrar.h" |
#include "base/prefs/pref_service.h" |
#include "base/stl_util.h" |
+#include "base/thread_task_runner_handle.h" |
#include "base/threading/sequenced_worker_pool.h" |
#include "base/values.h" |
#include "chrome/browser/app_mode/app_mode_utils.h" |
@@ -61,6 +62,7 @@ namespace file_browser_private = extensions::api::file_browser_private; |
namespace file_manager { |
namespace { |
// Constants for the "transferState" field of onFileTransferUpdated event. |
+const char kFileTransferStateAdded[] = "added"; |
const char kFileTransferStateStarted[] = "started"; |
const char kFileTransferStateInProgress[] = "in_progress"; |
const char kFileTransferStateCompleted[] = "completed"; |
@@ -98,6 +100,7 @@ void JobInfoToTransferStatus( |
IsUploadJob(job_info.job_type) ? |
file_browser_private::TRANSFER_TYPE_UPLOAD : |
file_browser_private::TRANSFER_TYPE_DOWNLOAD; |
+ status->num_total_jobs = job_info.num_total_jobs; |
// JavaScript does not have 64-bit integers. Instead we use double, which |
// is in IEEE 754 formant and accurate up to 52-bits in JS, and in practice |
// in C++. Larger values are rounded. |
@@ -365,7 +368,8 @@ EventRouter::DriveJobInfoWithStatus::DriveJobInfoWithStatus( |
} |
EventRouter::EventRouter(Profile* profile) |
- : pref_change_registrar_(new PrefChangeRegistrar), |
+ : startup_time_delta_(base::TimeDelta::FromMilliseconds(100)), |
+ pref_change_registrar_(new PrefChangeRegistrar), |
profile_(profile), |
multi_user_window_manager_observer_registered_(false), |
device_event_router_(new DeviceEventRouterImpl(profile)), |
@@ -620,7 +624,12 @@ void EventRouter::OnFileManagerPrefsChanged() { |
void EventRouter::OnJobAdded(const drive::JobInfo& job_info) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- OnJobUpdated(job_info); |
+ if (!drive::IsActiveFileTransferJobInfo(job_info)) |
+ return; |
+ DriveJobInfoWithStatus job_info_with_status = |
+ DriveJobInfoWithStatus(job_info, kFileTransferStateAdded); |
+ SendDriveFileTransferEventDelay( |
+ job_info_with_status, base::Time::Now(), false /* is_delayed */); |
} |
void EventRouter::OnJobUpdated(const drive::JobInfo& job_info) { |
@@ -635,9 +644,9 @@ void EventRouter::OnJobUpdated(const drive::JobInfo& job_info) { |
job_info, |
is_new_job ? kFileTransferStateStarted : kFileTransferStateInProgress); |
- // Fire event if needed. |
- bool always = is_new_job; |
- SendDriveFileTransferEvent(always); |
+ DriveJobInfoWithStatus job_info_with_status = drive_jobs_[job_info.job_id]; |
+ SendDriveFileTransferEventDelay( |
+ job_info_with_status, base::Time::Now(), false /* is_delayed */); |
} |
void EventRouter::OnJobDone(const drive::JobInfo& job_info, |
@@ -660,6 +669,50 @@ void EventRouter::OnJobDone(const drive::JobInfo& job_info, |
drive_jobs_.erase(job_info.job_id); |
} |
+void EventRouter::SendDriveFileTransferEventDelay( |
+ const DriveJobInfoWithStatus& job_info_with_status, |
+ base::Time call_time, |
+ bool is_delayed) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ if (!is_delayed) { |
+ last_post_delayed_task_ = base::Time::Now(); |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&EventRouter::SendDriveFileTransferEventDelay, |
+ weak_factory_.GetWeakPtr(), |
+ job_info_with_status, |
+ last_post_delayed_task_, |
+ true /* is_delayed */), |
+ startup_time_delta_); |
+ return; |
+ } |
+ |
+ DCHECK(!last_post_delayed_task_.is_null()); |
+ |
+ if (call_time < last_post_delayed_task_) { |
+ return; |
+ } |
+ |
+ // Convert the current |drive_jobs_| to IDL type. |
+ std::vector<linked_ptr<file_browser_private::FileTransferStatus> > |
+ status_list; |
+ |
+ linked_ptr<file_browser_private::FileTransferStatus> status( |
+ new file_browser_private::FileTransferStatus()); |
+ JobInfoToTransferStatus(profile_, |
+ kFileManagerAppId, |
+ job_info_with_status.status, |
+ job_info_with_status.job_info, |
+ status.get()); |
+ status_list.push_back(status); |
+ |
+ BroadcastEvent( |
+ profile_, |
+ file_browser_private::OnFileTransfersUpdated::kEventName, |
+ file_browser_private::OnFileTransfersUpdated::Create(status_list)); |
+} |
+ |
void EventRouter::SendDriveFileTransferEvent(bool always) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |