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

Side by Side Diff: content/browser/devtools/protocol/page_handler.cc

Issue 1043173003: [DevTools] Move Page and Emulation handlers to RenderFrameHostImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
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 "content/browser/devtools/protocol/page_handler.h" 5 #include "content/browser/devtools/protocol/page_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 screencast_quality_(kDefaultScreenshotQuality), 91 screencast_quality_(kDefaultScreenshotQuality),
92 screencast_max_width_(-1), 92 screencast_max_width_(-1),
93 screencast_max_height_(-1), 93 screencast_max_height_(-1),
94 capture_retry_count_(0), 94 capture_retry_count_(0),
95 has_compositor_frame_metadata_(false), 95 has_compositor_frame_metadata_(false),
96 screencast_frame_sent_(0), 96 screencast_frame_sent_(0),
97 screencast_frame_acked_(0), 97 screencast_frame_acked_(0),
98 processing_screencast_frame_(false), 98 processing_screencast_frame_(false),
99 color_picker_(new ColorPicker(base::Bind( 99 color_picker_(new ColorPicker(base::Bind(
100 &PageHandler::OnColorPicked, base::Unretained(this)))), 100 &PageHandler::OnColorPicked, base::Unretained(this)))),
101 host_(nullptr), 101 web_contents_(nullptr),
102 screencast_listener_(nullptr), 102 screencast_listener_(nullptr),
103 weak_factory_(this) { 103 weak_factory_(this) {
104 } 104 }
105 105
106 PageHandler::~PageHandler() { 106 PageHandler::~PageHandler() {
107 } 107 }
108 108
109 void PageHandler::SetRenderViewHost(RenderViewHostImpl* host) { 109 void PageHandler::SetWebContents(WebContentsImpl* web_contents) {
110 if (host_ == host) 110 if (web_contents_ == web_contents)
111 return; 111 return;
112 112
113 color_picker_->SetRenderViewHost(host); 113 web_contents_ = web_contents;
114 host_ = host; 114 color_picker_->SetRenderWidgetHost(GetRenderWidgetHost());
115 } 115 }
116 116
117 void PageHandler::SetClient(scoped_ptr<Client> client) { 117 void PageHandler::SetClient(scoped_ptr<Client> client) {
118 client_.swap(client); 118 client_.swap(client);
119 } 119 }
120 120
121 void PageHandler::Detached() { 121 void PageHandler::Detached() {
122 Disable(); 122 Disable();
123 } 123 }
124 124
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 screencast_enabled_ = false; 166 screencast_enabled_ = false;
167 color_picker_->SetEnabled(false); 167 color_picker_->SetEnabled(false);
168 if (screencast_listener_) 168 if (screencast_listener_)
169 screencast_listener_->ScreencastEnabledChanged(); 169 screencast_listener_->ScreencastEnabledChanged();
170 return Response::FallThrough(); 170 return Response::FallThrough();
171 } 171 }
172 172
173 Response PageHandler::Reload(const bool* ignoreCache, 173 Response PageHandler::Reload(const bool* ignoreCache,
174 const std::string* script_to_evaluate_on_load, 174 const std::string* script_to_evaluate_on_load,
175 const std::string* script_preprocessor) { 175 const std::string* script_preprocessor) {
176 if (!host_) 176 if (!web_contents_)
177 return Response::InternalError("Could not connect to view"); 177 return Response::InternalError("Could not connect to view");
178 178
179 WebContents* web_contents = WebContents::FromRenderViewHost(host_);
180 if (!web_contents)
181 return Response::InternalError("No WebContents to reload");
182
183 // Handle in browser only if it is crashed. 179 // Handle in browser only if it is crashed.
184 if (!web_contents->IsCrashed()) 180 if (!web_contents_->IsCrashed())
185 return Response::FallThrough(); 181 return Response::FallThrough();
186 182
187 web_contents->GetController().Reload(false); 183 web_contents_->GetController().Reload(false);
188 return Response::OK(); 184 return Response::OK();
189 } 185 }
190 186
191 Response PageHandler::Navigate(const std::string& url, 187 Response PageHandler::Navigate(const std::string& url,
192 FrameId* frame_id) { 188 FrameId* frame_id) {
193 GURL gurl(url); 189 GURL gurl(url);
194 if (!gurl.is_valid()) 190 if (!gurl.is_valid())
195 return Response::InternalError("Cannot navigate to invalid URL"); 191 return Response::InternalError("Cannot navigate to invalid URL");
196 192
197 if (!host_) 193 if (!web_contents_)
198 return Response::InternalError("Could not connect to view"); 194 return Response::InternalError("Could not connect to view");
199 195
200 WebContents* web_contents = WebContents::FromRenderViewHost(host_); 196 web_contents_->GetController()
201 if (!web_contents)
202 return Response::InternalError("No WebContents to navigate");
203
204 web_contents->GetController()
205 .LoadURL(gurl, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); 197 .LoadURL(gurl, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
206 return Response::FallThrough(); 198 return Response::FallThrough();
207 } 199 }
208 200
209 Response PageHandler::GetNavigationHistory(int* current_index, 201 Response PageHandler::GetNavigationHistory(int* current_index,
210 NavigationEntries* entries) { 202 NavigationEntries* entries) {
211 if (!host_) 203 if (!web_contents_)
212 return Response::InternalError("Could not connect to view"); 204 return Response::InternalError("Could not connect to view");
213 205
214 WebContents* web_contents = WebContents::FromRenderViewHost(host_); 206 NavigationController& controller = web_contents_->GetController();
215 if (!web_contents)
216 return Response::InternalError("No WebContents to navigate");
217
218 NavigationController& controller = web_contents->GetController();
219 *current_index = controller.GetCurrentEntryIndex(); 207 *current_index = controller.GetCurrentEntryIndex();
220 for (int i = 0; i != controller.GetEntryCount(); ++i) { 208 for (int i = 0; i != controller.GetEntryCount(); ++i) {
221 entries->push_back(NavigationEntry::Create() 209 entries->push_back(NavigationEntry::Create()
222 ->set_id(controller.GetEntryAtIndex(i)->GetUniqueID()) 210 ->set_id(controller.GetEntryAtIndex(i)->GetUniqueID())
223 ->set_url(controller.GetEntryAtIndex(i)->GetURL().spec()) 211 ->set_url(controller.GetEntryAtIndex(i)->GetURL().spec())
224 ->set_title( 212 ->set_title(
225 base::UTF16ToUTF8(controller.GetEntryAtIndex(i)->GetTitle()))); 213 base::UTF16ToUTF8(controller.GetEntryAtIndex(i)->GetTitle())));
226 } 214 }
227 return Response::OK(); 215 return Response::OK();
228 } 216 }
229 217
230 Response PageHandler::NavigateToHistoryEntry(int entry_id) { 218 Response PageHandler::NavigateToHistoryEntry(int entry_id) {
231 if (!host_) 219 if (!web_contents_)
232 return Response::InternalError("Could not connect to view"); 220 return Response::InternalError("Could not connect to view");
233 221
234 WebContents* web_contents = WebContents::FromRenderViewHost(host_); 222 NavigationController& controller = web_contents_->GetController();
235 if (!web_contents)
236 return Response::InternalError("No WebContents to navigate");
237
238 NavigationController& controller = web_contents->GetController();
239 for (int i = 0; i != controller.GetEntryCount(); ++i) { 223 for (int i = 0; i != controller.GetEntryCount(); ++i) {
240 if (controller.GetEntryAtIndex(i)->GetUniqueID() == entry_id) { 224 if (controller.GetEntryAtIndex(i)->GetUniqueID() == entry_id) {
241 controller.GoToIndex(i); 225 controller.GoToIndex(i);
242 return Response::OK(); 226 return Response::OK();
243 } 227 }
244 } 228 }
245 229
246 return Response::InvalidParams("No entry with passed id"); 230 return Response::InvalidParams("No entry with passed id");
247 } 231 }
248 232
249 Response PageHandler::CaptureScreenshot(DevToolsCommandId command_id) { 233 Response PageHandler::CaptureScreenshot(DevToolsCommandId command_id) {
250 if (!host_ || !host_->GetView()) 234 if (!web_contents_ || !web_contents_->GetRenderWidgetHostView())
251 return Response::InternalError("Could not connect to view"); 235 return Response::InternalError("Could not connect to view");
252 236
253 host_->GetSnapshotFromBrowser( 237 GetRenderWidgetHost()->GetSnapshotFromBrowser(
254 base::Bind(&PageHandler::ScreenshotCaptured, 238 base::Bind(&PageHandler::ScreenshotCaptured,
255 weak_factory_.GetWeakPtr(), command_id)); 239 weak_factory_.GetWeakPtr(), command_id));
256 return Response::OK(); 240 return Response::OK();
257 } 241 }
258 242
259 Response PageHandler::CanScreencast(bool* result) { 243 Response PageHandler::CanScreencast(bool* result) {
260 #if defined(OS_ANDROID) 244 #if defined(OS_ANDROID)
261 *result = true; 245 *result = true;
262 #else 246 #else
263 *result = false; 247 *result = false;
264 #endif // defined(OS_ANDROID) 248 #endif // defined(OS_ANDROID)
265 return Response::OK(); 249 return Response::OK();
266 } 250 }
267 251
268 Response PageHandler::StartScreencast(const std::string* format, 252 Response PageHandler::StartScreencast(const std::string* format,
269 const int* quality, 253 const int* quality,
270 const int* max_width, 254 const int* max_width,
271 const int* max_height) { 255 const int* max_height) {
272 if (!host_) 256 if (!web_contents_)
273 return Response::InternalError("Could not connect to view"); 257 return Response::InternalError("Could not connect to view");
274 258
275 screencast_enabled_ = true; 259 screencast_enabled_ = true;
276 screencast_format_ = format ? *format : kPng; 260 screencast_format_ = format ? *format : kPng;
277 screencast_quality_ = quality ? *quality : kDefaultScreenshotQuality; 261 screencast_quality_ = quality ? *quality : kDefaultScreenshotQuality;
278 if (screencast_quality_ < 0 || screencast_quality_ > 100) 262 if (screencast_quality_ < 0 || screencast_quality_ > 100)
279 screencast_quality_ = kDefaultScreenshotQuality; 263 screencast_quality_ = kDefaultScreenshotQuality;
280 screencast_max_width_ = max_width ? *max_width : -1; 264 screencast_max_width_ = max_width ? *max_width : -1;
281 screencast_max_height_ = max_height ? *max_height : -1; 265 screencast_max_height_ = max_height ? *max_height : -1;
282 266
283 bool visible = !host_->is_hidden(); 267 bool visible = !GetRenderWidgetHost()->is_hidden();
284 NotifyScreencastVisibility(visible); 268 NotifyScreencastVisibility(visible);
285 if (visible) { 269 if (visible) {
286 if (has_compositor_frame_metadata_) 270 if (has_compositor_frame_metadata_) {
287 InnerSwapCompositorFrame(); 271 InnerSwapCompositorFrame();
288 else 272 } else {
289 host_->Send(new ViewMsg_ForceRedraw(host_->GetRoutingID(), 0)); 273 GetRenderWidgetHost()->Send(
274 new ViewMsg_ForceRedraw(GetRenderWidgetHost()->GetRoutingID(), 0));
275 }
290 } 276 }
291 if (screencast_listener_) 277 if (screencast_listener_)
292 screencast_listener_->ScreencastEnabledChanged(); 278 screencast_listener_->ScreencastEnabledChanged();
293 return Response::FallThrough(); 279 return Response::FallThrough();
294 } 280 }
295 281
296 Response PageHandler::StopScreencast() { 282 Response PageHandler::StopScreencast() {
297 screencast_enabled_ = false; 283 screencast_enabled_ = false;
298 if (screencast_listener_) 284 if (screencast_listener_)
299 screencast_listener_->ScreencastEnabledChanged(); 285 screencast_listener_->ScreencastEnabledChanged();
300 return Response::FallThrough(); 286 return Response::FallThrough();
301 } 287 }
302 288
303 Response PageHandler::ScreencastFrameAck(int frame_number) { 289 Response PageHandler::ScreencastFrameAck(int frame_number) {
304 screencast_frame_acked_ = frame_number; 290 screencast_frame_acked_ = frame_number;
305 return Response::OK(); 291 return Response::OK();
306 } 292 }
307 293
308 Response PageHandler::HandleJavaScriptDialog(bool accept, 294 Response PageHandler::HandleJavaScriptDialog(bool accept,
309 const std::string* prompt_text) { 295 const std::string* prompt_text) {
310 base::string16 prompt_override; 296 base::string16 prompt_override;
311 if (prompt_text) 297 if (prompt_text)
312 prompt_override = base::UTF8ToUTF16(*prompt_text); 298 prompt_override = base::UTF8ToUTF16(*prompt_text);
313 299
314 if (!host_) 300 if (!web_contents_)
315 return Response::InternalError("Could not connect to view"); 301 return Response::InternalError("Could not connect to view");
316 302
317 WebContents* web_contents = WebContents::FromRenderViewHost(host_);
318 if (!web_contents)
319 return Response::InternalError("No JavaScript dialog to handle");
320
321 JavaScriptDialogManager* manager = 303 JavaScriptDialogManager* manager =
322 web_contents->GetDelegate()->GetJavaScriptDialogManager(web_contents); 304 web_contents_->GetDelegate()->GetJavaScriptDialogManager(web_contents_);
323 if (manager && manager->HandleJavaScriptDialog( 305 if (manager && manager->HandleJavaScriptDialog(
324 web_contents, accept, prompt_text ? &prompt_override : nullptr)) { 306 web_contents_, accept, prompt_text ? &prompt_override : nullptr)) {
325 return Response::OK(); 307 return Response::OK();
326 } 308 }
327 309
328 return Response::InternalError("Could not handle JavaScript dialog"); 310 return Response::InternalError("Could not handle JavaScript dialog");
329 } 311 }
330 312
331 Response PageHandler::QueryUsageAndQuota(DevToolsCommandId command_id, 313 Response PageHandler::QueryUsageAndQuota(DevToolsCommandId command_id,
332 const std::string& security_origin) { 314 const std::string& security_origin) {
333 return Response::OK(); 315 return Response::OK();
334 } 316 }
335 317
336 Response PageHandler::SetColorPickerEnabled(bool enabled) { 318 Response PageHandler::SetColorPickerEnabled(bool enabled) {
337 if (!host_) 319 if (!web_contents_)
338 return Response::InternalError("Could not connect to view"); 320 return Response::InternalError("Could not connect to view");
339 321
340 color_picker_->SetEnabled(enabled); 322 color_picker_->SetEnabled(enabled);
341 return Response::OK(); 323 return Response::OK();
342 } 324 }
343 325
326 RenderWidgetHostImpl* PageHandler::GetRenderWidgetHost() {
327 // TODO(dgozman): there should be a way to get main RenderWidgetHost from
328 // WebContents without RenderViewHost.
329 return web_contents_ ?
330 static_cast<RenderViewHostImpl*>(web_contents_->GetRenderViewHost()) :
331 nullptr;
332 }
333
344 void PageHandler::NotifyScreencastVisibility(bool visible) { 334 void PageHandler::NotifyScreencastVisibility(bool visible) {
345 if (visible) 335 if (visible)
346 capture_retry_count_ = kCaptureRetryLimit; 336 capture_retry_count_ = kCaptureRetryLimit;
347 client_->ScreencastVisibilityChanged( 337 client_->ScreencastVisibilityChanged(
348 ScreencastVisibilityChangedParams::Create()->set_visible(visible)); 338 ScreencastVisibilityChangedParams::Create()->set_visible(visible));
349 } 339 }
350 340
351 void PageHandler::InnerSwapCompositorFrame() { 341 void PageHandler::InnerSwapCompositorFrame() {
352 if (screencast_frame_sent_ - screencast_frame_acked_ > 342 if (screencast_frame_sent_ - screencast_frame_acked_ >
353 kMaxScreencastFramesInFlight || processing_screencast_frame_) { 343 kMaxScreencastFramesInFlight || processing_screencast_frame_) {
354 return; 344 return;
355 } 345 }
356 346
357 if (!host_ || !host_->GetView()) 347 if (!web_contents_ || !web_contents_->GetRenderWidgetHostView())
358 return; 348 return;
359 349
360 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 350 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
361 host_->GetView()); 351 web_contents_->GetRenderWidgetHostView());
362 // TODO(vkuzkokov): do not use previous frame metadata. 352 // TODO(vkuzkokov): do not use previous frame metadata.
363 cc::CompositorFrameMetadata& metadata = last_compositor_frame_metadata_; 353 cc::CompositorFrameMetadata& metadata = last_compositor_frame_metadata_;
364 354
365 gfx::SizeF viewport_size_dip = gfx::ScaleSize( 355 gfx::SizeF viewport_size_dip = gfx::ScaleSize(
366 metadata.scrollable_viewport_size, metadata.page_scale_factor); 356 metadata.scrollable_viewport_size, metadata.page_scale_factor);
367 gfx::SizeF screen_size_dip = gfx::ScaleSize(view->GetPhysicalBackingSize(), 357 gfx::SizeF screen_size_dip = gfx::ScaleSize(view->GetPhysicalBackingSize(),
368 1 / metadata.device_scale_factor); 358 1 / metadata.device_scale_factor);
369 359
370 blink::WebScreenInfo screen_info; 360 blink::WebScreenInfo screen_info;
371 view->GetScreenInfo(&screen_info); 361 view->GetScreenInfo(&screen_info);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 weak_factory_.GetWeakPtr(), metadata, base::Time::Now())); 415 weak_factory_.GetWeakPtr(), metadata, base::Time::Now()));
426 } 416 }
427 417
428 void PageHandler::ScreencastFrameEncoded( 418 void PageHandler::ScreencastFrameEncoded(
429 const cc::CompositorFrameMetadata& metadata, 419 const cc::CompositorFrameMetadata& metadata,
430 const base::Time& timestamp, 420 const base::Time& timestamp,
431 const std::string& data) { 421 const std::string& data) {
432 processing_screencast_frame_ = false; 422 processing_screencast_frame_ = false;
433 423
434 // Consider metadata empty in case it has no device scale factor. 424 // Consider metadata empty in case it has no device scale factor.
435 if (metadata.device_scale_factor == 0 || !host_ || data.empty()) 425 if (metadata.device_scale_factor == 0 || !web_contents_ || data.empty())
436 return; 426 return;
437 427
438 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 428 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
439 host_->GetView()); 429 web_contents_->GetRenderWidgetHostView());
440 if (!view) 430 if (!view)
441 return; 431 return;
442 432
443 gfx::SizeF screen_size_dip = gfx::ScaleSize( 433 gfx::SizeF screen_size_dip = gfx::ScaleSize(
444 view->GetPhysicalBackingSize(), 1 / metadata.device_scale_factor); 434 view->GetPhysicalBackingSize(), 1 / metadata.device_scale_factor);
445 scoped_refptr<ScreencastFrameMetadata> param_metadata = 435 scoped_refptr<ScreencastFrameMetadata> param_metadata =
446 ScreencastFrameMetadata::Create() 436 ScreencastFrameMetadata::Create()
447 ->set_page_scale_factor(metadata.page_scale_factor) 437 ->set_page_scale_factor(metadata.page_scale_factor)
448 ->set_offset_top(metadata.location_bar_content_translation.y()) 438 ->set_offset_top(metadata.location_bar_content_translation.y())
449 ->set_device_width(screen_size_dip.width()) 439 ->set_device_width(screen_size_dip.width())
(...skipping 27 matching lines...) Expand all
477 467
478 void PageHandler::OnColorPicked(int r, int g, int b, int a) { 468 void PageHandler::OnColorPicked(int r, int g, int b, int a) {
479 scoped_refptr<dom::RGBA> color = 469 scoped_refptr<dom::RGBA> color =
480 dom::RGBA::Create()->set_r(r)->set_g(g)->set_b(b)->set_a(a); 470 dom::RGBA::Create()->set_r(r)->set_g(g)->set_b(b)->set_a(a);
481 client_->ColorPicked(ColorPickedParams::Create()->set_color(color)); 471 client_->ColorPicked(ColorPickedParams::Create()->set_color(color));
482 } 472 }
483 473
484 } // namespace page 474 } // namespace page
485 } // namespace devtools 475 } // namespace devtools
486 } // namespace content 476 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698