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 "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" |
| 11 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/threading/worker_pool.h" | |
| 13 #include "content/browser/devtools/protocol/color_picker.h" | 14 #include "content/browser/devtools/protocol/color_picker.h" |
| 14 #include "content/browser/devtools/protocol/usage_and_quota_query.h" | 15 #include "content/browser/devtools/protocol/usage_and_quota_query.h" |
| 15 #include "content/browser/geolocation/geolocation_service_context.h" | 16 #include "content/browser/geolocation/geolocation_service_context.h" |
| 16 #include "content/browser/renderer_host/render_view_host_impl.h" | 17 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 17 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 18 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 18 #include "content/browser/web_contents/web_contents_impl.h" | 19 #include "content/browser/web_contents/web_contents_impl.h" |
| 19 #include "content/common/view_messages.h" | 20 #include "content/common/view_messages.h" |
| 20 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
| 21 #include "content/public/browser/javascript_dialog_manager.h" | 22 #include "content/public/browser/javascript_dialog_manager.h" |
| 22 #include "content/public/browser/navigation_controller.h" | 23 #include "content/public/browser/navigation_controller.h" |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 469 gfx::Size snapshot_size_dip(gfx::ToRoundedSize( | 470 gfx::Size snapshot_size_dip(gfx::ToRoundedSize( |
| 470 gfx::ScaleSize(viewport_size_dip, scale))); | 471 gfx::ScaleSize(viewport_size_dip, scale))); |
| 471 | 472 |
| 472 if (snapshot_size_dip.width() > 0 && snapshot_size_dip.height() > 0) { | 473 if (snapshot_size_dip.width() > 0 && snapshot_size_dip.height() > 0) { |
| 473 gfx::Rect viewport_bounds_dip(gfx::ToRoundedSize(viewport_size_dip)); | 474 gfx::Rect viewport_bounds_dip(gfx::ToRoundedSize(viewport_size_dip)); |
| 474 view->CopyFromCompositingSurface( | 475 view->CopyFromCompositingSurface( |
| 475 viewport_bounds_dip, | 476 viewport_bounds_dip, |
| 476 snapshot_size_dip, | 477 snapshot_size_dip, |
| 477 base::Bind(&PageHandler::ScreencastFrameCaptured, | 478 base::Bind(&PageHandler::ScreencastFrameCaptured, |
| 478 weak_factory_.GetWeakPtr(), | 479 weak_factory_.GetWeakPtr(), |
| 479 screencast_format_, | |
| 480 screencast_quality_, | |
| 481 last_compositor_frame_metadata_), | 480 last_compositor_frame_metadata_), |
| 482 kN32_SkColorType); | 481 kN32_SkColorType); |
| 483 } | 482 } |
| 484 } | 483 } |
| 485 | 484 |
| 486 void PageHandler::ScreencastFrameCaptured( | 485 static void EncodeScreencastFrame( |
| 486 const SkBitmap& bitmap, | |
| 487 const std::string& format, | 487 const std::string& format, |
| 488 int quality, | 488 int quality, |
| 489 const cc::CompositorFrameMetadata& metadata, | 489 const base::Callback<void(const std::string&)> callback) { |
| 490 const SkBitmap& bitmap, | |
| 491 ReadbackResponse response) { | |
| 492 if (response != READBACK_SUCCESS) { | |
| 493 if (capture_retry_count_) { | |
| 494 --capture_retry_count_; | |
| 495 base::MessageLoop::current()->PostDelayedTask( | |
| 496 FROM_HERE, | |
| 497 base::Bind(&PageHandler::InnerSwapCompositorFrame, | |
| 498 weak_factory_.GetWeakPtr()), | |
| 499 base::TimeDelta::FromMilliseconds(kFrameRateThresholdMs)); | |
| 500 } | |
| 501 return; | |
| 502 } | |
| 503 | |
| 504 std::vector<unsigned char> data; | 490 std::vector<unsigned char> data; |
| 505 SkAutoLockPixels lock_image(bitmap); | 491 SkAutoLockPixels lock_image(bitmap); |
| 506 bool encoded; | 492 bool encoded; |
| 507 if (format == kPng) { | 493 if (format == kPng) { |
| 508 encoded = gfx::PNGCodec::Encode( | 494 encoded = gfx::PNGCodec::Encode( |
| 509 reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), | 495 reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), |
| 510 gfx::PNGCodec::FORMAT_SkBitmap, | 496 gfx::PNGCodec::FORMAT_SkBitmap, |
| 511 gfx::Size(bitmap.width(), bitmap.height()), | 497 gfx::Size(bitmap.width(), bitmap.height()), |
| 512 bitmap.width() * bitmap.bytesPerPixel(), | 498 bitmap.width() * bitmap.bytesPerPixel(), |
| 513 false, std::vector<gfx::PNGCodec::Comment>(), &data); | 499 false, std::vector<gfx::PNGCodec::Comment>(), &data); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 524 } | 510 } |
| 525 | 511 |
| 526 if (!encoded) | 512 if (!encoded) |
| 527 return; | 513 return; |
| 528 | 514 |
| 529 std::string base_64_data; | 515 std::string base_64_data; |
| 530 base::Base64Encode( | 516 base::Base64Encode( |
| 531 base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()), | 517 base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()), |
| 532 &base_64_data); | 518 &base_64_data); |
| 533 | 519 |
| 520 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 521 base::Bind(callback, base_64_data)); | |
| 522 } | |
| 523 | |
| 524 void PageHandler::ScreencastFrameCaptured( | |
| 525 const cc::CompositorFrameMetadata& metadata, | |
| 526 const SkBitmap& bitmap, | |
| 527 ReadbackResponse response) { | |
| 528 if (response != READBACK_SUCCESS) { | |
| 529 if (capture_retry_count_) { | |
| 530 --capture_retry_count_; | |
| 531 base::MessageLoop::current()->PostDelayedTask( | |
| 532 FROM_HERE, | |
| 533 base::Bind(&PageHandler::InnerSwapCompositorFrame, | |
| 534 weak_factory_.GetWeakPtr()), | |
| 535 base::TimeDelta::FromMilliseconds(kFrameRateThresholdMs)); | |
| 536 } | |
| 537 return; | |
| 538 } | |
| 539 base::WorkerPool::PostTask( | |
|
dgozman
2014/11/17 14:03:59
Maybe use PostTaskAndReply?
vkuzkokov
2014/11/17 14:47:47
PostTaskAndReplyWithResult. Done.
| |
| 540 FROM_HERE, | |
| 541 base::Bind(&EncodeScreencastFrame, | |
| 542 bitmap, | |
| 543 screencast_format_, | |
|
dgozman
2014/11/17 14:03:59
We passed these as params for the case when e.g. f
vkuzkokov
2014/11/17 14:47:47
This way we use more recent settings for format an
| |
| 544 screencast_quality_, | |
| 545 base::Bind(&PageHandler::ScreencastFrameEncoded, | |
| 546 weak_factory_.GetWeakPtr(), metadata)), | |
| 547 true); | |
| 548 } | |
| 549 | |
| 550 void PageHandler::ScreencastFrameEncoded( | |
| 551 const cc::CompositorFrameMetadata& metadata, | |
| 552 const std::string& data) { | |
| 534 // Consider metadata empty in case it has no device scale factor. | 553 // Consider metadata empty in case it has no device scale factor. |
| 535 if (metadata.device_scale_factor == 0 || !host_) | 554 if (metadata.device_scale_factor == 0 || !host_) |
| 536 return; | 555 return; |
| 537 | 556 |
| 538 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 557 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
| 539 host_->GetView()); | 558 host_->GetView()); |
| 540 if (!view) | 559 if (!view) |
| 541 return; | 560 return; |
| 542 | 561 |
| 543 gfx::SizeF viewport_size_dip = gfx::ScaleSize( | 562 gfx::SizeF viewport_size_dip = gfx::ScaleSize( |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 557 ->set_device_width(screen_size_dip.width()) | 576 ->set_device_width(screen_size_dip.width()) |
| 558 ->set_device_height(screen_size_dip.height()) | 577 ->set_device_height(screen_size_dip.height()) |
| 559 ->set_scroll_offset_x(metadata.root_scroll_offset.x()) | 578 ->set_scroll_offset_x(metadata.root_scroll_offset.x()) |
| 560 ->set_scroll_offset_y(metadata.root_scroll_offset.y()) | 579 ->set_scroll_offset_y(metadata.root_scroll_offset.y()) |
| 561 ->set_viewport(dom::Rect::Create() | 580 ->set_viewport(dom::Rect::Create() |
| 562 ->set_x(metadata.root_scroll_offset.x()) | 581 ->set_x(metadata.root_scroll_offset.x()) |
| 563 ->set_y(metadata.root_scroll_offset.y()) | 582 ->set_y(metadata.root_scroll_offset.y()) |
| 564 ->set_width(metadata.scrollable_viewport_size.width()) | 583 ->set_width(metadata.scrollable_viewport_size.width()) |
| 565 ->set_height(metadata.scrollable_viewport_size.height())); | 584 ->set_height(metadata.scrollable_viewport_size.height())); |
| 566 client_->ScreencastFrame(ScreencastFrameParams::Create() | 585 client_->ScreencastFrame(ScreencastFrameParams::Create() |
| 567 ->set_data(base_64_data) | 586 ->set_data(data) |
| 568 ->set_metadata(param_metadata)); | 587 ->set_metadata(param_metadata)); |
| 569 } | 588 } |
| 570 | 589 |
| 571 void PageHandler::ScreenshotCaptured( | 590 void PageHandler::ScreenshotCaptured( |
| 572 scoped_refptr<DevToolsProtocol::Command> command, | 591 scoped_refptr<DevToolsProtocol::Command> command, |
| 573 const unsigned char* png_data, | 592 const unsigned char* png_data, |
| 574 size_t png_size) { | 593 size_t png_size) { |
| 575 if (!png_data || !png_size) { | 594 if (!png_data || !png_size) { |
| 576 client_->SendInternalErrorResponse(command, | 595 client_->SendInternalErrorResponse(command, |
| 577 "Unable to capture screenshot"); | 596 "Unable to capture screenshot"); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 595 | 614 |
| 596 void PageHandler::QueryUsageAndQuotaCompleted( | 615 void PageHandler::QueryUsageAndQuotaCompleted( |
| 597 scoped_refptr<DevToolsProtocol::Command> command, | 616 scoped_refptr<DevToolsProtocol::Command> command, |
| 598 scoped_refptr<QueryUsageAndQuotaResponse> response_data) { | 617 scoped_refptr<QueryUsageAndQuotaResponse> response_data) { |
| 599 client_->SendQueryUsageAndQuotaResponse(command, response_data); | 618 client_->SendQueryUsageAndQuotaResponse(command, response_data); |
| 600 } | 619 } |
| 601 | 620 |
| 602 } // namespace page | 621 } // namespace page |
| 603 } // namespace devtools | 622 } // namespace devtools |
| 604 } // namespace content | 623 } // namespace content |
| OLD | NEW |