15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/dom_distiller/core/dom_distiller_model.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using syncer::SyncChange;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncChangeList;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncData;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncDataList;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dom_distiller {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DomDistillerModel::DomDistillerModel()
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : next_key_(1) {}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DomDistillerModel::DomDistillerModel(
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<ArticleEntry>& initial_data)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : next_key_(1) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < initial_data.size(); ++i) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddEntry(initial_data[i]);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DomDistillerModel::~DomDistillerModel() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DomDistillerModel::GetEntryById(const std::string& entry_id,
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     ArticleEntry* entry) const {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyType key = 0;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetKeyById(entry_id, &key)) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetEntryByKey(key, entry);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DomDistillerModel::GetEntryByUrl(const GURL& url,
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     ArticleEntry* entry) const {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyType key = 0;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!GetKeyByUrl(url, &key)) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetEntryByKey(key, entry);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DomDistillerModel::GetKeyById(const std::string& entry_id,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   KeyType* key) const {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringToKeyMap::const_iterator it = entry_id_to_key_map_.find(entry_id);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it == entry_id_to_key_map_.end()) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key != NULL) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *key = it->second;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DomDistillerModel::GetKeyByUrl(const GURL& url, KeyType* key) const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringToKeyMap::const_iterator it = url_to_key_map_.find(url.spec());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it == url_to_key_map_.end()) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (key != NULL) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *key = it->second;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DomDistillerModel::GetEntryByKey(KeyType key, ArticleEntry* entry) const {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry != NULL) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EntryMap::const_iterator it = entries_.find(key);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(it != entries_.end());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *entry = it->second;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t DomDistillerModel::GetNumEntries() const {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entries_.size();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<ArticleEntry> DomDistillerModel::GetEntries() const {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ArticleEntry> entries_list;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (EntryMap::const_iterator it = entries_.begin(); it != entries_.end();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries_list.push_back(it->second);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entries_list;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncDataList DomDistillerModel::GetAllSyncData() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncDataList data;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (EntryMap::const_iterator it = entries_.begin(); it != entries_.end();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data.push_back(CreateLocalData(it->second));
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return data;
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DomDistillerModel::CalculateChangesForMerge(
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const SyncDataList& data,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SyncChangeList* changes_to_apply,
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SyncChangeList* changes_missing) {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef base::hash_set<std::string> StringSet;
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StringSet entries_to_change;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (SyncDataList::const_iterator it = data.begin(); it != data.end(); ++it) {
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string entry_id = GetEntryIdFromSyncData(*it);
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::pair<StringSet::iterator, bool> insert_result =
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entries_to_change.insert(entry_id);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(insert_result.second);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SyncChange::SyncChangeType change_type = SyncChange::ACTION_ADD;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (GetEntryById(entry_id, NULL)) {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      change_type = SyncChange::ACTION_UPDATE;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    changes_to_apply->push_back(SyncChange(FROM_HERE, change_type, *it));
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  for (EntryMap::const_iterator it = entries_.begin(); it != entries_.end();
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ++it) {
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (entries_to_change.find(it->second.entry_id()) ==
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entries_to_change.end()) {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      changes_missing->push_back(SyncChange(
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          FROM_HERE, SyncChange::ACTION_ADD, CreateLocalData(it->second)));
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DomDistillerModel::ApplyChangesToModel(
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SyncChangeList& changes,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncChangeList* changes_applied,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncChangeList* changes_missing) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(changes_applied);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(changes_missing);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (SyncChangeList::const_iterator it = changes.begin(); it != changes.end();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyChangeToModel(*it, changes_applied, changes_missing);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DomDistillerModel::AddEntry(const ArticleEntry& entry) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& entry_id = entry.entry_id();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyType key = next_key_++;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!GetKeyById(entry_id, NULL));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries_.insert(std::make_pair(key, entry));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_id_to_key_map_.insert(std::make_pair(entry_id, key));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < entry.pages_size(); ++i) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_to_key_map_.insert(std::make_pair(entry.pages(i).url(), key));
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DomDistillerModel::RemoveEntry(const ArticleEntry& entry) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& entry_id = entry.entry_id();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyType key = 0;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = GetKeyById(entry_id, &key);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(success);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entries_.erase(key);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry_id_to_key_map_.erase(entry_id);
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < entry.pages_size(); ++i) {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    url_to_key_map_.erase(entry.pages(i).url());
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DomDistillerModel::ApplyChangeToModel(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SyncChange& change,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncChangeList* changes_applied,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncChangeList* changes_missing) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(change.IsValid());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(changes_applied);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(changes_missing);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& entry_id = GetEntryIdFromSyncData(change.sync_data());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (change.change_type() == SyncChange::ACTION_DELETE) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ArticleEntry current_entry;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (GetEntryById(entry_id, &current_entry)) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RemoveEntry(current_entry);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      changes_applied->push_back(SyncChange(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          change.location(), SyncChange::ACTION_DELETE, change.sync_data()));
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we couldn't find in sync db, we were deleting anyway so swallow the
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // error.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ArticleEntry entry = GetEntryFromChange(change);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ArticleEntry current_entry;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetEntryById(entry_id, &current_entry)) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddEntry(entry);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changes_applied->push_back(SyncChange(
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        change.location(), SyncChange::ACTION_ADD, change.sync_data()));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!AreEntriesEqual(current_entry, entry)) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Currently, conflicts are simply resolved by accepting the last one to
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // arrive.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveEntry(current_entry);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddEntry(entry);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      changes_applied->push_back(SyncChange(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          change.location(), SyncChange::ACTION_UPDATE, change.sync_data()));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace dom_distiller
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)