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