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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_browsertest.cc

Issue 17971002: Make RenderWidgetHostViewAura::CopyFromCompositingSurface readback layer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tabcapture-aura: add test and fix IsSurfaceAvailableForCopy Created 7 years, 5 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 | Annotate | Revision Log
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 "base/command_line.h" 5 #include "base/command_line.h"
6 #include "base/message_loop/message_loop_proxy.h" 6 #include "base/message_loop/message_loop_proxy.h"
7 #include "base/path_service.h" 7 #include "base/path_service.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "content/browser/gpu/gpu_data_manager_impl.h" 9 #include "content/browser/gpu/gpu_data_manager_impl.h"
10 #include "content/browser/renderer_host/render_widget_host_impl.h" 10 #include "content/browser/renderer_host/render_widget_host_impl.h"
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 191 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
192 // Note: Not appending kForceCompositingMode switch here, since not all bots 192 // Note: Not appending kForceCompositingMode switch here, since not all bots
193 // support compositing. Some bots will run with compositing on, and others 193 // support compositing. Some bots will run with compositing on, and others
194 // won't. Therefore, the call to SetUpSourceSurface() later on will detect 194 // won't. Therefore, the call to SetUpSourceSurface() later on will detect
195 // whether compositing mode is actually on or not. If not, the tests will 195 // whether compositing mode is actually on or not. If not, the tests will
196 // pass blindly, logging a warning message, since we cannot test what the 196 // pass blindly, logging a warning message, since we cannot test what the
197 // platform/implementation does not support. 197 // platform/implementation does not support.
198 RenderWidgetHostViewBrowserTest::SetUpCommandLine(command_line); 198 RenderWidgetHostViewBrowserTest::SetUpCommandLine(command_line);
199 } 199 }
200 200
201 virtual GURL TestUrl() {
202 return net::FilePathToFileURL(
203 test_dir().AppendASCII("rwhv_compositing_animation.html"));
204 }
205
201 virtual bool SetUpSourceSurface() OVERRIDE { 206 virtual bool SetUpSourceSurface() OVERRIDE {
202 if (!IsForceCompositingModeEnabled()) 207 if (!IsForceCompositingModeEnabled())
203 return false; // See comment in SetUpCommandLine(). 208 return false; // See comment in SetUpCommandLine().
204 #if defined(OS_MACOSX) 209 #if defined(OS_MACOSX)
205 CHECK(IOSurfaceSupport::Initialize()); 210 CHECK(IOSurfaceSupport::Initialize());
206 #endif 211 #endif
207 NavigateToURL(shell(), net::FilePathToFileURL( 212 NavigateToURL(shell(), TestUrl());
208 test_dir().AppendASCII("rwhv_compositing_animation.html")));
209 #if !defined(USE_AURA) 213 #if !defined(USE_AURA)
210 if (!GetRenderWidgetHost()->is_accelerated_compositing_active()) 214 if (!GetRenderWidgetHost()->is_accelerated_compositing_active())
211 return false; // Renderer did not turn on accelerated compositing. 215 return false; // Renderer did not turn on accelerated compositing.
212 #endif 216 #endif
213 217
214 // Using accelerated compositing, but a compositing surface might not be 218 // Using accelerated compositing, but a compositing surface might not be
215 // available yet. So, wait for it. 219 // available yet. So, wait for it.
216 WaitForCopySourceReady(); 220 WaitForCopySourceReady();
217 return true; 221 return true;
218 } 222 }
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 base::Unretained(this), 415 base::Unretained(this),
412 base::MessageLoopProxy::current(), 416 base::MessageLoopProxy::current(),
413 run_loop.QuitClosure(), 417 run_loop.QuitClosure(),
414 base::Time::Now())); 418 base::Time::Now()));
415 run_loop.Run(); 419 run_loop.Run();
416 420
417 EXPECT_EQ(2, callback_invoke_count()); 421 EXPECT_EQ(2, callback_invoke_count());
418 EXPECT_EQ(2, frames_captured()); 422 EXPECT_EQ(2, frames_captured());
419 } 423 }
420 424
425 class CompositingRenderWidgetHostViewBrowserTestTabCapture
426 : public CompositingRenderWidgetHostViewBrowserTest {
427 public:
428 CompositingRenderWidgetHostViewBrowserTestTabCapture()
429 : expected_copy_from_compositing_surface_result_(false),
430 allowable_error_(0),
431 test_url_("data:text/html,<!doctype html>") {}
432
433 void CopyFromCompositingSurfaceCallback(bool result, const SkBitmap& bitmap) {
434 EXPECT_EQ(expected_copy_from_compositing_surface_result_, result);
435
436 const SkBitmap& expected_bitmap =
437 expected_copy_from_compositing_surface_bitmap_;
438 EXPECT_EQ(expected_bitmap.width(), bitmap.width());
439 EXPECT_EQ(expected_bitmap.height(), bitmap.height());
440 EXPECT_EQ(expected_bitmap.config(), bitmap.config());
441 SkAutoLockPixels expected_bitmap_lock(expected_bitmap);
442 SkAutoLockPixels bitmap_lock(bitmap);
443 int fails = 0;
444 for (int i = 0; i < bitmap.width() && fails < 10; ++i) {
445 for (int j = 0; j < bitmap.height() && fails < 10; ++j) {
446 SkColor expected_color = expected_bitmap.getColor(i, j);
447 SkColor color = bitmap.getColor(i, j);
448 EXPECT_NEAR(expected_color, color, allowable_error_)
449 << "expected_color: " << std::hex << expected_color
450 << " color: " << color
451 << " Failed at " << std::dec << i << ", " << j;
452 if (static_cast<int>(std::abs(expected_color - color)) >
453 allowable_error_)
454 ++fails;
455 }
456 }
457 EXPECT_LT(fails, 10);
458
459 base::MessageLoop::current()->Quit();
piman 2013/06/28 03:23:13 You can pass in the RunLoop's QuitClosure, so that
danakj 2013/06/28 16:50:12 Ah! Ok, I was going to use the QuitClosure, but th
danakj 2013/06/28 17:58:39 Done.
460 }
461
462 void SetExpectedCopyFromCompositingSurfaceResult(bool result,
463 const SkBitmap& bitmap) {
464 expected_copy_from_compositing_surface_result_ = result;
465 expected_copy_from_compositing_surface_bitmap_ = bitmap;
466 }
467
468 void SetAllowableError(int amount) { allowable_error_ = amount; }
469
470 virtual GURL TestUrl() OVERRIDE {
471 return GURL(test_url_);
472 }
473
474 virtual void SetUp() OVERRIDE {
475 ui::DisableTestCompositor();
476 CompositingRenderWidgetHostViewBrowserTest::SetUp();
477 }
478
479 void SetTestUrl(std::string url) { test_url_ = url; }
480
481 private:
482 bool expected_copy_from_compositing_surface_result_;
483 SkBitmap expected_copy_from_compositing_surface_bitmap_;
484 int allowable_error_;
485 std::string test_url_;
486 };
487
488 IN_PROC_BROWSER_TEST_F(CompositingRenderWidgetHostViewBrowserTestTabCapture,
489 CopyFromCompositingSurface_WholeSurface_Unscaled) {
490 SetTestUrl("data:text/html,<!doctype html>"
491 "<div class='left'></div>"
492 "<style>"
493 "body { background: #ff0; padding: 0; margin: 0; }"
494 ".left { background: #0ff;"
495 " width: 50%;"
496 " height: 506px;"
497 "}"
498 "</style>");
499
500 SET_UP_SURFACE_OR_PASS_TEST();
501
502 RenderViewHost* const rwh =
503 shell()->web_contents()->GetRenderViewHost();
504 RenderWidgetHostViewPort* rwhvp =
505 static_cast<RenderWidgetHostViewPort*>(rwh->GetView());
506
507 gfx::Rect bounds = gfx::Rect(rwhvp->GetViewBounds().size());
508 EXPECT_EQ(gfx::Rect(766, 506).ToString(), bounds.ToString());
piman 2013/06/28 03:23:13 Is this size expected to be stable across platform
danakj 2013/06/28 16:50:12 Ya I wasn't sure, so I put this to see and run the
danakj 2013/06/28 17:58:39 Using just the top left 400x300 now. We'll see wha
509
510 gfx::Size out_size = bounds.size();
511
512 SkBitmap expected_bitmap;
513 expected_bitmap.setConfig(
514 SkBitmap::kARGB_8888_Config, out_size.width(), out_size.height());
515 expected_bitmap.allocPixels();
516 // Left half is #0ff.
517 expected_bitmap.eraseARGB(255, 0, 255, 255);
518 // Right half is #0ff.
519 {
520 SkAutoLockPixels lock(expected_bitmap);
521 for (int i = 0; i < out_size.width() / 2; ++i) {
522 for (int j = 0; j < out_size.height(); ++j) {
523 *expected_bitmap.getAddr32(out_size.width() / 2 + i, j) =
524 SkColorSetARGB(255, 255, 255, 0);;
525 }
526 }
527 }
528 SetExpectedCopyFromCompositingSurfaceResult(true, expected_bitmap);
529
530 base::Callback<void(bool, const SkBitmap&)> callback = base::Bind(
531 &CompositingRenderWidgetHostViewBrowserTestTabCapture::
532 CopyFromCompositingSurfaceCallback,
533 base::Unretained(this));
534 rwhvp->CopyFromCompositingSurface(bounds, out_size, callback);
535
536 base::RunLoop run_loop;
537 run_loop.Run();
538 }
539
540 IN_PROC_BROWSER_TEST_F(CompositingRenderWidgetHostViewBrowserTestTabCapture,
541 CopyFromCompositingSurface_WholeSurface_Scaled) {
542 SetTestUrl("data:text/html,<!doctype html>"
543 "<div class='left'></div>"
544 "<style>"
545 "body { background: #ff0; padding: 0; margin: 0; }"
546 ".left { background: #0ff;"
547 " width: 50%;"
548 " height: 506px;"
549 "}"
550 "</style>");
551
552 SET_UP_SURFACE_OR_PASS_TEST();
553
554 RenderViewHost* const rwh =
555 shell()->web_contents()->GetRenderViewHost();
556 RenderWidgetHostViewPort* rwhvp =
557 static_cast<RenderWidgetHostViewPort*>(rwh->GetView());
558
559 gfx::Rect bounds = gfx::Rect(rwhvp->GetViewBounds().size());
560 EXPECT_EQ(gfx::Rect(766, 506).ToString(), bounds.ToString());
561
562 // Scale the output to 400x300.
563 gfx::Size out_size(400, 300);
564
565 SkBitmap expected_bitmap;
566 expected_bitmap.setConfig(
567 SkBitmap::kARGB_8888_Config, out_size.width(), out_size.height());
568 expected_bitmap.allocPixels();
569 // Left half is #0ff.
570 expected_bitmap.eraseARGB(255, 0, 255, 255);
571 // Right half is #0ff.
572 {
573 SkAutoLockPixels lock(expected_bitmap);
574 for (int i = 0; i < out_size.width() / 2; ++i) {
575 for (int j = 0; j < out_size.height(); ++j) {
576 *expected_bitmap.getAddr32(out_size.width() / 2 + i, j) =
577 SkColorSetARGB(255, 255, 255, 0);;
578 }
579 }
580 }
581 SetExpectedCopyFromCompositingSurfaceResult(true, expected_bitmap);
582
583 base::Callback<void(bool, const SkBitmap&)> callback = base::Bind(
584 &CompositingRenderWidgetHostViewBrowserTestTabCapture::
585 CopyFromCompositingSurfaceCallback,
586 base::Unretained(this));
587 rwhvp->CopyFromCompositingSurface(bounds, out_size, callback);
588
589 base::RunLoop run_loop;
590 run_loop.Run();
591 }
592
593 IN_PROC_BROWSER_TEST_F(CompositingRenderWidgetHostViewBrowserTestTabCapture,
594 CopyFromCompositingSurface_CroppedSurface_Unscaled) {
595 SetTestUrl("data:text/html,<!doctype html>"
596 "<div class='left'></div>"
597 "<style>"
598 "body { background: #ff0; padding: 0; margin: 0; }"
599 ".left { background: #0ff;"
600 " width: 50%;"
601 " height: 506px;"
602 "}"
603 "</style>");
604
605 SET_UP_SURFACE_OR_PASS_TEST();
606
607 RenderViewHost* const rwh =
608 shell()->web_contents()->GetRenderViewHost();
609 RenderWidgetHostViewPort* rwhvp =
610 static_cast<RenderWidgetHostViewPort*>(rwh->GetView());
611
612 gfx::Rect bounds = gfx::Rect(rwhvp->GetViewBounds().size());
613 EXPECT_EQ(gfx::Rect(766, 506).ToString(), bounds.ToString());
614
615 // Grab 60x60 pixels from the center of the tab contents.
616 bounds = gfx::Rect(bounds.CenterPoint() - gfx::Vector2d(30, 30),
617 gfx::Size(60, 60));
618 gfx::Size out_size = bounds.size();
619
620 SkBitmap expected_bitmap;
621 expected_bitmap.setConfig(
622 SkBitmap::kARGB_8888_Config, out_size.width(), out_size.height());
623 expected_bitmap.allocPixels();
624 // Left half is #0ff.
625 expected_bitmap.eraseARGB(255, 0, 255, 255);
626 // Right half is #0ff.
627 {
628 SkAutoLockPixels lock(expected_bitmap);
629 for (int i = 0; i < out_size.width() / 2; ++i) {
630 for (int j = 0; j < out_size.height(); ++j) {
631 *expected_bitmap.getAddr32(out_size.width() / 2 + i, j) =
632 SkColorSetARGB(255, 255, 255, 0);;
633 }
634 }
635 }
636 SetExpectedCopyFromCompositingSurfaceResult(true, expected_bitmap);
637
638 base::Callback<void(bool, const SkBitmap&)> callback = base::Bind(
639 &CompositingRenderWidgetHostViewBrowserTestTabCapture::
640 CopyFromCompositingSurfaceCallback,
641 base::Unretained(this));
642 rwhvp->CopyFromCompositingSurface(bounds, out_size, callback);
643
644 base::RunLoop run_loop;
645 run_loop.Run();
646 }
647
648 IN_PROC_BROWSER_TEST_F(CompositingRenderWidgetHostViewBrowserTestTabCapture,
649 CopyFromCompositingSurface_CroppedSurface_Scaled) {
650 SetTestUrl("data:text/html,<!doctype html>"
651 "<div class='left'></div>"
652 "<style>"
653 "body { background: #ff0; padding: 0; margin: 0; }"
654 ".left { background: #0ff;"
655 " width: 50%;"
656 " height: 506px;"
657 "}"
658 "</style>");
659
660 SET_UP_SURFACE_OR_PASS_TEST();
661
662 RenderViewHost* const rwh =
663 shell()->web_contents()->GetRenderViewHost();
664 RenderWidgetHostViewPort* rwhvp =
665 static_cast<RenderWidgetHostViewPort*>(rwh->GetView());
666
667 gfx::Rect bounds = gfx::Rect(rwhvp->GetViewBounds().size());
668 EXPECT_EQ(gfx::Rect(766, 506).ToString(), bounds.ToString());
669
670 // Grab 60x60 pixels from the center of the tab contents.
671 bounds = gfx::Rect(bounds.CenterPoint() - gfx::Vector2d(30, 30),
672 gfx::Size(60, 60));
673
674 // Scale to 20 x 10.
675 gfx::Size out_size(20, 10);
676
677 SkBitmap expected_bitmap;
678 expected_bitmap.setConfig(
679 SkBitmap::kARGB_8888_Config, out_size.width(), out_size.height());
680 expected_bitmap.allocPixels();
681 // Left half is #0ff.
682 expected_bitmap.eraseARGB(255, 0, 255, 255);
683 // Right half is #0ff.
684 {
685 SkAutoLockPixels lock(expected_bitmap);
686 for (int i = 0; i < out_size.width() / 2; ++i) {
687 for (int j = 0; j < out_size.height(); ++j) {
688 *expected_bitmap.getAddr32(out_size.width() / 2 + i, j) =
689 SkColorSetARGB(255, 255, 255, 0);;
690 }
691 }
692 }
693 SetExpectedCopyFromCompositingSurfaceResult(true, expected_bitmap);
694
695 base::Callback<void(bool, const SkBitmap&)> callback = base::Bind(
696 &CompositingRenderWidgetHostViewBrowserTestTabCapture::
697 CopyFromCompositingSurfaceCallback,
698 base::Unretained(this));
699 rwhvp->CopyFromCompositingSurface(bounds, out_size, callback);
700
701 base::RunLoop run_loop;
702 run_loop.Run();
703 }
704
421 #endif // !defined(OS_ANDROID) && !defined(OS_IOS) 705 #endif // !defined(OS_ANDROID) && !defined(OS_IOS)
422 706
423 } // namespace 707 } // namespace
424 } // namespace content 708 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.cc ('k') | content/common/gpu/client/gl_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698