1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/api/reading_list_private/reading_list_private_api.h"
6
7#include <string>
8#include <vector>
9
10#include "base/memory/linked_ptr.h"
11#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
12#include "chrome/browser/profiles/profile.h"
13#include "chrome/common/extensions/api/reading_list_private.h"
14#include "components/dom_distiller/core/article_entry.h"
15#include "components/dom_distiller/core/dom_distiller_service.h"
16
17namespace extensions {
18
19namespace AddEntry = api::reading_list_private::AddEntry;
20namespace RemoveEntry = api::reading_list_private::RemoveEntry;
21namespace GetEntries = api::reading_list_private::GetEntries;
22
23using api::reading_list_private::Entry;
24using dom_distiller::ArticleEntry;
25using dom_distiller::DomDistillerService;
26using dom_distiller::DomDistillerServiceFactory;
27
28bool ReadingListPrivateAddEntryFunction::RunAsync() {
29  scoped_ptr<AddEntry::Params> params(AddEntry::Params::Create(*args_));
30  EXTENSION_FUNCTION_VALIDATE(params);
31  GURL url_to_add(params->entry.url);
32  if (!url_to_add.is_valid()) {
33    error_ = "Invalid url specified.";
34    SendResponse(false);
35    return false;
36  }
37
38  DomDistillerService* service =
39      DomDistillerServiceFactory::GetForBrowserContext(GetProfile());
40  const std::string& id = service->AddToList(
41      url_to_add,
42      service->CreateDefaultDistillerPage().Pass(),
43      base::Bind(&ReadingListPrivateAddEntryFunction::SendResponse, this));
44  Entry new_entry;
45  new_entry.id = id;
46  results_ = AddEntry::Results::Create(new_entry);
47  return true;
48}
49
50bool ReadingListPrivateRemoveEntryFunction::RunSync() {
51  scoped_ptr<RemoveEntry::Params> params(RemoveEntry::Params::Create(*args_));
52  EXTENSION_FUNCTION_VALIDATE(params);
53  DomDistillerService* service =
54      DomDistillerServiceFactory::GetForBrowserContext(GetProfile());
55  scoped_ptr<ArticleEntry> entry(service->RemoveEntry(params->id));
56  if (entry == NULL) {
57    results_ = make_scoped_ptr(new base::ListValue());
58  } else {
59    Entry removed_entry;
60    removed_entry.id = entry->entry_id();
61    results_ = RemoveEntry::Results::Create(removed_entry);
62  }
63  return true;
64}
65
66bool ReadingListPrivateGetEntriesFunction::RunSync() {
67  DomDistillerService* service =
68      DomDistillerServiceFactory::GetForBrowserContext(GetProfile());
69  const std::vector<ArticleEntry>& entries = service->GetEntries();
70  std::vector<linked_ptr<Entry> > result;
71  for (std::vector<ArticleEntry>::const_iterator i = entries.begin();
72       i != entries.end();
73       ++i) {
74    linked_ptr<Entry> e(new Entry);
75    e->id = i->entry_id();
76    result.push_back(e);
77  }
78  results_ = GetEntries::Results::Create(result);
79  return true;
80}
81
82}  // namespace extensions
83