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, ¤t_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, ¤t_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)