Clean up extension confirmation prompts and make them consistent between Views and...
[chromium-blink-merge.git] / components / dom_distiller / webui / dom_distiller_handler.cc
blobd70dce4798c79d2d96049b17d41782a226505a89
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
3 // found in the LICENSE file.
5 #include "components/dom_distiller/webui/dom_distiller_handler.h"
7 #include <vector>
9 #include "base/bind.h"
10 #include "base/values.h"
11 #include "components/dom_distiller/core/dom_distiller_service.h"
12 #include "components/dom_distiller/core/proto/distilled_page.pb.h"
13 #include "components/dom_distiller/core/url_utils.h"
14 #include "content/public/browser/web_contents.h"
15 #include "content/public/browser/web_ui.h"
16 #include "net/base/escape.h"
17 #include "url/gurl.h"
19 namespace dom_distiller {
21 namespace {
23 GURL GetViewUrlFromArgs(const std::string& scheme,
24 const base::ListValue* args) {
25 std::string url;
26 if (args->GetString(0, &url)) {
27 const GURL gurl(url);
28 if (url_utils::IsUrlDistillable(gurl)) {
29 return url_utils::GetDistillerViewUrlFromUrl(scheme, gurl);
32 return GURL();
35 } // namespace
37 DomDistillerHandler::DomDistillerHandler(DomDistillerService* service,
38 const std::string& scheme)
39 : service_(service), article_scheme_(scheme), weak_ptr_factory_(this) {}
41 DomDistillerHandler::~DomDistillerHandler() {}
43 void DomDistillerHandler::RegisterMessages() {
44 web_ui()->RegisterMessageCallback(
45 "requestEntries",
46 base::Bind(&DomDistillerHandler::HandleRequestEntries,
47 base::Unretained(this)));
48 web_ui()->RegisterMessageCallback(
49 "addArticle",
50 base::Bind(&DomDistillerHandler::HandleAddArticle,
51 base::Unretained(this)));
52 web_ui()->RegisterMessageCallback(
53 "selectArticle",
54 base::Bind(&DomDistillerHandler::HandleSelectArticle,
55 base::Unretained(this)));
56 web_ui()->RegisterMessageCallback(
57 "viewUrl",
58 base::Bind(&DomDistillerHandler::HandleViewUrl, base::Unretained(this)));
61 void DomDistillerHandler::HandleAddArticle(const base::ListValue* args) {
62 std::string url;
63 args->GetString(0, &url);
64 GURL gurl(url);
65 if (gurl.is_valid()) {
66 service_->AddToList(
67 gurl,
68 service_->CreateDefaultDistillerPage(
69 web_ui()->GetWebContents()->GetContainerBounds().size()),
70 base::Bind(base::Bind(&DomDistillerHandler::OnArticleAdded,
71 base::Unretained(this))));
72 } else {
73 web_ui()->CallJavascriptFunction("domDistiller.onArticleAddFailed");
77 void DomDistillerHandler::HandleViewUrl(const base::ListValue* args) {
78 GURL view_url = GetViewUrlFromArgs(article_scheme_, args);
79 if (view_url.is_valid()) {
80 web_ui()->GetWebContents()->GetController().LoadURL(
81 view_url,
82 content::Referrer(),
83 ui::PAGE_TRANSITION_GENERATED,
84 std::string());
85 } else {
86 web_ui()->CallJavascriptFunction("domDistiller.onViewUrlFailed");
90 void DomDistillerHandler::HandleSelectArticle(const base::ListValue* args) {
91 std::string entry_id;
92 args->GetString(0, &entry_id);
93 GURL url =
94 url_utils::GetDistillerViewUrlFromEntryId(article_scheme_, entry_id);
95 DCHECK(url.is_valid());
96 web_ui()->GetWebContents()->GetController().LoadURL(
97 url,
98 content::Referrer(),
99 ui::PAGE_TRANSITION_GENERATED,
100 std::string());
103 void DomDistillerHandler::HandleRequestEntries(const base::ListValue* args) {
104 base::ListValue entries;
105 const std::vector<ArticleEntry>& entries_specifics = service_->GetEntries();
106 for (std::vector<ArticleEntry>::const_iterator it = entries_specifics.begin();
107 it != entries_specifics.end();
108 ++it) {
109 const ArticleEntry& article = *it;
110 DCHECK(IsEntryValid(article));
111 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue());
112 entry->SetString("entry_id", article.entry_id());
113 std::string title = (!article.has_title() || article.title().empty())
114 ? article.entry_id()
115 : article.title();
116 entry->SetString("title", net::EscapeForHTML(title));
117 entries.Append(entry.release());
119 // TODO(nyquist): Write a test that ensures we sanitize the data we send.
120 web_ui()->CallJavascriptFunction("domDistiller.onReceivedEntries", entries);
123 void DomDistillerHandler::OnArticleAdded(bool article_available) {
124 // TODO(nyquist): Update this function.
125 if (article_available) {
126 HandleRequestEntries(NULL);
127 } else {
128 web_ui()->CallJavascriptFunction("domDistiller.onArticleAddFailed");
132 } // namespace dom_distiller