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

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

Issue 716053003: [DevTools] Move PNG encoding from UI to worker thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « content/browser/devtools/protocol/page_handler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/devtools/protocol/page_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698