| 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 32e99b0f4b4fc20408c965de70077adf7b11d15b..6743df4f40e57dc5488166b029534edcfa48adee 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"
|
| @@ -59,6 +60,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";
|
| @@ -96,6 +98,8 @@ void JobInfoToTransferStatus(
|
| IsUploadJob(job_info.job_type) ?
|
| file_browser_private::TRANSFER_TYPE_UPLOAD :
|
| file_browser_private::TRANSFER_TYPE_DOWNLOAD;
|
| + status->num_total_jobs.reset(
|
| + new double(static_cast<double>(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.
|
| @@ -340,7 +344,8 @@ EventRouter::DriveJobInfoWithStatus::DriveJobInfoWithStatus(
|
| }
|
|
|
| EventRouter::EventRouter(Profile* profile)
|
| - : pref_change_registrar_(new PrefChangeRegistrar),
|
| + : startup_time_delta_(base::TimeDelta::FromSeconds(1)),
|
| + pref_change_registrar_(new PrefChangeRegistrar),
|
| profile_(profile),
|
| multi_user_window_manager_observer_registered_(false),
|
| weak_factory_(this) {
|
| @@ -579,7 +584,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) {
|
| @@ -619,6 +629,51 @@ 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));
|
| + DCHECK_EQ(job_info_with_status.job_info.state, drive::STATE_NEW);
|
| +
|
| + 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));
|
|
|
|
|