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

Unified Diff: components/reading_list/ios/reading_list_entry.cc

Issue 2763233003: Move ReadingList model to components/reading_list/core (Closed)
Patch Set: feedback Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: components/reading_list/ios/reading_list_entry.cc
diff --git a/components/reading_list/ios/reading_list_entry.cc b/components/reading_list/ios/reading_list_entry.cc
deleted file mode 100644
index f7f1ff37eaaa483c33b02626f485f61e98f1cee8..0000000000000000000000000000000000000000
--- a/components/reading_list/ios/reading_list_entry.cc
+++ /dev/null
@@ -1,598 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/reading_list/ios/reading_list_entry.h"
-
-#include "base/json/json_string_value_serializer.h"
-#include "base/memory/ptr_util.h"
-#include "components/reading_list/ios/offline_url_utils.h"
-#include "components/reading_list/ios/proto/reading_list.pb.h"
-#include "components/reading_list/ios/reading_list_store.h"
-#include "components/sync/protocol/reading_list_specifics.pb.h"
-#include "net/base/backoff_entry_serializer.h"
-
-namespace {
-// Converts |time| to the number of microseconds since Jan 1st 1970.
-int64_t TimeToUS(const base::Time& time) {
- return (time - base::Time::UnixEpoch()).InMicroseconds();
-}
-}
-
-// The backoff time is the following: 10min, 10min, 1h, 2h, 2h..., starting
-// after the first failure.
-const net::BackoffEntry::Policy ReadingListEntry::kBackoffPolicy = {
- // Number of initial errors (in sequence) to ignore before applying
- // exponential back-off rules.
- 2,
-
- // Initial delay for exponential back-off in ms.
- 10 * 60 * 1000, // 10 minutes.
-
- // Factor by which the waiting time will be multiplied.
- 6,
-
- // Fuzzing percentage. ex: 10% will spread requests randomly
- // between 90%-100% of the calculated time.
- 0.1, // 10%.
-
- // Maximum amount of time we are willing to delay our request in ms.
- 2 * 3600 * 1000, // 2 hours.
-
- // Time to keep an entry from being discarded even when it
- // has no significant state, -1 to never discard.
- -1,
-
- true, // Don't use initial delay unless the last request was an error.
-};
-
-ReadingListEntry::ReadingListEntry(const GURL& url,
- const std::string& title,
- const base::Time& now)
- : ReadingListEntry(url, title, now, nullptr){};
-
-ReadingListEntry::ReadingListEntry(const GURL& url,
- const std::string& title,
- const base::Time& now,
- std::unique_ptr<net::BackoffEntry> backoff)
- : ReadingListEntry(url,
- title,
- UNSEEN,
- TimeToUS(now),
- 0,
- TimeToUS(now),
- TimeToUS(now),
- WAITING,
- base::FilePath(),
- GURL(),
- 0,
- 0,
- 0,
- std::move(backoff)) {}
-
-ReadingListEntry::ReadingListEntry(
- const GURL& url,
- const std::string& title,
- State state,
- int64_t creation_time,
- int64_t first_read_time,
- int64_t update_time,
- int64_t update_title_time,
- ReadingListEntry::DistillationState distilled_state,
- const base::FilePath& distilled_path,
- const GURL& distilled_url,
- int64_t distillation_time,
- int64_t distillation_size,
- int failed_download_counter,
- std::unique_ptr<net::BackoffEntry> backoff)
- : url_(url),
- title_(title),
- state_(state),
- distilled_path_(distilled_path),
- distilled_url_(distilled_url),
- distilled_state_(distilled_state),
- failed_download_counter_(failed_download_counter),
- creation_time_us_(creation_time),
- first_read_time_us_(first_read_time),
- update_time_us_(update_time),
- update_title_time_us_(update_title_time),
- distillation_time_us_(distillation_time),
- distillation_size_(distillation_size) {
- if (backoff) {
- backoff_ = std::move(backoff);
- } else {
- backoff_ = base::MakeUnique<net::BackoffEntry>(&kBackoffPolicy);
- }
- DCHECK(creation_time_us_);
- DCHECK(update_time_us_);
- DCHECK(update_title_time_us_);
- DCHECK(!url.is_empty());
- DCHECK(url.is_valid());
-}
-
-ReadingListEntry::ReadingListEntry(ReadingListEntry&& entry)
- : url_(std::move(entry.url_)),
- title_(std::move(entry.title_)),
- state_(std::move(entry.state_)),
- distilled_path_(std::move(entry.distilled_path_)),
- distilled_url_(std::move(entry.distilled_url_)),
- distilled_state_(std::move(entry.distilled_state_)),
- backoff_(std::move(entry.backoff_)),
- failed_download_counter_(std::move(entry.failed_download_counter_)),
- creation_time_us_(std::move(entry.creation_time_us_)),
- first_read_time_us_(std::move(entry.first_read_time_us_)),
- update_time_us_(std::move(entry.update_time_us_)),
- update_title_time_us_(std::move(entry.update_title_time_us_)),
- distillation_time_us_(std::move(entry.distillation_time_us_)),
- distillation_size_(std::move(entry.distillation_size_)) {}
-
-ReadingListEntry::~ReadingListEntry() {}
-
-const GURL& ReadingListEntry::URL() const {
- return url_;
-}
-
-const std::string& ReadingListEntry::Title() const {
- return title_;
-}
-
-ReadingListEntry::DistillationState ReadingListEntry::DistilledState() const {
- return distilled_state_;
-}
-
-const base::FilePath& ReadingListEntry::DistilledPath() const {
- return distilled_path_;
-}
-
-const GURL& ReadingListEntry::DistilledURL() const {
- return distilled_url_;
-}
-
-int64_t ReadingListEntry::DistillationTime() const {
- return distillation_time_us_;
-}
-
-int64_t ReadingListEntry::DistillationSize() const {
- return distillation_size_;
-}
-
-base::TimeDelta ReadingListEntry::TimeUntilNextTry() const {
- return backoff_->GetTimeUntilRelease();
-}
-
-int ReadingListEntry::FailedDownloadCounter() const {
- return failed_download_counter_;
-}
-
-ReadingListEntry& ReadingListEntry::operator=(ReadingListEntry&& other) {
- url_ = std::move(other.url_);
- title_ = std::move(other.title_);
- distilled_path_ = std::move(other.distilled_path_);
- distilled_url_ = std::move(other.distilled_url_);
- distilled_state_ = std::move(other.distilled_state_);
- backoff_ = std::move(other.backoff_);
- state_ = std::move(other.state_);
- failed_download_counter_ = std::move(other.failed_download_counter_);
- creation_time_us_ = std::move(other.creation_time_us_);
- first_read_time_us_ = std::move(other.first_read_time_us_);
- update_time_us_ = std::move(other.update_time_us_);
- update_title_time_us_ = std::move(other.update_title_time_us_);
- distillation_time_us_ = std::move(other.distillation_time_us_);
- distillation_size_ = std::move(other.distillation_size_);
- return *this;
-}
-
-bool ReadingListEntry::operator==(const ReadingListEntry& other) const {
- return url_ == other.url_;
-}
-
-void ReadingListEntry::SetTitle(const std::string& title,
- const base::Time& now) {
- title_ = title;
- update_title_time_us_ = TimeToUS(now);
-}
-
-void ReadingListEntry::SetRead(bool read, const base::Time& now) {
- State previous_state = state_;
- state_ = read ? READ : UNREAD;
- if (state_ == previous_state) {
- return;
- }
- if (FirstReadTime() == 0 && read) {
- first_read_time_us_ = TimeToUS(now);
- }
- if (!(previous_state == UNSEEN && state_ == UNREAD)) {
- // If changing UNSEEN -> UNREAD, entry is not marked updated to preserve
- // order in Reading List View.
- MarkEntryUpdated(now);
- }
-}
-
-bool ReadingListEntry::IsRead() const {
- return state_ == READ;
-}
-
-bool ReadingListEntry::HasBeenSeen() const {
- return state_ != UNSEEN;
-}
-
-void ReadingListEntry::SetDistilledInfo(const base::FilePath& path,
- const GURL& distilled_url,
- int64_t distilation_size,
- const base::Time& distilation_time) {
- DCHECK(!path.empty());
- DCHECK(distilled_url.is_valid());
- distilled_path_ = path;
- distilled_state_ = PROCESSED;
- distilled_url_ = distilled_url;
- distillation_time_us_ = TimeToUS(distilation_time);
- distillation_size_ = distilation_size;
- backoff_->Reset();
- failed_download_counter_ = 0;
-}
-
-void ReadingListEntry::SetDistilledState(DistillationState distilled_state) {
- DCHECK(distilled_state != PROCESSED); // use SetDistilledPath instead.
- DCHECK(distilled_state != WAITING);
- // Increase time until next retry exponentially if the state change from a
- // non-error state to an error state.
- if ((distilled_state == WILL_RETRY || distilled_state == ERROR) &&
- distilled_state_ != WILL_RETRY && distilled_state_ != ERROR) {
- backoff_->InformOfRequest(false);
- failed_download_counter_++;
- }
-
- distilled_state_ = distilled_state;
- distilled_path_ = base::FilePath();
- distilled_url_ = GURL::EmptyGURL();
-}
-
-int64_t ReadingListEntry::UpdateTime() const {
- return update_time_us_;
-}
-
-int64_t ReadingListEntry::UpdateTitleTime() const {
- return update_title_time_us_;
-}
-
-int64_t ReadingListEntry::CreationTime() const {
- return creation_time_us_;
-}
-
-int64_t ReadingListEntry::FirstReadTime() const {
- return first_read_time_us_;
-}
-
-void ReadingListEntry::MarkEntryUpdated(const base::Time& now) {
- update_time_us_ = TimeToUS(now);
-}
-
-// static
-std::unique_ptr<ReadingListEntry> ReadingListEntry::FromReadingListLocal(
- const reading_list::ReadingListLocal& pb_entry,
- const base::Time& now) {
- if (!pb_entry.has_url()) {
- return nullptr;
- }
- GURL url(pb_entry.url());
- if (url.is_empty() || !url.is_valid()) {
- return nullptr;
- }
- std::string title;
- if (pb_entry.has_title()) {
- title = pb_entry.title();
- }
-
- int64_t creation_time_us = 0;
- if (pb_entry.has_creation_time_us()) {
- creation_time_us = pb_entry.creation_time_us();
- } else {
- creation_time_us = (now - base::Time::UnixEpoch()).InMicroseconds();
- }
-
- int64_t first_read_time_us = 0;
- if (pb_entry.has_first_read_time_us()) {
- first_read_time_us = pb_entry.first_read_time_us();
- }
-
- int64_t update_time_us = creation_time_us;
- if (pb_entry.has_update_time_us()) {
- update_time_us = pb_entry.update_time_us();
- }
-
- int64_t update_title_time_us = creation_time_us;
- if (pb_entry.has_update_title_time_us()) {
- update_title_time_us = pb_entry.update_title_time_us();
- }
-
- State state = UNSEEN;
- if (pb_entry.has_status()) {
- switch (pb_entry.status()) {
- case reading_list::ReadingListLocal::READ:
- state = READ;
- break;
- case reading_list::ReadingListLocal::UNREAD:
- state = UNREAD;
- break;
- case reading_list::ReadingListLocal::UNSEEN:
- state = UNSEEN;
- break;
- }
- }
-
- ReadingListEntry::DistillationState distillation_state =
- ReadingListEntry::WAITING;
- if (pb_entry.has_distillation_state()) {
- switch (pb_entry.distillation_state()) {
- case reading_list::ReadingListLocal::WAITING:
- distillation_state = ReadingListEntry::WAITING;
- break;
- case reading_list::ReadingListLocal::PROCESSING:
- distillation_state = ReadingListEntry::PROCESSING;
- break;
- case reading_list::ReadingListLocal::PROCESSED:
- distillation_state = ReadingListEntry::PROCESSED;
- break;
- case reading_list::ReadingListLocal::WILL_RETRY:
- distillation_state = ReadingListEntry::WILL_RETRY;
- break;
- case reading_list::ReadingListLocal::ERROR:
- distillation_state = ReadingListEntry::ERROR;
- break;
- }
- }
-
- base::FilePath distilled_path;
- if (pb_entry.has_distilled_path()) {
- distilled_path = base::FilePath(pb_entry.distilled_path());
- }
-
- GURL distilled_url;
- if (pb_entry.has_distilled_url()) {
- distilled_url = GURL(pb_entry.distilled_url());
- }
-
- int64_t distillation_time_us = 0;
- if (pb_entry.has_distillation_time_us()) {
- distillation_time_us = pb_entry.distillation_time_us();
- }
-
- int64_t distillation_size = 0;
- if (pb_entry.has_distillation_size()) {
- distillation_size = pb_entry.distillation_size();
- }
-
- int64_t failed_download_counter = 0;
- if (pb_entry.has_failed_download_counter()) {
- failed_download_counter = pb_entry.failed_download_counter();
- }
-
- std::unique_ptr<net::BackoffEntry> backoff;
- if (pb_entry.has_backoff()) {
- JSONStringValueDeserializer deserializer(pb_entry.backoff());
- std::unique_ptr<base::Value> value(
- deserializer.Deserialize(nullptr, nullptr));
- if (value) {
- backoff = net::BackoffEntrySerializer::DeserializeFromValue(
- *value, &kBackoffPolicy, nullptr, now);
- }
- }
-
- return base::WrapUnique<ReadingListEntry>(new ReadingListEntry(
- url, title, state, creation_time_us, first_read_time_us, update_time_us,
- update_title_time_us, distillation_state, distilled_path, distilled_url,
- distillation_time_us, distillation_size, failed_download_counter,
- std::move(backoff)));
-}
-
-// static
-std::unique_ptr<ReadingListEntry> ReadingListEntry::FromReadingListSpecifics(
- const sync_pb::ReadingListSpecifics& pb_entry,
- const base::Time& now) {
- if (!pb_entry.has_url()) {
- return nullptr;
- }
- GURL url(pb_entry.url());
- if (url.is_empty() || !url.is_valid()) {
- return nullptr;
- }
- std::string title;
- if (pb_entry.has_title()) {
- title = pb_entry.title();
- }
-
- int64_t creation_time_us = TimeToUS(now);
- if (pb_entry.has_creation_time_us()) {
- creation_time_us = pb_entry.creation_time_us();
- }
-
- int64_t first_read_time_us = 0;
- if (pb_entry.has_first_read_time_us()) {
- first_read_time_us = pb_entry.first_read_time_us();
- }
-
- int64_t update_time_us = creation_time_us;
- if (pb_entry.has_update_time_us()) {
- update_time_us = pb_entry.update_time_us();
- }
-
- int64_t update_title_time_us = creation_time_us;
- if (pb_entry.has_update_title_time_us()) {
- update_title_time_us = pb_entry.update_title_time_us();
- }
-
- State state = UNSEEN;
- if (pb_entry.has_status()) {
- switch (pb_entry.status()) {
- case sync_pb::ReadingListSpecifics::READ:
- state = READ;
- break;
- case sync_pb::ReadingListSpecifics::UNREAD:
- state = UNREAD;
- break;
- case sync_pb::ReadingListSpecifics::UNSEEN:
- state = UNSEEN;
- break;
- }
- }
-
- return base::WrapUnique<ReadingListEntry>(new ReadingListEntry(
- url, title, state, creation_time_us, first_read_time_us, update_time_us,
- update_title_time_us, WAITING, base::FilePath(), GURL(), 0, 0, 0,
- nullptr));
-}
-
-void ReadingListEntry::MergeWithEntry(const ReadingListEntry& other) {
-#if !defined(NDEBUG)
- // Checks that the result entry respects the sync order.
- std::unique_ptr<sync_pb::ReadingListSpecifics> old_this_pb(
- AsReadingListSpecifics());
- std::unique_ptr<sync_pb::ReadingListSpecifics> other_pb(
- other.AsReadingListSpecifics());
-#endif
- DCHECK(url_ == other.url_);
- if (update_title_time_us_ < other.update_title_time_us_) {
- // Take the most recent title updated.
- title_ = std::move(other.title_);
- update_title_time_us_ = std::move(other.update_title_time_us_);
- } else if (update_title_time_us_ == other.update_title_time_us_) {
- if (title_.compare(other.title_) < 0) {
- // Take the last in alphabetical order or the longer one.
- // This ensure empty string is replaced.
- title_ = std::move(other.title_);
- }
- }
- if (creation_time_us_ < other.creation_time_us_) {
- creation_time_us_ = std::move(other.creation_time_us_);
- first_read_time_us_ = std::move(other.first_read_time_us_);
- } else if (creation_time_us_ == other.creation_time_us_) {
- // The first_time_read_us from |other| is used if
- // - this.first_time_read_us == 0: the entry was never read in this device.
- // - this.first_time_read_us > other.first_time_read_us: the entry was
- // first read on another device.
- if (first_read_time_us_ == 0 ||
- (other.first_read_time_us_ != 0 &&
- other.first_read_time_us_ < first_read_time_us_)) {
- first_read_time_us_ = std::move(other.first_read_time_us_);
- }
- }
- if (update_time_us_ < other.update_time_us_) {
- update_time_us_ = std::move(other.update_time_us_);
- state_ = std::move(other.state_);
- } else if (update_time_us_ == other.update_time_us_) {
- if (state_ == UNSEEN) {
- state_ = std::move(other.state_);
- } else if (other.state_ == READ) {
- state_ = std::move(other.state_);
- }
- }
-#if !defined(NDEBUG)
- std::unique_ptr<sync_pb::ReadingListSpecifics> new_this_pb(
- AsReadingListSpecifics());
- DCHECK(ReadingListStore::CompareEntriesForSync(*old_this_pb, *new_this_pb));
- DCHECK(ReadingListStore::CompareEntriesForSync(*other_pb, *new_this_pb));
-#endif
-}
-
-std::unique_ptr<reading_list::ReadingListLocal>
-ReadingListEntry::AsReadingListLocal(const base::Time& now) const {
- std::unique_ptr<reading_list::ReadingListLocal> pb_entry =
- base::MakeUnique<reading_list::ReadingListLocal>();
-
- // URL is used as the key for the database and sync as there is only one entry
- // per URL.
- pb_entry->set_entry_id(URL().spec());
- pb_entry->set_title(Title());
- pb_entry->set_url(URL().spec());
- pb_entry->set_creation_time_us(CreationTime());
- pb_entry->set_first_read_time_us(FirstReadTime());
- pb_entry->set_update_time_us(UpdateTime());
- pb_entry->set_update_title_time_us(UpdateTitleTime());
-
- switch (state_) {
- case READ:
- pb_entry->set_status(reading_list::ReadingListLocal::READ);
- break;
- case UNREAD:
- pb_entry->set_status(reading_list::ReadingListLocal::UNREAD);
- break;
- case UNSEEN:
- pb_entry->set_status(reading_list::ReadingListLocal::UNSEEN);
- break;
- }
-
- reading_list::ReadingListLocal::DistillationState distilation_state;
- switch (DistilledState()) {
- case ReadingListEntry::WAITING:
- distilation_state = reading_list::ReadingListLocal::WAITING;
- break;
- case ReadingListEntry::PROCESSING:
- distilation_state = reading_list::ReadingListLocal::PROCESSING;
- break;
- case ReadingListEntry::PROCESSED:
- distilation_state = reading_list::ReadingListLocal::PROCESSED;
- break;
- case ReadingListEntry::WILL_RETRY:
- distilation_state = reading_list::ReadingListLocal::WILL_RETRY;
- break;
- case ReadingListEntry::ERROR:
- distilation_state = reading_list::ReadingListLocal::ERROR;
- break;
- }
- pb_entry->set_distillation_state(distilation_state);
- if (!DistilledPath().empty()) {
- pb_entry->set_distilled_path(DistilledPath().value());
- }
- if (DistilledURL().is_valid()) {
- pb_entry->set_distilled_url(DistilledURL().spec());
- }
- if (DistillationTime()) {
- pb_entry->set_distillation_time_us(DistillationTime());
- }
- if (DistillationSize()) {
- pb_entry->set_distillation_size(DistillationSize());
- }
-
- pb_entry->set_failed_download_counter(failed_download_counter_);
-
- if (backoff_) {
- std::unique_ptr<base::Value> backoff =
- net::BackoffEntrySerializer::SerializeToValue(*backoff_, now);
-
- std::string output;
- JSONStringValueSerializer serializer(&output);
- serializer.Serialize(*backoff);
- pb_entry->set_backoff(output);
- }
- return pb_entry;
-}
-
-std::unique_ptr<sync_pb::ReadingListSpecifics>
-ReadingListEntry::AsReadingListSpecifics() const {
- std::unique_ptr<sync_pb::ReadingListSpecifics> pb_entry =
- base::MakeUnique<sync_pb::ReadingListSpecifics>();
-
- // URL is used as the key for the database and sync as there is only one entry
- // per URL.
- pb_entry->set_entry_id(URL().spec());
- pb_entry->set_title(Title());
- pb_entry->set_url(URL().spec());
- pb_entry->set_creation_time_us(CreationTime());
- pb_entry->set_first_read_time_us(FirstReadTime());
- pb_entry->set_update_time_us(UpdateTime());
- pb_entry->set_update_title_time_us(UpdateTitleTime());
-
- switch (state_) {
- case READ:
- pb_entry->set_status(sync_pb::ReadingListSpecifics::READ);
- break;
- case UNREAD:
- pb_entry->set_status(sync_pb::ReadingListSpecifics::UNREAD);
- break;
- case UNSEEN:
- pb_entry->set_status(sync_pb::ReadingListSpecifics::UNSEEN);
- break;
- }
-
- return pb_entry;
-}
« no previous file with comments | « components/reading_list/ios/reading_list_entry.h ('k') | components/reading_list/ios/reading_list_entry_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698