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 8e913d59d470405ac881913a6923cda2e4924a9d..38be0fe57e93e39bd4da0bd06eb8f2a8a6084714 100644 |
--- a/components/dom_distiller/content/dom_distiller_viewer_source.cc |
+++ b/components/dom_distiller/content/dom_distiller_viewer_source.cc |
@@ -16,11 +16,13 @@ |
#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 "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_view_host.h" |
#include "grit/component_strings.h" |
#include "grit/dom_distiller_resources.h" |
#include "net/base/escape.h" |
+#include "net/base/url_util.h" |
#include "net/url_request/url_request.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/resource_bundle.h" |
@@ -29,16 +31,17 @@ |
namespace { |
const char kCssPath[] = "readability.css"; |
+const char kRequestIdKey[] = "request_id"; |
std::string ReplaceHtmlTemplateValues(std::string title, std::string content) { |
base::StringPiece html_template = |
ResourceBundle::GetSharedInstance().GetRawDataResource( |
IDR_DOM_DISTILLER_VIEWER_HTML); |
std::vector<std::string> substitutions; |
- substitutions.push_back(title); // $1 |
- substitutions.push_back(kCssPath); // $2 |
- substitutions.push_back(title); // $3 |
- substitutions.push_back(content); // $4 |
+ substitutions.push_back(title); // $1 |
+ substitutions.push_back(std::string("/") + kCssPath); // $2 |
cjhopman
2014/02/05 23:03:06
why not put this slash in the html file?
nyquist
2014/02/25 20:30:24
Done.
|
+ substitutions.push_back(title); // $3 |
+ substitutions.push_back(content); // $4 |
return ReplaceStringPlaceholders(html_template, substitutions, NULL); |
} |
@@ -48,7 +51,8 @@ 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 +73,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,7 +105,7 @@ 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(); |
} |
@@ -140,9 +144,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 |
@@ -178,16 +182,45 @@ bool DomDistillerViewerSource::ShouldServiceRequest( |
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(); |
- } |
+ if (*path == kCssPath) |
+ return; |
+ GURL dummy_url(scheme_ + "://dummy/?" + request->url().query()); |
shashi
2014/02/05 22:28:08
nit: Instead of using dummy, maybe use dom-distill
nyquist
2014/02/25 20:30:24
Done.
|
+ // Use the host component as the request ID. |
+ GURL url = net::AppendOrReplaceQueryParameter( |
shashi
2014/02/05 22:28:08
Maybe a unit_test to make sure this works with url
nyquist
2014/02/25 20:30:24
Removed request_id now.
|
+ dummy_url, kRequestIdKey, request->url().host()); |
cjhopman
2014/02/05 23:03:06
It looks like the request id is never used.
nyquist
2014/02/25 20:30:24
Done.
|
+ *path = url.query(); |
}; |
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, |
+ RequestViewerHandle* request_viewer_handle) { |
+ GURL dummy_url(scheme_ + "://dummy/?" + path); |
cjhopman
2014/02/05 23:03:06
I don't really like how we are passing data around
cjhopman
2014/02/05 23:03:06
Could you comment on what you need this dummy_url
nyquist
2014/02/25 20:30:24
Done.
|
+ std::string request_id; |
+ net::GetValueForKeyInQuery(dummy_url, kRequestIdKey, &request_id); |
+ std::string entry_id; |
+ net::GetValueForKeyInQuery(dummy_url, kEntryIdKey, &entry_id); |
+ bool has_entry_id = !entry_id.empty(); |
+ entry_id = StringToUpperASCII(entry_id); |
+ |
+ std::string requested_url_str; |
+ net::GetValueForKeyInQuery(dummy_url, kUrlKey, &requested_url_str); |
+ GURL requested_url(requested_url_str); |
+ bool has_url = !requested_url_str.empty() && requested_url.is_valid(); |
+ |
+ if (has_entry_id) { |
+ return dom_distiller_service_->ViewEntry(request_viewer_handle, entry_id) |
+ .Pass(); |
+ } else if (has_url) { |
+ return dom_distiller_service_->ViewUrl(request_viewer_handle, requested_url) |
+ .Pass(); |
+ } else { |
+ return scoped_ptr<ViewerHandle>(); |
+ } |
} |
} // namespace dom_distiller |