Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / components / dom_distiller / core / task_tracker.cc
index ccd5656..1afd482 100644 (file)
@@ -5,6 +5,8 @@
 #include "components/dom_distiller/core/task_tracker.h"
 
 #include "base/message_loop/message_loop.h"
+#include "components/dom_distiller/core/proto/distilled_article.pb.h"
+#include "components/dom_distiller/core/proto/distilled_page.pb.h"
 
 namespace dom_distiller {
 
@@ -20,7 +22,8 @@ ViewerHandle::~ViewerHandle() {
 TaskTracker::TaskTracker(const ArticleEntry& entry, CancelCallback callback)
     : cancel_callback_(callback),
       entry_(entry),
-      distilled_page_(),
+      distilled_article_(),
+      distillation_complete_(false),
       weak_ptr_factory_(this) {}
 
 TaskTracker::~TaskTracker() { DCHECK(viewers_.empty()); }
@@ -51,7 +54,7 @@ void TaskTracker::StartBlobFetcher() {
 void TaskTracker::AddSaveCallback(const SaveCallback& callback) {
   DCHECK(!callback.is_null());
   save_callbacks_.push_back(callback);
-  if (distilled_page_) {
+  if (distillation_complete_) {
     // Distillation for this task has already completed, and so it can be
     // immediately saved.
     ScheduleSaveCallbacks(true);
@@ -60,7 +63,7 @@ void TaskTracker::AddSaveCallback(const SaveCallback& callback) {
 
 scoped_ptr<ViewerHandle> TaskTracker::AddViewer(ViewRequestDelegate* delegate) {
   viewers_.push_back(delegate);
-  if (distilled_page_) {
+  if (distillation_complete_) {
     // Distillation for this task has already completed, and so the delegate can
     // be immediately told of the result.
     base::MessageLoop::current()->PostTask(
@@ -120,12 +123,10 @@ void TaskTracker::ScheduleSaveCallbacks(bool distillation_succeeded) {
 
 void TaskTracker::DoSaveCallbacks(bool distillation_succeeded) {
   if (!save_callbacks_.empty()) {
-    DistilledPageProto* distilled_proto =
-        distillation_succeeded ? distilled_page_.get() : NULL;
-
     for (size_t i = 0; i < save_callbacks_.size(); ++i) {
       DCHECK(!save_callbacks_[i].is_null());
-      save_callbacks_[i].Run(entry_, distilled_proto, distillation_succeeded);
+      save_callbacks_[i].Run(
+          entry_, distilled_article_.get(), distillation_succeeded);
     }
 
     save_callbacks_.clear();
@@ -134,21 +135,33 @@ void TaskTracker::DoSaveCallbacks(bool distillation_succeeded) {
 }
 
 void TaskTracker::NotifyViewer(ViewRequestDelegate* delegate) {
-  DCHECK(distilled_page_);
-  delegate->OnArticleReady(distilled_page_.get());
+  DCHECK(distillation_complete_);
+  delegate->OnArticleReady(distilled_article_.get());
 }
 
-void TaskTracker::OnDistilledDataReady(scoped_ptr<DistilledPageProto> proto) {
-  distilled_page_ = proto.Pass();
-  DCHECK(distilled_page_);
+void TaskTracker::OnDistilledDataReady(
+    scoped_ptr<DistilledArticleProto> distilled_article) {
+  distilled_article_ = distilled_article.Pass();
+  bool distillation_successful = false;
+  if (distilled_article_->pages_size() > 0) {
+    distillation_successful = true;
+    entry_.set_title(distilled_article_->title());
+    // Reset the pages.
+    entry_.clear_pages();
+    for (int i = 0; i < distilled_article_->pages_size(); ++i) {
+      sync_pb::ArticlePage* page = entry_.add_pages();
+      page->set_url(distilled_article_->pages(i).url());
+    }
+  }
+
+  distillation_complete_ = true;
 
-  entry_.set_title(distilled_page_->title());
   for (size_t i = 0; i < viewers_.size(); ++i) {
     NotifyViewer(viewers_[i]);
   }
 
   // Already inside a callback run SaveCallbacks directly.
-  DoSaveCallbacks(true);
+  DoSaveCallbacks(distillation_successful);
 }
 
 }  // namespace dom_distiller