1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/dom_distiller/core/task_tracker.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/auto_reset.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/dom_distiller/core/distilled_content_store.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/dom_distiller/core/proto/distilled_article.pb.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/dom_distiller/core/proto/distilled_page.pb.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace dom_distiller { 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ViewerHandle::ViewerHandle(CancelCallback callback) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : cancel_callback_(callback) {} 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ViewerHandle::~ViewerHandle() { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!cancel_callback_.is_null()) { 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cancel_callback_.Run(); 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 240529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTaskTracker::TaskTracker(const ArticleEntry& entry, 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CancelCallback callback, 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DistilledContentStore* content_store) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : cancel_callback_(callback), 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content_store_(content_store), 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch blob_fetcher_running_(false), 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) entry_(entry), 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) distilled_article_(), 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content_ready_(false), 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) destruction_allowed_(true), 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_(this) {} 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TaskTracker::~TaskTracker() { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(destruction_allowed_); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(viewers_.empty()); 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid TaskTracker::StartDistiller(DistillerFactory* factory, 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<DistillerPage> distiller_page) { 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (distiller_) { 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry_.pages_size() == 0) { 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL url(entry_.pages(0).url()); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(url.is_valid()); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) distiller_ = factory->CreateDistiller(); 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) distiller_->DistillPage(url, 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu distiller_page.Pass(), 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&TaskTracker::OnDistillerFinished, 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&TaskTracker::OnArticleDistillationUpdated, 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TaskTracker::StartBlobFetcher() { 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (content_store_) { 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blob_fetcher_running_ = true; 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content_store_->LoadContent(entry_, 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Bind(&TaskTracker::OnBlobFetched, 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch weak_ptr_factory_.GetWeakPtr())); 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TaskTracker::AddSaveCallback(const SaveCallback& callback) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!callback.is_null()); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) save_callbacks_.push_back(callback); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (content_ready_) { 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Distillation for this task has already completed, and so it can be 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // immediately saved. 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScheduleSaveCallbacks(true); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<ViewerHandle> TaskTracker::AddViewer(ViewRequestDelegate* delegate) { 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) viewers_.push_back(delegate); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (content_ready_) { 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Distillation for this task has already completed, and so the delegate can 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // be immediately told of the result. 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop::current()->PostTask( 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FROM_HERE, 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&TaskTracker::NotifyViewer, 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate)); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return scoped_ptr<ViewerHandle>(new ViewerHandle(base::Bind( 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate))); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const std::string& TaskTracker::GetEntryId() const { return entry_.entry_id(); } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TaskTracker::HasEntryId(const std::string& entry_id) const { 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return entry_.entry_id() == entry_id; 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TaskTracker::HasUrl(const GURL& url) const { 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < entry_.pages_size(); ++i) { 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry_.pages(i).url() == url.spec()) { 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TaskTracker::RemoveViewer(ViewRequestDelegate* delegate) { 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) viewers_.erase(std::remove(viewers_.begin(), viewers_.end(), delegate)); 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (viewers_.empty()) { 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MaybeCancel(); 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TaskTracker::MaybeCancel() { 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!save_callbacks_.empty() || !viewers_.empty()) { 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // There's still work to be done. 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CancelPendingSources(); 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::AutoReset<bool> dont_delete_this_in_callback(&destruction_allowed_, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cancel_callback_.Run(this); 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TaskTracker::CancelSaveCallbacks() { ScheduleSaveCallbacks(false); } 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TaskTracker::ScheduleSaveCallbacks(bool distillation_succeeded) { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&TaskTracker::DoSaveCallbacks, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) distillation_succeeded)); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::OnDistillerFinished( 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<DistilledArticleProto> distilled_article) { 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (content_ready_) { 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DistilledArticleReady(distilled_article.Pass()); 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (content_ready_) { 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddDistilledContentToStore(*distilled_article_); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 'distiller_ != null' is used as a signal that distillation is in progress, 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // so it needs to be released so that we know distillation is done. 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->DeleteSoon(FROM_HERE, distiller_.release()); 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ContentSourceFinished(); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::CancelPendingSources() { 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (distiller_) { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->DeleteSoon(FROM_HERE, distiller_.release()); 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::OnBlobFetched( 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool success, 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<DistilledArticleProto> distilled_article) { 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch blob_fetcher_running_ = false; 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (content_ready_) { 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DistilledArticleReady(distilled_article.Pass()); 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ContentSourceFinished(); 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool TaskTracker::IsAnySourceRunning() const { 1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return distiller_ || blob_fetcher_running_; 1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::ContentSourceFinished() { 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (content_ready_) { 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CancelPendingSources(); 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } else if (!IsAnySourceRunning()) { 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch distilled_article_.reset(new DistilledArticleProto()); 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NotifyViewersAndCallbacks(); 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::DistilledArticleReady( 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DistilledArticleProto> distilled_article) { 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(!content_ready_); 1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (distilled_article->pages_size() == 0) { 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content_ready_ = true; 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch distilled_article_ = distilled_article.Pass(); 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch entry_.set_title(distilled_article_->title()); 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch entry_.clear_pages(); 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (int i = 0; i < distilled_article_->pages_size(); ++i) { 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sync_pb::ArticlePage* page = entry_.add_pages(); 2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch page->set_url(distilled_article_->pages(i).url()); 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NotifyViewersAndCallbacks(); 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::NotifyViewersAndCallbacks() { 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < viewers_.size(); ++i) { 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NotifyViewer(viewers_[i]); 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Already inside a callback run SaveCallbacks directly. 2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DoSaveCallbacks(content_ready_); 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::NotifyViewer(ViewRequestDelegate* delegate) { 2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate->OnArticleReady(distilled_article_.get()); 2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::DoSaveCallbacks(bool success) { 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!save_callbacks_.empty()) { 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < save_callbacks_.size(); ++i) { 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(!save_callbacks_[i].is_null()); 2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch save_callbacks_[i].Run( 2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch entry_, distilled_article_.get(), success); 2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch save_callbacks_.clear(); 2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch MaybeCancel(); 2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TaskTracker::OnArticleDistillationUpdated( 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ArticleDistillationUpdate& article_update) { 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < viewers_.size(); ++i) { 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) viewers_[i]->OnArticleUpdated(article_update); 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid TaskTracker::AddDistilledContentToStore( 2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const DistilledArticleProto& content) { 2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (content_store_) { 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content_store_->SaveContent( 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch entry_, content, DistilledContentStore::SaveCallback()); 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace dom_distiller 255