Commit 9a8bc81f authored by Dan Harrington's avatar Dan Harrington Committed by Commit Bot

Fix auto-fetch hanging notification

The underlying problem was that RequestCoordinator was reporting that a request
had been added, but in fact it was rejected. This led auto-fetch code to believe
there was an outstanding request remaining.

Bug: 1003053
Change-Id: I5f1554481405ca63a050c119ef624053e58f3acf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1801318Reviewed-by: default avatarPeter Williamson <petewil@chromium.org>
Commit-Queue: Dan H <harringtond@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697293}
parent 92a3efc0
...@@ -545,22 +545,26 @@ void RequestCoordinator::AddRequestResultCallback( ...@@ -545,22 +545,26 @@ void RequestCoordinator::AddRequestResultCallback(
RequestAvailability availability, RequestAvailability availability,
AddRequestResult result, AddRequestResult result,
const SavePageRequest& request) { const SavePageRequest& request) {
NotifyAdded(request); if (result == AddRequestResult::SUCCESS) {
// Inform the scheduler that we have an outstanding task. NotifyAdded(request);
scheduler_->Schedule(GetTriggerConditions(kUserRequest)); // Inform the scheduler that we have an outstanding task.
scheduler_->Schedule(GetTriggerConditions(kUserRequest));
if (availability == RequestAvailability::DISABLED_FOR_OFFLINER) {
// Mark attempt started (presuming it is disabled for background offliner if (availability == RequestAvailability::DISABLED_FOR_OFFLINER) {
// because foreground offlining is happening). // Mark attempt started (presuming it is disabled for background offliner
queue_->MarkAttemptStarted( // because foreground offlining is happening).
request.request_id(), queue_->MarkAttemptStarted(
base::BindOnce(&RequestCoordinator::MarkAttemptDone, request.request_id(),
weak_ptr_factory_.GetWeakPtr(), request.request_id(), base::BindOnce(&RequestCoordinator::MarkAttemptDone,
request.client_id().name_space)); weak_ptr_factory_.GetWeakPtr(), request.request_id(),
} else if (request.user_requested()) { request.client_id().name_space));
StartImmediatelyIfConnected(); } else if (request.user_requested()) {
StartImmediatelyIfConnected();
}
} else {
event_logger_.RecordAddRequestFailed(request.client_id().name_space,
result);
} }
std::move(save_page_later_callback).Run(result); std::move(save_page_later_callback).Run(result);
} }
......
...@@ -4,6 +4,10 @@ ...@@ -4,6 +4,10 @@
#include "components/offline_pages/core/background/request_coordinator_event_logger.h" #include "components/offline_pages/core/background/request_coordinator_event_logger.h"
#include <string>
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
namespace offline_pages { namespace offline_pages {
namespace { namespace {
...@@ -33,7 +37,7 @@ static std::string BackgroundSavePageResultToString( ...@@ -33,7 +37,7 @@ static std::string BackgroundSavePageResultToString(
return "DOWNLOAD_THROTTLED"; return "DOWNLOAD_THROTTLED";
default: default:
NOTREACHED(); NOTREACHED();
return std::to_string(static_cast<int>(result)); return base::NumberToString(static_cast<int>(result));
} }
} }
...@@ -47,7 +51,7 @@ static std::string UpdateRequestResultToString(UpdateRequestResult result) { ...@@ -47,7 +51,7 @@ static std::string UpdateRequestResultToString(UpdateRequestResult result) {
return "REQUEST_DOES_NOT_EXIST"; return "REQUEST_DOES_NOT_EXIST";
default: default:
NOTREACHED(); NOTREACHED();
return std::to_string(static_cast<int>(result)); return base::NumberToString(static_cast<int>(result));
} }
} }
...@@ -57,7 +61,7 @@ void RequestCoordinatorEventLogger::RecordOfflinerResult( ...@@ -57,7 +61,7 @@ void RequestCoordinatorEventLogger::RecordOfflinerResult(
const std::string& name_space, const std::string& name_space,
Offliner::RequestStatus new_status, Offliner::RequestStatus new_status,
int64_t request_id) { int64_t request_id) {
std::string request_id_str = std::to_string(request_id); std::string request_id_str = base::NumberToString(request_id);
RecordActivity("Background save attempt for " + name_space + ":" + RecordActivity("Background save attempt for " + name_space + ":" +
request_id_str + " - " + request_id_str + " - " +
Offliner::RequestStatusToString(new_status)); Offliner::RequestStatusToString(new_status));
...@@ -67,7 +71,7 @@ void RequestCoordinatorEventLogger::RecordDroppedSavePageRequest( ...@@ -67,7 +71,7 @@ void RequestCoordinatorEventLogger::RecordDroppedSavePageRequest(
const std::string& name_space, const std::string& name_space,
RequestNotifier::BackgroundSavePageResult result, RequestNotifier::BackgroundSavePageResult result,
int64_t request_id) { int64_t request_id) {
std::string request_id_str = std::to_string(request_id); std::string request_id_str = base::NumberToString(request_id);
RecordActivity("Background save request removed " + name_space + ":" + RecordActivity("Background save request removed " + name_space + ":" +
request_id_str + " - " + request_id_str + " - " +
BackgroundSavePageResultToString(result)); BackgroundSavePageResultToString(result));
...@@ -80,4 +84,12 @@ void RequestCoordinatorEventLogger::RecordUpdateRequestFailed( ...@@ -80,4 +84,12 @@ void RequestCoordinatorEventLogger::RecordUpdateRequestFailed(
UpdateRequestResultToString(result)); UpdateRequestResultToString(result));
} }
void RequestCoordinatorEventLogger::RecordAddRequestFailed(
const std::string& name_space,
AddRequestResult result) {
RecordActivity(
base::StrCat({"Add request failed for ", name_space, " - code ",
base::NumberToString(static_cast<int>(result))}));
}
} // namespace offline_pages } // namespace offline_pages
...@@ -31,6 +31,9 @@ class RequestCoordinatorEventLogger : public OfflineEventLogger { ...@@ -31,6 +31,9 @@ class RequestCoordinatorEventLogger : public OfflineEventLogger {
void RecordUpdateRequestFailed(const std::string& name_space, void RecordUpdateRequestFailed(const std::string& name_space,
UpdateRequestResult result); UpdateRequestResult result);
void RecordAddRequestFailed(const std::string& name_space,
AddRequestResult result);
}; };
} // namespace offline_pages } // namespace offline_pages
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/synchronization/waitable_event.h" #include "base/synchronization/waitable_event.h"
#include "base/system/sys_info.h" #include "base/system/sys_info.h"
#include "base/test/bind_test_util.h"
#include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "base/test/test_mock_time_task_runner.h" #include "base/test/test_mock_time_task_runner.h"
...@@ -80,17 +81,11 @@ class BoolCallbackResult { ...@@ -80,17 +81,11 @@ class BoolCallbackResult {
class ObserverStub : public RequestCoordinator::Observer { class ObserverStub : public RequestCoordinator::Observer {
public: public:
ObserverStub() ObserverStub() { Clear(); }
: added_called_(false),
completed_called_(false),
changed_called_(false),
network_progress_called_(false),
network_progress_bytes_(0),
last_status_(RequestCoordinator::BackgroundSavePageResult::SUCCESS),
state_(SavePageRequest::RequestState::OFFLINING) {}
void Clear() { void Clear() {
added_called_ = false; added_called_ = false;
added_call_count_ = 0;
completed_called_ = false; completed_called_ = false;
changed_called_ = false; changed_called_ = false;
network_progress_called_ = false; network_progress_called_ = false;
...@@ -101,6 +96,7 @@ class ObserverStub : public RequestCoordinator::Observer { ...@@ -101,6 +96,7 @@ class ObserverStub : public RequestCoordinator::Observer {
void OnAdded(const SavePageRequest& request) override { void OnAdded(const SavePageRequest& request) override {
added_called_ = true; added_called_ = true;
++added_call_count_;
state_ = request.request_state(); state_ = request.request_state();
pending_state_ = request.pending_state(); pending_state_ = request.pending_state();
} }
...@@ -125,6 +121,7 @@ class ObserverStub : public RequestCoordinator::Observer { ...@@ -125,6 +121,7 @@ class ObserverStub : public RequestCoordinator::Observer {
} }
bool added_called() { return added_called_; } bool added_called() { return added_called_; }
int added_call_count() const { return added_call_count_; }
bool completed_called() { return completed_called_; } bool completed_called() { return completed_called_; }
bool changed_called() { return changed_called_; } bool changed_called() { return changed_called_; }
bool network_progress_called() { return network_progress_called_; } bool network_progress_called() { return network_progress_called_; }
...@@ -137,6 +134,7 @@ class ObserverStub : public RequestCoordinator::Observer { ...@@ -137,6 +134,7 @@ class ObserverStub : public RequestCoordinator::Observer {
private: private:
bool added_called_; bool added_called_;
int added_call_count_;
bool completed_called_; bool completed_called_;
bool changed_called_; bool changed_called_;
bool network_progress_called_; bool network_progress_called_;
...@@ -1879,4 +1877,28 @@ TEST_F(RequestCoordinatorTest, ...@@ -1879,4 +1877,28 @@ TEST_F(RequestCoordinatorTest,
EXPECT_EQ(PendingState::PENDING_ANOTHER_DOWNLOAD, observer().pending_state()); EXPECT_EQ(PendingState::PENDING_ANOTHER_DOWNLOAD, observer().pending_state());
} }
TEST_F(RequestCoordinatorTest, SavePageLaterRejectedDuplicateUrl) {
// Request the same URL twice using the 'disallow_duplicate_requests' option,
// and verify the second request is rejected.
EnableOfflinerCallback(false);
RequestCoordinator::SavePageLaterParams params;
params.url = kUrl1;
params.client_id = kClientId1;
params.add_options.disallow_duplicate_requests = true;
std::vector<AddRequestResult> results;
auto callback = base::BindLambdaForTesting(
[&](AddRequestResult result) { results.push_back(result); });
EXPECT_NE(0, coordinator()->SavePageLater(params, callback));
EXPECT_NE(0, coordinator()->SavePageLater(params, callback));
PumpLoop();
// Only one is added.
EXPECT_EQ(1, observer().added_call_count());
EXPECT_EQ(std::vector<AddRequestResult>(
{AddRequestResult::SUCCESS, AddRequestResult::DUPLICATE_URL}),
results);
}
} // namespace offline_pages } // namespace offline_pages
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment