Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: chrome/browser/chromeos/drive/change_list_loader.cc

Issue 444463005: drive: Trigger "fast fetch" if remote update came during full loading. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase + fix test. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/browser/chromeos/drive/change_list_loader.h" 5 #include "chrome/browser/chromeos/drive/change_list_loader.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 320
321 void ChangeListLoader::RemoveObserver(ChangeListLoaderObserver* observer) { 321 void ChangeListLoader::RemoveObserver(ChangeListLoaderObserver* observer) {
322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
323 observers_.RemoveObserver(observer); 323 observers_.RemoveObserver(observer);
324 } 324 }
325 325
326 void ChangeListLoader::CheckForUpdates(const FileOperationCallback& callback) { 326 void ChangeListLoader::CheckForUpdates(const FileOperationCallback& callback) {
327 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 327 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
328 DCHECK(!callback.is_null()); 328 DCHECK(!callback.is_null());
329 329
330 // We only start to check for updates iff the load is done.
331 // I.e., we ignore checking updates if not loaded to avoid starting the
332 // load without user's explicit interaction (such as opening Drive).
333 if (!loaded_ && !IsRefreshing())
334 return;
335
336 // For each CheckForUpdates() request, always refresh the changestamp info.
337 about_resource_loader_->UpdateAboutResource(
338 base::Bind(&ChangeListLoader::OnAboutResourceUpdated,
339 weak_ptr_factory_.GetWeakPtr()));
340
330 if (IsRefreshing()) { 341 if (IsRefreshing()) {
331 // There is in-flight loading. So keep the callback here, and check for 342 // There is in-flight loading. So keep the callback here, and check for
332 // updates when the in-flight loading is completed. 343 // updates when the in-flight loading is completed.
333 pending_update_check_callback_ = callback; 344 pending_update_check_callback_ = callback;
334 return; 345 return;
335 } 346 }
336 347
337 if (loaded_) { 348 DCHECK(loaded_);
338 // We only start to check for updates iff the load is done. 349 logger_->Log(logging::LOG_INFO, "Checking for updates");
339 // I.e., we ignore checking updates if not loaded to avoid starting the 350 Load(callback);
340 // load without user's explicit interaction (such as opening Drive).
341 logger_->Log(logging::LOG_INFO, "Checking for updates");
342 Load(callback);
343 }
344 } 351 }
345 352
346 void ChangeListLoader::LoadIfNeeded(const FileOperationCallback& callback) { 353 void ChangeListLoader::LoadIfNeeded(const FileOperationCallback& callback) {
347 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 354 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
348 DCHECK(!callback.is_null()); 355 DCHECK(!callback.is_null());
349 356
350 // If the metadata is not yet loaded, start loading. 357 // If the metadata is not yet loaded, start loading.
351 if (!loaded_) 358 if (!loaded_ && !IsRefreshing())
352 Load(callback); 359 Load(callback);
353 } 360 }
354 361
355 void ChangeListLoader::Load(const FileOperationCallback& callback) { 362 void ChangeListLoader::Load(const FileOperationCallback& callback) {
356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
357 DCHECK(!callback.is_null()); 364 DCHECK(!callback.is_null());
358 365
359 // Check if this is the first time this ChangeListLoader do loading. 366 // Check if this is the first time this ChangeListLoader do loading.
360 // Note: IsRefreshing() depends on pending_load_callback_ so check in advance. 367 // Note: IsRefreshing() depends on pending_load_callback_ so check in advance.
361 const bool is_initial_load = (!loaded_ && !IsRefreshing()); 368 const bool is_initial_load = (!loaded_ && !IsRefreshing());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 if (is_initial_load && *local_changestamp > 0) { 402 if (is_initial_load && *local_changestamp > 0) {
396 // The local data is usable. Flush callbacks to tell loading was successful. 403 // The local data is usable. Flush callbacks to tell loading was successful.
397 OnChangeListLoadComplete(FILE_ERROR_OK); 404 OnChangeListLoadComplete(FILE_ERROR_OK);
398 405
399 // Continues to load from server in background. 406 // Continues to load from server in background.
400 // Put dummy callbacks to indicate that fetching is still continuing. 407 // Put dummy callbacks to indicate that fetching is still continuing.
401 pending_load_callback_.push_back( 408 pending_load_callback_.push_back(
402 base::Bind(&util::EmptyFileOperationCallback)); 409 base::Bind(&util::EmptyFileOperationCallback));
403 } 410 }
404 411
405 about_resource_loader_->UpdateAboutResource( 412 about_resource_loader_->GetAboutResource(
406 base::Bind(&ChangeListLoader::LoadAfterGetAboutResource, 413 base::Bind(&ChangeListLoader::LoadAfterGetAboutResource,
407 weak_ptr_factory_.GetWeakPtr(), 414 weak_ptr_factory_.GetWeakPtr(),
408 *local_changestamp)); 415 *local_changestamp));
409 } 416 }
410 417
411 void ChangeListLoader::LoadAfterGetAboutResource( 418 void ChangeListLoader::LoadAfterGetAboutResource(
412 int64 local_changestamp, 419 int64 local_changestamp,
413 google_apis::GDataErrorCode status, 420 google_apis::GDataErrorCode status,
414 scoped_ptr<google_apis::AboutResource> about_resource) { 421 scoped_ptr<google_apis::AboutResource> about_resource) {
415 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 422 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 } 463 }
457 pending_load_callback_.clear(); 464 pending_load_callback_.clear();
458 465
459 // If there is pending update check, try to load the change from the server 466 // If there is pending update check, try to load the change from the server
460 // again, because there may exist an update during the completed loading. 467 // again, because there may exist an update during the completed loading.
461 if (!pending_update_check_callback_.is_null()) { 468 if (!pending_update_check_callback_.is_null()) {
462 Load(base::ResetAndReturn(&pending_update_check_callback_)); 469 Load(base::ResetAndReturn(&pending_update_check_callback_));
463 } 470 }
464 } 471 }
465 472
473 void ChangeListLoader::OnAboutResourceUpdated(
474 google_apis::GDataErrorCode error,
475 scoped_ptr<google_apis::AboutResource> resource) {
476 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
477
478 if (drive::GDataToFileError(error) != drive::FILE_ERROR_OK) {
479 logger_->Log(logging::LOG_ERROR,
480 "Failed to update the about resource: %s",
481 google_apis::GDataErrorCodeToString(error).c_str());
482 return;
483 }
484 logger_->Log(logging::LOG_INFO,
485 "About resource updated to: %s",
486 base::Int64ToString(resource->largest_change_id()).c_str());
487 }
488
466 void ChangeListLoader::LoadChangeListFromServer(int64 start_changestamp) { 489 void ChangeListLoader::LoadChangeListFromServer(int64 start_changestamp) {
467 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 490 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
468 DCHECK(!change_feed_fetcher_); 491 DCHECK(!change_feed_fetcher_);
469 DCHECK(about_resource_loader_->cached_about_resource()); 492 DCHECK(about_resource_loader_->cached_about_resource());
470 493
471 bool is_delta_update = start_changestamp != 0; 494 bool is_delta_update = start_changestamp != 0;
472 495
473 // Set up feed fetcher. 496 // Set up feed fetcher.
474 if (is_delta_update) { 497 if (is_delta_update) {
475 change_feed_fetcher_.reset( 498 change_feed_fetcher_.reset(
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 573
551 OnChangeListLoadComplete(error); 574 OnChangeListLoadComplete(error);
552 575
553 FOR_EACH_OBSERVER(ChangeListLoaderObserver, 576 FOR_EACH_OBSERVER(ChangeListLoaderObserver,
554 observers_, 577 observers_,
555 OnLoadFromServerComplete()); 578 OnLoadFromServerComplete());
556 } 579 }
557 580
558 } // namespace internal 581 } // namespace internal
559 } // namespace drive 582 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/drive/change_list_loader.h ('k') | chrome/browser/chromeos/drive/change_list_loader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698