15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/api/reading_list_private/reading_list_private_api.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/linked_ptr.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/extensions/api/reading_list_private.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/dom_distiller/core/article_entry.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/dom_distiller/core/dom_distiller_service.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/web_contents.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace AddEntry = api::reading_list_private::AddEntry;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace RemoveEntry = api::reading_list_private::RemoveEntry;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace GetEntries = api::reading_list_private::GetEntries;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using api::reading_list_private::Entry;
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using dom_distiller::ArticleEntry;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using dom_distiller::DomDistillerService;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using dom_distiller::DomDistillerServiceFactory;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ReadingListPrivateAddEntryFunction::RunAsync() {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<AddEntry::Params> params(AddEntry::Params::Create(*args_));
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url_to_add(params->entry.url);
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!url_to_add.is_valid()) {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_ = "Invalid url specified.";
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SendResponse(false);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DomDistillerService* service =
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DomDistillerServiceFactory::GetForBrowserContext(GetProfile());
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Size render_view_size;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::WebContents* web_contents = GetAssociatedWebContents();
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (web_contents)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    render_view_size = web_contents->GetContainerBounds().size();
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const std::string& id = service->AddToList(
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      url_to_add,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      service->CreateDefaultDistillerPage(render_view_size).Pass(),
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&ReadingListPrivateAddEntryFunction::SendResponse, this));
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Entry new_entry;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_entry.id = id;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  results_ = AddEntry::Results::Create(new_entry);
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool ReadingListPrivateRemoveEntryFunction::RunSync() {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<RemoveEntry::Params> params(RemoveEntry::Params::Create(*args_));
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DomDistillerService* service =
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      DomDistillerServiceFactory::GetForBrowserContext(GetProfile());
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<ArticleEntry> entry(service->RemoveEntry(params->id));
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (entry == NULL) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    results_ = make_scoped_ptr(new base::ListValue());
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Entry removed_entry;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    removed_entry.id = entry->entry_id();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    results_ = RemoveEntry::Results::Create(removed_entry);
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool ReadingListPrivateGetEntriesFunction::RunSync() {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DomDistillerService* service =
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DomDistillerServiceFactory::GetForBrowserContext(GetProfile());
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<ArticleEntry>& entries = service->GetEntries();
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<linked_ptr<Entry> > result;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (std::vector<ArticleEntry>::const_iterator i = entries.begin();
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       i != entries.end();
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       ++i) {
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    linked_ptr<Entry> e(new Entry);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    e->id = i->entry_id();
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result.push_back(e);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  results_ = GetEntries::Results::Create(result);
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace extensions
88