| OLD | NEW |
| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 distilled_article_(), | 37 distilled_article_(), |
| 38 content_ready_(false), | 38 content_ready_(false), |
| 39 destruction_allowed_(true), | 39 destruction_allowed_(true), |
| 40 weak_ptr_factory_(this) {} | 40 weak_ptr_factory_(this) {} |
| 41 | 41 |
| 42 TaskTracker::~TaskTracker() { | 42 TaskTracker::~TaskTracker() { |
| 43 DCHECK(destruction_allowed_); | 43 DCHECK(destruction_allowed_); |
| 44 DCHECK(viewers_.empty()); | 44 DCHECK(viewers_.empty()); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void TaskTracker::StartDistiller(DistillerFactory* factory, | 47 void TaskTracker::StartDistiller( |
| 48 scoped_ptr<DistillerPage> distiller_page) { | 48 DistillerFactory* factory, |
| 49 std::unique_ptr<DistillerPage> distiller_page) { |
| 49 if (distiller_) { | 50 if (distiller_) { |
| 50 return; | 51 return; |
| 51 } | 52 } |
| 52 if (entry_.pages_size() == 0) { | 53 if (entry_.pages_size() == 0) { |
| 53 return; | 54 return; |
| 54 } | 55 } |
| 55 GURL url(entry_.pages(0).url()); | 56 GURL url(entry_.pages(0).url()); |
| 56 DCHECK(url.is_valid()); | 57 DCHECK(url.is_valid()); |
| 57 | 58 |
| 58 distiller_ = factory->CreateDistillerForUrl(url); | 59 distiller_ = factory->CreateDistillerForUrl(url); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 75 void TaskTracker::AddSaveCallback(const SaveCallback& callback) { | 76 void TaskTracker::AddSaveCallback(const SaveCallback& callback) { |
| 76 DCHECK(!callback.is_null()); | 77 DCHECK(!callback.is_null()); |
| 77 save_callbacks_.push_back(callback); | 78 save_callbacks_.push_back(callback); |
| 78 if (content_ready_) { | 79 if (content_ready_) { |
| 79 // Distillation for this task has already completed, and so it can be | 80 // Distillation for this task has already completed, and so it can be |
| 80 // immediately saved. | 81 // immediately saved. |
| 81 ScheduleSaveCallbacks(true); | 82 ScheduleSaveCallbacks(true); |
| 82 } | 83 } |
| 83 } | 84 } |
| 84 | 85 |
| 85 scoped_ptr<ViewerHandle> TaskTracker::AddViewer(ViewRequestDelegate* delegate) { | 86 std::unique_ptr<ViewerHandle> TaskTracker::AddViewer( |
| 87 ViewRequestDelegate* delegate) { |
| 86 viewers_.push_back(delegate); | 88 viewers_.push_back(delegate); |
| 87 if (content_ready_) { | 89 if (content_ready_) { |
| 88 // Distillation for this task has already completed, and so the delegate can | 90 // Distillation for this task has already completed, and so the delegate can |
| 89 // be immediately told of the result. | 91 // be immediately told of the result. |
| 90 base::ThreadTaskRunnerHandle::Get()->PostTask( | 92 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 91 FROM_HERE, base::Bind(&TaskTracker::NotifyViewer, | 93 FROM_HERE, base::Bind(&TaskTracker::NotifyViewer, |
| 92 weak_ptr_factory_.GetWeakPtr(), delegate)); | 94 weak_ptr_factory_.GetWeakPtr(), delegate)); |
| 93 } | 95 } |
| 94 return scoped_ptr<ViewerHandle>(new ViewerHandle(base::Bind( | 96 return std::unique_ptr<ViewerHandle>(new ViewerHandle(base::Bind( |
| 95 &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate))); | 97 &TaskTracker::RemoveViewer, weak_ptr_factory_.GetWeakPtr(), delegate))); |
| 96 } | 98 } |
| 97 | 99 |
| 98 const std::string& TaskTracker::GetEntryId() const { return entry_.entry_id(); } | 100 const std::string& TaskTracker::GetEntryId() const { return entry_.entry_id(); } |
| 99 | 101 |
| 100 bool TaskTracker::HasEntryId(const std::string& entry_id) const { | 102 bool TaskTracker::HasEntryId(const std::string& entry_id) const { |
| 101 return entry_.entry_id() == entry_id; | 103 return entry_.entry_id() == entry_id; |
| 102 } | 104 } |
| 103 | 105 |
| 104 bool TaskTracker::HasUrl(const GURL& url) const { | 106 bool TaskTracker::HasUrl(const GURL& url) const { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 133 void TaskTracker::CancelSaveCallbacks() { ScheduleSaveCallbacks(false); } | 135 void TaskTracker::CancelSaveCallbacks() { ScheduleSaveCallbacks(false); } |
| 134 | 136 |
| 135 void TaskTracker::ScheduleSaveCallbacks(bool distillation_succeeded) { | 137 void TaskTracker::ScheduleSaveCallbacks(bool distillation_succeeded) { |
| 136 base::ThreadTaskRunnerHandle::Get()->PostTask( | 138 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 137 FROM_HERE, | 139 FROM_HERE, |
| 138 base::Bind(&TaskTracker::DoSaveCallbacks, weak_ptr_factory_.GetWeakPtr(), | 140 base::Bind(&TaskTracker::DoSaveCallbacks, weak_ptr_factory_.GetWeakPtr(), |
| 139 distillation_succeeded)); | 141 distillation_succeeded)); |
| 140 } | 142 } |
| 141 | 143 |
| 142 void TaskTracker::OnDistillerFinished( | 144 void TaskTracker::OnDistillerFinished( |
| 143 scoped_ptr<DistilledArticleProto> distilled_article) { | 145 std::unique_ptr<DistilledArticleProto> distilled_article) { |
| 144 if (content_ready_) { | 146 if (content_ready_) { |
| 145 return; | 147 return; |
| 146 } | 148 } |
| 147 | 149 |
| 148 DistilledArticleReady(std::move(distilled_article)); | 150 DistilledArticleReady(std::move(distilled_article)); |
| 149 if (content_ready_) { | 151 if (content_ready_) { |
| 150 AddDistilledContentToStore(*distilled_article_); | 152 AddDistilledContentToStore(*distilled_article_); |
| 151 } | 153 } |
| 152 | 154 |
| 153 // 'distiller_ != null' is used as a signal that distillation is in progress, | 155 // 'distiller_ != null' is used as a signal that distillation is in progress, |
| 154 // so it needs to be released so that we know distillation is done. | 156 // so it needs to be released so that we know distillation is done. |
| 155 base::MessageLoop::current()->DeleteSoon(FROM_HERE, distiller_.release()); | 157 base::MessageLoop::current()->DeleteSoon(FROM_HERE, distiller_.release()); |
| 156 | 158 |
| 157 ContentSourceFinished(); | 159 ContentSourceFinished(); |
| 158 } | 160 } |
| 159 | 161 |
| 160 void TaskTracker::CancelPendingSources() { | 162 void TaskTracker::CancelPendingSources() { |
| 161 if (distiller_) { | 163 if (distiller_) { |
| 162 base::MessageLoop::current()->DeleteSoon(FROM_HERE, distiller_.release()); | 164 base::MessageLoop::current()->DeleteSoon(FROM_HERE, distiller_.release()); |
| 163 } | 165 } |
| 164 } | 166 } |
| 165 | 167 |
| 166 void TaskTracker::OnBlobFetched( | 168 void TaskTracker::OnBlobFetched( |
| 167 bool success, | 169 bool success, |
| 168 scoped_ptr<DistilledArticleProto> distilled_article) { | 170 std::unique_ptr<DistilledArticleProto> distilled_article) { |
| 169 blob_fetcher_running_ = false; | 171 blob_fetcher_running_ = false; |
| 170 | 172 |
| 171 if (content_ready_) { | 173 if (content_ready_) { |
| 172 return; | 174 return; |
| 173 } | 175 } |
| 174 | 176 |
| 175 DistilledArticleReady(std::move(distilled_article)); | 177 DistilledArticleReady(std::move(distilled_article)); |
| 176 | 178 |
| 177 ContentSourceFinished(); | 179 ContentSourceFinished(); |
| 178 } | 180 } |
| 179 | 181 |
| 180 bool TaskTracker::IsAnySourceRunning() const { | 182 bool TaskTracker::IsAnySourceRunning() const { |
| 181 return distiller_ || blob_fetcher_running_; | 183 return distiller_ || blob_fetcher_running_; |
| 182 } | 184 } |
| 183 | 185 |
| 184 void TaskTracker::ContentSourceFinished() { | 186 void TaskTracker::ContentSourceFinished() { |
| 185 if (content_ready_) { | 187 if (content_ready_) { |
| 186 CancelPendingSources(); | 188 CancelPendingSources(); |
| 187 } else if (!IsAnySourceRunning()) { | 189 } else if (!IsAnySourceRunning()) { |
| 188 distilled_article_.reset(new DistilledArticleProto()); | 190 distilled_article_.reset(new DistilledArticleProto()); |
| 189 NotifyViewersAndCallbacks(); | 191 NotifyViewersAndCallbacks(); |
| 190 } | 192 } |
| 191 } | 193 } |
| 192 | 194 |
| 193 void TaskTracker::DistilledArticleReady( | 195 void TaskTracker::DistilledArticleReady( |
| 194 scoped_ptr<DistilledArticleProto> distilled_article) { | 196 std::unique_ptr<DistilledArticleProto> distilled_article) { |
| 195 DCHECK(!content_ready_); | 197 DCHECK(!content_ready_); |
| 196 | 198 |
| 197 if (distilled_article->pages_size() == 0) { | 199 if (distilled_article->pages_size() == 0) { |
| 198 return; | 200 return; |
| 199 } | 201 } |
| 200 | 202 |
| 201 content_ready_ = true; | 203 content_ready_ = true; |
| 202 | 204 |
| 203 distilled_article_ = std::move(distilled_article); | 205 distilled_article_ = std::move(distilled_article); |
| 204 entry_.set_title(distilled_article_->title()); | 206 entry_.set_title(distilled_article_->title()); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 void TaskTracker::AddDistilledContentToStore( | 249 void TaskTracker::AddDistilledContentToStore( |
| 248 const DistilledArticleProto& content) { | 250 const DistilledArticleProto& content) { |
| 249 if (content_store_) { | 251 if (content_store_) { |
| 250 content_store_->SaveContent( | 252 content_store_->SaveContent( |
| 251 entry_, content, DistilledContentStore::SaveCallback()); | 253 entry_, content, DistilledContentStore::SaveCallback()); |
| 252 } | 254 } |
| 253 } | 255 } |
| 254 | 256 |
| 255 | 257 |
| 256 } // namespace dom_distiller | 258 } // namespace dom_distiller |
| OLD | NEW |