Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/dom_distiller/content/dom_distiller_viewer_source.h" | 5 #include "components/dom_distiller/content/dom_distiller_viewer_source.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 | 73 |
| 74 // content::WebContentsObserver implementation: | 74 // content::WebContentsObserver implementation: |
| 75 void DidNavigateMainFrame( | 75 void DidNavigateMainFrame( |
| 76 const content::LoadCommittedDetails& details, | 76 const content::LoadCommittedDetails& details, |
| 77 const content::FrameNavigateParams& params) override; | 77 const content::FrameNavigateParams& params) override; |
| 78 void RenderProcessGone(base::TerminationStatus status) override; | 78 void RenderProcessGone(base::TerminationStatus status) override; |
| 79 void WebContentsDestroyed() override; | 79 void WebContentsDestroyed() override; |
| 80 void DidFinishLoad(content::RenderFrameHost* render_frame_host, | 80 void DidFinishLoad(content::RenderFrameHost* render_frame_host, |
| 81 const GURL& validated_url) override; | 81 const GURL& validated_url) override; |
| 82 | 82 |
| 83 private: | 83 protected: |
| 84 // Sends JavaScript to the attached Viewer, buffering data if the viewer isn't | 84 // Sends JavaScript to the attached Viewer, buffering data if the viewer isn't |
| 85 // ready. | 85 // ready. |
| 86 void SendJavaScript(const std::string& buffer) override; | 86 void SendJavaScript(const std::string& buffer) override; |
| 87 | 87 |
| 88 // Cancels the current view request. Once called, no updates will be | 88 // Cancels the current view request. Once called, no updates will be |
| 89 // propagated to the view, and the request to DomDistillerService will be | 89 // propagated to the view, and the request to DomDistillerService will be |
| 90 // cancelled. | 90 // cancelled. |
| 91 void Cancel(); | 91 void Cancel(); |
| 92 | 92 |
| 93 // The scheme hosting the current view request; | 93 // The scheme hosting the current view request; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 return; | 182 return; |
| 183 } | 183 } |
| 184 waiting_for_page_ready_ = false; | 184 waiting_for_page_ready_ = false; |
| 185 if (buffer_.empty()) { | 185 if (buffer_.empty()) { |
| 186 return; | 186 return; |
| 187 } | 187 } |
| 188 web_contents()->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(buffer_)); | 188 web_contents()->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(buffer_)); |
| 189 buffer_.clear(); | 189 buffer_.clear(); |
| 190 } | 190 } |
| 191 | 191 |
| 192 class DomDistillerViewerSource::PrintPreviewRequestViewerHandle | |
|
cjhopman
2015/05/20 02:00:02
We probably don't want any printpreview-specific s
arjunpatel
2015/05/26 21:40:44
We've been investigating how to remove the print p
| |
| 193 : public DomDistillerViewerSource::RequestViewerHandle { | |
| 194 public: | |
| 195 explicit PrintPreviewRequestViewerHandle( | |
| 196 content::WebContents* web_contents, | |
| 197 const std::string& expected_scheme, | |
| 198 const std::string& expected_request_path, | |
| 199 scoped_ptr<ContentDataCallback> callback, | |
| 200 DistilledPagePrefs* distilled_page_prefs); | |
| 201 ~PrintPreviewRequestViewerHandle() override; | |
| 202 | |
| 203 // ViewRequestDelegate implementation: | |
| 204 void OnArticleReady(const DistilledArticleProto* article_proto) override; | |
| 205 void OnArticleUpdated(ArticleDistillationUpdate article_update) override; | |
| 206 | |
| 207 private: | |
| 208 // DistilledPagePrefs::Observer implementation: | |
| 209 void OnChangeFontFamily( | |
| 210 DistilledPagePrefs::FontFamily new_font_family) override; | |
| 211 void OnChangeTheme(DistilledPagePrefs::Theme new_theme) override; | |
| 212 }; | |
| 213 | |
| 214 DomDistillerViewerSource:: | |
| 215 PrintPreviewRequestViewerHandle::PrintPreviewRequestViewerHandle( | |
| 216 content::WebContents* web_contents, | |
| 217 const std::string& expected_scheme, | |
| 218 const std::string& expected_request_path, | |
| 219 scoped_ptr<ContentDataCallback> callback, | |
| 220 DistilledPagePrefs* distilled_page_prefs) | |
| 221 : DomDistillerViewerSource::RequestViewerHandle( | |
| 222 web_contents, | |
| 223 expected_scheme, | |
| 224 expected_request_path, | |
| 225 callback.Pass(), | |
| 226 distilled_page_prefs) { | |
| 227 } | |
| 228 | |
| 229 DomDistillerViewerSource:: | |
| 230 PrintPreviewRequestViewerHandle::~PrintPreviewRequestViewerHandle() { | |
| 231 } | |
| 232 | |
| 233 void DomDistillerViewerSource::PrintPreviewRequestViewerHandle::OnArticleReady( | |
| 234 const DistilledArticleProto* article_proto) { | |
| 235 std::string content = dom_distiller::viewer::GetUnsafePrintPreviewHtml( | |
| 236 article_proto, | |
| 237 distilled_page_prefs_->GetTheme(), | |
| 238 distilled_page_prefs_->GetFontFamily()); | |
| 239 callback_->RunCallback(content); | |
| 240 | |
| 241 // No need to hold on to the ViewerHandle now that distillation is complete. | |
| 242 viewer_handle_.reset(); | |
| 243 } | |
| 244 | |
| 245 void DomDistillerViewerSource:: | |
| 246 PrintPreviewRequestViewerHandle::OnArticleUpdated( | |
| 247 ArticleDistillationUpdate article_update) { | |
| 248 } | |
| 249 | |
| 250 void DomDistillerViewerSource::PrintPreviewRequestViewerHandle::OnChangeTheme( | |
| 251 DistilledPagePrefs::Theme new_theme) { | |
| 252 } | |
| 253 | |
| 254 void DomDistillerViewerSource:: | |
| 255 PrintPreviewRequestViewerHandle::OnChangeFontFamily( | |
| 256 DistilledPagePrefs::FontFamily new_font) { | |
| 257 } | |
| 258 | |
| 192 DomDistillerViewerSource::DomDistillerViewerSource( | 259 DomDistillerViewerSource::DomDistillerViewerSource( |
| 193 DomDistillerServiceInterface* dom_distiller_service, | 260 DomDistillerServiceInterface* dom_distiller_service, |
| 194 const std::string& scheme, | 261 const std::string& scheme, |
| 195 scoped_ptr<ExternalFeedbackReporter> external_reporter) | 262 scoped_ptr<ExternalFeedbackReporter> external_reporter) |
| 196 : scheme_(scheme), | 263 : scheme_(scheme), |
| 197 dom_distiller_service_(dom_distiller_service), | 264 dom_distiller_service_(dom_distiller_service), |
| 198 external_feedback_reporter_(external_reporter.Pass()) { | 265 external_feedback_reporter_(external_reporter.Pass()) { |
| 199 } | 266 } |
| 200 | 267 |
| 201 DomDistillerViewerSource::~DomDistillerViewerSource() { | 268 DomDistillerViewerSource::~DomDistillerViewerSource() { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 215 if (!render_frame_host) return; | 282 if (!render_frame_host) return; |
| 216 content::RenderViewHost* render_view_host = | 283 content::RenderViewHost* render_view_host = |
| 217 render_frame_host->GetRenderViewHost(); | 284 render_frame_host->GetRenderViewHost(); |
| 218 DCHECK(render_view_host); | 285 DCHECK(render_view_host); |
| 219 CHECK_EQ(0, render_view_host->GetEnabledBindings()); | 286 CHECK_EQ(0, render_view_host->GetEnabledBindings()); |
| 220 | 287 |
| 221 if (kViewerCssPath == path) { | 288 if (kViewerCssPath == path) { |
| 222 std::string css = viewer::GetCss(); | 289 std::string css = viewer::GetCss(); |
| 223 callback.Run(base::RefCountedString::TakeString(&css)); | 290 callback.Run(base::RefCountedString::TakeString(&css)); |
| 224 return; | 291 return; |
| 292 } else if (kPrintPreviewViewerCssPath == path) { | |
| 293 std::string css = viewer::GetPrintPreviewCss(); | |
| 294 callback.Run(base::RefCountedString::TakeString(&css)); | |
| 295 return; | |
| 225 } else if (kViewerJsPath == path) { | 296 } else if (kViewerJsPath == path) { |
| 226 std::string js = viewer::GetJavaScript(); | 297 std::string js = viewer::GetJavaScript(); |
| 227 callback.Run(base::RefCountedString::TakeString(&js)); | 298 callback.Run(base::RefCountedString::TakeString(&js)); |
| 228 return; | 299 return; |
| 229 } else if (kViewerViewOriginalPath == path) { | 300 } else if (kViewerViewOriginalPath == path) { |
| 230 content::RecordAction(base::UserMetricsAction("DomDistiller_ViewOriginal")); | 301 content::RecordAction(base::UserMetricsAction("DomDistiller_ViewOriginal")); |
| 231 callback.Run(NULL); | 302 callback.Run(NULL); |
| 232 return; | 303 return; |
| 233 } else if (kFeedbackBad == path) { | 304 } else if (kFeedbackBad == path) { |
| 234 FeedbackReporter::ReportQuality(false); | 305 FeedbackReporter::ReportQuality(false); |
| 235 callback.Run(NULL); | 306 callback.Run(NULL); |
| 236 if (!external_feedback_reporter_) | 307 if (!external_feedback_reporter_) |
| 237 return; | 308 return; |
| 238 content::WebContents* contents = | 309 content::WebContents* contents = |
| 239 content::WebContents::FromRenderFrameHost(render_frame_host); | 310 content::WebContents::FromRenderFrameHost(render_frame_host); |
| 240 external_feedback_reporter_->ReportExternalFeedback( | 311 external_feedback_reporter_->ReportExternalFeedback( |
| 241 contents, contents->GetURL(), false); | 312 contents, contents->GetURL(), false); |
| 242 return; | 313 return; |
| 243 } else if (kFeedbackGood == path) { | 314 } else if (kFeedbackGood == path) { |
| 244 FeedbackReporter::ReportQuality(true); | 315 FeedbackReporter::ReportQuality(true); |
| 245 callback.Run(NULL); | 316 callback.Run(NULL); |
| 246 return; | 317 return; |
| 247 } | 318 } |
| 248 content::WebContents* web_contents = | 319 content::WebContents* web_contents = |
| 249 content::WebContents::FromRenderFrameHost(render_frame_host); | 320 content::WebContents::FromRenderFrameHost(render_frame_host); |
| 250 DCHECK(web_contents); | 321 DCHECK(web_contents); |
| 251 // An empty |path| is invalid, but guard against it. If not empty, assume | 322 |
| 252 // |path| starts with '?', which is stripped away. | |
| 253 scoped_ptr<ContentDataCallback> data_callback( | 323 scoped_ptr<ContentDataCallback> data_callback( |
| 254 new ContentDataCallback(callback)); | 324 new ContentDataCallback(callback)); |
| 255 const std::string path_after_query_separator = | 325 RequestViewerHandle* request_viewer_handle = NULL; |
| 256 path.size() > 0 ? path.substr(1) : ""; | 326 std::string print_prefix = "printing/"; |
| 257 RequestViewerHandle* request_viewer_handle = new RequestViewerHandle( | 327 if (path.compare(0, print_prefix.length(), print_prefix) == 0) { |
| 328 const std::string path_after_query_separator = | |
| 329 path.substr(print_prefix.length() + 1); | |
| 330 request_viewer_handle = new PrintPreviewRequestViewerHandle( | |
| 258 web_contents, scheme_, path_after_query_separator, data_callback.Pass(), | 331 web_contents, scheme_, path_after_query_separator, data_callback.Pass(), |
| 259 dom_distiller_service_->GetDistilledPagePrefs()); | 332 dom_distiller_service_->GetDistilledPagePrefs()); |
| 333 | |
| 334 } else { | |
| 335 // An empty |path| is invalid, but guard against it. If not empty, assume | |
| 336 // |path| starts with '?', which is stripped away. | |
| 337 const std::string path_after_query_separator = | |
| 338 path.size() > 0 ? path.substr(1) : ""; | |
| 339 request_viewer_handle = new RequestViewerHandle( | |
| 340 web_contents, scheme_, path_after_query_separator, data_callback.Pass(), | |
| 341 dom_distiller_service_->GetDistilledPagePrefs()); | |
| 342 } | |
| 343 | |
| 260 scoped_ptr<ViewerHandle> viewer_handle = viewer::CreateViewRequest( | 344 scoped_ptr<ViewerHandle> viewer_handle = viewer::CreateViewRequest( |
| 261 dom_distiller_service_, path, request_viewer_handle, | 345 dom_distiller_service_, path, request_viewer_handle, |
| 262 web_contents->GetContainerBounds().size()); | 346 web_contents->GetContainerBounds().size()); |
| 263 | 347 |
| 264 if (viewer_handle) { | 348 if (viewer_handle) { |
| 265 // The service returned a |ViewerHandle| and guarantees it will call | 349 // The service returned a |ViewerHandle| and guarantees it will call |
| 266 // the |RequestViewerHandle|, so passing ownership to it, to ensure the | 350 // the |RequestViewerHandle|, so passing ownership to it, to ensure the |
| 267 // request is not cancelled. The |RequestViewerHandle| will delete itself | 351 // request is not cancelled. The |RequestViewerHandle| will delete itself |
| 268 // after receiving the callback. | 352 // after receiving the callback. |
| 269 request_viewer_handle->TakeViewerHandle(viewer_handle.Pass()); | 353 request_viewer_handle->TakeViewerHandle(viewer_handle.Pass()); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 297 std::string DomDistillerViewerSource::GetContentSecurityPolicyObjectSrc() | 381 std::string DomDistillerViewerSource::GetContentSecurityPolicyObjectSrc() |
| 298 const { | 382 const { |
| 299 return "object-src 'none'; style-src 'self' https://fonts.googleapis.com;"; | 383 return "object-src 'none'; style-src 'self' https://fonts.googleapis.com;"; |
| 300 } | 384 } |
| 301 | 385 |
| 302 std::string DomDistillerViewerSource::GetContentSecurityPolicyFrameSrc() const { | 386 std::string DomDistillerViewerSource::GetContentSecurityPolicyFrameSrc() const { |
| 303 return "frame-src *;"; | 387 return "frame-src *;"; |
| 304 } | 388 } |
| 305 | 389 |
| 306 } // namespace dom_distiller | 390 } // namespace dom_distiller |
| OLD | NEW |