Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Side by Side Diff: components/dom_distiller/core/task_tracker.cc

Issue 189833002: Add a DistilledContentStore (and an in-memory impl) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/dom_distiller/core/task_tracker.h" 5 #include "components/dom_distiller/core/task_tracker.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "components/dom_distiller/core/distilled_content_store.h"
9 #include "components/dom_distiller/core/proto/distilled_article.pb.h" 10 #include "components/dom_distiller/core/proto/distilled_article.pb.h"
10 #include "components/dom_distiller/core/proto/distilled_page.pb.h" 11 #include "components/dom_distiller/core/proto/distilled_page.pb.h"
11 12
12 namespace dom_distiller { 13 namespace dom_distiller {
13 14
14 ViewerHandle::ViewerHandle(CancelCallback callback) 15 ViewerHandle::ViewerHandle(CancelCallback callback)
15 : cancel_callback_(callback) {} 16 : cancel_callback_(callback) {}
16 17
17 ViewerHandle::~ViewerHandle() { 18 ViewerHandle::~ViewerHandle() {
18 if (!cancel_callback_.is_null()) { 19 if (!cancel_callback_.is_null()) {
19 cancel_callback_.Run(); 20 cancel_callback_.Run();
20 } 21 }
21 } 22 }
22 23
23 TaskTracker::TaskTracker(const ArticleEntry& entry, CancelCallback callback) 24 TaskTracker::TaskTracker(const ArticleEntry& entry,
25 CancelCallback callback,
26 DistilledContentStore* content_store)
24 : cancel_callback_(callback), 27 : cancel_callback_(callback),
28 content_store_(content_store),
25 entry_(entry), 29 entry_(entry),
26 distilled_article_(), 30 distilled_article_(),
27 content_ready_(false), 31 content_ready_(false),
28 destruction_allowed_(true), 32 destruction_allowed_(true),
29 weak_ptr_factory_(this) {} 33 weak_ptr_factory_(this) {}
30 34
31 TaskTracker::~TaskTracker() { 35 TaskTracker::~TaskTracker() {
32 DCHECK(destruction_allowed_); 36 DCHECK(destruction_allowed_);
33 DCHECK(viewers_.empty()); 37 DCHECK(viewers_.empty());
34 } 38 }
35 39
36 void TaskTracker::StartDistiller(DistillerFactory* factory) { 40 void TaskTracker::StartDistiller(DistillerFactory* factory) {
37 if (distiller_) { 41 if (distiller_) {
38 return; 42 return;
39 } 43 }
40 if (entry_.pages_size() == 0) { 44 if (entry_.pages_size() == 0) {
41 return; 45 return;
42 } 46 }
43
44 GURL url(entry_.pages(0).url()); 47 GURL url(entry_.pages(0).url());
45 DCHECK(url.is_valid()); 48 DCHECK(url.is_valid());
46 49
47 distiller_ = factory->CreateDistiller(); 50 distiller_ = factory->CreateDistiller();
48 distiller_->DistillPage(url, 51 distiller_->DistillPage(url,
49 base::Bind(&TaskTracker::OnDistillerFinished, 52 base::Bind(&TaskTracker::OnDistillerFinished,
50 weak_ptr_factory_.GetWeakPtr()), 53 weak_ptr_factory_.GetWeakPtr()),
51 base::Bind(&TaskTracker::OnArticleDistillationUpdated, 54 base::Bind(&TaskTracker::OnArticleDistillationUpdated,
52 weak_ptr_factory_.GetWeakPtr())); 55 weak_ptr_factory_.GetWeakPtr()));
53 } 56 }
54 57
55 void TaskTracker::StartBlobFetcher() { 58 void TaskTracker::StartBlobFetcher() {
56 // TODO(cjhopman): There needs to be some local storage for the distilled 59 if (content_store_) {
57 // blob. When that happens, this should start some task to fetch the blob for 60 content_store_->LoadContent(entry_,
58 // |entry_| and asynchronously notify |this| when it is done. 61 base::Bind(&TaskTracker::OnBlobFetched,
62 weak_ptr_factory_.GetWeakPtr()));
63 }
59 } 64 }
60 65
61 void TaskTracker::AddSaveCallback(const SaveCallback& callback) { 66 void TaskTracker::AddSaveCallback(const SaveCallback& callback) {
62 DCHECK(!callback.is_null()); 67 DCHECK(!callback.is_null());
63 save_callbacks_.push_back(callback); 68 save_callbacks_.push_back(callback);
64 if (content_ready_) { 69 if (content_ready_) {
65 // Distillation for this task has already completed, and so it can be 70 // Distillation for this task has already completed, and so it can be
66 // immediately saved. 71 // immediately saved.
67 ScheduleSaveCallbacks(true); 72 ScheduleSaveCallbacks(true);
68 } 73 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 } 144 }
140 } 145 }
141 146
142 void TaskTracker::NotifyViewer(ViewRequestDelegate* delegate) { 147 void TaskTracker::NotifyViewer(ViewRequestDelegate* delegate) {
143 DCHECK(content_ready_); 148 DCHECK(content_ready_);
144 delegate->OnArticleReady(distilled_article_.get()); 149 delegate->OnArticleReady(distilled_article_.get());
145 } 150 }
146 151
147 void TaskTracker::OnDistillerFinished( 152 void TaskTracker::OnDistillerFinished(
148 scoped_ptr<DistilledArticleProto> distilled_article) { 153 scoped_ptr<DistilledArticleProto> distilled_article) {
149 OnDistilledArticleReady(distilled_article.Pass()); 154 if (!content_ready_) {
155 OnDistilledArticleReady(distilled_article.Pass());
156 }
157 }
158
159 void TaskTracker::OnBlobFetched(
160 bool success,
161 scoped_ptr<DistilledArticleProto> distilled_article) {
162 if (!content_ready_ && success) {
163 OnDistilledArticleReady(distilled_article.Pass());
164 }
150 } 165 }
151 166
152 void TaskTracker::OnDistilledArticleReady( 167 void TaskTracker::OnDistilledArticleReady(
153 scoped_ptr<DistilledArticleProto> distilled_article) { 168 scoped_ptr<DistilledArticleProto> distilled_article) {
169 DCHECK(!content_ready_);
170 content_ready_ = true;
154 distilled_article_ = distilled_article.Pass(); 171 distilled_article_ = distilled_article.Pass();
155 bool distillation_successful = false; 172 bool distillation_successful = false;
nyquist 2014/04/10 19:00:13 how about bool distillation_successful = distilled
cjhopman 2014/04/11 22:37:21 Done.
156 if (distilled_article_->pages_size() > 0) { 173 if (distilled_article_->pages_size() > 0) {
157 distillation_successful = true; 174 distillation_successful = true;
158 entry_.set_title(distilled_article_->title()); 175 entry_.set_title(distilled_article_->title());
159 // Reset the pages. 176 // Reset the pages.
160 entry_.clear_pages(); 177 entry_.clear_pages();
161 for (int i = 0; i < distilled_article_->pages_size(); ++i) { 178 for (int i = 0; i < distilled_article_->pages_size(); ++i) {
162 sync_pb::ArticlePage* page = entry_.add_pages(); 179 sync_pb::ArticlePage* page = entry_.add_pages();
163 page->set_url(distilled_article_->pages(i).url()); 180 page->set_url(distilled_article_->pages(i).url());
164 } 181 }
165 } 182 }
166 183
167 content_ready_ = true; 184 if (distillation_successful) {
shashi 2014/03/18 21:14:57 Can OnDistillerFinished determine if the distillat
nyquist 2014/04/10 19:00:13 Or how about just adding a param |store_if_valid|
cjhopman 2014/04/11 22:37:21 So this should be more correct now.
185 // TODO(cjhopman): If this article came from the blob fetcher, there is no
186 // reason to store it back there.
187 AddDistilledContentToStore();
188 }
168 189
169 for (size_t i = 0; i < viewers_.size(); ++i) { 190 for (size_t i = 0; i < viewers_.size(); ++i) {
170 NotifyViewer(viewers_[i]); 191 NotifyViewer(viewers_[i]);
171 } 192 }
172 193
173 // Already inside a callback run SaveCallbacks directly. 194 // Already inside a callback run SaveCallbacks directly.
174 DoSaveCallbacks(distillation_successful); 195 DoSaveCallbacks(distillation_successful);
175 } 196 }
176 197
177 void TaskTracker::OnArticleDistillationUpdated( 198 void TaskTracker::OnArticleDistillationUpdated(
178 const ArticleDistillationUpdate& article_update) { 199 const ArticleDistillationUpdate& article_update) {
179 for (size_t i = 0; i < viewers_.size(); ++i) { 200 for (size_t i = 0; i < viewers_.size(); ++i) {
180 viewers_[i]->OnArticleUpdated(article_update); 201 viewers_[i]->OnArticleUpdated(article_update);
181 } 202 }
182 } 203 }
183 204
205 void TaskTracker::AddDistilledContentToStore() {
206 if (content_store_) {
207 content_store_->SaveContent(
208 entry_, *distilled_article_, DistilledContentStore::SaveCallback());
209 }
210 }
211
212
184 } // namespace dom_distiller 213 } // namespace dom_distiller
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698