OLD | NEW |
---|---|
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 Loading... | |
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, ¶m)) | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |