Chromium Code Reviews| Index: components/dom_distiller/core/distilled_content_store.cc |
| diff --git a/components/dom_distiller/core/distilled_content_store.cc b/components/dom_distiller/core/distilled_content_store.cc |
| index 9a92920c75a8d57b60b33b9243b7e3122bf3db6e..100dd9602402498c7d23ccca71c2ad24793f0c65 100644 |
| --- a/components/dom_distiller/core/distilled_content_store.cc |
| +++ b/components/dom_distiller/core/distilled_content_store.cc |
| @@ -9,10 +9,13 @@ |
| namespace dom_distiller { |
| InMemoryContentStore::InMemoryContentStore(const int max_num_entries) |
| - : cache_(max_num_entries) { |
| + : cache_(max_num_entries, CacheDeletor(this)) { |
| } |
| InMemoryContentStore::~InMemoryContentStore() { |
| + // Clear the cache before destruction to ensure the CacheDeletor is not called |
| + // after InMemoryContentStore has been destroyed. |
| + cache_.Clear(); |
| } |
| void InMemoryContentStore::SaveContent( |
| @@ -34,6 +37,19 @@ void InMemoryContentStore::LoadContent( |
| ContentMap::const_iterator it = cache_.Get(entry.entry_id()); |
| bool success = it != cache_.end(); |
| + if (!success) { |
| + // Could not find article by entry ID, so try looking it up by URL. |
| + for (int i = 0; i < entry.pages_size(); ++i) { |
| + URLMap::const_iterator url_it = url_to_id_.find(entry.pages(i).url()); |
| + if (url_it != url_to_id_.end()) { |
| + it = cache_.Get(url_it->second); |
| + success = it != cache_.end(); |
| + if (success) { |
| + break; |
| + } |
| + } |
| + } |
| + } |
| scoped_ptr<DistilledArticleProto> distilled_article; |
| if (success) { |
| distilled_article.reset(new DistilledArticleProto(it->second)); |
| @@ -48,6 +64,44 @@ void InMemoryContentStore::LoadContent( |
| void InMemoryContentStore::InjectContent(const ArticleEntry& entry, |
| const DistilledArticleProto& proto) { |
| cache_.Put(entry.entry_id(), proto); |
| + AddUrlToIdMapping(entry, proto); |
| +} |
| + |
| +void InMemoryContentStore::AddUrlToIdMapping( |
| + const ArticleEntry& entry, |
| + const DistilledArticleProto& proto) { |
| + for (int i = 0; i < proto.pages_size(); i++) { |
| + const DistilledPageProto& page = proto.pages(i); |
| + if (page.has_url()) { |
| + url_to_id_.insert( |
| + std::pair<std::string, std::string>(page.url(), entry.entry_id())); |
|
cjhopman
2014/06/06 17:33:05
how about just:
url_to_id_[page.url()] = entry.ent
nyquist
2014/06/06 19:00:21
Done.
|
| + } |
| + } |
| +} |
| + |
| +void InMemoryContentStore::EraseUrlToIdMapping( |
| + const DistilledArticleProto& proto) { |
| + for (int i = 0; i < proto.pages_size(); i++) { |
| + const DistilledPageProto& page = proto.pages(i); |
| + if (page.has_url()) { |
| + url_to_id_.erase(page.url()); |
| + } |
| + } |
| +} |
| + |
| +InMemoryContentStore::CacheDeletor::CacheDeletor(InMemoryContentStore* store) |
| + : store_(store) { |
| +} |
| + |
| +InMemoryContentStore::CacheDeletor::~CacheDeletor() { |
| +} |
| + |
| +void InMemoryContentStore::CacheDeletor::operator()( |
| + const DistilledArticleProto& proto) { |
| + // When InMemoryContentStore is deleted, the |store_| pointer becomes invalid, |
| + // but since the ContentMap is cleared in the InMemoryContentStore destructor, |
| + // this should never be called after the destructor. |
| + store_->EraseUrlToIdMapping(proto); |
| } |
| } // namespace dom_distiller |