Index: components/dom_distiller/webui/dom_distiller_handler.cc |
diff --git a/components/dom_distiller/webui/dom_distiller_handler.cc b/components/dom_distiller/webui/dom_distiller_handler.cc |
index ede4f40615b78c919609e262ce382bb0c0809667..59b4fb9943632871f4a4bfe638ba4680e66e109a 100644 |
--- a/components/dom_distiller/webui/dom_distiller_handler.cc |
+++ b/components/dom_distiller/webui/dom_distiller_handler.cc |
@@ -10,12 +10,30 @@ |
#include "base/values.h" |
#include "components/dom_distiller/core/dom_distiller_service.h" |
#include "components/dom_distiller/core/proto/distilled_page.pb.h" |
+#include "components/dom_distiller/core/url_utils.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/browser/web_ui.h" |
+#include "net/base/escape.h" |
#include "url/gurl.h" |
namespace dom_distiller { |
+namespace { |
+ |
+GURL GetViewUrlFromArgs(const std::string& scheme, |
+ const base::ListValue* args) { |
+ std::string url; |
+ if (args->GetString(0, &url)) { |
+ const GURL gurl(url); |
+ if (url_utils::IsUrlDistillable(gurl)) { |
+ return url_utils::GetDistillerViewUrlFromUrl(scheme, gurl); |
+ } |
+ } |
+ return GURL(); |
+} |
+ |
+} // namespace |
+ |
DomDistillerHandler::DomDistillerHandler(DomDistillerService* service, |
const std::string& scheme) |
: service_(service), article_scheme_(scheme), weak_ptr_factory_(this) {} |
@@ -35,6 +53,9 @@ void DomDistillerHandler::RegisterMessages() { |
"selectArticle", |
base::Bind(&DomDistillerHandler::HandleSelectArticle, |
base::Unretained(this))); |
+ web_ui()->RegisterMessageCallback( |
+ "viewUrl", |
+ base::Bind(&DomDistillerHandler::HandleViewUrl, base::Unretained(this))); |
} |
void DomDistillerHandler::HandleAddArticle(const base::ListValue* args) { |
@@ -51,13 +72,29 @@ void DomDistillerHandler::HandleAddArticle(const base::ListValue* args) { |
} |
} |
+void DomDistillerHandler::HandleViewUrl(const base::ListValue* args) { |
+ GURL view_url = GetViewUrlFromArgs(article_scheme_, args); |
+ if (view_url.is_valid()) { |
+ web_ui()->GetWebContents()->GetController().LoadURL( |
+ view_url, |
+ content::Referrer(), |
+ content::PAGE_TRANSITION_GENERATED, |
+ std::string()); |
+ } else { |
+ web_ui()->CallJavascriptFunction("domDistiller.onViewUrlFailed"); |
+ } |
+} |
+ |
void DomDistillerHandler::HandleSelectArticle(const base::ListValue* args) { |
std::string entry_id; |
args->GetString(0, &entry_id); |
- GURL url(article_scheme_ + std::string("://") + entry_id); |
+ GURL url = |
+ url_utils::GetDistillerViewUrlFromEntryId(article_scheme_, entry_id); |
DCHECK(url.is_valid()); |
- web_ui()->GetWebContents()->GetController().LoadURL(url, |
- content::Referrer(), content::PAGE_TRANSITION_GENERATED, |
+ web_ui()->GetWebContents()->GetController().LoadURL( |
+ url, |
+ content::Referrer(), |
+ content::PAGE_TRANSITION_GENERATED, |
std::string()); |
} |
@@ -74,9 +111,10 @@ void DomDistillerHandler::HandleRequestEntries(const base::ListValue* args) { |
std::string title = (!article.has_title() || article.title().empty()) |
? article.entry_id() |
: article.title(); |
- entry->SetString("title", title); |
+ entry->SetString("title", net::EscapeForHTML(title)); |
entries.Append(entry.release()); |
} |
+ // TODO(nyquist): Write a test that ensures we sanitize the data we send. |
web_ui()->CallJavascriptFunction("domDistiller.onReceivedEntries", entries); |
} |