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

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

Issue 146843010: Add support for multipage distillation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "components/dom_distiller/core/proto/distilled_article.pb.h"
9 #include "components/dom_distiller/core/proto/distilled_page.pb.h"
8 10
9 namespace dom_distiller { 11 namespace dom_distiller {
10 12
11 ViewerHandle::ViewerHandle(CancelCallback callback) 13 ViewerHandle::ViewerHandle(CancelCallback callback)
12 : cancel_callback_(callback) {} 14 : cancel_callback_(callback) {}
13 15
14 ViewerHandle::~ViewerHandle() { 16 ViewerHandle::~ViewerHandle() {
15 if (!cancel_callback_.is_null()) { 17 if (!cancel_callback_.is_null()) {
16 cancel_callback_.Run(); 18 cancel_callback_.Run();
17 } 19 }
18 } 20 }
19 21
20 TaskTracker::TaskTracker(const ArticleEntry& entry, CancelCallback callback) 22 TaskTracker::TaskTracker(const ArticleEntry& entry, CancelCallback callback)
21 : cancel_callback_(callback), 23 : cancel_callback_(callback),
22 entry_(entry), 24 entry_(entry),
23 distilled_page_(), 25 distilled_article_(),
26 distillation_complete_(false),
24 weak_ptr_factory_(this) {} 27 weak_ptr_factory_(this) {}
25 28
26 TaskTracker::~TaskTracker() { DCHECK(viewers_.empty()); } 29 TaskTracker::~TaskTracker() { DCHECK(viewers_.empty()); }
27 30
28 void TaskTracker::StartDistiller(DistillerFactory* factory) { 31 void TaskTracker::StartDistiller(DistillerFactory* factory) {
29 if (distiller_) { 32 if (distiller_) {
30 return; 33 return;
31 } 34 }
32 if (entry_.pages_size() == 0) { 35 if (entry_.pages_size() == 0) {
33 return; 36 return;
(...skipping 10 matching lines...) Expand all
44 47
45 void TaskTracker::StartBlobFetcher() { 48 void TaskTracker::StartBlobFetcher() {
46 // TODO(cjhopman): There needs to be some local storage for the distilled 49 // TODO(cjhopman): There needs to be some local storage for the distilled
47 // blob. When that happens, this should start some task to fetch the blob for 50 // blob. When that happens, this should start some task to fetch the blob for
48 // |entry_| and asynchronously notify |this| when it is done. 51 // |entry_| and asynchronously notify |this| when it is done.
49 } 52 }
50 53
51 void TaskTracker::AddSaveCallback(const SaveCallback& callback) { 54 void TaskTracker::AddSaveCallback(const SaveCallback& callback) {
52 DCHECK(!callback.is_null()); 55 DCHECK(!callback.is_null());
53 save_callbacks_.push_back(callback); 56 save_callbacks_.push_back(callback);
54 if (distilled_page_) { 57 if (distillation_complete_) {
55 // Distillation for this task has already completed, and so it can be 58 // Distillation for this task has already completed, and so it can be
56 // immediately saved. 59 // immediately saved.
57 ScheduleSaveCallbacks(true); 60 ScheduleSaveCallbacks(true);
58 } 61 }
59 } 62 }
60 63
61 scoped_ptr<ViewerHandle> TaskTracker::AddViewer(ViewRequestDelegate* delegate) { 64 scoped_ptr<ViewerHandle> TaskTracker::AddViewer(ViewRequestDelegate* delegate) {
62 viewers_.push_back(delegate); 65 viewers_.push_back(delegate);
63 if (distilled_page_) { 66 if (distillation_complete_) {
64 // Distillation for this task has already completed, and so the delegate can 67 // Distillation for this task has already completed, and so the delegate can
65 // be immediately told of the result. 68 // be immediately told of the result.
66 base::MessageLoop::current()->PostTask( 69 base::MessageLoop::current()->PostTask(
67 FROM_HERE, 70 FROM_HERE,
68 base::Bind(&TaskTracker::NotifyViewer, 71 base::Bind(&TaskTracker::NotifyViewer,
69 weak_ptr_factory_.GetWeakPtr(), 72 weak_ptr_factory_.GetWeakPtr(),
70 delegate)); 73 delegate));
71 } 74 }
72 return scoped_ptr<ViewerHandle>(new ViewerHandle(base::Bind( 75 return scoped_ptr<ViewerHandle>(new ViewerHandle(base::Bind(
73 &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate))); 76 &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate)));
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 void TaskTracker::ScheduleSaveCallbacks(bool distillation_succeeded) { 116 void TaskTracker::ScheduleSaveCallbacks(bool distillation_succeeded) {
114 base::MessageLoop::current()->PostTask( 117 base::MessageLoop::current()->PostTask(
115 FROM_HERE, 118 FROM_HERE,
116 base::Bind(&TaskTracker::DoSaveCallbacks, 119 base::Bind(&TaskTracker::DoSaveCallbacks,
117 weak_ptr_factory_.GetWeakPtr(), 120 weak_ptr_factory_.GetWeakPtr(),
118 distillation_succeeded)); 121 distillation_succeeded));
119 } 122 }
120 123
121 void TaskTracker::DoSaveCallbacks(bool distillation_succeeded) { 124 void TaskTracker::DoSaveCallbacks(bool distillation_succeeded) {
122 if (!save_callbacks_.empty()) { 125 if (!save_callbacks_.empty()) {
123 DistilledPageProto* distilled_proto =
124 distillation_succeeded ? distilled_page_.get() : NULL;
125
126 for (size_t i = 0; i < save_callbacks_.size(); ++i) { 126 for (size_t i = 0; i < save_callbacks_.size(); ++i) {
127 DCHECK(!save_callbacks_[i].is_null()); 127 DCHECK(!save_callbacks_[i].is_null());
128 save_callbacks_[i].Run(entry_, distilled_proto, distillation_succeeded); 128 save_callbacks_[i].Run(
129 entry_, distilled_article_.get(), distillation_succeeded);
129 } 130 }
130 131
131 save_callbacks_.clear(); 132 save_callbacks_.clear();
132 MaybeCancel(); 133 MaybeCancel();
133 } 134 }
134 } 135 }
135 136
136 void TaskTracker::NotifyViewer(ViewRequestDelegate* delegate) { 137 void TaskTracker::NotifyViewer(ViewRequestDelegate* delegate) {
137 DCHECK(distilled_page_); 138 DCHECK(distillation_complete_);
138 delegate->OnArticleReady(distilled_page_.get()); 139 delegate->OnArticleReady(distilled_article_.get());
139 } 140 }
140 141
141 void TaskTracker::OnDistilledDataReady(scoped_ptr<DistilledPageProto> proto) { 142 void TaskTracker::OnDistilledDataReady(
142 distilled_page_ = proto.Pass(); 143 scoped_ptr<DistilledArticleProto> distilled_article) {
143 DCHECK(distilled_page_); 144 distilled_article_ = distilled_article.Pass();
145 bool distillation_successful = false;
146 if (distilled_article_->pages_size() > 0) {
147 distillation_successful = true;
148 entry_.set_title(distilled_article_->title());
149 // Reset the pages.
150 entry_.clear_pages();
151 for (int i = 0; i < distilled_article_->pages_size(); ++i) {
152 sync_pb::ArticlePage* page = entry_.add_pages();
153 page->set_url(distilled_article_->pages(i).url());
154 }
155 }
144 156
145 entry_.set_title(distilled_page_->title()); 157 distillation_complete_ = true;
158
146 for (size_t i = 0; i < viewers_.size(); ++i) { 159 for (size_t i = 0; i < viewers_.size(); ++i) {
147 NotifyViewer(viewers_[i]); 160 NotifyViewer(viewers_[i]);
148 } 161 }
149 162
150 // Already inside a callback run SaveCallbacks directly. 163 // Already inside a callback run SaveCallbacks directly.
151 DoSaveCallbacks(true); 164 DoSaveCallbacks(distillation_successful);
152 } 165 }
153 166
154 } // namespace dom_distiller 167 } // namespace dom_distiller
OLDNEW
« no previous file with comments | « components/dom_distiller/core/task_tracker.h ('k') | components/dom_distiller/core/task_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698