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

Side by Side Diff: content/browser/devtools/renderer_overrides_handler.cc

Issue 23706005: DevTools: expose last composited frame metadata on RenderWidgetHostViewPort. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Same with devtools_protocol_constants aligned. Created 7 years, 3 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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/renderer_overrides_handler.h" 5 #include "content/browser/devtools/renderer_overrides_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"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
13 #include "base/strings/string16.h" 13 #include "base/strings/string16.h"
14 #include "base/values.h" 14 #include "base/values.h"
15 #include "cc/output/compositor_frame_metadata.h"
15 #include "content/browser/child_process_security_policy_impl.h" 16 #include "content/browser/child_process_security_policy_impl.h"
16 #include "content/browser/devtools/devtools_protocol_constants.h" 17 #include "content/browser/devtools/devtools_protocol_constants.h"
17 #include "content/browser/devtools/devtools_tracing_handler.h" 18 #include "content/browser/devtools/devtools_tracing_handler.h"
18 #include "content/browser/renderer_host/dip_util.h" 19 #include "content/browser/renderer_host/dip_util.h"
19 #include "content/browser/renderer_host/render_view_host_delegate.h" 20 #include "content/browser/renderer_host/render_view_host_delegate.h"
20 #include "content/browser/renderer_host/render_view_host_impl.h" 21 #include "content/browser/renderer_host/render_view_host_impl.h"
22 #include "content/common/view_messages.h"
21 #include "content/port/browser/render_widget_host_view_port.h" 23 #include "content/port/browser/render_widget_host_view_port.h"
22 #include "content/public/browser/browser_thread.h" 24 #include "content/public/browser/browser_thread.h"
23 #include "content/public/browser/devtools_agent_host.h" 25 #include "content/public/browser/devtools_agent_host.h"
24 #include "content/public/browser/javascript_dialog_manager.h" 26 #include "content/public/browser/javascript_dialog_manager.h"
25 #include "content/public/browser/navigation_controller.h" 27 #include "content/public/browser/navigation_controller.h"
26 #include "content/public/browser/render_process_host.h" 28 #include "content/public/browser/render_process_host.h"
27 #include "content/public/browser/render_view_host.h" 29 #include "content/public/browser/render_view_host.h"
28 #include "content/public/browser/render_widget_host_view.h" 30 #include "content/public/browser/render_widget_host_view.h"
29 #include "content/public/browser/web_contents.h" 31 #include "content/public/browser/web_contents.h"
30 #include "content/public/browser/web_contents_delegate.h" 32 #include "content/public/browser/web_contents_delegate.h"
31 #include "content/public/common/page_transition_types.h" 33 #include "content/public/common/page_transition_types.h"
32 #include "content/public/common/referrer.h" 34 #include "content/public/common/referrer.h"
35 #include "ipc/ipc_sender.h"
33 #include "third_party/WebKit/public/web/WebInputEvent.h" 36 #include "third_party/WebKit/public/web/WebInputEvent.h"
34 #include "ui/gfx/codec/jpeg_codec.h" 37 #include "ui/gfx/codec/jpeg_codec.h"
35 #include "ui/gfx/codec/png_codec.h" 38 #include "ui/gfx/codec/png_codec.h"
36 #include "ui/gfx/size_conversions.h" 39 #include "ui/gfx/size_conversions.h"
37 #include "ui/snapshot/snapshot.h" 40 #include "ui/snapshot/snapshot.h"
38 #include "url/gurl.h" 41 #include "url/gurl.h"
39 42
40 using WebKit::WebGestureEvent; 43 using WebKit::WebGestureEvent;
41 using WebKit::WebInputEvent; 44 using WebKit::WebInputEvent;
42 using WebKit::WebMouseEvent; 45 using WebKit::WebMouseEvent;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 &RendererOverridesHandler::InputDispatchGestureEvent, 144 &RendererOverridesHandler::InputDispatchGestureEvent,
142 base::Unretained(this))); 145 base::Unretained(this)));
143 } 146 }
144 147
145 RendererOverridesHandler::~RendererOverridesHandler() {} 148 RendererOverridesHandler::~RendererOverridesHandler() {}
146 149
147 void RendererOverridesHandler::OnClientDetached() { 150 void RendererOverridesHandler::OnClientDetached() {
148 screencast_command_ = NULL; 151 screencast_command_ = NULL;
149 } 152 }
150 153
151 void RendererOverridesHandler::OnSwapCompositorFrame() { 154 void RendererOverridesHandler::OnSwapCompositorFrame(
no sievers 2013/08/29 20:24:52 Can you even save the metadata in here instead of
155 const IPC::Message& message) {
152 if (!screencast_command_) 156 if (!screencast_command_)
153 return; 157 return;
154 158
159 ViewHostMsg_SwapCompositorFrame::Param param;
160 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, &param))
161 return;
162 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
163 param.b.AssignTo(frame.get());
164 InnerSwapCompositorFrame(frame->metadata);
165 }
166
167 void RendererOverridesHandler::InnerSwapCompositorFrame(
168 const cc::CompositorFrameMetadata& metadata) {
155 std::string format; 169 std::string format;
156 int quality = kDefaultScreenshotQuality; 170 int quality = kDefaultScreenshotQuality;
157 double scale = 1; 171 double scale = 1;
158 ParseCaptureParameters(screencast_command_.get(), &format, &quality, &scale); 172 ParseCaptureParameters(screencast_command_.get(), &format, &quality, &scale);
159 173
160 RenderViewHost* host = agent_->GetRenderViewHost(); 174 RenderViewHost* host = agent_->GetRenderViewHost();
161 RenderWidgetHostViewPort* view_port = 175 RenderWidgetHostViewPort* view_port =
162 RenderWidgetHostViewPort::FromRWHV(host->GetView()); 176 RenderWidgetHostViewPort::FromRWHV(host->GetView());
163 177
164 gfx::Rect view_bounds = host->GetView()->GetViewBounds(); 178 gfx::Rect view_bounds = host->GetView()->GetViewBounds();
165 gfx::Size snapshot_size = gfx::ToFlooredSize( 179 gfx::Size snapshot_size = gfx::ToFlooredSize(
166 gfx::ScaleSize(view_bounds.size(), scale)); 180 gfx::ScaleSize(view_bounds.size(), scale));
167 181
168 view_port->CopyFromCompositingSurface( 182 view_port->CopyFromCompositingSurface(
169 view_bounds, snapshot_size, 183 view_bounds, snapshot_size,
170 base::Bind(&RendererOverridesHandler::ScreenshotCaptured, 184 base::Bind(&RendererOverridesHandler::ScreenshotCaptured,
171 weak_factory_.GetWeakPtr(), 185 weak_factory_.GetWeakPtr(),
172 scoped_refptr<DevToolsProtocol::Command>(), format, quality, 186 scoped_refptr<DevToolsProtocol::Command>(), format, quality,
173 scale)); 187 metadata));
174 } 188 }
175 189
176 190
177 // DOM agent handlers -------------------------------------------------------- 191 // DOM agent handlers --------------------------------------------------------
178 192
179 scoped_refptr<DevToolsProtocol::Response> 193 scoped_refptr<DevToolsProtocol::Response>
180 RendererOverridesHandler::GrantPermissionsForSetFileInputFiles( 194 RendererOverridesHandler::GrantPermissionsForSetFileInputFiles(
181 scoped_refptr<DevToolsProtocol::Command> command) { 195 scoped_refptr<DevToolsProtocol::Command> command) {
182 base::DictionaryValue* params = command->params(); 196 base::DictionaryValue* params = command->params();
183 base::ListValue* file_list = NULL; 197 base::ListValue* file_list = NULL;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 bool is_unscaled_png = scale == 1 && format == kPng; 296 bool is_unscaled_png = scale == 1 && format == kPng;
283 if (is_unscaled_png && ui::GrabViewSnapshot(host->GetView()->GetNativeView(), 297 if (is_unscaled_png && ui::GrabViewSnapshot(host->GetView()->GetNativeView(),
284 &png, view_bounds)) { 298 &png, view_bounds)) {
285 std::string base64_data; 299 std::string base64_data;
286 bool success = base::Base64Encode( 300 bool success = base::Base64Encode(
287 base::StringPiece(reinterpret_cast<char*>(&*png.begin()), png.size()), 301 base::StringPiece(reinterpret_cast<char*>(&*png.begin()), png.size()),
288 &base64_data); 302 &base64_data);
289 if (success) { 303 if (success) {
290 base::DictionaryValue* result = new base::DictionaryValue(); 304 base::DictionaryValue* result = new base::DictionaryValue();
291 result->SetString( 305 result->SetString(
292 devtools::Page::captureScreenshot::kResponseData, base64_data); 306 devtools::Page::kData, base64_data);
293 return command->SuccessResponse(result); 307 return command->SuccessResponse(result);
294 } 308 }
295 return command->InternalErrorResponse("Unable to base64encode screenshot"); 309 return command->InternalErrorResponse("Unable to base64encode screenshot");
296 } 310 }
297 311
298 // Fallback to copying from compositing surface. 312 // Fallback to copying from compositing surface.
299 RenderWidgetHostViewPort* view_port = 313 RenderWidgetHostViewPort* view_port =
300 RenderWidgetHostViewPort::FromRWHV(host->GetView()); 314 RenderWidgetHostViewPort::FromRWHV(host->GetView());
301 315
302 gfx::Size snapshot_size = gfx::ToFlooredSize( 316 gfx::Size snapshot_size = gfx::ToFlooredSize(
303 gfx::ScaleSize(view_bounds.size(), scale)); 317 gfx::ScaleSize(view_bounds.size(), scale));
304 view_port->CopyFromCompositingSurface( 318 view_port->CopyFromCompositingSurface(
305 view_bounds, snapshot_size, 319 view_bounds, snapshot_size,
306 base::Bind(&RendererOverridesHandler::ScreenshotCaptured, 320 base::Bind(&RendererOverridesHandler::ScreenshotCaptured,
307 weak_factory_.GetWeakPtr(), command, format, quality, scale)); 321 weak_factory_.GetWeakPtr(), command, format, quality,
322 view_port->GetLastCompositorFrameMetadata()));
308 return command->AsyncResponsePromise(); 323 return command->AsyncResponsePromise();
309 } 324 }
310 325
311 scoped_refptr<DevToolsProtocol::Response> 326 scoped_refptr<DevToolsProtocol::Response>
312 RendererOverridesHandler::PageStartScreencast( 327 RendererOverridesHandler::PageStartScreencast(
313 scoped_refptr<DevToolsProtocol::Command> command) { 328 scoped_refptr<DevToolsProtocol::Command> command) {
314 screencast_command_ = command; 329 screencast_command_ = command;
315 OnSwapCompositorFrame(); 330
331 RenderViewHost* host = agent_->GetRenderViewHost();
332 RenderWidgetHostViewPort* view_port =
333 RenderWidgetHostViewPort::FromRWHV(host->GetView());
334
335 InnerSwapCompositorFrame(view_port->GetLastCompositorFrameMetadata());
316 return command->SuccessResponse(NULL); 336 return command->SuccessResponse(NULL);
317 } 337 }
318 338
319 scoped_refptr<DevToolsProtocol::Response> 339 scoped_refptr<DevToolsProtocol::Response>
320 RendererOverridesHandler::PageStopScreencast( 340 RendererOverridesHandler::PageStopScreencast(
321 scoped_refptr<DevToolsProtocol::Command> command) { 341 scoped_refptr<DevToolsProtocol::Command> command) {
322 screencast_command_ = NULL; 342 screencast_command_ = NULL;
323 return command->SuccessResponse(NULL); 343 return command->SuccessResponse(NULL);
324 } 344 }
325 345
326 void RendererOverridesHandler::ScreenshotCaptured( 346 void RendererOverridesHandler::ScreenshotCaptured(
327 scoped_refptr<DevToolsProtocol::Command> command, 347 scoped_refptr<DevToolsProtocol::Command> command,
328 const std::string& format, 348 const std::string& format,
329 int quality, 349 int quality,
330 double scale, 350 const cc::CompositorFrameMetadata& metadata,
331 bool success, 351 bool success,
332 const SkBitmap& bitmap) { 352 const SkBitmap& bitmap) {
333 if (!success) { 353 if (!success) {
334 if (command) { 354 if (command) {
335 SendAsyncResponse( 355 SendAsyncResponse(
336 command->InternalErrorResponse("Unable to capture screenshot")); 356 command->InternalErrorResponse("Unable to capture screenshot"));
337 } 357 }
338 return; 358 return;
339 } 359 }
340 360
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 data.size()), 394 data.size()),
375 &base_64_data)) { 395 &base_64_data)) {
376 if (command) { 396 if (command) {
377 SendAsyncResponse( 397 SendAsyncResponse(
378 command->InternalErrorResponse("Unable to base64 encode")); 398 command->InternalErrorResponse("Unable to base64 encode"));
379 } 399 }
380 return; 400 return;
381 } 401 }
382 402
383 base::DictionaryValue* response = new base::DictionaryValue(); 403 base::DictionaryValue* response = new base::DictionaryValue();
404 response->SetString(devtools::Page::kData, base_64_data);
405
406 // Consider metadata empty in case it has no device scale factor.
407 if (metadata.device_scale_factor != 0) {
408 response->SetDouble(devtools::Page::kParamDeviceScaleFactor,
409 metadata.device_scale_factor);
410 response->SetDouble(devtools::Page::kParamPageScaleFactor,
411 metadata.page_scale_factor);
412
413 base::DictionaryValue* viewport = new base::DictionaryValue();
414 viewport->SetDouble(devtools::kParamX, metadata.root_scroll_offset.x());
415 viewport->SetDouble(devtools::kParamY, metadata.root_scroll_offset.y());
416 viewport->SetDouble(devtools::kParamWidth, metadata.viewport_size.width());
417 viewport->SetDouble(devtools::kParamHeight,
418 metadata.viewport_size.height());
419 response->Set(devtools::Page::kParamViewport, viewport);
420 }
421
384 if (command) { 422 if (command) {
385 response->SetString(
386 devtools::Page::captureScreenshot::kResponseData, base_64_data);
387 SendAsyncResponse(command->SuccessResponse(response)); 423 SendAsyncResponse(command->SuccessResponse(response));
388 } else { 424 } else {
389 response->SetString(
390 devtools::Page::screencastFrame::kResponseData, base_64_data);
391 SendNotification(devtools::Page::screencastFrame::kName, response); 425 SendNotification(devtools::Page::screencastFrame::kName, response);
392 } 426 }
393 } 427 }
394 428
395 429
396 // Input agent handlers ------------------------------------------------------ 430 // Input agent handlers ------------------------------------------------------
397 431
398 scoped_refptr<DevToolsProtocol::Response> 432 scoped_refptr<DevToolsProtocol::Response>
399 RendererOverridesHandler::InputDispatchMouseEvent( 433 RendererOverridesHandler::InputDispatchMouseEvent(
400 scoped_refptr<DevToolsProtocol::Command> command) { 434 scoped_refptr<DevToolsProtocol::Command> command) {
(...skipping 22 matching lines...) Expand all
423 else if (type == "mouseMoved") 457 else if (type == "mouseMoved")
424 mouse_event.type = WebInputEvent::MouseMove; 458 mouse_event.type = WebInputEvent::MouseMove;
425 else 459 else
426 return NULL; 460 return NULL;
427 } else { 461 } else {
428 return NULL; 462 return NULL;
429 } 463 }
430 464
431 int x; 465 int x;
432 int y; 466 int y;
433 if (!params->GetInteger(devtools::Input::kParamX, &x) || 467 if (!params->GetInteger(devtools::kParamX, &x) ||
434 !params->GetInteger(devtools::Input::kParamY, &y)) { 468 !params->GetInteger(devtools::kParamY, &y)) {
435 return NULL; 469 return NULL;
436 } 470 }
437 471
438 float device_scale_factor = ui::GetScaleFactorScale( 472 float device_scale_factor = ui::GetScaleFactorScale(
439 GetScaleFactorForView(host->GetView())); 473 GetScaleFactorForView(host->GetView()));
440 mouse_event.x = floor(x / device_scale_factor); 474 mouse_event.x = floor(x / device_scale_factor);
441 mouse_event.y = floor(y / device_scale_factor); 475 mouse_event.y = floor(y / device_scale_factor);
442 mouse_event.windowX = mouse_event.x; 476 mouse_event.windowX = mouse_event.x;
443 mouse_event.windowY = mouse_event.y; 477 mouse_event.windowY = mouse_event.y;
444 mouse_event.globalX = mouse_event.x; 478 mouse_event.globalX = mouse_event.x;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 return NULL; 541 return NULL;
508 } else { 542 } else {
509 return NULL; 543 return NULL;
510 } 544 }
511 545
512 float device_scale_factor = ui::GetScaleFactorScale( 546 float device_scale_factor = ui::GetScaleFactorScale(
513 GetScaleFactorForView(host->GetView())); 547 GetScaleFactorForView(host->GetView()));
514 548
515 int x; 549 int x;
516 int y; 550 int y;
517 if (!params->GetInteger(devtools::Input::kParamX, &x) || 551 if (!params->GetInteger(devtools::kParamX, &x) ||
518 !params->GetInteger(devtools::Input::kParamY, &y)) { 552 !params->GetInteger(devtools::kParamY, &y)) {
519 return NULL; 553 return NULL;
520 } 554 }
521 event.x = floor(x / device_scale_factor); 555 event.x = floor(x / device_scale_factor);
522 event.y = floor(y / device_scale_factor); 556 event.y = floor(y / device_scale_factor);
523 event.globalX = event.x; 557 event.globalX = event.x;
524 event.globalY = event.y; 558 event.globalY = event.y;
525 559
526 if (type == "scrollUpdate") { 560 if (type == "scrollUpdate") {
527 int dx; 561 int dx;
528 int dy; 562 int dy;
(...skipping 15 matching lines...) Expand all
544 return NULL; 578 return NULL;
545 } 579 }
546 event.data.pinchUpdate.scale = static_cast<float>(scale); 580 event.data.pinchUpdate.scale = static_cast<float>(scale);
547 } 581 }
548 582
549 host->ForwardGestureEvent(event); 583 host->ForwardGestureEvent(event);
550 return command->SuccessResponse(NULL); 584 return command->SuccessResponse(NULL);
551 } 585 }
552 586
553 } // namespace content 587 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698