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

Side by Side Diff: components/offline_pages/background/request_coordinator.cc

Issue 2219393004: Adds an observer for the request coordinator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@resumeAPI
Patch Set: Created 4 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "components/offline_pages/background/request_coordinator.h" 5 #include "components/offline_pages/background/request_coordinator.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 static int64_t id = 0; 81 static int64_t id = 0;
82 82
83 // Build a SavePageRequest. 83 // Build a SavePageRequest.
84 offline_pages::SavePageRequest request( 84 offline_pages::SavePageRequest request(
85 id++, url, client_id, base::Time::Now(), was_user_requested); 85 id++, url, client_id, base::Time::Now(), was_user_requested);
86 86
87 // Put the request on the request queue. 87 // Put the request on the request queue.
88 queue_->AddRequest(request, 88 queue_->AddRequest(request,
89 base::Bind(&RequestCoordinator::AddRequestResultCallback, 89 base::Bind(&RequestCoordinator::AddRequestResultCallback,
90 weak_ptr_factory_.GetWeakPtr())); 90 weak_ptr_factory_.GetWeakPtr()));
91 NotifyAvailable(client_id);
91 return true; 92 return true;
92 } 93 }
93 void RequestCoordinator::GetQueuedRequests( 94 void RequestCoordinator::GetQueuedRequests(
94 const std::string& client_namespace, 95 const std::string& client_namespace,
95 const QueuedRequestCallback& callback) { 96 const QueuedRequestCallback& callback) {
96 // Get all matching requests from the request queue, send them to our 97 // Get all matching requests from the request queue, send them to our
97 // callback. We bind the namespace and callback to the front of the callback 98 // callback. We bind the namespace and callback to the front of the callback
98 // param set. 99 // param set.
99 queue_->GetRequests(base::Bind(&RequestCoordinator::GetQueuedRequestsCallback, 100 queue_->GetRequests(base::Bind(&RequestCoordinator::GetQueuedRequestsCallback,
100 weak_ptr_factory_.GetWeakPtr(), 101 weak_ptr_factory_.GetWeakPtr(),
(...skipping 21 matching lines...) Expand all
122 queue_->RemoveRequestsByClientId( 123 queue_->RemoveRequestsByClientId(
123 client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, 124 client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback,
124 weak_ptr_factory_.GetWeakPtr())); 125 weak_ptr_factory_.GetWeakPtr()));
125 } 126 }
126 127
127 void RequestCoordinator::PauseRequests( 128 void RequestCoordinator::PauseRequests(
128 const std::vector<ClientId>& client_ids) { 129 const std::vector<ClientId>& client_ids) {
129 queue_->PauseRequestsByClientId( 130 queue_->PauseRequestsByClientId(
130 client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, 131 client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback,
131 weak_ptr_factory_.GetWeakPtr())); 132 weak_ptr_factory_.GetWeakPtr()));
133 for(ClientId client_id : client_ids)
134 NotifyPaused(client_id);
132 } 135 }
133 136
134 void RequestCoordinator::ResumeRequests( 137 void RequestCoordinator::ResumeRequests(
135 const std::vector<ClientId>& client_ids) { 138 const std::vector<ClientId>& client_ids) {
136 queue_->ResumeRequestsByClientId( 139 queue_->ResumeRequestsByClientId(
137 client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback, 140 client_ids, base::Bind(&RequestCoordinator::UpdateMultipleRequestCallback,
138 weak_ptr_factory_.GetWeakPtr())); 141 weak_ptr_factory_.GetWeakPtr()));
139 // TODO: Should we also schedule a task, in case there is not one scheduled? 142 // TODO: Should we also schedule a task, in case there is not one scheduled?
143 for (ClientId client_id : client_ids)
144 NotifyAvailable(client_id);
140 } 145 }
141 146
142 void RequestCoordinator::AddRequestResultCallback( 147 void RequestCoordinator::AddRequestResultCallback(
143 RequestQueue::AddRequestResult result, 148 RequestQueue::AddRequestResult result,
144 const SavePageRequest& request) { 149 const SavePageRequest& request) {
145
146 // Inform the scheduler that we have an outstanding task.. 150 // Inform the scheduler that we have an outstanding task..
147 scheduler_->Schedule(GetTriggerConditionsForUserRequest()); 151 scheduler_->Schedule(GetTriggerConditionsForUserRequest());
148 } 152 }
149 153
150 // Called in response to updating a request in the request queue. 154 // Called in response to updating a request in the request queue.
151 void RequestCoordinator::UpdateRequestCallback( 155 void RequestCoordinator::UpdateRequestCallback(
152 const ClientId& client_id, 156 const ClientId& client_id,
153 RequestQueue::UpdateRequestResult result) { 157 RequestQueue::UpdateRequestResult result) {
154 // If the request succeeded, nothing to do. If it failed, we can't really do 158 // If the request succeeded, nothing to do. If it failed, we can't really do
155 // much, so just log it. 159 // much, so just log it.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED) { 313 if (status == Offliner::RequestStatus::FOREGROUND_CANCELED) {
310 // Update the request for the canceled attempt. 314 // Update the request for the canceled attempt.
311 // TODO(dougarnett): See if we can conclusively identify other attempt 315 // TODO(dougarnett): See if we can conclusively identify other attempt
312 // aborted cases to treat this way (eg, for Render Process Killed). 316 // aborted cases to treat this way (eg, for Render Process Killed).
313 SavePageRequest updated_request(request); 317 SavePageRequest updated_request(request);
314 updated_request.MarkAttemptAborted(); 318 updated_request.MarkAttemptAborted();
315 queue_->UpdateRequest(updated_request, 319 queue_->UpdateRequest(updated_request,
316 base::Bind(&RequestCoordinator::UpdateRequestCallback, 320 base::Bind(&RequestCoordinator::UpdateRequestCallback,
317 weak_ptr_factory_.GetWeakPtr(), 321 weak_ptr_factory_.GetWeakPtr(),
318 updated_request.client_id())); 322 updated_request.client_id()));
323 NotifyFailed(request.client_id());
319 324
320 } else if (status == Offliner::RequestStatus::SAVED || 325 } else if (status == Offliner::RequestStatus::SAVED) {
321 request.completed_attempt_count() + 1 >= 326 // Remove the request from the queue if it either succeeded.
322 policy_->GetMaxCompletedTries()) {
323 // Remove the request from the queue if it either succeeded or exceeded the
324 // max number of retries. The +1 represents the request that just
325 // completed. Since we call MarkAttemptCompleted within the if branches,
326 // the completed_attempt_count has not yet been updated when we are checking
327 // the if condition.
328 std::vector<ClientId> client_ids; 327 std::vector<ClientId> client_ids;
329 client_ids.push_back(request.client_id()); 328 client_ids.push_back(request.client_id());
330 queue_->RemoveRequestsByClientId( 329 queue_->RemoveRequestsByClientId(
331 client_ids, 330 client_ids,
332 base::Bind(&RequestCoordinator::UpdateRequestCallback, 331 base::Bind(&RequestCoordinator::UpdateRequestCallback,
333 weak_ptr_factory_.GetWeakPtr(), request.client_id())); 332 weak_ptr_factory_.GetWeakPtr(), request.client_id()));
333 NotifySucceeded(request.client_id());
334 } else if (request.completed_attempt_count() + 1 >=
335 policy_->GetMaxCompletedTries()) {
336 // Remove from the request queue if we exceeeded max retries. The +1
337 // represents the request that just completed. Since we call
338 // MarkAttemptCompleted within the if branches, the completed_attempt_count
339 // has not yet been updated when we are checking the if condition.
340 std::vector<ClientId> client_ids;
341 client_ids.push_back(request.client_id());
342 queue_->RemoveRequestsByClientId(
343 client_ids,
344 base::Bind(&RequestCoordinator::UpdateRequestCallback,
345 weak_ptr_factory_.GetWeakPtr(), request.client_id()));
346 NotifyFailed(request.client_id());
334 } else { 347 } else {
335 // If we failed, but are not over the limit, update the request in the 348 // If we failed, but are not over the limit, update the request in the
336 // queue. 349 // queue.
337 SavePageRequest updated_request(request); 350 SavePageRequest updated_request(request);
338 updated_request.MarkAttemptCompleted(); 351 updated_request.MarkAttemptCompleted();
339 queue_->UpdateRequest(updated_request, 352 queue_->UpdateRequest(updated_request,
340 base::Bind(&RequestCoordinator::UpdateRequestCallback, 353 base::Bind(&RequestCoordinator::UpdateRequestCallback,
341 weak_ptr_factory_.GetWeakPtr(), 354 weak_ptr_factory_.GetWeakPtr(),
342 updated_request.client_id())); 355 updated_request.client_id()));
356 NotifyAvailable(request.client_id());
343 } 357 }
344 358
345 // Determine whether we might try another request in this 359 // Determine whether we might try another request in this
346 // processing window based on how the previous request completed. 360 // processing window based on how the previous request completed.
347 // 361 //
348 // TODO(dougarnett): Need to split PRERENDERING_FAILED into separate 362 // TODO(dougarnett): Need to split PRERENDERING_FAILED into separate
349 // codes as to whether we should try another request or not. 363 // codes as to whether we should try another request or not.
350 switch (status) { 364 switch (status) {
351 case Offliner::RequestStatus::SAVED: 365 case Offliner::RequestStatus::SAVED:
352 case Offliner::RequestStatus::SAVE_FAILED: 366 case Offliner::RequestStatus::SAVE_FAILED:
(...skipping 15 matching lines...) Expand all
368 382
369 const Scheduler::TriggerConditions 383 const Scheduler::TriggerConditions
370 RequestCoordinator::GetTriggerConditionsForUserRequest() { 384 RequestCoordinator::GetTriggerConditionsForUserRequest() {
371 Scheduler::TriggerConditions trigger_conditions( 385 Scheduler::TriggerConditions trigger_conditions(
372 policy_->PowerRequiredForUserRequestedPage(), 386 policy_->PowerRequiredForUserRequestedPage(),
373 policy_->BatteryPercentageRequiredForUserRequestedPage(), 387 policy_->BatteryPercentageRequiredForUserRequestedPage(),
374 policy_->UnmeteredNetworkRequiredForUserRequestedPage()); 388 policy_->UnmeteredNetworkRequiredForUserRequestedPage());
375 return trigger_conditions; 389 return trigger_conditions;
376 } 390 }
377 391
392 void RequestCoordinator::AddObserver(Observer* observer) {
393 DCHECK(observer);
394 observers_.AddObserver(observer);
395 }
396
397 void RequestCoordinator::RemoveObserver(Observer* observer) {
398 observers_.RemoveObserver(observer);
399 }
400
401 void RequestCoordinator::NotifyAvailable(ClientId client_id) {
402 RequestInfo info;
403 info.client_id = client_id;
404 FOR_EACH_OBSERVER(Observer, observers_, OnAvailable(info));
405 }
406
407 void RequestCoordinator::NotifySucceeded(ClientId client_id) {
408 RequestInfo info;
409 info.client_id = client_id;;
410 FOR_EACH_OBSERVER(Observer, observers_, OnSucceeded(info));
411 }
412
413 void RequestCoordinator::NotifyFailed(ClientId client_id) {
414 RequestInfo info;
415 info.client_id = client_id;
416 FOR_EACH_OBSERVER(Observer, observers_, OnFailed(info));
417 }
418
419 void RequestCoordinator::NotifyPaused(ClientId client_id) {
420 RequestInfo info;
421 info.client_id = client_id;
422 FOR_EACH_OBSERVER(Observer, observers_, OnPaused(info));
423 }
424
378 void RequestCoordinator::GetOffliner() { 425 void RequestCoordinator::GetOffliner() {
379 if (!offliner_) { 426 if (!offliner_) {
380 offliner_ = factory_->GetOffliner(policy_.get()); 427 offliner_ = factory_->GetOffliner(policy_.get());
381 } 428 }
382 } 429 }
383 430
384 } // namespace offline_pages 431 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698