Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Unified Diff: components/dom_distiller/content/dom_distiller_viewer_source.cc

Issue 151003006: Add support for distilling arbitrary URLs in DOM Distiller Viewer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added new strings to iOS whitelist Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/dom_distiller/content/dom_distiller_viewer_source.cc
diff --git a/components/dom_distiller/content/dom_distiller_viewer_source.cc b/components/dom_distiller/content/dom_distiller_viewer_source.cc
index 375a542c77aade81760c01823c9f37f4d46cf2fe..56aa0e83b8ca76714b4746ab5d724293f6e296aa 100644
--- a/components/dom_distiller/content/dom_distiller_viewer_source.cc
+++ b/components/dom_distiller/content/dom_distiller_viewer_source.cc
@@ -16,6 +16,8 @@
#include "components/dom_distiller/core/proto/distilled_article.pb.h"
#include "components/dom_distiller/core/proto/distilled_page.pb.h"
#include "components/dom_distiller/core/task_tracker.h"
+#include "components/dom_distiller/core/url_constants.h"
+#include "components/dom_distiller/core/url_utils.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
#include "grit/component_resources.h"
@@ -26,9 +28,9 @@
#include "ui/base/resource/resource_bundle.h"
#include "url/gurl.h"
-namespace {
+namespace dom_distiller {
-const char kCssPath[] = "readability.css";
+namespace {
std::string ReplaceHtmlTemplateValues(std::string title, std::string content) {
base::StringPiece html_template =
@@ -44,11 +46,10 @@ std::string ReplaceHtmlTemplateValues(std::string title, std::string content) {
} // namespace
-namespace dom_distiller {
-
// Handles receiving data asynchronously for a specific entry, and passing
// it along to the data callback for the data source.
-class RequestViewerHandle : public ViewRequestDelegate {
+class DomDistillerViewerSource::RequestViewerHandle
+ : public ViewRequestDelegate {
public:
explicit RequestViewerHandle(
const content::URLDataSource::GotDataCallback& callback);
@@ -69,13 +70,13 @@ class RequestViewerHandle : public ViewRequestDelegate {
content::URLDataSource::GotDataCallback callback_;
};
-RequestViewerHandle::RequestViewerHandle(
+DomDistillerViewerSource::RequestViewerHandle::RequestViewerHandle(
const content::URLDataSource::GotDataCallback& callback)
: callback_(callback) {}
-RequestViewerHandle::~RequestViewerHandle() {}
+DomDistillerViewerSource::RequestViewerHandle::~RequestViewerHandle() {}
-void RequestViewerHandle::OnArticleReady(
+void DomDistillerViewerSource::RequestViewerHandle::OnArticleReady(
const DistilledArticleProto* article_proto) {
DCHECK(article_proto);
std::string title;
@@ -101,13 +102,13 @@ void RequestViewerHandle::OnArticleReady(
base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
-void RequestViewerHandle::TakeViewerHandle(
+void DomDistillerViewerSource::RequestViewerHandle::TakeViewerHandle(
scoped_ptr<ViewerHandle> viewer_handle) {
viewer_handle_ = viewer_handle.Pass();
}
DomDistillerViewerSource::DomDistillerViewerSource(
- DomDistillerService* dom_distiller_service,
+ DomDistillerServiceInterface* dom_distiller_service,
const std::string& scheme)
: scheme_(scheme), dom_distiller_service_(dom_distiller_service) {}
@@ -140,9 +141,9 @@ void DomDistillerViewerSource::StartDataRequest(
RequestViewerHandle* request_viewer_handle =
new RequestViewerHandle(callback);
- std::string entry_id = StringToUpperASCII(path);
scoped_ptr<ViewerHandle> viewer_handle =
- dom_distiller_service_->ViewEntry(request_viewer_handle, entry_id);
+ CreateViewRequest(path, request_viewer_handle);
+
if (viewer_handle) {
// The service returned a |ViewerHandle| and guarantees it will call
// the |RequestViewerHandle|, so passing ownership to it, to ensure the
@@ -163,8 +164,8 @@ void DomDistillerViewerSource::StartDataRequest(
}
};
-std::string DomDistillerViewerSource::GetMimeType(const std::string& path)
- const {
+std::string DomDistillerViewerSource::GetMimeType(
+ const std::string& path) const {
if (path == kCssPath)
return "text/css";
return "text/html";
@@ -175,19 +176,45 @@ bool DomDistillerViewerSource::ShouldServiceRequest(
return request->url().SchemeIs(scheme_.c_str());
}
+// TODO(nyquist): Start tracking requests using this method.
void DomDistillerViewerSource::WillServiceRequest(
const net::URLRequest* request,
- std::string* path) const {
- if (*path != kCssPath) {
- // Since the full request is not available to StartDataRequest, replace the
- // path to contain the data needed.
- *path = request->url().host();
- }
-};
+ std::string* path) const {};
std::string DomDistillerViewerSource::GetContentSecurityPolicyObjectSrc()
const {
- return "object-src 'none'; style-src 'self'";
+ return "object-src 'none'; style-src 'self';";
+}
+
+scoped_ptr<ViewerHandle> DomDistillerViewerSource::CreateViewRequest(
+ const std::string& path,
+ ViewRequestDelegate* view_request_delegate) {
+ std::string entry_id =
+ url_utils::GetValueForKeyInUrlPathQuery(path, kEntryIdKey);
+ bool has_valid_entry_id = !entry_id.empty();
+ entry_id = StringToUpperASCII(entry_id);
+
+ std::string requested_url_str =
+ url_utils::GetValueForKeyInUrlPathQuery(path, kUrlKey);
+ GURL requested_url(requested_url_str);
+ bool has_valid_url = url_utils::IsUrlDistillable(requested_url);
+
+ if (has_valid_entry_id && has_valid_url) {
+ // It is invalid to specify a query param for both |kEntryIdKey| and
+ // |kUrlKey|.
+ return scoped_ptr<ViewerHandle>();
+ }
+
+ if (has_valid_entry_id) {
+ return dom_distiller_service_->ViewEntry(view_request_delegate, entry_id)
+ .Pass();
+ } else if (has_valid_url) {
+ return dom_distiller_service_->ViewUrl(view_request_delegate, requested_url)
+ .Pass();
+ }
+
+ // It is invalid to not specify a query param for |kEntryIdKey| or |kUrlKey|.
+ return scoped_ptr<ViewerHandle>();
}
} // namespace dom_distiller

Powered by Google App Engine
This is Rietveld 408576698