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

Side by Side Diff: components/dom_distiller/content/dom_distiller_viewer_source.cc

Issue 373623002: Convert remaining WebContentsObservers loading callbacks to use RFH. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix CrOS test Created 6 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 ArticleDistillationUpdate article_update) OVERRIDE; 48 ArticleDistillationUpdate article_update) OVERRIDE;
49 49
50 void TakeViewerHandle(scoped_ptr<ViewerHandle> viewer_handle); 50 void TakeViewerHandle(scoped_ptr<ViewerHandle> viewer_handle);
51 51
52 // WebContentsObserver: 52 // WebContentsObserver:
53 virtual void DidNavigateMainFrame( 53 virtual void DidNavigateMainFrame(
54 const content::LoadCommittedDetails& details, 54 const content::LoadCommittedDetails& details,
55 const content::FrameNavigateParams& params) OVERRIDE; 55 const content::FrameNavigateParams& params) OVERRIDE;
56 virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE; 56 virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
57 virtual void WebContentsDestroyed() OVERRIDE; 57 virtual void WebContentsDestroyed() OVERRIDE;
58 virtual void DidFinishLoad( 58 virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host,
59 int64 frame_id, 59 const GURL& validated_url) OVERRIDE;
60 const GURL& validated_url,
61 bool is_main_frame,
62 content::RenderViewHost* render_view_host) OVERRIDE;
63 60
64 private: 61 private:
65 // Sends JavaScript to the attached Viewer, buffering data if the viewer isn't 62 // Sends JavaScript to the attached Viewer, buffering data if the viewer isn't
66 // ready. 63 // ready.
67 void SendJavaScript(const std::string& buffer); 64 void SendJavaScript(const std::string& buffer);
68 65
69 // Cancels the current view request. Once called, no updates will be 66 // Cancels the current view request. Once called, no updates will be
70 // propagated to the view, and the request to DomDistillerService will be 67 // propagated to the view, and the request to DomDistillerService will be
71 // cancelled. 68 // cancelled.
72 void Cancel(); 69 void Cancel();
73 70
74 // The handle to the view request towards the DomDistillerService. It 71 // The handle to the view request towards the DomDistillerService. It
75 // needs to be kept around to ensure the distillation request finishes. 72 // needs to be kept around to ensure the distillation request finishes.
76 scoped_ptr<ViewerHandle> viewer_handle_; 73 scoped_ptr<ViewerHandle> viewer_handle_;
77 74
78 // WebContents associated with the Viewer's render process.
79 content::WebContents* web_contents_;
80
81 // The scheme hosting the current view request; 75 // The scheme hosting the current view request;
82 std::string expected_scheme_; 76 std::string expected_scheme_;
83 77
84 // The query path for the current view request. 78 // The query path for the current view request.
85 std::string expected_request_path_; 79 std::string expected_request_path_;
86 80
87 // Holds the callback to where the data retrieved is sent back. 81 // Holds the callback to where the data retrieved is sent back.
88 content::URLDataSource::GotDataCallback callback_; 82 content::URLDataSource::GotDataCallback callback_;
89 83
90 // Number of pages of the distilled article content that have been rendered by 84 // Number of pages of the distilled article content that have been rendered by
91 // the viewer. 85 // the viewer.
92 int page_count_; 86 int page_count_;
93 87
94 // Whether the page is sufficiently initialized to handle updates from the 88 // Whether the page is sufficiently initialized to handle updates from the
95 // distiller. 89 // distiller.
96 bool waiting_for_page_ready_; 90 bool waiting_for_page_ready_;
97 91
98 // Temporary store of pending JavaScript if the page isn't ready to receive 92 // Temporary store of pending JavaScript if the page isn't ready to receive
99 // data from distillation. 93 // data from distillation.
100 std::string buffer_; 94 std::string buffer_;
101 }; 95 };
102 96
103 DomDistillerViewerSource::RequestViewerHandle::RequestViewerHandle( 97 DomDistillerViewerSource::RequestViewerHandle::RequestViewerHandle(
104 content::WebContents* web_contents, 98 content::WebContents* web_contents,
105 const std::string& expected_scheme, 99 const std::string& expected_scheme,
106 const std::string& expected_request_path, 100 const std::string& expected_request_path,
107 const content::URLDataSource::GotDataCallback& callback) 101 const content::URLDataSource::GotDataCallback& callback)
108 : web_contents_(web_contents), 102 : expected_scheme_(expected_scheme),
109 expected_scheme_(expected_scheme),
110 expected_request_path_(expected_request_path), 103 expected_request_path_(expected_request_path),
111 callback_(callback), 104 callback_(callback),
112 page_count_(0), 105 page_count_(0),
113 waiting_for_page_ready_(true) { 106 waiting_for_page_ready_(true) {
114 content::WebContentsObserver::Observe(web_contents_); 107 content::WebContentsObserver::Observe(web_contents);
115 } 108 }
116 109
117 DomDistillerViewerSource::RequestViewerHandle::~RequestViewerHandle() { 110 DomDistillerViewerSource::RequestViewerHandle::~RequestViewerHandle() {
118 // Balanced with constructor although can be a no-op if frame navigated away.
nyquist 2014/07/07 22:03:34 I wasn't aware that this was unnecessary. Thanks.
119 content::WebContentsObserver::Observe(NULL);
120 } 111 }
121 112
122 void DomDistillerViewerSource::RequestViewerHandle::SendJavaScript( 113 void DomDistillerViewerSource::RequestViewerHandle::SendJavaScript(
123 const std::string& buffer) { 114 const std::string& buffer) {
124 if (waiting_for_page_ready_) { 115 if (waiting_for_page_ready_) {
125 buffer_ += buffer; 116 buffer_ += buffer;
126 } else { 117 } else {
127 if (web_contents_) { 118 if (web_contents()) {
128 web_contents_->GetMainFrame()->ExecuteJavaScript( 119 web_contents()->GetMainFrame()->ExecuteJavaScript(
129 base::UTF8ToUTF16(buffer)); 120 base::UTF8ToUTF16(buffer));
130 } 121 }
131 } 122 }
132 } 123 }
133 124
134 void DomDistillerViewerSource::RequestViewerHandle::DidNavigateMainFrame( 125 void DomDistillerViewerSource::RequestViewerHandle::DidNavigateMainFrame(
135 const content::LoadCommittedDetails& details, 126 const content::LoadCommittedDetails& details,
136 const content::FrameNavigateParams& params) { 127 const content::FrameNavigateParams& params) {
137 const GURL& navigation = details.entry->GetURL(); 128 const GURL& navigation = details.entry->GetURL();
138 if (details.is_in_page || ( 129 if (details.is_in_page || (
(...skipping 10 matching lines...) Expand all
149 void DomDistillerViewerSource::RequestViewerHandle::RenderProcessGone( 140 void DomDistillerViewerSource::RequestViewerHandle::RenderProcessGone(
150 base::TerminationStatus status) { 141 base::TerminationStatus status) {
151 Cancel(); 142 Cancel();
152 } 143 }
153 144
154 void DomDistillerViewerSource::RequestViewerHandle::WebContentsDestroyed() { 145 void DomDistillerViewerSource::RequestViewerHandle::WebContentsDestroyed() {
155 Cancel(); 146 Cancel();
156 } 147 }
157 148
158 void DomDistillerViewerSource::RequestViewerHandle::Cancel() { 149 void DomDistillerViewerSource::RequestViewerHandle::Cancel() {
159 // Ensure we don't send any incremental updates to the Viewer.
160 web_contents_ = NULL;
161
162 // No need to listen for notifications. 150 // No need to listen for notifications.
163 content::WebContentsObserver::Observe(NULL); 151 content::WebContentsObserver::Observe(NULL);
164 152
165 // Schedule the Viewer for deletion. Ensures distillation is cancelled, and 153 // Schedule the Viewer for deletion. Ensures distillation is cancelled, and
166 // any pending data stored in |buffer_| is released. 154 // any pending data stored in |buffer_| is released.
167 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 155 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
168 } 156 }
169 157
170 void DomDistillerViewerSource::RequestViewerHandle::DidFinishLoad( 158 void DomDistillerViewerSource::RequestViewerHandle::DidFinishLoad(
171 int64 frame_id, 159 content::RenderFrameHost* render_frame_host,
172 const GURL& validated_url, 160 const GURL& validated_url) {
173 bool is_main_frame, 161 if (render_frame_host->GetParent()) {
174 content::RenderViewHost* render_view_host) {
175 if (!is_main_frame || web_contents_ == NULL) {
176 return; 162 return;
177 } 163 }
178 waiting_for_page_ready_ = false; 164 waiting_for_page_ready_ = false;
179 if (buffer_.empty()) { 165 if (buffer_.empty()) {
180 return; 166 return;
181 } 167 }
182 if (web_contents_) { 168 web_contents()->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(buffer_));
183 web_contents_->GetMainFrame()->ExecuteJavaScript(
184 base::UTF8ToUTF16(buffer_));
185 }
186 buffer_.clear(); 169 buffer_.clear();
187 } 170 }
188 171
189 void DomDistillerViewerSource::RequestViewerHandle::OnArticleReady( 172 void DomDistillerViewerSource::RequestViewerHandle::OnArticleReady(
190 const DistilledArticleProto* article_proto) { 173 const DistilledArticleProto* article_proto) {
191 if (page_count_ == 0) { 174 if (page_count_ == 0) {
192 // This is a single-page article. 175 // This is a single-page article.
193 std::string unsafe_page_html = viewer::GetUnsafeArticleHtml(article_proto); 176 std::string unsafe_page_html = viewer::GetUnsafeArticleHtml(article_proto);
194 callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html)); 177 callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
195 } else if (page_count_ == article_proto->pages_size()) { 178 } else if (page_count_ == article_proto->pages_size()) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 const net::URLRequest* request, 302 const net::URLRequest* request,
320 std::string* path) const { 303 std::string* path) const {
321 } 304 }
322 305
323 std::string DomDistillerViewerSource::GetContentSecurityPolicyObjectSrc() 306 std::string DomDistillerViewerSource::GetContentSecurityPolicyObjectSrc()
324 const { 307 const {
325 return "object-src 'none'; style-src 'self';"; 308 return "object-src 'none'; style-src 'self';";
326 } 309 }
327 310
328 } // namespace dom_distiller 311 } // namespace dom_distiller
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698